Sign Customiser

Replace the customiser's entire pricing configuration with the request body — the full canonical document, exactly as the read operation returns it (no envelope). This is an explicit full replacement: sizes and price lists omitted from the document are deleted (each carries its id — size_id, price_list_id — to update in place; omit the id to create a new record, and use a size client_key with row size_key references to link rows to sizes created in the same request). For partial updates prefer PATCH; to check a document without persisting anything use the validate operation. The read-only descriptor fields (object, customiser_id, pricing_model, pricing_model_display_name, currency) may be echoed back unchanged but can never be changed here — in particular the pricing model cannot be switched. Field semantics, units, and the per-model document shapes are documented on the read operation. Requires the pricing:write scope. A successful replacement immediately reprices the storefront: the customiser's cached configuration is invalidated and translated language content is resynchronised. Send an Idempotency-Key header (1-255 visible ASCII characters, e.g. a UUID) to make the write safe to retry: repeating the same key with the same body replays the original response (marked Idempotency-Replay: true) without executing again; the same key with a different body is a 409 problem with code idempotency_key_conflict; keys are retained for at least 24 hours and are scoped to your credential, the HTTP method, and the path. Validation failures are 422 problems: validation_failed lists every field error in errors[] with a JSON pointer and, for enum violations, the allowed_values; unknown_field means the document contains fields outside the schema (fix the pointers listed — nothing is ever silently ignored); legacy_pricing_model means the customiser still uses the retired fixed-height model. A 409 problem with code resource_in_use means the document omits sizes or price lists that fonts or settings still reference — keep them in the document or detach them first. A 400 problem means the body is not valid JSON or the Idempotency-Key header is malformed. 401/403/404/429 behave as on the read operation.

PUT /api/v3/customisers/{customiser_id}/pricing

Authorisation

Bearer token required. Include in the Authorization header.

Path parameters

customiser_id string path required

The customiser id, from the list customisers operation.

Example: 1

Request body

object string body
customiser_id integer body
pricing_model string body
pricing_model_display_name string body
currency string body
sizes array body
base_pricing object body
price_lists array body
sheet_pricing object body

Request body example

