Welcome to the Quote3D Documentation!

Core Concepts: Files, Quotes and Jobs

This page introduces the foundational ideas and patterns that power the platform. Understanding these concepts will help you get the most out of the API and build robust integrations for 3D printing workflows.

API Base Route

For external API calls, send requests directly to https://api.quote3d.com/v2/... (for example, GET https://api.quote3d.com/v2/user).

In your software, set https://api.quote3d.com as the API host/base URL and call v2 paths such as /v2/user, /v2/file, and /v2/quotes.

1. Authentication & Security

Every endpoint requires authentication with your Quote3D API token, with one exception: the public upload route documented under File Management. For external calls, use the https://api.quote3d.com/v2 base route. Send the token either as Authorization: Bearer YOUR_TOKEN or X-API-Token. Generate tokens from your Quote3D dashboard and keep them secret.

Tokens can be scoped. A full-access token reaches every endpoint, while a widget-scoped token is restricted to the endpoints the embedded widget needs. Calling anything outside a token's scope returns 403. You can see and change a token's scope on the Tokens page of your dashboard.

Reminder: Keep your API tokens secure. Never share them publicly or commit them to version control.

2. Account Management

Manage your account, uploads, and usage statistics through dedicated endpoints:

  • GET /v2/user Retrieve your account details, plan, and monthly allowances — this is where quotes_used, quotes_limit, storage_used, storage_limit and reset_date live
  • GET /v2/user/uploads List all of the files you've uploaded to your account. These are listed from newest to oldest.
  • GET /v2/quota Get your rate limit allowances — the global limit plus a per-endpoint breakdown with remaining calls and reset times — together with your request counts for today, this month, this year, and all time
  • GET /v2/usage Get detailed usage analytics including endpoint statistics, material usage, and time-based trends

3. File Management

Upload, download, and manage your 3D model files (STL, 3MF, OBJ formats):

  • GET /v2/file/upload-idGet a temporary upload_id to upload a new file with the public upload route.
  • POST /v2/file/public/{upload_id}This route does NOT require authentication. Use this on your client side to upload files directly to our storage.

    Using the Public Upload route lets you avoid routing large files through your backend server. This prevents exposing your API token and reduces server load.

  • POST /v2/fileUpload a file from your server side (requires authentication, use this when you want to upload from your backend)
  • GET /v2/file/{file_id}Download a file using its file_id
  • DELETE /v2/file/{file_id}Delete a file you no longer need

The upload is rejected if the file is not a valid STL, 3MF, or OBJ model, or if it exceeds the platform file size limit (50 MB by default). Both upload routes apply the same checks.

How your files are stored

Uploaded models are stored encrypted and are never publicly reachable — there is no link that serves a stored file directly. The file_path field in responses is the authenticated download path (GET /v2/file/{file_id}), not a location on disk, so treat it as an endpoint rather than a URL you can share. Deleting a file removes it from storage, not only from your listings.

4. Part Info & Technical Analysis

Check if your models are printable, get part dimensions, and advanced technical metrics:

  • POST /v2/printability/{file_id} Instant Analysis - Check measurements, volume, surface area, and geometric integrity (open edges/non-manifold) before generating a quote.

Quote3D goes beyond simple dimension checks; it analyzes the model's manifold integrity and evaluates the bed adhesion risk critical for 3D printing. These metrics are provided in both Printability and Quote responses.

5. Quote Operations

Generate instant quotes for your 3D prints and manage quote history:

  • POST /v2/file/quote/{file_id}Start asynchronous quote calculation for a 3D model. Returns a job ID; use the jobs endpoint to retrieve the completed result.
  • POST /v2/file/quote/{file_id}/asyncAlternative asynchronous quote endpoint. Returns a job ID that you can use to check status and fetch the completed result.
  • GET /v2/jobs/{job_id}Check the status of an async quote job. Returns progress percentage and completion status.
  • GET /v2/quotesRetrieve all your quote history with pagination support
  • GET /v2/quotes/{quote_id}Get detailed information about a specific quote
  • DELETE /v2/quotes/{quote_id}Remove a quote from your history

Async workflow: POST /v2/file/quote/{file_id} returns a job id first. Use GET /v2/jobs/{job_id} for the compact completed result, and GET /v2/quotes/{quote_id} for the stored detailed quote payload when available.

Quote Request Parameters

When generating a quote, you can provide custom configuration in the request body. Any parameters you don't specify will be automatically taken from your Dashboard Slice Profile settings. This allows you to override specific settings per quote while keeping defaults for others.

