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 trendsGET /v2/configThe account's enabled technologies, printers, materials with their colours (in stock or not) and pricing defaults — what the widget offers. Widget-scoped tokens may read it.
3. File Management
Upload, download, and manage your 3D model files (STL, 3MF, OBJ, STEP 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, OBJ or STEP model, or if it exceeds the platform file size limit (50 MB by default). STEP (.step/.stp) files are tessellated on the server with the same settings OrcaSlicer uses (linear deflection 0.003 mm, angular deflection 0.5 rad), all bodies of an assembly are merged, and lengths are converted to millimetres. 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 every technology.
- 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', 'SLS', 'SLM' or 'MJF' ('RESIN' is accepted as an alias for 'SLA', and 'DMLS' and 'LPBF' for 'SLM'). 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), 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. monotonic, monotonicline, 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) |
| mjf_layer_time | number | MJF: seconds per layer. HP's published build rate is exactly bed area x layer thickness / layer time, so this single number sets the whole build time; XY geometry never enters it. The 4200 datasheet states 7.55 s at a 0.08 mm layer. |
| mjf_layer_thickness | number | MJF: layer thickness (mm). HP ships 0.08 mm on the 4200/5200 series. |
| mjf_preheat_time | integer | MJF: preheat time before the build starts (minutes). Shared by every part in the build and billed pro rata. |
| mjf_cooling_time | integer | MJF: cooldown time after the build (minutes). The powder cake must cool before unpacking; shared by every part and billed pro rata. |
| mjf_power | number | MJF: average machine power draw (W), used for the energy cost line. |
| mjf_bb_multiplier | number | MJF: multiplier on the build-envelope (cake) share a part is charged. 0 = the part is not charged for the powder it displaces in the cake. |
| mjf_part_spacing | number | MJF: minimum gap between parts in the powder cake (mm). Drives how many parts fit in one build, and therefore the per-part share of preheat, cooldown and powder. |
| slm_laser_speed | number | SLM: laser scanning speed (mm/s). The vendor build-rate identity is layer thickness x scan speed x hatch distance x number of lasers, so these four fields set the scan time together. |
| slm_hatch_spacing | number | SLM: distance between adjacent scan lines (mm). |
| slm_layer_thickness | number | SLM: layer thickness (mm). Metal powder bed machines typically run 0.02-0.06 mm. |
| slm_laser_count | integer | SLM: number of lasers. A divisor on the whole scan term, exactly as in the vendor build-rate formula. It does NOT shorten recoating. |
| slm_contour_count | integer | SLM: number of contour (border) passes around each slice outline. 0 = no contour pass. |
| slm_contour_speed | number | SLM: contour pass speed (mm/s); usually slower than the hatch speed. |
| slm_jump_speed | number | SLM: laser repositioning (jump) speed between scan vectors (mm/s). |
| slm_recoat_time | number | SLM: seconds the recoater needs per layer. The vendor build-rate figure EXCLUDES recoating, so unlike SLS this value cannot be derived from a published build rate - measure it on the machine. |
| slm_preheat_time | integer | SLM: build chamber preheat and inert gas purge time (minutes), shared by every part on the plate. |
| slm_cooldown_time | integer | SLM: cooldown time after the build (minutes), shared by every part on the plate. |
| slm_power | number | SLM: average machine power draw (W), used for the energy cost line. |
| slm_part_spacing | number | SLM: minimum gap between parts on the build plate (mm). SLM parts cannot be stacked in Z - every part is welded to the plate - so this drives plate nesting and the per-build part count directly. |
| slm_build_plate_cost | number | SLM: build plate cost per run, divided among the parts in that run. 0 = not charged. |
| slm_plate_removal_cost | number | SLM: cost of separating parts from the plate (wire EDM or bandsaw) per run, divided among the parts in that run. 0 = not charged. |
| slm_stress_relief_cost | number | SLM: stress-relief furnace cycle cost per run, divided among the parts in that run. 0 = not charged. |
| slm_inert_gas_flow | number | SLM: argon or nitrogen consumption (litres per minute) during the build. 0 = not charged. |
| slm_inert_gas_cost_per_liter | number | SLM: price of one litre of inert gas, in the quote currency. 0 = not charged. |
| slm_support_removal_cost_per_cm3 | number | SLM: manual support removal cost per cm3 of support. Metal supports are load and heat bearing and are cut off, not peeled. 0 = not charged. |
| 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 the volume-based technologies (SLA, SLS, SLM, MJF) color is only applied if 'post_processing' is set to 'painting' or '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). |
| mjf_refresh_factor | number | MJF powder refresh ratio (e.g. 0.2 = 20% fresh powder). HP publishes a separate ratio per powder, measured differently from the SLS ratio for the same polymer. Omit to fall back to sls_refresh_factor. |
| mjf_fusing_agent_ml_per_cm3 | number | MJF: fusing agent consumed per cm3 of fused part volume (mL/cm3). Shop measurement; 0 leaves the agent cost out of the quote. |
| mjf_detail_agent_ml_per_cm2 | number | MJF: detailing agent consumed per cm2 of fused boundary area (mL/cm2). Shop measurement; 0 leaves it out. |
| mjf_agent_cost_per_liter | number | MJF: agent price per litre in the quote currency. 0 disables the agent cost line. |
| metal_powder_loss_factor | number | SLM: sieving and handling loss as a fraction of part plus support volume (0.05 = 5%). Unused metal powder is sieved and reused, so - unlike SLS and MJF - the surrounding powder is NOT billed. |
| 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, one of TRY, USD, EUR, GBP, JPY, CNY, RUB, CAD, AUD, CHF, SEK, NOK, DKK, SGD, HKD, NZD, MXN, BRL, INR; case does not matter. Defaults to your dashboard preference. |
| tax_rate | number | Tax rate percentage (0-100) |
| fixed_fee | number | Fixed fee per quote |
| minimum_price | number | Minimum quote price: a pre-tax floor for the whole quote. A cheaper quote is raised to it, a dearer one is unchanged. Defaults to your minimum price for the quote's technology; 0 = none. |
| energy_cost_per_kwh | number | Energy cost per kWh |
| hollowing | string | SLA, SLS and MJF specific: 'solid', '2mm' or '3mm'. For SLA it defaults to '2mm' when SLA hollowing is enabled in your settings; for SLS and MJF the same applies to their own setting. Ignored for FDM, where the cavity is set by fill_density, and for SLM, where a sealed cavity would trap powder that cannot be evacuated. SLS and MJF parts are hollowed WITHOUT an escape hole: the unfused powder stays inside, is charged at powder bed density instead of solid density, and is not recoverable. |
| post_processing | string | Volume-based technologies (SLA, SLS, SLM, MJF): 'standard', 'sanding', 'painting' or 'painted' (Default: 'standard'). The value is recorded on the quote and priced from the per-technology post-processing fees in Global Settings. SLM fees are higher across the band because even 'standard' covers cutting the part off the build plate and cleaning the surface. |
| 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. |
| mjf_post_processing_fee_standard | number | MJF: fee applied when post_processing is 'standard'. |
| mjf_post_processing_fee_sanding | number | MJF: fee applied when post_processing is 'sanding'. |
| mjf_post_processing_fee_painting | number | MJF: fee applied when post_processing is 'painting'. |
| mjf_post_processing_fee_painted | number | MJF: fee applied when post_processing is 'painted'. |
| slm_post_processing_fee_standard | number | SLM: fee applied when post_processing is 'standard'. |
| slm_post_processing_fee_sanding | number | SLM: fee applied when post_processing is 'sanding'. |
| slm_post_processing_fee_painting | number | SLM: fee applied when post_processing is 'painting'. |
| slm_post_processing_fee_painted | number | SLM: fee applied when post_processing is 'painted'. |
| mjf_min_build_fill | number | MJF: minimum share of the build an order pays for. 0 = the build is shared with other orders, 1 = the order pays for the whole build. |
| 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 webhookPOST /v2/webhooks/{webhook_id}/deliveries/{delivery_id}/resend- Send a past delivery again, for example after fixing your endpoint
Supported events include: quote.completed, quote.failed, file.uploaded, file.deleted, job.status_changed, widget.added_to_cart, usage.alert. 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. Catalog & Stock
Manage the account's own printers, materials, colours, colour stock, pricing and technologies with a server token. The widget reads the same catalogue, so a change reaches the quote form at once. Widget-scoped tokens are refused, and these calls do not count against the monthly request quota:
GET /v2/store/catalog- Everything the account offers, with readiness per technology and colours running lowGET /v2/store/catalog/schema- The dashboard's printer, material and pricing forms with bounds, units and help texts in the requested localePOST /v2/store/catalog/adopt- Copy global printers and materials into the account, with the colours, price and starting stock you choosePOST /v2/store/catalog/materials- Create a material, optionally starting from a global oneGET · PATCH · DELETE /v2/store/catalog/materials/{id}- Read, change or delete one material, including its stock settingsPUT /v2/store/catalog/materials/{id}/colors- Replace a material's colour list; stock of existing colours is keptGET · PATCH · DELETE /v2/store/catalog/printers/{id}- Read, change or delete one printerGET · PATCH · DELETE /v2/store/catalog/pricing- Read, change or reset the pricing settings; changing currency changes the account currency without converting amountsGET · PUT /v2/store/catalog/technologies- Which technologies the plan allows and which are onGET · POST /v2/store/stock/movements- Record a purchase, count or waste, and list the stock historyPOST /v2/store/stock/orders- Take, give back or check the material of a paid order, at most once per quote
PATCH bodies carry values and updated_at. values use the same snake_case field names as the catalogue listing (a name the form does not have is refused with 400); if the profile changed since you read it, the call answers 409 with error_key stale.
10. 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
- Your plan sets a quote allowance, which resets each billing period, and a storage allowance, which never resets and frees up only when files are deleted
- 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.
11. Responses & Errors
Successful responses come in two shapes. Quote, job, stored-quote detail, webhook, analytics, usage, quota and config calls wrap their payload as success: true with the result under data. File, upload ID, user, uploads, quotes list, printability and Catalog & Stock calls return their fields at the top level. The API reference shows the exact schema of each call. File downloads and CSV exports return the raw file body.
{
"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
Every failure has the same shape: a detail list naming the parameter or field (loc, msg, code), an error_code such as AUTH_001, an error_summary, and where useful recovery_suggestions and documentation_url. Branch on the HTTP status and error_code rather than on the 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: a scope restriction, an origin or IP address not on the token's list (AUTH_004), or a plan allowance that is used up (RATE_002, with the X-Quota-* headers). |
| 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.
12. 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