Sign Customiser

Sets the storefront presentation order of the customiser's backboards. backboard_ids must be the complete current membership of the family, each id exactly once, in the order to present them; a partial or stale list is refused with a 422 naming the missing, unknown, and duplicated ids rather than being partially applied.

POST/api/v3/customisers/{customiser_id}/backboards/reorder

Overview

Competing reorders of unchanged membership are last-write-wins. Requires customisers:write and an Idempotency-Key. The reorder clears the customiser's cached storefront configuration and runs the advisory language sync, and never regenerates Shopify products, product images, or the product cache.

Authorisation

Bearer token required. Include it in theAuthorization header.

Required scope: customisers:write

Path parameters

customiser_idstringpathrequired

The customiser id.

Example: 1

Request body

backboard_idsarraybody

Request body example

application/json
{
  "backboard_ids": [
    13,
    11,
    8
  ]
}
Reorder backboards
curl https://web.signcustomiser.com/api/v3/customisers/1/backboards/reorder \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "backboard_ids": [
    13,
    11,
    8
  ]
}'
Response200
{
  "data": [
    {
      "object": "backboard",
      "id": 13,
      "customiser_id": 42,
      "name": "Black Panel",
      "description": null,
      "backboard_type": "board",
      "letter_type_ids": [],
      "outline_size": null,
      "allow_multilayer": false,
      "custom_background_enabled": false,
      "show_custom_background": false,
      "base_price": 0,
      "currency": "USD",
      "price_multiplier": 1,
      "price_multiplier_target": "base_letter_price",
      "price_per_sq_cm": null,
      "sort_order": 1,
      "image_url": null,
      "button_image_url": null,
      "geometry": {
        "has_custom_shape": false,
        "status": null,
        "failure_reason": null,
        "measured_at": null
      },
      "created_at": "2026-08-13T00:00:00Z",
      "updated_at": "2026-08-13T00:05:00Z"
    }
  ],
  "pagination": {
    "has_more": false,
    "next_cursor": null
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/backboards/reorder",
    "documentation": "https://www.signcustomiser.com/help/api/",
    "next": null
  },
  "meta": {
    "api_version": "v3",
    "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
  }
}
Response400
{
  "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.",
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response401
{
  "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"
}
Response403
{
  "type": "https://www.signcustomiser.com/help/api/problems/insufficient_scope",
  "title": "Insufficient scope",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "This operation requires the customisers:write scope.",
  "required_scopes": [
    "customisers:write"
  ],
  "granted_scopes": [
    "customisers:read"
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response404
{
  "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"
}
Response409
{
  "type": "https://www.signcustomiser.com/help/api/problems/idempotency_key_conflict",
  "title": "Idempotency key conflict",
  "status": 409,
  "code": "idempotency_key_conflict",
  "detail": "This Idempotency-Key was already used for a different request body on this operation.",
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response413
{
  "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"
}
Response422
{
  "type": "https://www.signcustomiser.com/help/api/problems/reorder_membership_mismatch",
  "title": "Reorder membership mismatch",
  "status": 422,
  "code": "reorder_membership_mismatch",
  "detail": "A reorder must list the complete current membership of the family exactly once each.",
  "errors": [
    {
      "pointer": "/backboard_ids",
      "code": "reorder_membership_mismatch",
      "detail": "The submitted ids do not match the family membership exactly once each."
    }
  ],
  "missing_ids": [
    8
  ],
  "unknown_ids": [
    88
  ],
  "duplicate_ids": [],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response429
{
  "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": 37,
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}