Important: If you don't provide a parameter in your request, the API will use the value from your Dashboard Slice Profile (Printer Profile, Material Profile, or Global Settings). Make sure to set up your default profiles in the Dashboard for consistent quotes. You can also configure all your parameters in a specific Printer Profile on the Dashboard and simply pass its 'printer_id' in your request to apply those settings instantly without passing them individually.

Configuration precedence: Values sent in the V2 API request override the selected user profile values; any field still missing then falls back to the user/global default profiles.

The tables below cover the parameters integrations override most often. They are not the full list — the quote engine accepts many more printer, material, and pricing fields, and every one of them can be set once in your Dashboard Slice Profiles instead of being sent on each request. Configure your profiles there and send only what varies per quote; the complete field list lives in the OpenAPI schema.

Request Validation

Numeric fields in printer_config, material_config and quote_config are bound-checked before the job is queued. A value outside its range, a non-finite number (NaN, Infinity), a wrong type, or a negative number where only zero and above make sense is rejected with HTTP 400 and a VALIDATION_ERROR naming the exact field. Zero is still accepted wherever it is meaningful — a per-role speed or acceleration of 0 means "use the printer default", the same convention OrcaSlicer uses.

  • Temperature limits: the material temperatures (temperature and bed_temperature, whether sent in the request or read from the Material Profile) are checked against the printer's min_hotend_temp / max_hotend_temp and min_bed_temp / max_bed_temp. A material that needs more heat than the selected printer can deliver is rejected instead of being quoted. FDM only — resin and powder technologies have no nozzle or heated bed. Leave the printer limits unset to skip the check.
  • Enabled technologies: if you have restricted the technologies in your Global Settings, a quote request for a disabled technology is rejected. Leave the setting empty to accept all three.
  • Material price fields: price_per_gram is the value the engine charges. When you save a Material Profile, price_per_kg is recalculated from it automatically (and price_per_gram is derived from price_per_kg when only the kilogram price is supplied), so the two can never disagree.

Root Parameters

ParameterTypeDescription
technologystringOptional. Production technology: 'FDM', 'SLA' or 'SLS' ('RESIN' is accepted as an alias for 'SLA'). Determines which technology-specific parameters apply and how parts are packed for batch production. When omitted, the technology of the selected printer is used, falling back to 'FDM'.
printer_idstringOptional. ID of a specific printer to use instead of the default printer.
quantitynumberOptional. The total number of copies to produce (Default: 1).

Quantity and Batch Production Logic

Our system utilizes an advanced packing algorithm based on the specified 'quantity':

  • FDM Technology: Parts are placed side-by-side on the build plate (X and Y axes) as space permits.
  • SLA Technology: Parts are positioned side-by-side in the resin vat (X and Y axes).
  • SLS Technology: Parts can be stacked in all axes (X, Y, and Z) to fully utilize the powder bed capacity.

Thanks to this optimized packing, if multiple parts can fit in a single batch, fixed overhead costs like preheating, cooling, and layer changes are only applied per required batch. This ensures highly realistic, cost-effective pricing for volume orders.

printer_config

Printer configuration parameters. All fields are optional and will use your default Printer Profile values if not provided.

