Sign Customiser

Adds a size to the customiser, at the end of the current presentation order. Only name is required on a simple-letter customiser; the other models add what they price by — width_multiplier on advanced letter, width_cm and height_cm on frame fit.

POST/api/v3/customisers/{customiser_id}/sizes

Overview

A field the customiser's pricing model never reads is refused with a 422 pointer rather than stored where nothing would read it, and sort_order moves only through the reorder operation. On a customiser still using the deprecated fixed-height pricing model the create is refused: its current sizes live in the legacy fixed-height sizes resource, so a row created here would never be offered. Sizes are dual-surfaced. A full replace of the pricing document stays authoritative over this family and deletes any size its payload omits, so a size created here disappears if the next pricing write does not carry it. Read the pricing document first and echo the sizes it reports. Requires customisers:write and an Idempotency-Key. The write clears the customiser's cached storefront configuration and runs the advisory language sync. It never regenerates Shopify products, product images, or the product cache, so live listings are untouched. Option writes also spend one unit of a separate per-key option-write budget; exhausting it returns a 429 with retry_after.

Authorisation

Bearer token required. Include it in theAuthorization header.

Required scope: customisers:write

Path parameters

customiser_idstringpathrequired

The customiser id.

Example: 1

Request body

sizing_strategystringbody
height_measurement_modestringbody
namestringbody
descriptionstringbody
char_limitintegerbody
line_limitintegerbody
min_charintegerbody
width_cmintegerbody
height_cmintegerbody
line_height_cmintegerbody
length_cmintegerbody
width_multipliernumberbody
border_margin_cmnumberbody

Request body example

application/json
{
  "sizing_strategy": "fixed_width",
  "height_measurement_mode": "line_height",
  "name": "Small",
  "description": "Fits a shop window",
  "char_limit": 12,
  "line_limit": 1,
  "min_char": 1,
  "width_cm": 40,
  "height_cm": 20,
  "line_height_cm": 10,
  "length_cm": 120,
  "width_multiplier": 1.5,
  "border_margin_cm": 5.08
}
Create a size
curl https://web.signcustomiser.com/api/v3/customisers/1/sizes \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "sizing_strategy": "fixed_width",
  "height_measurement_mode": "line_height",
  "name": "Small",
  "description": "Fits a shop window",
  "char_limit": 12,
  "line_limit": 1,
  "min_char": 1,
  "width_cm": 40,
  "height_cm": 20,
  "line_height_cm": 10,
  "length_cm": 120,
  "width_multiplier": 1.5,
  "border_margin_cm": 5.08
}'
Response201
{
  "data": {
    "object": "size",
    "id": 7,
    "customiser_id": 42,
    "name": "Small",
    "description": null,
    "char_limit": null,
    "line_limit": null,
    "min_char": null,
    "width_cm": 40,
    "height_cm": null,
    "line_height_cm": null,
    "length_cm": null,
    "width_multiplier": null,
    "sizing_strategy": "fixed_width",
    "height_measurement_mode": "line_height",
    "border_margin_cm": null,
    "sort_order": 1,
    "created_at": "2026-08-13T00:00:00Z",
    "updated_at": "2026-08-13T00:00:00Z"
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/sizes/7",
    "documentation": "https://www.signcustomiser.com/help/api/"
  },
  "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/validation_failed",
  "title": "Validation failed",
  "status": 422,
  "code": "validation_failed",
  "detail": "This customiser's pricing model does not price sizes by width_multiplier, so the value would never be read. Omit the field.",
  "errors": [
    {
      "pointer": "/width_multiplier",
      "code": "field_not_used_by_pricing_model",
      "detail": "The width_multiplier field is not used by this customiser's pricing model."
    }
  ],
  "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"
}