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/userRetrieve your account details, plan, and monthly allowances — this is where quotes_used, quotes_limit, storage_used, storage_limit and reset_date liveGET /v2/user/uploadsList all of the files you've uploaded to your account. These are listed from newest to oldest.GET /v2/quotaGet 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 timeGET /v2/usageGet 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-id— Get 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/file— Upload 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_idDELETE /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}/async— Alternative 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/quotes— Retrieve all your quote history with pagination supportGET /v2/quotes/{quote_id}— Get detailed information about a specific quoteDELETE /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
| Parameter | Type | Description |
|---|---|---|
| technology | string | Optional. 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_id | string | Optional. ID of a specific printer to use instead of the default printer. |
| quantity | number | Optional. 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.
| Parameter | Type | Description |
|---|---|---|
| nozzle_diameter | number | FDM nozzle diameter (mm). Drives extrusion width, so it changes both print time and material use. |
| support_material | boolean | Enable support generation. When omitted, the profile value is used. |
| bed_size_x | number | Build volume X dimension (mm) |
| bed_size_y | number | Build volume Y dimension (mm) |
| bed_size_z | number | Build volume Z dimension (mm) |
| print_speed | number | Default print speed (mm/s) |
| max_print_speed | number | Maximum print speed (mm/s) |
| travel_speed | number | Travel speed (mm/s) |
| first_layer_speed | number | First layer speed (mm/s) |
| layer_height | number | Layer height (mm) |
| min_layer_height | number | Minimum layer height (mm) |
| max_layer_height | number | Maximum layer height (mm) |
| perimeters | number | Number of perimeters/walls |
| top_solid_layers | number | Top solid layers count |
| bottom_solid_layers | number | Bottom solid layers count |
| min_wall_count | number | Minimum wall count |
| max_wall_count | number | Maximum wall count |
| fill_density | number | Infill density (0-100%) |
| infill_pattern | string | Infill 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_angle | number | Support overhang angle (degrees) |
| support_density | number | Support density (0-100%) |
| brim_enabled | boolean | Enable brim generation for FDM quotes |
| brim_width | number | Brim width in millimeters when brim is enabled |
| acceleration_print | number | Print acceleration (mm/s²) |
| acceleration_travel | number | Travel acceleration (mm/s²) |
| acceleration_retraction | number | Retraction acceleration (mm/s²) |
| acceleration_outer_wall | number | Outer wall acceleration (mm/s²). 0 uses acceleration_print. |
| acceleration_inner_wall | number | Inner wall acceleration (mm/s²). 0 uses acceleration_print. |
| acceleration_sparse_infill | number | Sparse infill acceleration (mm/s²). 0 uses acceleration_print. |
| acceleration_solid_infill | number | Solid infill acceleration (mm/s²). 0 uses acceleration_print. |
| acceleration_top_surface | number | Top surface acceleration (mm/s²). 0 uses acceleration_print. |
| acceleration_bridge | number | Bridge acceleration (mm/s²). 0 uses acceleration_print. |
| acceleration_first_layer | number | First layer acceleration (mm/s²). 0 uses acceleration_print. |
| retraction_minimum_travel | number | Travel moves shorter than this do not retract (mm). Reference default 1. |
| z_hop_mm | number | Nozzle lift before a travel move (mm). 0 disables it. Reference default 0.4. |
| bed_exclude_x | number | Unusable bed edge margin on X (mm), removed from the packing area. |
| bed_exclude_y | number | Unusable bed edge margin on Y (mm), removed from the packing area. |
| jerk_print | number | Print jerk (mm/s) |
| jerk_travel | number | Travel jerk (mm/s) |
| jerk_retraction | number | Retraction jerk (mm/s) |
| min_hotend_temp | number | Minimum hotend temperature (°C) |
| max_hotend_temp | number | Maximum hotend temperature (°C) |
| min_bed_temp | number | Minimum bed temperature (°C) |
| max_bed_temp | number | Maximum bed temperature (°C) |
| hourly_cost | number | Machine hourly cost |
| SLA SPECIFIC | ||
| sla_exposure_time | number | SLA: Exposure time per layer (seconds) |
| sla_bottom_exposure_time | number | SLA: Baseline exposure time (seconds) |
| sla_bottom_layer_count | number | SLA: Number of bottom layers |
| sla_lift_distance | number | SLA: Lift distance (mm) |
| sla_lift_speed | number | SLA: Lift speed (mm/min) |
| sla_retract_speed | number | SLA: Retract speed (mm/min) |
| sla_cleaning_cost | number | SLA: Fixed cleaning cost per print (IPA, consumables) |
| sla_pad_enabled | boolean | SLA: print the model on a pad/raft. Off by default; pad resin is counted with support material. |
| sla_pad_wall_thickness | number | SLA: pad wall thickness in mm. Alias: sla_pad_height. |
| sla_pad_wall_height | number | SLA: pad wall height in mm (raised rim around the pad cavity). |
| sla_pad_wall_slope | number | SLA: pad wall slope in degrees (45-90). The pad tapers downward at this angle. |
| sla_pad_brim_size | number | SLA: pad brim size in mm. Alias: sla_pad_expansion. |
| sla_pad_max_merge_distance | number | SLA: support feet closer than this are merged into one pad island (mm). |
| sla_support_head_front_diameter | number | SLA: support head front (tip) diameter in mm. |
| sla_support_head_penetration | number | SLA: how deep the support head sinks into the model surface (mm). |
| sla_support_head_width | number | SLA: support head rod length in mm. |
| sla_support_pillar_diameter | number | SLA: support pillar diameter in mm. Drives most of the support resin volume. |
| sla_support_base_diameter | number | SLA: support pillar base (foot) diameter in mm. |
| sla_support_base_height | number | SLA: support pillar base (foot) height in mm. |
| sla_support_object_elevation | number | SLA: 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_angle | number | SLA: bridge slope in degrees used when routing supports. Not the same as support_overhang_angle. |
| sla_support_max_pillar_link_distance | number | SLA: pillars farther apart than this are not cross-linked (mm). |
| sla_support_max_bridge_length | number | SLA: longest sideways bridge a support head may take to reach the plate (mm). |
| sla_support_max_bridges_on_pillar | number | SLA: how many bridges a single pillar accepts. |
| sla_support_points_density | number | SLA: 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_compensation | number | SLA: 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_width | number | SLA: Contours narrower than this are left alone so thin features are not erased. Reference value 0.2. |
| sla_faded_layers | number | SLA: 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_speed | number | SLS: Laser speed (mm/s) |
| sls_hatch_spacing | number | SLS: Hatch spacing (mm) |
| sls_layer_thickness | number | SLS: Layer thickness (mm) |
| sls_layer_recoat_time | number | SLS: Layer recoat time (seconds) |
| sls_preheat_time | number | SLS: Preheat time (minutes) |
| sls_cooling_time | number | SLS: Cooling time (minutes) |
| sla_light_off_delay | number | SLA: Light-off delay for each layer (seconds). |
| sla_transition_layer_count | number | SLA: Number of transition layers. |
| sla_drain_holes | array | SLA: Drainage holes configuration to prevent suction cups. |
| sls_bb_multiplier | number | SLS: 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_count | number | SLS: number of contour (border) passes the laser traces around each slice outline. 0 disables the contour pass. |
| sls_contour_speed | number | SLS: contour scan speed in mm/s. 0 means the contour is scanned at sls_laser_speed. |
| sls_jump_speed | number | SLS: 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_spacing | number | SLS: 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_flow | number | Maximum 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.
| Parameter | Type | Description |
|---|---|---|
| filament_type | string | Filament type (PLA, ABS, PETG, etc.) |
| color | string | Color name (e.g., 'White', 'Black', '#FFFFFF'). Note: For SLA/SLS technologies, color is only applied if 'post_processing' is set to 'painted'. |
| density | number | Material density (g/cm³) |
| diameter | number | Filament diameter (mm) |
| filament_flow_ratio | number | FDM 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_density | number | SLS: Bulk density of loose powder in g/cm³. Used for reusable powder and refresh calculations. |
| temperature | number | Print temperature (°C) |
| print_temp_min | number | Minimum print temperature (°C) |
| print_temp_max | number | Maximum print temperature (°C) |
| bed_temperature | number | Bed temperature (°C) |
| bed_temp_min | number | Minimum bed temperature (°C) |
| bed_temp_max | number | Maximum bed temperature (°C) |
| fan_speed | number | Fan speed (0-100%) |
| min_fan_speed | number | Minimum fan speed (0-100%) |
| retraction_distance | number | Retraction distance (mm) |
| retraction_speed | number | Retraction speed (mm/s) |
| slow_down_min_speed | number | Lower speed bound for layer cooling (mm/s). Reference default 20. |
| retraction_minimum_travel | number | Overrides the printer value for this material (mm). |
| z_hop_mm | number | Overrides the printer value for this material (mm). |
| price_per_kg | number | Price per kilogram |
| price_per_gram | number | Price per gram |
| support_cost_multiplier | number | Support material cost multiplier |
| sls_refresh_factor | number | SLS powder refresh rate ratio (e.g. 0.3 = 30% fresh powder). |
| max_volumetric_flow | number | Material specific volumetric flow limit in mm³/s. |
| min_layer_time | number | Minimum 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').
| Parameter | Type | Description |
|---|---|---|
| currency | string | Currency code (USD, TRY, EUR, GBP, JPY, CNY, RUB). Defaults to your dashboard preference. |
| tax_rate | number | Tax rate percentage (0-100) |
| fixed_fee | number | Fixed fee per quote |
| energy_cost_per_kwh | number | Energy cost per kWh |
| hollowing | string | SLA/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_processing | string | SLA/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_standard | number | SLA standard post-processing fee per part. Overrides the settings value; post_processing selects which one applies. |
| sla_post_processing_fee_sanding | number | SLA sanding post-processing fee per part. Overrides the settings value; post_processing selects which one applies. |
| sla_post_processing_fee_painting | number | SLA painting post-processing fee per part. Overrides the settings value; post_processing selects which one applies. |
| sla_post_processing_fee_painted | number | SLA painted post-processing fee per part. Overrides the settings value; post_processing selects which one applies. |
| sls_post_processing_fee_standard | number | SLS standard post-processing fee per part. Overrides the settings value; post_processing selects which one applies. |
| sls_post_processing_fee_sanding | number | SLS sanding post-processing fee per part. Overrides the settings value; post_processing selects which one applies. |
| sls_post_processing_fee_painting | number | SLS painting post-processing fee per part. Overrides the settings value; post_processing selects which one applies. |
| sls_post_processing_fee_painted | number | SLS painted post-processing fee per part. Overrides the settings value; post_processing selects which one applies. |
| enable_batch_system | boolean | Enable/disable batch calculation system (default: true) |
| sls_min_build_fill | number | SLS: 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_factor | number | Factor for calculating material wastage (e.g. 1.10 for 10% wastage). |
| volume_discount_tiers | array | Quantity 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:
- Request Parameters - Values you explicitly provide in the API request take highest priority
- User Profile - If you have a user-specific profile set as default, it's used next
- 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 endpointGET /v2/webhooks- List all your webhooksGET /v2/webhooks/{webhook_id}- Get webhook details and delivery statisticsPUT /v2/webhooks/{webhook_id}- Update webhook settingsDELETE /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 trendsGET /v2/analytics/popular- See your most popular materials and printer configurationsGET /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.
| Status | Meaning |
|---|---|
| 400 | The 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. |
| 401 | The API token is missing, malformed, expired, or revoked. |
| 403 | The token is valid but not allowed to perform this call — usually a scope restriction or a blocked IP address. |
| 404 | The requested file, quote, job, or webhook does not exist or does not belong to your account. |
| 429 | A rate limit was exceeded. Read the Retry-After header and back off before retrying. |
| 500 | An 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