ParameterTypeDescription
nozzle_diameternumberFDM nozzle diameter (mm). Drives extrusion width, so it changes both print time and material use.
support_materialbooleanEnable support generation. When omitted, the profile value is used.
bed_size_xnumberBuild volume X dimension (mm)
bed_size_ynumberBuild volume Y dimension (mm)
bed_size_znumberBuild volume Z dimension (mm)
print_speednumberDefault print speed (mm/s)
max_print_speednumberMaximum print speed (mm/s)
travel_speednumberTravel speed (mm/s)
first_layer_speednumberFirst layer speed (mm/s)
layer_heightnumberLayer height (mm)
min_layer_heightnumberMinimum layer height (mm)
max_layer_heightnumberMaximum layer height (mm)
perimetersnumberNumber of perimeters/walls
top_solid_layersnumberTop solid layers count
bottom_solid_layersnumberBottom solid layers count
min_wall_countnumberMinimum wall count
max_wall_countnumberMaximum wall count
fill_densitynumberInfill density (0-100%)
infill_patternstringInfill pattern. Default: rectilinear. Basic (rectilinear, alignedrectilinear, zigzag, crosszag, lockedzag, line, grid), Triangle (triangles, trihexagon), Cubic (cubic, adaptivecubic, supportcubic), Honeycomb (honeycomb, honeycomb3d, lateralhoneycomb), Advanced (gyroid), Special (monotonic, monotonicline), Space-filling (hilbertcurve, archimedeanchords, octagramspiral). hilbertcurve, archimedeanchords, octagramspiral are accepted but have no generator of their own — they are quoted as rectilinear. Values are matched case-insensitively with separators ignored, so tri-hexagon and Zig Zag both work; the OrcaSlicer spelling 3dhoneycomb is accepted too. lightning, quartercubic, laterallattice, crosshatch, concentric, tpmsd, tpmsfk are not supported and return 400.
support_overhang_anglenumberSupport overhang angle (degrees)
support_densitynumberSupport density (0-100%)
brim_enabledbooleanEnable brim generation for FDM quotes
brim_widthnumberBrim width in millimeters when brim is enabled
acceleration_printnumberPrint acceleration (mm/s²)
acceleration_travelnumberTravel acceleration (mm/s²)
acceleration_retractionnumberRetraction acceleration (mm/s²)
acceleration_outer_wallnumberOuter wall acceleration (mm/s²). 0 uses acceleration_print.
acceleration_inner_wallnumberInner wall acceleration (mm/s²). 0 uses acceleration_print.
acceleration_sparse_infillnumberSparse infill acceleration (mm/s²). 0 uses acceleration_print.
acceleration_solid_infillnumberSolid infill acceleration (mm/s²). 0 uses acceleration_print.
acceleration_top_surfacenumberTop surface acceleration (mm/s²). 0 uses acceleration_print.
acceleration_bridgenumberBridge acceleration (mm/s²). 0 uses acceleration_print.
acceleration_first_layernumberFirst layer acceleration (mm/s²). 0 uses acceleration_print.
retraction_minimum_travelnumberTravel moves shorter than this do not retract (mm). Reference default 1.
z_hop_mmnumberNozzle lift before a travel move (mm). 0 disables it. Reference default 0.4.
bed_exclude_xnumberUnusable bed edge margin on X (mm), removed from the packing area.
bed_exclude_ynumberUnusable bed edge margin on Y (mm), removed from the packing area.
jerk_printnumberPrint jerk (mm/s)
jerk_travelnumberTravel jerk (mm/s)
jerk_retractionnumberRetraction jerk (mm/s)
min_hotend_tempnumberMinimum hotend temperature (°C)
max_hotend_tempnumberMaximum hotend temperature (°C)
min_bed_tempnumberMinimum bed temperature (°C)
max_bed_tempnumberMaximum bed temperature (°C)
hourly_costnumberMachine hourly cost
SLA SPECIFIC
sla_exposure_timenumberSLA: Exposure time per layer (seconds)
sla_bottom_exposure_timenumberSLA: Baseline exposure time (seconds)
sla_bottom_layer_countnumberSLA: Number of bottom layers
sla_lift_distancenumberSLA: Lift distance (mm)
sla_lift_speednumberSLA: Lift speed (mm/min)
sla_retract_speednumberSLA: Retract speed (mm/min)
sla_cleaning_costnumberSLA: Fixed cleaning cost per print (IPA, consumables)
sla_pad_enabledbooleanSLA: print the model on a pad/raft. Off by default; pad resin is counted with support material.
sla_pad_wall_thicknessnumberSLA: pad wall thickness in mm. Alias: sla_pad_height.
sla_pad_wall_heightnumberSLA: pad wall height in mm (raised rim around the pad cavity).
sla_pad_wall_slopenumberSLA: pad wall slope in degrees (45-90). The pad tapers downward at this angle.
sla_pad_brim_sizenumberSLA: pad brim size in mm. Alias: sla_pad_expansion.
sla_pad_max_merge_distancenumberSLA: support feet closer than this are merged into one pad island (mm).
sla_support_head_front_diameternumberSLA: support head front (tip) diameter in mm.
sla_support_head_penetrationnumberSLA: how deep the support head sinks into the model surface (mm).
sla_support_head_widthnumberSLA: support head rod length in mm.
sla_support_pillar_diameternumberSLA: support pillar diameter in mm. Drives most of the support resin volume.
sla_support_base_diameternumberSLA: support pillar base (foot) diameter in mm.
sla_support_base_heightnumberSLA: support pillar base (foot) height in mm.
sla_support_object_elevationnumberSLA: object elevation above the build plate in mm. Also adds printed layers, so it affects print time. Applied only when supports are generated.
sla_support_critical_anglenumberSLA: bridge slope in degrees used when routing supports. Not the same as support_overhang_angle.
sla_support_max_pillar_link_distancenumberSLA: pillars farther apart than this are not cross-linked (mm).
sla_support_max_bridge_lengthnumberSLA: longest sideways bridge a support head may take to reach the plate (mm).
sla_support_max_bridges_on_pillarnumberSLA: how many bridges a single pillar accepts.
sla_support_points_densitynumberSLA: support point density as a percentage, 100 = normal. NOT the same quantity as support_density, which is the FDM support infill percentage.
sla_elephant_foot_compensationnumberSLA: How far the first layers are pulled in to cancel the widening at the base. Reference value 0.2 on every bundled SLA printer. 0 disables it.
sla_elephant_foot_min_widthnumberSLA: Contours narrower than this are left alone so thin features are not erased. Reference value 0.2.
sla_faded_layersnumberSLA: Over how many layers the compensation fades to zero. This is NOT the bottom layer count; the reference MSLA profile uses 8.
SLS SPECIFIC
sls_laser_speednumberSLS: Laser speed (mm/s)
sls_hatch_spacingnumberSLS: Hatch spacing (mm)
sls_layer_thicknessnumberSLS: Layer thickness (mm)
sls_layer_recoat_timenumberSLS: Layer recoat time (seconds)
sls_preheat_timenumberSLS: Preheat time (minutes)
sls_cooling_timenumberSLS: Cooling time (minutes)
sla_light_off_delaynumberSLA: Light-off delay for each layer (seconds).
sla_transition_layer_countnumberSLA: Number of transition layers.
sla_drain_holesarraySLA: Drainage holes configuration to prevent suction cups.
sls_bb_multipliernumberSLS: machine-space surcharge per gram-equivalent of the build slot a part occupies. The slot is the part minimum-volume box plus its share of the powder gaps and unusable chamber edges, so it does not change when the model arrives rotated. 0 disables the surcharge.
sls_contour_countnumberSLS: number of contour (border) passes the laser traces around each slice outline. 0 disables the contour pass.
sls_contour_speednumberSLS: contour scan speed in mm/s. 0 means the contour is scanned at sls_laser_speed.
sls_jump_speednumberSLS: galvo jump speed in mm/s for the non-sintering repositioning moves between scan vectors. 0 times jumps at sls_laser_speed, an upper bound.
sls_part_spacingnumberSLS: minimum powder gap around a part in mm, applied both between parts and to the chamber wall. It decides how many parts fit in one build, so it drives both the machine-space share and the fixed-cost split. 0 uses the engine default of 3 mm.
max_volumetric_flownumberMaximum volumetric flow rate in mm³/s.

