Skip to content

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.

# 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

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.