Sign Customiser

Store one order received from an enabled custom integration for the authenticated Store. Every product_id must be a modern product created through the same integration and Store. The 201 response means Sign Customiser committed the order; it does not claim payment, manufacturing, fulfilment, shipping, refund, or cancellation state. Requires orders:write. total_amount is the integration's external grand total in integer minor units. Sign Customiser separately derives its app total from the stored unit prices and quantities, so callers cannot override the platform fee basis. currency must equal the Store and every referenced product currency. Customer and address values are optional snapshots; request payloads are never retained as raw JSON. Sign Customiser durably schedules the established manufacturer order emails, order analytics, order-created webhook, and onboarding synchronisation with the order. Manufacturer recipients and analytics events have independent retry units. A queue publishing failure rolls the order back. Delivery by external providers is asynchronous. Repeating the exact method, path, body, credential, and Idempotency-Key replays the original 201 response and does not schedule those effects again. Retry a 409 idempotency_key_in_flight with the same key after retry_after; use the original body or a new key for an idempotency conflict. This v3 operation rejects a store_order_id already present for the integration and serialises concurrent v3 creations. During migration, do not send the same logical order through legacy and v3 writes in parallel.

POST /api/v3/orders

Authorisation

Bearer token required. Include it in the Authorization header.

Required scope: orders:write

Request body

integration_id integer body
store_order_id string body
store_order_number string body
total_amount integer body
currency string body
shipping_method string body
customer object body
billing_address object body
shipping_address object body
line_items array body

Request body example