material_config

Material configuration parameters. All fields are optional and will use your default Material Profile values if not provided.

Material Profile Integration: The filament_type parameter should match a material name from your Dashboard Material Profile. When you specify a filament_type (e.g., "PLA", "ABS", "PETG"), the API automatically loads all properties from that Material Profile, including density, temperatures, flow ratio, retraction settings, and pricing.

Pricing Accuracy: material cost is calculated from price_per_gram. Setting either price_per_kg or price_per_gram on the Material Profile is enough — the other one is kept in sync for you. You can still override the price per request with price_per_gram or price_per_kg in material_config.

Example: If you have a "PLA" material profile in your Dashboard with price_per_kg: 20.0 and price_per_gram: 0.02, you can simply send {"filament_type": "PLA"} in your request, and all pricing will be calculated automatically.

ParameterTypeDescription
filament_typestringFilament type (PLA, ABS, PETG, etc.)
colorstringColor name (e.g., 'White', 'Black', '#FFFFFF'). Note: For SLA/SLS technologies, color is only applied if 'post_processing' is set to 'painted'.
densitynumberMaterial density (g/cm³)
diameternumberFilament diameter (mm)
filament_flow_rationumberFDM flow ratio multiplier. 1.0 means 100% flow. Request values override the selected user Material Profile; if missing, the global profile value is used before the default 1.0.
powder_bulk_densitynumberSLS: Bulk density of loose powder in g/cm³. Used for reusable powder and refresh calculations.
temperaturenumberPrint temperature (°C)
print_temp_minnumberMinimum print temperature (°C)
print_temp_maxnumberMaximum print temperature (°C)
bed_temperaturenumberBed temperature (°C)
bed_temp_minnumberMinimum bed temperature (°C)
bed_temp_maxnumberMaximum bed temperature (°C)
fan_speednumberFan speed (0-100%)
min_fan_speednumberMinimum fan speed (0-100%)
retraction_distancenumberRetraction distance (mm)
retraction_speednumberRetraction speed (mm/s)
slow_down_min_speednumberLower speed bound for layer cooling (mm/s). Reference default 20.
retraction_minimum_travelnumberOverrides the printer value for this material (mm).
z_hop_mmnumberOverrides the printer value for this material (mm).
price_per_kgnumberPrice per kilogram
price_per_gramnumberPrice per gram
support_cost_multipliernumberSupport material cost multiplier
sls_refresh_factornumberSLS powder refresh rate ratio (e.g. 0.3 = 30% fresh powder).
max_volumetric_flownumberMaterial specific volumetric flow limit in mm³/s.
min_layer_timenumberMinimum layer time in seconds for cooling.

