API reference

Base URL
https://sinter.systems
Format
JSON; POST /v1/quotes is multipart/form-data.

Account

GET/v1/me

API key

The customer account and the key in use.

Returns · 200

customerThe account.
keyname, prefix, scopes of the key in use.
authHow the call was authenticated.

Errors

401Missing, wrong or revoked key.

POST/v1/billing/portal

Signed-in person only

A link to the card payment portal: saved cards and receipts.

  • API keys get 403.

Returns · 200

urlThe portal.

Errors

404No billing account: the account hasn’t paid by card yet, or the portal isn’t set up.

Device login

POST/v1/device/start

Public

Starts a device login.

Body · application/json · optional

NameTypeNotes
namestringWhat the agent or script is; shown to the person approving. Default "Agent". ≤ 80 chars.
scopesarray of quotes | orders | purchasequotes, orders, purchase. Default quotes and orders. purchase only if the person approving allows purchases. ≥ 1 item.

Returns · 200

device_codeSecret. Used to poll for the key.
user_codeThe code the person approves.
verification_urlWhere the person approves it.
verification_url_completeThe same page with the code filled in.
expires_inSeconds until the codes expire (600).
intervalSeconds between polls.

Errors

429Too many logins started.

POST/v1/device/token

Public

Returns the API key once the person has approved the device login.

Body · application/json

NameTypeNotes
device_code requiredstring≤ 200 chars.

Returns · 200

api_keyThe key. Shown once.
keyname, prefix, scopes. scopes are what the person granted, which may be fewer than asked for.

Errors

400 authorization_pendingNot approved yet. Poll again after interval seconds.
400 slow_downPolling too fast. Wait longer between polls.
400 access_deniedDenied. Final.
400 expired_tokenExpired. Final.
400 invalid_grantUnknown or already used code. Final.
429Too many polls.

GET/v1/device/{user_code}

Signed-in person only

A pending device login, for the /device page.

  • API keys get 403.

Path

NameTypeNotes
user_code requiredstring

Returns · 200

scopes_supportedquotes, orders, purchase.

POST/v1/device/{user_code}/approve

Signed-in person only

Approves a device login.

  • API keys get 403.

Path

NameTypeNotes
user_code requiredstring

Body · application/json · optional

NameTypeNotes
scopesarray of quotes | orders | purchaseA subset of the scopes asked for. Left out: all of them. ≥ 1 item.

Returns · 200

Errors

409Already approved or denied.

POST/v1/device/{user_code}/deny

Signed-in person only

Denies a device login.

  • API keys get 403.

Path

NameTypeNotes
user_code requiredstring

Returns · 200

Errors

409Already approved or denied.

Connected apps

GET/v1/oauth/requests/{handle}

Signed-in person only

A pending MCP connection request, for the /oauth/consent page.

  • API keys get 403.
  • The first account to open a request holds it.

Path

NameTypeNotes
handle requiredstring

Returns · 200

clientid, name, claimed_uri (unverified), verified_domain (only for a client named by its metadata document URL).
redirect_uriWhere the browser returns after the decision.
requested_scopesWhat the client asked for.
scopesRequested; once approved, granted.
statuspending, approved or denied.
expires_atUnix time. 10 minutes after the request.

Errors

403Opened by another account.
404Unknown or expired.

POST/v1/oauth/requests/{handle}/approve

Signed-in person only

Approves an MCP connection request.

  • API keys get 403.

Path

NameTypeNotes
handle requiredstring

Body · application/json · optional

NameTypeNotes
scopesarray of quotes | orders | purchaseA subset of the scopes asked for. Left out: the asked-for scopes other than purchase. ≥ 1 item.

Returns · 200

redirect_toThe client’s redirect URI with the code.

Errors

400Scope not asked for, or none approved.
403Opened by another account.
404Unknown or expired.
409Already approved or denied.

POST/v1/oauth/requests/{handle}/deny

Signed-in person only

Denies an MCP connection request.

  • API keys get 403.

Path

NameTypeNotes
handle requiredstring

Returns · 200

redirect_toThe client’s redirect URI with error=access_denied.

Errors

403Opened by another account.
404Unknown or expired.
409Already approved or denied.

GET/v1/oauth/grants

Signed-in person only

Connected apps: the account’s MCP connections.

  • API keys get 403.

Returns · 200

grants[]id, client_id, client_name, scopes, created_at, last_used_at, revoked_at.

DELETE/v1/oauth/grants/{grant_id}

Signed-in person only

Revokes an MCP connection and its tokens.

  • API keys get 403.

Path

NameTypeNotes
grant_id requiredstring

