Public Quoting API
Instant, checkout-ready 3D-print quotes over plain HTTPS. No authentication, no API key. Prices are real slicer-backed quotes in GBP including UK VAT — not estimates. Base URL: https://bicester3d.co.uk
Machine-readable entry points
- OpenAPI 3.1 description: /.well-known/openapi.json
- API catalog (RFC 9727): /.well-known/api-catalog
- Agent skill (upload → quote flow): /.well-known/agent-skills/index.json
- Auth & agent access statement: /auth.md
- Service status: /api/status
1 — Pick a material
FDM (filament): GET /api/stock · SLA (resin): GET /api/sla/stock. Each entry in materials[] has an id — pass it as material_id when quoting. A sensible default is FDM “PLA Basic” in Black.
2 — Upload the model
POST /api/s3/presign-upload
Content-Type: application/json
{"fileName": "bracket.stl", "contentType": "application/octet-stream", "fileSize": 1048576}
→ {"key": "uploads/<uuid>/bracket.stl", "url": "<presigned S3 PUT URL>"}PUT the raw file bytes to url within 15 minutes. If you passed contentType when presigning, the PUT must send the identical Content-Type header. Accepted formats: STL (preferred), 3MF, OBJ, STEP. Maximum 200 MB.
3 — Request the quote
POST /api/pricing/calculate (FDM)
POST /api/sla/pricing/calculate (SLA resin)
Content-Type: application/json
{
"blob_storage_id": "uploads/<uuid>/bracket.stl",
"print_settings": {"material_id": 1, "quality": "medium", "quantity": 1}
}
→ 202 {"quote_id": "<uuid>", "status": "pending"}print_settings
| Field | Values | Notes |
|---|---|---|
| material_id | integer | Required. id from the stock endpoints. |
| quality | FDM: low | medium | high SLA: any (deprecated) | Required for FDM. On SLA this field is DEPRECATED and ignored by the server — use layer_um instead. |
| layer_um | integer (SLA only) | Layer height in microns — must be one of the resin's supported_layers_um from /api/sla/stock (e.g. 50, 25). Omit for the resin's standard layer; finer layers cost more. |
| quantity | 1–1000 | Batches pay per-job overhead once — per-unit price falls with quantity. |
| strength | decorative | standard | structural | FDM only. Preset infill/pattern. |
| nozzle_size | 0.4 | 0.6 | 0.8 | FDM only. Bigger = faster, less detail. |
| infill / wall_loops | 0–100 / 1–10 | FDM only. Raw overrides; take precedence over strength. |
| express_service | boolean | Faster turnaround, surcharge applies. |
4 — Poll until completed
GET /api/pricing/{quote_id} (FDM)
GET /api/sla/pricing/{quote_id} (SLA)
status: pending → processing → completed | failedPoll every 3–5 seconds. Most quotes complete in 10–120 seconds; complex models can take several minutes because the model is genuinely sliced. On completed, the pricing payload sits at the top level or under pricing_response — check both:
- pricing_breakdown.total_price_pence — authoritative all-in price for the whole batch, pence, VAT included
- pricing_breakdown.currency — GBP (EUR for Ireland-region sessions)
- cost components (material, machine time, labour, overhead, VAT, surcharges), plus print_time_estimate, volume_cm3, material_info
Ordering
Checkout currently happens on the website with a human in the loop: send your user to bicester3d.co.uk/quote — the same file and settings re-price in about a minute. For programmatic ordering, business (NET invoice) accounts, or volume arrangements, email hello@bicester3d.co.uk.