quote_config

Quote pricing configuration parameters. All fields are optional and will use your default Global Settings values if not provided. The currency defaults to your dashboard preference (e.g., 'USD', 'TRY', 'EUR').

ParameterTypeDescription
currencystringCurrency code (USD, TRY, EUR, GBP, JPY, CNY, RUB). Defaults to your dashboard preference.
tax_ratenumberTax rate percentage (0-100)
fixed_feenumberFixed fee per quote
energy_cost_per_kwhnumberEnergy cost per kWh
hollowingstringSLA/SLS specific: 'solid', '2mm' or '3mm'. For SLA it defaults to '2mm' when SLA hollowing is enabled in your settings; for SLS it defaults to '2mm' when SLS hollowing is enabled. SLS parts are hollowed WITHOUT an escape hole, so the unsintered powder stays inside: it is charged at powder bed density and is not recoverable. A part whose walls are already thinner than twice the configured wall thickness is left solid.
post_processingstringSLA/SLS specific: 'standard', 'sanding', 'painting' or 'painted' (Default: 'standard'). The value is recorded on the quote; 'painted' is also what makes the requested color apply to SLA/SLS parts.
sla_post_processing_fee_standardnumberSLA standard post-processing fee per part. Overrides the settings value; post_processing selects which one applies.
sla_post_processing_fee_sandingnumberSLA sanding post-processing fee per part. Overrides the settings value; post_processing selects which one applies.
sla_post_processing_fee_paintingnumberSLA painting post-processing fee per part. Overrides the settings value; post_processing selects which one applies.
sla_post_processing_fee_paintednumberSLA painted post-processing fee per part. Overrides the settings value; post_processing selects which one applies.
sls_post_processing_fee_standardnumberSLS standard post-processing fee per part. Overrides the settings value; post_processing selects which one applies.
sls_post_processing_fee_sandingnumberSLS sanding post-processing fee per part. Overrides the settings value; post_processing selects which one applies.
sls_post_processing_fee_paintingnumberSLS painting post-processing fee per part. Overrides the settings value; post_processing selects which one applies.
sls_post_processing_fee_paintednumberSLS painted post-processing fee per part. Overrides the settings value; post_processing selects which one applies.
enable_batch_systembooleanEnable/disable batch calculation system (default: true)
sls_min_build_fillnumberSLS: minimum build fill as a fraction between 0 and 1. The order is billed as if it filled at least this share of a build run — 0 shares the build with other jobs, 1 bills a whole build. Ignored when enable_batch_system is false.
material_wastage_factornumberFactor for calculating material wastage (e.g. 1.10 for 10% wastage).
volume_discount_tiersarrayQuantity discount tiers, e.g. [{"minVolume": 100, "discount": 5}]. Falls back to your Global Settings tiers.

Tip: Quotes are automatically saved to your account. You can access them anytime through the quote history endpoints.

6. Printer & Quote Profiles

Configure printer settings and pricing to get accurate quotes. You can manage your default profiles in the Dashboard Slice Profiles section, which will be used automatically when you don't specify parameters in API requests.

Profile Types

  • Printer Profile - Configure your printer settings (bed size, nozzle diameter, print speed, layer height, acceleration, jerk, temperatures, etc.) to match your actual printer. Set this as your default profile in the Dashboard, and it will be used for all quote requests unless you override specific parameters.
  • Material Profile - Set material properties (filament type, density, diameter, temperatures, fan speed, flow ratio, retraction settings, pricing) for each material you use. The API will automatically use the material profile matching the filament_type you specify in the request.
  • Global Settings - Configure global quote settings like tax rate, fixed fees, energy costs, and default currency. These settings apply to all quotes unless overridden in the request.

