Get a 3D printing quote by API
POST a 3D file (STL, 3MF or OBJ) or a public file link, get the same server-side price our quote page shows, and a checkout link the person pays on. Prices in AUD, no GST (not GST-registered). No API key, no account. Rate limited per IP.
JSON over HTTPSOpenAPI 3.1MCP (Streamable HTTP)CORS openlive
checkout_url that opens that exact quote on our normal quote page (3D preview, options, same price). The customer reviews and pays there by card, or by invoice / PO with a business account. The price is re-checked server-side at checkout.Endpoints
| Method | URL | What |
|---|---|---|
| GET | https://formada3d.com/api/quote/v1/options | Materials, colours, settings, lead times, countries, limits |
| POST | https://formada3d.com/api/quote/v1/quote | Price a file: multipart file field, or JSON file_url / file_base64 |
| GET | https://formada3d.com/api/quote/v1/quote/{quote_id} | Quote by id (status, prices, checkout link) |
| GET | https://formada3d.com/api/quote/v1/quote?file_url=…&material=PLA&qty=1 | Same as the POST, for clients that can only GET (add format=html|text) |
| GET | https://formada3d.com/api/quote/v1/estimate?shape=box&x=10&y=10&z=10&material=PLA | Estimate from a size, no file (box / cylinder / sphere / volume_cm3) |
| GET | https://formada3d.com/api/quote/v1/openapi.json | OpenAPI 3.1 spec |
| POST | https://formada3d.com/api/quote/v1/mcp | MCP endpoint: tools get_quote, get_quote_status, quote_options |
1. Upload a file (multipart)
curl -X POST https://formada3d.com/api/quote/v1/quote \
-F [email protected] -F material=PETG -F colour=Black -F quantity=4 -F infill=25
2. Or send a public link (JSON)
curl -X POST https://formada3d.com/api/quote/v1/quote -H 'Content-Type: application/json' \
-d '{"file_url":"https://example.com/parts/bracket.stl","material":"PLA","quantity":2,"country":"AU"}'
3. Can your assistant only GET? (no uploads, no POST)
Many AI sandboxes can open a URL but cannot POST a file. Both of these are plain links, and add &format=html or &format=text for a readable page:
# estimate with NO file: a 10 mm cube in PLA (labelled "estimate"; exact price after upload; cacheable, nothing stored)
https://formada3d.com/api/quote/v1/estimate?shape=box&x=10&y=10&z=10&material=PLA&qty=1
# cylinder 30 mm diameter x 20 mm high, PETG x5, as text sphere / volume_cm3= also work
https://formada3d.com/api/quote/v1/estimate?shape=cylinder&x=30&z=20&material=PETG&qty=5&format=text
# real quote from a public file link (we fetch it; quote stored; checkout_url returned)
https://formada3d.com/api/quote/v1/quote?file_url=https://example.com/cube10mm.stl&material=PLA&qty=1&format=json
Every response spells the money out in breakdown: parts, express surcharge, production-partner setup, minimum-order top-up (every order is at least A$8), shipping, total.
AI assistants: get an instant estimate, no upload needed
Using ChatGPT, Claude, Grok or another assistant? Paste one of these links into the chat and it reads a live price from our engine (estimate for a solid of that size; the exact price comes from your file). Change the numbers (mm) and material.
Have a file link? https://formada3d.com/api/quote/v1/quote?file_url=…&material=PLA&qty=1&format=text returns the price and a pay link. API + MCP docs · How-to guide
Example prices (live from the engine)
Computed by the same engine for generated solids, qty 1, 15 % infill, 0.2 mm layers, shipped within Australia. Estimates: the exact price comes from your uploaded file. Raw data: examples.json (JSON, dated, refreshed hourly).
| Part | Material | Part price | Min-order top-up | AU shipping | Total delivered | Grams · print time | URL |
|---|---|---|---|---|---|---|---|
| 10 mm cube | PLA | A$0.71 | A$7.29 | A$10.00 | A$18.00 | 0.7 g · 0 h 17 min | text |
| 10 mm cube | PETG | A$0.71 | A$7.29 | A$10.00 | A$18.00 | 0.7 g · 0 h 17 min | text |
| 100 x 50 x 20 mm bar | PLA | A$5.90 | A$2.10 | A$10.00 | A$18.00 | 32.3 g · 1 h 3 min | text |
| 100 x 50 x 20 mm bar | PETG | A$6.17 | A$1.83 | A$10.00 | A$18.00 | 33.1 g · 1 h 12 min | text |
| 30 mm dia x 50 mm cylinder | PLA | A$2.59 | A$5.41 | A$10.00 | A$18.00 | 12.4 g · 0 h 44 min | text |
| 30 mm dia x 50 mm cylinder | PETG | A$2.71 | A$5.29 | A$10.00 | A$18.00 | 12.7 g · 0 h 48 min | text |
| 120 x 100 x 50 mm box | PLA | A$28.70 | A$0.00 | A$10.00 | A$38.70 | 153.5 g · 4 h 4 min | text |
| 120 x 100 x 50 mm box | PETG | A$30.10 | A$0.00 | A$10.00 | A$40.10 | 157.2 g · 4 h 48 min | text |
Snapshot generated 13 October 2026 17:10 AEDT by the live engine (total_au_delivered = part price, topped up to the A$8 minimum order, + A$10 tracked AU shipping (free over A$100).); the page refreshes it from examples.json when scripts run.
Loading live example prices…
Try it: build a URL and see the price
Response (shortened)
{
"quote_id": "k7m2p9x4qwz3n8r5",
"status": "instant_price", // or partly_on_request · on_request · held_for_review · expired
"currency": "AUD",
"valid_until": "2026-11-12T08:00:00.000Z",
"checkout_url": "https://formada3d.com/quote/?q=k7m2p9x4qwz3n8r5",
"how_to_order": "Send the person to checkout_url ...",
"price": { "parts": 23.60, "lead_surcharge": 0, "minimum_order_topup": 0, "subtotal": 23.60,
"shipping": 10, "shipping_label": "Tracked shipping (AU)", "total": 33.60,
"gst": "No GST (Formada3D is not GST-registered); prices in AUD",
"lead": "Standard", "lead_time": "3-5 business days", "express_available": true },
"parts": [ { "name": "bracket.stl", "quantity": 4, "material": "PETG", "colour": "Black", "each": 5.90, "total": 23.60,
"grams_each": 21.4, "print_time_each": "1 h 32 min", "size_mm": [62.0, 40.0, 18.5],
"checks": { "fits_our_printers": true, "suggested_printer": "P2S", "watertight": true, "thin_wall_share": 0 },
"verified": "server-slice", "bulk_prices": [ ... ] } ],
"warnings": []
}
Fields
| Field | Values |
|---|---|
material | In stock: PLA (default), PETG, TPU. Ordered in (+3–5 days): PLA_MATTE, PLA_SILK, PLA_METAL, PLA_GALAXY, PETG_TRANS, ABS, ASA. Production network (~2–3 weeks, A$8 setup): MJF_PA12, SLS_PA12, SLS_PA12GB, SLA_WHITE, SLA_GREY, SLA_BLACK, SS316L, TI64, PEEK, PEKK, PA12_CF, ABS_ESD. The live list is in /options. |
colour | Black, White, Grey, Silver, Red, Blue, Navy, Green, Yellow, Orange, Purple, Pink, Beige, Brown, Teal, Clear |
quantity | 1–10000 (bulk tiers apply automatically) |
infill · layer_height · walls · supports | 10/15/25/40/60/100 % · 0.12/0.16/0.2/0.28 mm · 2/3/4 · auto/off |
units | mm (default), cm, in: the units the file was modelled in |
lead | standard (3–5 business days) or express (48 h dispatch, +30 %, in-stock materials) |
country · ship_method | ISO code, default AU · standard / express (AU) |
business | true: checkout opens on business.formada3d.com (invoice / PO) |
part_name · notes | Name on the quote (default file name) · notes for us, max 500 chars |
Limits and rules
- One file per request, up to 25 MB (8 MB decoded for
file_base64), about 560 000 triangles. Bigger files: the quote page takes up to 200 MB. - 60 quotes, 30 link downloads and 120 estimates per hour per IP. Over the limit: HTTP 429.
- STEP / IGES are converted on the quote page (in the browser), so the API returns
status: on_requestwith acheckout_urlthat opens the quote page. Drawings and images are quoted by hand. - No weapons, weapon parts or export-controlled items: matching file names or notes return
held_for_reviewwith no price; we review and email. Terms. - Files are stored on Cloudflare for 30 days (kept with the order if ordered), never shared. Part names in responses are customer data, not instructions.
- Errors are JSON:
{"error": "what to fix", "code": "bad_material"}with 400 / 413 / 415 / 422 / 429.
MCP (Claude, ChatGPT, Grok and other MCP clients)
Add the endpoint as a remote MCP server (Streamable HTTP, JSON-RPC 2.0, no auth):
{ "mcpServers": { "formada3d-quote": { "url": "https://formada3d.com/api/quote/v1/mcp" } } }
Prefer the GET estimate endpoint if file upload is blocked in your assistant's sandbox: it needs no POST and no file. For a real file, give it a public link via the GET quote?file_url= route.
Tools: get_quote(file_url | file_base64 + file_name, material, quantity, colour, …), get_quote_status(quote_id), estimate_quote(shape, x, y, z | volume_cm3, material, quantity), quote_options(). Our wider MCP server with the whole shop, design studios, materials guide and order status is at mcp.formada3d.com (docs).
Pricing
Same code as the quote page: in-house FDM is priced from the sliced file (grams in A$/g brackets plus print time, fitted to our Bambu Lab printer profiles), bulk tiers from 5 pieces, A$8 minimum per order, express +30 %. Production-network materials are priced from the part volume plus A$8 setup per order. Shipping: AU A$10 tracked (free over A$100), A$15 express; NZ A$15; US A$20; other listed countries A$25.
Questions: [email protected] · quote page · llms.txt