Returns · 200

Errors

404Unknown grant, or another account’s.

API keys

GET/v1/keys

Signed-in person only

The account’s API keys.

  • API keys get 403.

Returns · 200

keys[]name, prefix, scopes. Never the secret.
scopes_supportedquotes, orders, purchase.

POST/v1/keys

Signed-in person only

Creates an API key. The secret is in this response only.

  • API keys get 403.

Body · application/json · optional

NameTypeNotes
namestringDefault "API key". ≤ 80 chars.
scopesarray of quotes | orders | purchasequotes, orders, purchase. Default quotes and orders. purchase is Allow purchases. ≥ 1 item.

Returns · 201

DELETE/v1/keys/{key_id}

Signed-in person only

Revokes an API key.

  • API keys get 403.

Path

NameTypeNotes
key_id requiredstring

Returns · 200

Materials

GET/v1/materials

Public

Materials, colors, print settings and lead times.

Returns · 200

materials[].idPLA+, PLA-CF, PETG, PETG-CF, ASA, ASA-CF, PC, PC-CF, TPU, TPU-CF, Nylon, Nylon-CF, PPA-CF, PPS-CF, Custom.
materials[].availablefalse: out of stock; new quotes in it are refused.
materials[].lead_daysThe material’s lead days in the default color (the first of colors), already included in a quote’s ship_by. PLA+ and PETG in black or white ship without material lead time; other materials and colours add one day.
materials[].same_day_colorsThe colors the material ships in without lead days; empty when every color adds one. A color change re-dates a quote.
materials[].customtrue: any other material, named in material_note.
speeds[]speed, label, days and optional asap_offset_days of each lead time. Economy uses speed week, days null and asap_offset_days 7.
colorsFilament colors; the first is the default.
custom_colorThe color to send with color_note for any other color (Custom); Sinter reviews it. null when not offered.
print_settings[]Settings a quote may change: name, label, type (float, int, choice or face), min and max or choices, unit; automatic: true when Sinter chooses it for the part if left out; range_by and ranges when the range follows another setting. Left out, a setting is Standard (or Automatic). The ranges are the printers’ own; see Materials.

Quotes

POST/v1/quotes

Scope: quotes

Uploads a model and starts a quote.

  • Returns status received, or quoted at once. Until quoted, needs_review, engineering or failed, poll GET /v1/quotes/{quote_id} every 5 to 10 seconds.
  • Quoted prices are binding.

Headers

NameTypeNotes
Idempotency-KeystringAny unique string up to 200 characters. A retried upload returns the same quote.

Body · multipart/form-data

NameTypeNotes
file requiredfileSTEP, STL, OBJ or 3MF, up to 50 MB.
materialPLA+ | PLA-CF | PETG | PETG-CF | ASA | ASA-CF | PC | PC-CF | TPU | TPU-CF | Nylon | Nylon-CF | PPA-CF | PPS-CF | CustomDefault "PLA+".
material_notestringRequired for Custom: the material wanted. ≤ 320 chars.
quantityintegerDefault 1. 1–100.
unitsmm | cm | inWhat an STL or OBJ was drawn in. Ignored for STEP and 3MF. Default "mm".
colorstringOne of the colors in /v1/materials. ≤ 40 chars.
color_notestringRequired for the Custom color: the color wanted. Sinter reviews the quote. ≤ 320 chars.

Returns · 202

Errors

400Refused, for example a material out of stock. See detail.
413File too large.
415Unsupported file type.
422Invalid input.
429A limit was reached. Wait Retry-After seconds.

GET/v1/quotes

Scope: quotes

The account’s quotes, newest first.

  • limit: 1–100 (default 50). Pass next_cursor as cursor to read the next page; null means the last page.

Path

NameTypeNotes
limitinteger1–100.
cursorstring≤ 64 chars.

Returns · 200

GET/v1/quotes/{quote_id}

Scope: quotes

One quote.

Path

NameTypeNotes
quote_id requiredstring

Returns · 200