Best Practice: Set up your default profiles in the Dashboard Slice Profiles section. This way, you can make simple quote requests without specifying all parameters, and the API will automatically use your configured defaults. You can still override any parameter per-request when needed.

How Profile Merging Works

When you make a quote request, the API merges your request parameters with your Dashboard profiles using this priority:

  1. Request Parameters - Values you explicitly provide in the API request take highest priority
  2. User Profile - If you have a user-specific profile set as default, it's used next
  3. Global Profile - If no user profile exists, the system falls back to global defaults

This means you can override just the parameters you need (e.g., only layer_height or fill_density) while keeping all other settings from your Dashboard profiles.

7. Webhooks

Receive real-time notifications when events occur in your account:

  • POST /v2/webhooks - Create a new webhook endpoint
  • GET /v2/webhooks - List all your webhooks
  • GET /v2/webhooks/{webhook_id} - Get webhook details and delivery statistics
  • PUT /v2/webhooks/{webhook_id} - Update webhook settings
  • DELETE /v2/webhooks/{webhook_id} - Remove a webhook

Supported events include: quote.completed, quote.failed, file.uploaded, file.deleted, job.status_changed, widget.added_to_cart. Webhooks include HMAC-SHA256 signatures for security verification.

Webhooks reference: payload shape, signature verification, retries and redelivery

8. Analytics & Reporting

Get insights into your API usage and quote statistics:

  • GET /v2/analytics/quotes - Get comprehensive quote statistics including total quotes, average prices, material usage trends
  • GET /v2/analytics/popular - See your most popular materials and printer configurations
  • GET /v2/analytics/cost-trends - Analyze cost trends over time (daily, weekly, or monthly grouping)
  • GET /v2/analytics/export - Export your quotes and usage data as CSV or JSON

9. Rate Limiting & Quotas

Quote3D uses rate limiting to ensure fair usage and system stability:

  • Rate limits are applied per API token and vary by endpoint
  • Rate limit information is included in response headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-RateLimit-Window
  • When rate limited, you'll receive a 429 Too Many Requests response with a Retry-After header
  • Monthly quotas for quotes and storage are based on your subscription plan
  • Limits are configurable per deployment, so read the current values rather than hard-coding them. Both the response headers above and this endpoint report them: GET /v2/quota

Best Practice: Implement exponential backoff when handling rate limit errors to avoid overwhelming the API.

10. Responses & Errors

Every JSON response uses the same envelope. A successful call returns success: true with the endpoint's payload under data, so your client can read one consistent shape everywhere. File downloads and CSV exports are the exception — they return the raw file body instead of the envelope.

{
  "success": true,
  "data": { "...": "endpoint-specific payload" }
}

Pagination & Sorting

List endpoints such as /v2/quotes and /v2/user/uploads are paginated with the limit and offset query parameters (default 50 results, maximum 100). Alongside the results they return a pagination object holding total, limit, offset, has_more, page and total_pages, so prefer has_more over recomputing the end of the list yourself. Sorting uses a single repeatable parameter in field:direction form, for example ?sort=created_at:desc&sort=total_price:asc; uploads default to newest first.

Error Responses

Failures return success: false with a human-readable error message and the matching HTTP status code. Always branch on the status code rather than on the message text, which may be reworded.

StatusMeaning
400The request body or a query parameter is invalid — a malformed field, an unsupported file format, or a model that does not fit the selected printer.
401The API token is missing, malformed, expired, or revoked.
403The token is valid but not allowed to perform this call — usually a scope restriction or a blocked IP address.
404The requested file, quote, job, or webhook does not exist or does not belong to your account.
429A rate limit was exceeded. Read the Retry-After header and back off before retrying.
500An unexpected server-side error. Safe to retry with backoff; if it persists, contact support with the timestamp.

Asynchronous quotes are different: queueing the job succeeds with 202, and a calculation that fails afterwards surfaces as a failed status with an error message on the job endpoint — not as an HTTP error. Always inspect the job status, not just the status code you got when you started it.

11. RESTful, Versioned API

  • All endpoints are versioned (e.g., /v2/)
  • Uses standard HTTP methods: GET, POST, PUT, DELETE
  • Described by an OpenAPI 3.0.3 schema you can import into your own tooling
  • Breaking changes and additions are recorded in the API changelog