application/json
{
  "integration_id": 17,
  "store_order_id": "ext-order-1001",
  "store_order_number": "#1001",
  "total_amount": 25800,
  "currency": "AUD",
  "shipping_method": "Express",
  "customer": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com",
    "phone": "+61 400 000 001"
  },
  "billing_address": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "address_1": "1 Example Street",
    "city": "Adelaide",
    "province": "SA",
    "postcode": "5000",
    "country": "AU",
    "company": "Analytical Engines Ltd",
    "address_2": "Suite 2",
    "email": "ada@example.com",
    "phone": "+61 400 000 001"
  },
  "shipping_address": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "address_1": "1 Example Street",
    "city": "Adelaide",
    "province": "SA",
    "postcode": "5000",
    "country": "AU",
    "company": "Analytical Engines Ltd",
    "address_2": "Suite 2",
    "email": "ada@example.com",
    "phone": "+61 400 000 001"
  },
  "line_items": [
    {
      "product_id": 731,
      "quantity": 2
    }
  ]
}
Create an order
curl https://web.signcustomiser.com/api/v3/orders \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "integration_id": 17,
  "store_order_id": "ext-order-1001",
  "store_order_number": "#1001",
  "total_amount": 25800,
  "currency": "AUD",
  "shipping_method": "Express",
  "customer": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "email": "ada@example.com",
    "phone": "+61 400 000 001"
  },
  "billing_address": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "address_1": "1 Example Street",
    "city": "Adelaide",
    "province": "SA",
    "postcode": "5000",
    "country": "AU",
    "company": "Analytical Engines Ltd",
    "address_2": "Suite 2",
    "email": "ada@example.com",
    "phone": "+61 400 000 001"
  },
  "shipping_address": {
    "first_name": "Ada",
    "last_name": "Lovelace",
    "address_1": "1 Example Street",
    "city": "Adelaide",
    "province": "SA",
    "postcode": "5000",
    "country": "AU",
    "company": "Analytical Engines Ltd",
    "address_2": "Suite 2",
    "email": "ada@example.com",
    "phone": "+61 400 000 001"
  },
  "line_items": [
    {
      "product_id": 731,
      "quantity": 2
    }
  ]
}'
Response 201
{
  "data": {
    "object": "order",
    "id": 123,
    "store_order_id": "ext-order-1001",
    "store_order_number": "#1001",
    "status": "received",
    "status_display_name": "Received",
    "total_amount": 25800,
    "currency": "AUD",
    "shipping_method": "Express",
    "customer": {
      "first_name": "Ada",
      "last_name": "Lovelace",
      "email": "ada@example.com",
      "phone": "+61 400 000 001"
    },
    "billing_address": {
      "first_name": "Ada",
      "last_name": "Lovelace",
      "company": null,
      "address_1": "1 Example Street",
      "address_2": null,
      "city": "Adelaide",
      "province": "SA",
      "postcode": "5000",
      "country": "AU",
      "email": null,
      "phone": null
    },
    "shipping_address": {
      "first_name": "Ada",
      "last_name": "Lovelace",
      "company": null,
      "address_1": "1 Example Street",
      "address_2": null,
      "city": "Adelaide",
      "province": "SA",
      "postcode": "5000",
      "country": "AU",
      "email": null,
      "phone": null
    },
    "line_items": [
      {
        "object": "order_line_item",
        "id": 731,
        "store_product_id": "ext-product-1001",
        "customiser_id": 42,
        "title": "Custom neon sign",
        "quantity": 2,
        "unit_price_amount": 12900,
        "currency": "AUD",
        "preview_image_url": null,
        "width_cm": 80.5,
        "height_cm": 31.5,
        "length_cm": 2.5
      }
    ],
    "created_at": "2026-07-19T09:20:00Z",
    "updated_at": "2026-07-19T09:20:00Z"
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/orders/123",
    "documentation": "https://www.signcustomiser.com/help/api/"
  },
  "meta": {
    "api_version": "v3",
    "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
  }
}
Response 400
{
  "type": "https://www.signcustomiser.com/help/api/problems/missing_idempotency_key",
  "title": "Missing idempotency key",
  "status": 400,
  "code": "missing_idempotency_key",
  "detail": "Provide an Idempotency-Key header for this write operation.",
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 401
{
  "type": "https://www.signcustomiser.com/help/api/problems/missing_api_key",
  "title": "Missing API key",
  "status": 401,
  "code": "missing_api_key",
  "detail": "Provide a store API key as a bearer token.",
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 403
{
  "type": "https://www.signcustomiser.com/help/api/problems/insufficient_scope",
  "title": "Insufficient scope",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "This operation requires the orders:write scope.",
  "required_scopes": [
    "orders:write"
  ],
  "granted_scopes": [
    "orders:read"
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 404
{
  "type": "https://www.signcustomiser.com/help/api/problems/resource_not_found",
  "title": "Resource not found",
  "status": 404,
  "code": "resource_not_found",
  "detail": "The requested resource does not exist or does not belong to the authenticated store.",
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 409
{
  "type": "https://www.signcustomiser.com/help/api/problems/store_order_id_conflict",
  "title": "Store order ID conflict",
  "status": 409,
  "code": "store_order_id_conflict",
  "detail": "This integration has already created an order with the supplied store_order_id. Retry the original request with its original Idempotency-Key, or use a new store_order_id.",
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 413
{
  "type": "https://www.signcustomiser.com/help/api/problems/request_too_large",
  "title": "Request too large",
  "status": 413,
  "code": "request_too_large",
  "detail": "The request body must not exceed 2 MiB.",
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 422
{
  "type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
  "title": "Validation failed",
  "status": 422,
  "code": "validation_failed",
  "detail": "One or more request fields are invalid.",
  "errors": [
    {
      "parameter": "line_items.0.product_id",
      "pointer": "/line_items/0/product_id",
      "code": "currency_mismatch",
      "detail": "The product currency must match the order and Store currency."
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 429
{
  "type": "https://www.signcustomiser.com/help/api/problems/rate_limited",
  "title": "Too many requests",
  "status": 429,
  "code": "rate_limited",
  "detail": "You have exceeded the request limit for this API key.",
  "retry_after": 60,
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}