application/json
{
  "object": "customiser_pricing",
  "customiser_id": 42,
  "pricing_model": "simple_letter",
  "pricing_model_display_name": "Simple Letter",
  "currency": "USD",
  "sizes": [
    {
      "size_id": 7,
      "client_key": "small",
      "name": "Small",
      "description": "Up to 50cm wide",
      "sort_order": 1,
      "char_limit": 20,
      "line_limit": 3,
      "min_char": 1,
      "width_cm": 50,
      "line_height_cm": 12,
      "sizing_strategy": "fixed_width",
      "height_measurement_mode": "line_height"
    }
  ],
  "base_pricing": {
    "mode": "included_in_price_lists",
    "rows": [
      {
        "size_id": 7,
        "base_price": {
          "line_1": 900,
          "line_2": 1000,
          "line_3": 1100
        }
      }
    ]
  },
  "price_lists": [
    {
      "price_list_id": 10,
      "name": "Standard",
      "shipping": [],
      "rows": [
        {
          "size_id": 7,
          "base_price": {
            "line_1": 1000,
            "line_2": 1200,
            "line_3": 1400
          },
          "letter_price": {
            "line_1": 100,
            "line_2": 120,
            "line_3": 140
          }
        }
      ]
    }
  ],
  "sheet_pricing": {
    "rows": [
      {
        "width_limit_cm": null,
        "height_limit_cm": null,
        "base_price": null,
        "price_per_sq_cm": null
      }
    ]
  }
}
Replace customiser pricing
curl https://web.signcustomiser.com/api/v3/customisers/1/pricing \
  --request PUT \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "object": "customiser_pricing",
  "customiser_id": 42,
  "pricing_model": "simple_letter",
  "pricing_model_display_name": "Simple Letter",
  "currency": "USD",
  "sizes": [
    {
      "size_id": 7,
      "client_key": "small",
      "name": "Small",
      "description": "Up to 50cm wide",
      "sort_order": 1,
      "char_limit": 20,
      "line_limit": 3,
      "min_char": 1,
      "width_cm": 50,
      "line_height_cm": 12,
      "sizing_strategy": "fixed_width",
      "height_measurement_mode": "line_height"
    }
  ],
  "base_pricing": {
    "mode": "included_in_price_lists",
    "rows": [
      {
        "size_id": 7,
        "base_price": {
          "line_1": 900,
          "line_2": 1000,
          "line_3": 1100
        }
      }
    ]
  },
  "price_lists": [
    {
      "price_list_id": 10,
      "name": "Standard",
      "shipping": [],
      "rows": [
        {
          "size_id": 7,
          "base_price": {
            "line_1": 1000,
            "line_2": 1200,
            "line_3": 1400
          },
          "letter_price": {
            "line_1": 100,
            "line_2": 120,
            "line_3": 140
          }
        }
      ]
    }
  ],
  "sheet_pricing": {
    "rows": [
      {
        "width_limit_cm": null,
        "height_limit_cm": null,
        "base_price": null,
        "price_per_sq_cm": null
      }
    ]
  }
}'
Response 200
{
  "data": {
    "object": "customiser_pricing",
    "customiser_id": 42,
    "pricing_model": "simple_letter",
    "pricing_model_display_name": "Simple Letter",
    "currency": "USD",
    "sizes": [
      {
        "size_id": 7,
        "client_key": null,
        "name": "Small",
        "description": "Up to 50cm wide",
        "sort_order": 1,
        "char_limit": 20,
        "line_limit": 3,
        "min_char": 1,
        "width_cm": 50,
        "height_cm": null,
        "line_height_cm": 12,
        "width_multiplier": null,
        "length_cm": null,
        "sizing_strategy": "fixed_width",
        "height_measurement_mode": "line_height"
      }
    ],
    "base_pricing": {
      "mode": "included_in_price_lists",
      "rows": []
    },
    "price_lists": [
      {
        "price_list_id": 10,
        "name": "Standard",
        "rows": [
          {
            "size_id": 7,
            "size_key": null,
            "base_price": {
              "line_1": 1000,
              "line_2": 1200,
              "line_3": 1400
            },
            "letter_price": {
              "line_1": 100,
              "line_2": 120,
              "line_3": 140
            }
          }
        ]
      }
    ],
    "sheet_pricing": null
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/pricing",
    "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/malformed_json",
  "title": "Malformed JSON",
  "status": 400,
  "code": "malformed_json",
  "detail": "The request body is not valid JSON: Syntax error.",
  "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: Authorization: Bearer <api key>. Keys are created in the merchant admin under Integrate → API Tokens.",
  "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 pricing:write scope, but the API key grants the following scopes: pricing:read. Create a key that includes the required scope in the merchant admin under Integrate → API Tokens.",
  "required_scopes": [
    "pricing:write"
  ],
  "granted_scopes": [
    "pricing: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/resource_in_use",
  "title": "Resource in use",
  "status": 409,
  "code": "resource_in_use",
  "detail": "The document omits sizes that fonts still reference, so the write would delete records in use. Keep those sizes in the document, or update the fonts that reference them first.",
  "errors": [
    {
      "pointer": "/sizes",
      "code": "resource_in_use",
      "detail": "The document omits sizes that fonts still reference, so the write would delete records in use. Keep those sizes in the document, or update the fonts that reference them first."
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 409
{
  "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. An idempotency key identifies one exact request: retry the original body to replay its response, or send the new body with a fresh key.",
  "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": "The request payload failed validation. Correct the fields listed in errors and retry.",
  "errors": [
    {
      "pointer": "/sizes/0/sizing_strategy",
      "code": "unsupported_value",
      "detail": "The selected sizes.0.sizing_strategy is invalid.",
      "allowed_values": [
        "fixed_width",
        "fixed_height"
      ]
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 422
{
  "type": "https://www.signcustomiser.com/help/api/problems/unknown_field",
  "title": "Unknown field",
  "status": 422,
  "code": "unknown_field",
  "detail": "The document contains fields this resource does not define: /sheet_pricing/pricings. Unknown fields are rejected rather than ignored so a typo can never silently change meaning.",
  "errors": [
    {
      "pointer": "/sheet_pricing/pricings",
      "code": "unknown_field",
      "detail": "The field \"pricings\" is not part of the pricing document."
    }
  ],
  "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. Wait 60 seconds, then retry.",
  "retry_after": 60,
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}