Makr3D Public API / v1

Build 3D-print fulfilment into your store or workflow.

The Makr3D API lets sellers manage parts and products, request fulfilment quotes, create and track orders, and receive signed webhook events from the UK print hub.

Quick start

Create an API key in the seller dashboard under Settings, API keys. The raw key is shown once, starts with m3d_live_, and must be sent as a bearer token.

Every key is scoped to exactly one seller account. Do not send a seller id in requests; Makr3D derives tenant scope from the key.

curl -sS https://makr3d.app/api/v1/account \
  -H "Authorization: Bearer m3d_live_xxx"

Authentication

Use Authorization: Bearer m3d_live_xxx. Missing or invalid keys return 401 unauthorized; valid keys without the required scope return 403 forbidden.

Rate limits

MVP defaults are 60 requests/minute globally, 300 order creates/hour and 100 quote creates/hour per key. A 429 includes retry_after_seconds and a Retry-After header.

Versioning

The base path is https://makr3d.app/api/v1. Breaking changes ship as a new /api/v2; v1 receives only backwards-compatible additions.

Endpoint map

System

Scope: any valid key

MethodPathUse
GET/healthAuthenticated liveness check for the API surface.
GET/accountRead the seller account bound to the API key.

Parts

Scope: parts:read, parts:write

MethodPathUse
GET/partsList the seller-owned printable parts.
POST/partsCreate a draft part.
GET/parts/{part_id}Read one part and its print options.
PATCH/parts/{part_id}Update part metadata.
POST/parts/{part_id}/files/upload-urlUpload an STL, 3MF, STEP or archive as multipart form data.
POST/parts/{part_id}/submit-for-reviewSubmit a part for Makr3D review.
POST/parts/{part_id}/sample-orderOrder a sample print for a part.

Products

Scope: products:read, products:write

MethodPathUse
GET/productsList product groups.
POST/productsCreate a product group from parts.
GET/products/{product_id}Read a product group and its members.
PATCH/products/{product_id}Update product group fields.
POST/products/{product_id}/partsAdd a part to a product group.
POST/products/{product_id}/parts/reorderReorder product group members.
POST/products/{product_id}/shareEnable revenue sharing for a product.

Quotes

Scope: quotes:read, quotes:write

MethodPathUse
POST/quotesCreate an idempotent fulfilment quote.
GET/quotes/{quote_id}Read a priced quote snapshot.

Orders

Scope: orders:read, orders:write

MethodPathUse
GET/ordersList orders with cursor pagination.
POST/ordersCreate an idempotent fulfilment order.
GET/orders/{order_id}Read an order with line items and shipment data.
GET/orders/{order_id}/trackingRead shipment/tracking details.
POST/orders/{order_id}/cancelIdempotently cancel an order where allowed.

Materials

Scope: any valid key

MethodPathUse
GET/materialsList printable materials and colours available for quoting.

Webhooks

Scope: webhooks:read, webhooks:write

MethodPathUse
GET/webhook-endpointsList registered webhook endpoints.
POST/webhook-endpointsCreate an idempotent webhook endpoint.
PATCH/webhook-endpoints/{endpoint_id}Update endpoint URL, events or status.
DELETE/webhook-endpoints/{endpoint_id}Remove an endpoint.
GET/webhook-deliveriesList webhook delivery attempts.
GET/webhook-deliveries/{delivery_id}Inspect one delivery attempt.
POST/webhook-deliveries/{delivery_id}/retryRetry a failed delivery.

Idempotent writes

Money-adjacent writes require an Idempotency-Keyheader. Replaying the same key with the same body returns the stored response; replaying it with a different body returns idempotency_conflict.

Required on POST /orders, POST /quotes, POST /orders/{order_id}/cancel and POST /webhook-endpoints.

curl -sS https://makr3d.app/api/v1/quotes \
  -X POST \
  -H "Authorization: Bearer m3d_live_xxx" \
  -H "Idempotency-Key: quote_01HX..." \
  -H "Content-Type: application/json" \
  -d '{"part_id":"part_...","quantity":1}'

Webhooks

Register an HTTPS endpoint to receive signed events. Each delivery includes Makr3D-Event-Id, Makr3D-Event-Type, Makr3D-Timestamp and Makr3D-Signature.

  • order lifecycle changes
  • quote result updates
  • QA outcomes
  • product sharing changes
  • shop sales
  • billing charge outcomes
  • channel listing imports
const expected = hmacSha256(
  webhookSecret,
  `${timestamp}.${rawBody}`
)

// Header format:
// Makr3D-Signature: v1=<hex>

Errors

Every failure returns the same envelope with a stable code, human message and request id for support correlation. Some responses add structured details or retry timing.

{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests.",
    "request_id": "req_...",
    "retry_after_seconds": 30
  }
}