statusSee Statuses and errors.
options[]One per lead time: speed, label, days, ship_by, total_cents, unit_cents, available, note. days is null for current options: use ship_by as the Pacific calendar day it falls on. Economy has asap_offset_days: 7, relative to the Default ship date; material lead time is already included.
tierinstant, assisted or engineered.
file_idThe file the quote was made from: the same for every quote of the same file (its requotes, or the file uploaded again under any name), different for another file even under the same name. Not comparable across accounts.
partdimensions_mm: the part’s size as uploaded, in its own axes.
ship_date_pendingtrue until Sinter confirms the ship date of an assisted quote. ship_by is null until then.
estimate_centsStatus engineering only: an estimate. options is empty.
estimate_pendingStatus engineering only: true while estimate_cents updates after a change.
request_statusEngineering review requests: draft (not sent; editable with requote), open (sent; editable with requote), accepted or rejected. null otherwise.
unitsmm, cm or in for STL and OBJ; null for STEP and 3MF.
print_settingsChanges from Standard, by name. {} for none.
manufacturabilityStructured analysis: analysis_id, version, status, checked, not_assessed, review_required, review_completed and findings. Read again after changes; screened is not a full DFM certification.
flagsManufacturability findings: code, level (block or warning), message and features. Warnings can appear on quoted parts. Read alongside status and tier; an empty array is not a guarantee of suitability.
progressWhile received or processing: stage (queued, checking, processing), fraction (0 to 1), ahead (quotes queued before this one).
review_urlThe quote page, with a 3D preview. Anyone with the link can see it; only the account that owns the quote, signed in, can change, pay for or cancel it there.
deliverymethod (courier or shipping), city, fee_cents and, for shipping, transit_days, once delivery is priced.
delivery_requiredtrue: accept needs a delivery price.

Errors

404Not found, or another account’s quote.

POST/v1/quotes/{quote_id}/requote

Scope: quotes

Changes material, quantity, units, color or print settings before payment.

  • Status received or processing: changed in place, same id. A quantity, color or Custom material name change keeps the work under way; a material, units or print_settings change starts it again.
  • Status engineering with request_status draft or open: changed in place, same id, still an engineering request. A material or print_settings change updates estimate_cents; estimate_pending is true until then. A change that no longer needs review, or a units change, returns a new quote and replaces this one.
  • request_status accepted or rejected: a new request with its own id. The accepted quote stays payable as issued.
  • Any other status: a new quote with its own id. An issued engineered quote stays payable as issued.
  • Use the id returned. Returns status quoted, received or engineering; poll.
  • Also refreshes an expired quote. There is no daily quote-count limit.

Path

NameTypeNotes
quote_id requiredstring

Body · application/json

NameTypeNotes
materialPLA+ | PLA-CF | PETG | PETG-CF | ASA | ASA-CF | PC | PC-CF | TPU | TPU-CF | Nylon | Nylon-CF | PPA-CF | PPS-CF | Custom
material_notestringCustom only. Kept when left out. ≤ 320 chars.
quantityinteger1–100.
unitsmm | cm | inUnchanged when left out.
colorstringUnchanged when left out. ≤ 40 chars.
color_notestringCustom color only. Kept when left out. ≤ 320 chars.
print_settingsobjectSettings by name from /v1/materials print_settings, within their ranges. {} resets them to Standard (or Automatic). Unchanged when left out.

Returns · 201

Errors

400Refused, for example a setting out of range. See detail.
409Paid, or the file is no longer stored.
429A limit was reached. Wait Retry-After seconds.

POST/v1/quotes/{quote_id}/claim

Scope: quotes

Moves a quote made without an account to this account.

  • The quote gets a new review_url. The old link stops working.

Path

NameTypeNotes
quote_id requiredstring

Body · application/json

NameTypeNotes
token requiredstringThe last part of the guest quote’s review_url. ≤ 200 chars.

Returns · 200

Errors

404Token doesn’t match.
409Another account has the quote, or a card payment is in progress.

POST/v1/quotes/{quote_id}/request

Scope: quotes

Sends a draft engineering request (request_status draft) to Sinter’s engineers.

  • Nothing is reviewed until it is sent. Send only when the user asks; let them change it with requote first.
  • Returns the quote with request_status open. Sending one already sent returns it unchanged.
  • An unsent draft expires a day after pricing. A sent request expires 14 days after sending unless issued.

Path

NameTypeNotes
quote_id requiredstring

Returns · 200

Errors

409Not status engineering, or the draft expired. Requote it.

POST/v1/quotes/{quote_id}/cancel

Scope: quotes

Withdraws a quote in status engineering.

Path

NameTypeNotes
quote_id requiredstring

Returns · 200

Errors

409Any other status. Not withdrawn.

POST/v1/quotes/{quote_id}/delivery

Scope: quotes

Prices delivery to an address: local courier, or carrier shipping if the user chooses it.

  • Local courier inside the San Francisco Bay Area delivery area.
  • Outside it, or when the courier can’t take the address: 422 carrier_shipping_available. Ask the user. Only if they choose carrier shipping, send the address again with accept_carrier true.
  • The quote’s delivery then shows method, city, fee_cents and, for shipping, transit_days. The address is not returned.
  • The fee is charged at checkout as its own line, and doesn’t change after payment.
  • Every quote needs a delivery price before it can be paid. A courier price is good for 24 hours.

