3DnaKlik for developers & AI agents
Everything behind the instant quote is a public, keyless API. Get slicer-accurate 3D printing prices programmatically, or let an AI assistant quote and order prints for you via our MCP server.
Quickstart — REST quote in one call
Volume-based estimate (no file needed). Material and quality ids come from GET /api/config.
curl -X POST https://3dnaklik.si/api/slice \
-H 'Content-Type: application/json' \
-d '{"volume_cm3": 25, "material_id": "pla-basic-black", "quality_id": "standard"}'MCP server — quotes from real files, for AI agents
Streamable-HTTP MCP endpoint at https://3dnaklik.si/mcp (no auth). The create_quote tool takes an STL/3MF by URL or base64, runs the actual slicer, and returns the price plus a prefilled order link you can hand to the customer. Also: list_materials, get_service_info.
curl -X POST https://3dnaklik.si/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'B2B API for business accounts
Companies that order regularly get a bearer API key once we approve their business account: quotes from their own STL or 3MF files at their negotiated discount off the public price, orders shipped straight to their customers in neutral packaging, and one invoice a month for the orders shipped the month before, paid by bank transfer within the agreed terms.
- Apply for a business account
- /api/b2b/v1/openapi.json: OpenAPI 3.1, tag B2B
- https://3dnaklik.si/api/b2b/v1: base URL, header Authorization: Bearer 3dk_live_...
# 1. Price a model (kept for 48 hours). Material and quality default to your account settings; the ids come from GET /materials.
curl -s https://3dnaklik.si/api/b2b/v1/quotes \
-H "Authorization: Bearer $B2B_API_KEY" \
-H "Content-Type: application/json" \
-d '{"file_url": "https://example.com/relief-1001.3mf", "file_name": "relief-1001.3mf", "quantity": 1}'
# 2. Order it, shipped to your customer. Put the quote_id from step 1 in items.
curl -s https://3dnaklik.si/api/b2b/v1/orders \
-H "Authorization: Bearer $B2B_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: TG-1001" \
-d '{"items": [{"quote_id": "q_..."}], "reference": "TG-1001", "recipient": {"name": "María López", "line1": "Calle de Alcalá 10", "postal_code": "28014", "city": "Madrid", "country": "ES", "phone": "+34 611 222 333"}}'Error codes
Every error is RFC 9457 problem+json with a stable code; its type URL ends in the code and opens its row below. Error messages are in English.
- UNAUTHORIZED 401
- Missing, malformed, unknown or revoked API key.
- ACCOUNT_PENDING 403
- The company account is waiting for approval.
- ACCOUNT_SUSPENDED 403
- The company account is suspended or was not approved.
- NOT_FOUND 404
- No such order or statement for this account.
- QUOTE_NOT_FOUND 404
- The quote does not exist, expired after 48 hours or belongs to another account.
- IDEMPOTENCY_KEY_REQUIRED 400
- POST /orders needs an Idempotency-Key header.
- IDEMPOTENCY_IN_PROGRESS 409
- A request with this Idempotency-Key is still running; retry after Retry-After.
- DUPLICATE_REFERENCE 409
- An order with this reference exists (order_number); send allow_duplicate_reference to place another one.
- CONCURRENT_ORDER 409
- Another order of this account is being placed; retry after Retry-After.
- FILE_TOO_LARGE 413
- The model file is over the size limit (max_bytes).
- VALIDATION_FAILED 422
- A field is invalid; errors[] names each one with a JSON pointer.
- IDEMPOTENCY_KEY_REUSED 422
- This Idempotency-Key was already used with a different body; order_number names the order it created.
- UNSUPPORTED_FILE_TYPE 422
- Only .stl and .3mf files are accepted.
- FILE_FETCH_FAILED 422
- file_url could not be downloaded (https and a public address only).
- MODEL_TOO_LARGE 422
- The model does not fit the build volume. It is never scaled for you; max_scale, when given, says how far to scale it.
- MATERIAL_UNAVAILABLE 422
- Unknown or disabled material; see GET /materials.
- TOO_MANY_COLOURS 422
- More colours than max_colours from GET /materials.
- COUNTRY_NOT_SUPPORTED 422
- We do not ship to this country with GLS.
- ORDER_LIMIT_EXCEEDED 422
- The order is over a per-order limit (pieces per item, pieces per order or the account amount); limit_code says which.
- OPEN_BALANCE_LIMIT 402
- The order would take the open balance over the account limit (see available_cents).
- STATEMENT_OVERDUE 402
- A statement is still unpaid 30 days after the invoice date, or the due date if later; ordering resumes once it is paid.
- RATE_LIMITED 429
- Too many requests; wait the seconds in Retry-After.
- SLICER_BUSY 503
- The slicer is busy; retry after Retry-After.
- SLICER_UNAVAILABLE 503
- Pricing is not available right now; retry later.
- INVOICE_UNAVAILABLE 503
- The invoice PDF is not available right now; retry after Retry-After.
Machine-readable discovery
- /openapi.json — OpenAPI 3.1 spec (typed schemas, error model)
- /.well-known/mcp/server-card.json — MCP server card
- /.well-known/api-catalog — API catalog (RFC 9727)
- /llms.txt — LLM-friendly site summary
- /llms-full.txt — Full LLM knowledge base
- /.well-known/acp.json — Agentic commerce discovery
- /api/b2b/v1/openapi.json — B2B API: OpenAPI 3.1, bearer key, tag B2B
Errors, rate limits, versioning
Errors are JSON — RFC 9457 problem+json with a machine-readable code plus a hint (legacy endpoints return {"error": "..."}). Unknown /api/* paths answer a JSON 404, never HTML.
Responses carry draft-RFC RateLimit / RateLimit-Policy headers (e.g. 30 requests/min on /api/slice); a 429 adds Retry-After — please self-throttle.
Versioning: the API is additive-only within a major version. Breaking changes would ship under /v2 with 6+ months of overlap, signalled by Deprecation/Sunset headers and a notice here. Nothing is deprecated today.
Questions?
Write to info@3dnaklik.si — integrations, higher rate limits and B2B automation are welcome.