Customiser letter parts
Add a letter part's demo colours
Fills an empty letter part with the demo colours Sign Customiser offers for its sign category, the starter palette the merchant admin offers on an empty letter part. The colours are created in their demo order, and the response lists every created colour in the projection the colours list uses.
Overview
The letter part must be declared in the letter type's letter_parts
(422 letter_part_not_declared). The part does not need a colour
selection yet: the operation creates one when it is missing. A letter part
that already holds colours is refused with a 409
letter_part_colours_not_empty, because demo colours would mix into the
merchant's own; delete the colours first, or add colours one at a time. A
sign category and letter part with no demo colours, such as the side of a
neon sign, is refused with a 422 demo_colours_not_available. A cut-out
metal or stencil customiser refuses the operation with a 422
letter_types_not_supported. Requires customisers:write and an
Idempotency-Key; the request takes no body.
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. It reads only Sign Customiser's own demo
data, and it spends one unit of the per-key option-write budget.
Authorisation
Bearer token required. Include it in the Authorization header.
Required scope: customisers:write
Path parameters
The customiser id.
Example: 1
The letter type id.
Example: 7
The letter part.
Example: face
curl https://web.signcustomiser.com/api/v3/customisers/1/letter-types/7/letter-parts/face/colours/populate-demo \
--request POST \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'{
"data": [
{
"object": "colour",
"id": 31,
"customiser_id": 42,
"name": "White",
"description": null,
"colour_type": "single",
"hexcode": "#ffffff",
"multi_colour_hexcodes": null,
"texture": "flat",
"min_width_cm": null,
"min_height_cm": null,
"min_size_rule": "any",
"base_price": 0,
"currency": "USD",
"price_multiplier": 1,
"price_multiplier_target": "base_letter_price",
"sort_order": 1,
"image_url": "https://cdn.example.com/demo/white.png",
"example_image_url": null,
"texture_image_url": null,
"created_at": "2026-08-13T00:00:00Z",
"updated_at": "2026-08-13T00:00:00Z"
}
],
"pagination": {
"has_more": false,
"next_cursor": null
},
"links": {
"self": "https://web.signcustomiser.com/api/v3/customisers/42/letter-types/7/letter-parts/face/colours/populate-demo",
"documentation": "https://www.signcustomiser.com/help/api/",
"next": null
},
"meta": {
"api_version": "v3",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
}{
"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"
}{
"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"
}{
"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"
}{
"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"
}{
"type": "https://www.signcustomiser.com/help/api/problems/letter_part_colours_not_empty",
"title": "Letter part colours not empty",
"status": 409,
"code": "letter_part_colours_not_empty",
"detail": "The face letter part already holds colours, so demo colours would mix into them. Delete its colours first, or add colours one at a time.",
"errors": [
{
"pointer": "",
"code": "letter_part_colours_not_empty",
"detail": "The face letter part already holds colours."
}
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/demo_colours_not_available",
"title": "Demo colours not available",
"status": 422,
"code": "demo_colours_not_available",
"detail": "Sign Customiser has no demo colours for the side letter part of this sign category. Add colours one at a time instead.",
"errors": [
{
"pointer": "",
"code": "demo_colours_not_available",
"detail": "No demo colours exist for this sign category and letter part."
}
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/letter_part_not_declared",
"title": "Letter part not declared",
"status": 422,
"code": "letter_part_not_declared",
"detail": "This letter type does not declare the halo letter part. Add it to letter_parts before creating its colour selection.",
"errors": [
{
"pointer": "/letter_part",
"code": "letter_part_not_declared",
"detail": "The halo letter part is not declared by this letter type."
}
],
"declared_letter_parts": [
"face"
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/rate_limited",
"title": "Too many requests",
"status": 429,
"code": "rate_limited",
"detail": "You have exceeded the option-write budget for this API key.",
"retry_after": 60,
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}