Path

NameTypeNotes
quote_id requiredstring

Body · application/json

NameTypeNotes
name requiredstring≤ 80 chars.
phone requiredstring≤ 30 chars.
street requiredstring≤ 120 chars.
unitstring≤ 60 chars.
city requiredstring≤ 80 chars.
state requiredstringTwo letters. /^[A-Za-z]{2}$/.
zip requiredstring/^\d{5}(-\d{4})?$/.
country"US"Default "US".
notesstringFor the courier. ≤ 280 chars.
accept_carrierbooleantrue only after the user chooses carrier shipping. Default false.

Returns · 200

Errors

422 carrier_shipping_availableOutside the courier area. Ask the user, then send again with accept_carrier true.
422 couriers_unavailableNo courier right now. Try again later.
422 outside_delivery_areaNo delivery to that address.
422 outside_shipping_areaNo carrier shipping to that address.
422 shipping_review_requiredHeld for review by Sinter.
422 delivery_invalidCheck the address and phone.
502Courier service error. Retry.
503Delivery is not available.

POST/v1/quotes/{quote_id}/accept

Scope: purchase

Accepts a quote at one lead time. This is a purchase.

  • Only with Allow purchases on for the key or agent, and the user’s approval of this purchase. See Rules for agents.
  • Pick an option whose available is true.
  • Every order is paid by card first: 402 payment_required with checkout_url. A person pays there; the quote becomes accepted once payment completes.
  • A quote already paid: 200 and the order.
  • Needs a delivery price: send delivery here, or call POST /v1/quotes/{quote_id}/delivery first.

Path

NameTypeNotes
quote_id requiredstring

Headers

NameTypeNotes
Idempotency-KeystringRequired. The same key with the same request returns the first answer for 24 hours. A repeated 402 with an expired checkout link returns a new link.

Body · application/json · optional

NameTypeNotes
speedasap | weekasap (Default) or week (Economy). Historical speed names are not accepted for new purchases. Default "week".
deliveryobjectPrices delivery in the same call; same fields as POST /v1/quotes/{quote_id}/delivery.
name requiredstring≤ 80 chars.
phone requiredstring≤ 30 chars.
street requiredstring≤ 120 chars.
unitstring≤ 60 chars.
city requiredstring≤ 80 chars.
state requiredstring/^[A-Za-z]{2}$/.
zip requiredstring/^\d{5}(-\d{4})?$/.
country"US"Default "US".
notesstring≤ 280 chars.
accept_carrierbooleanDefault false.

Returns · 200

Errors

402 payment_requiredcheckout_url: give it to the user.
403The key lacks the purchase scope.
409Expired, held for review, status engineering, the option is no longer available, or delivery not priced.
409 ship_date_changedThe Default ship date moved to a later day; ship_by has the new one. Accept again only if the user agrees.
422 carrier_shipping_availableAs for POST /v1/quotes/{quote_id}/delivery.
428No Idempotency-Key.

Orders

GET/v1/orders

Scope: orders

The account’s accepted orders, newest first.

  • limit: 1–100 (default 50). Pass next_cursor as cursor to read the next page; null means the last page.

Path

NameTypeNotes
limitinteger1–100.
cursorstring≤ 64 chars.

Returns · 200

GET/v1/orders/{order_id}

Scope: orders

One order. The order id is the quote id.

  • Shipped more than one full business day (Monday to Friday, Pacific) after its ship-by date: 10% of parts plus corresponding tax is refunded. Delivery charges are excluded.

Path

NameTypeNotes
order_id requiredstring

Returns · 200

statusqueued, in_production, on_hold, completed, cancelled.
parts[]unit, status and progress (0 to 1).
ship_byPromised ship date. null while ship_date_pending is true.
paidtrue once paid by card.
trackingSet once the order ships.
deliverymethod, city, fee_cents; transit_days and arrives_by for shipping; once packed, state, eta, delivered_at, carrier, tracking_number, tracking_url.

POST/v1/orders/{order_id}/cancel

Scope: orders

Paid orders are committed and can't be cancelled; unpaid quotes are cancelled from the quote link.

  • No refund once paid. If Sinter can't fulfill or declines an order, everything paid is refunded to the card, delivery and tax included.
  • No partial cancellation.

Path

NameTypeNotes
order_id requiredstring

Returns · 200

Errors

409Paid orders can't be cancelled. Contact [email protected].