Calculate prices
POST/api/v1/prices
Overview
Price inspected models at chosen sizes and quantities. Returns item prices and any repair fee in USD cents, without shipping or tax. Nothing is saved or charged. Business accounts get a fixed rate per cycle (3rd to 2nd, UTC); paid volume counts by calendar month after a two-day buffer. A failed or action_required model returns pricing_unavailable.
Requires models:read.
Parameters
Idempotency-Key header · optional
Account, method and path scoped retry key, retained for 24 hours from first use. Same body replays the original successful status and body. A changed body returns 409 idempotency_key_reused; an in-flight request returns 409 idempotency_request_in_progress with Retry-After. Retry transient failures with the same key and body.
string
Request body
application/json
items array · required
One to 50 model/print-size entries, up to 1,000 prints in total. Matching model_id and longest_dimension_mm values merge in first-appearance order. Combined quantity must not exceed 500 per model and size; different sizes remain separate.
items item fields
model_id string · required
Immutable model ID: MD- followed by eight uppercase Crockford Base32 characters. Use this same ID in the website, URLs and API; pass it unchanged.
Min length: 11 · Max length: 11
quantity integer · required
Printed models at this size, from 1 to 500. The same limit applies after matching model/size entries are merged.
Minimum: 1 · Maximum: 500
longest_dimension_mm number · required
Longest bounding-box dimension in millimeters, 30–200 inclusive. Fractional values are accepted. Uniformly scale all axes. At model creation this is the default and inspection reference size; each pricing/quote item explicitly selects its own size. Callers convert other units to millimeters.
Minimum: 30 · Maximum: 200
Responses
Ephemeral manufacturing prices.
200 response
{
"currency": "usd",
"pricing_version": "pv_support_v1_ebcc9b8b64eb5043",
"items": [
{
"model_id": "MD-739YQ549",
"longest_dimension_mm": 100,
"quantity": 2,
"volume": {
"value_mm3": 10000,
"status": "estimated"
},
"estimated_weight_g": 12,
"mesh_check_passed": true,
"unit_price": 2460,
"subtotal": 4920,
"repair": {
"required": false,
"applied": false,
"reason": null,
"status": "not_applied",
"fee": 0,
"covered_by_order_id": null
},
"file_revision": 1,
"support_volume": {
"value_mm3": 0,
"status": "estimated"
},
"minimum_total_volume": {
"value_mm3": 10000,
"status": "estimated"
},
"support_build_direction": "+y"
}
],
"subtotal": 4920,
"estimated_production_business_days": null,
"service_fees": {
"mesh_repair": 0,
"model_repair": 350
}
}Returns the Price calculation object.
Response headers
X-Request-IDRequest identifier for support. Send X-Request-ID with 8–64 ASCII letters, digits or hyphens to reuse that value; otherwise the server generates a UUID4 hex value. Include the returned X-Request-ID in support requests. Do not put secrets or account IDs in this value.
Idempotent-ReplayedPresent when the original successful response is replayed.
Errors
| HTTP | Code | What to do |
|---|---|---|
| 400 Bad Request | invalid_argument | A field, query parameter or header is invalid. Fix the field named in details, then send the request again. |
| 400 Bad Request | model_not_found | No model with this ID exists in the account, or it was deleted. Check the ID. |
| 400 Bad Request | pricing_unavailable | The model cannot be priced, usually because processing failed. Read the model's status_reasons; repeating the request does not rerun inspection. |
| 401 Unauthorized | unauthenticated | The API key is missing, invalid or revoked. Send a valid business API key in Authorization: Bearer. |
| 403 Forbidden | permission_denied | The key lacks the endpoint's scope, or payments lack spending consent. Check the scope listed on the endpoint. |
| 409 Conflict | idempotency_key_reused | This Idempotency-Key was already used with a different body. Retry the original body, or use a new key for a new operation. |
| 409 Conflict | idempotency_request_in_progress | A request with this Idempotency-Key is still running. Wait Retry-After seconds, then retry the same key and body. |
| 409 Conflict | model_not_ready | The model is still processing. Wait until its status is ready, then retry. |
| 413 Content Too Large | request_too_large | The JSON body is over this endpoint's size limit. Send a smaller body. |
| 415 Unsupported Media Type | unsupported_media_type | The body is not JSON. Send Content-Type: application/json. |
| 429 Too Many Requests | resource_exhausted | A rate or account limit was reached. Wait at least Retry-After seconds, then retry. |
| 500 Internal Server Error | internal | The server failed unexpectedly. Retry with backoff; contact support with X-Request-ID if it persists. |
| 503 Service Unavailable | unavailable | A required service is briefly unavailable. Retry with backoff, reusing the same Idempotency-Key. |
API v1 preview