Customisers
List customisers
List the store's customisers — the configurable sign products shoppers
design on the storefront. Call this to discover what the store sells and
to find the integer id used by every per-customiser operation. Each
item reports the customiser's pricing model (simple_letter,
advanced_letter or frame_fit, with a human display name), its
sign_category and product_family, its styling selection_mode
(single_style styles the whole sign as one unit; per_word lets the
shopper style each word), and whether it is active on the storefront.
The operation is read-only, has no side effects, and is always safe to
retry. Requires the customisers:read scope; results are always limited
to the store the API key belongs to.
Results are paginated: data holds up to limit customisers in
creation order (oldest first, stable across pages). While
pagination.has_more is true, fetch the next page by requesting
links.next — or by passing pagination.next_cursor as the cursor
parameter with the same filters. Cursors are opaque and server-owned:
send them back unchanged, never construct or edit one. A cursor is only
valid for the exact filter combination it was issued with; changing
filters (or altering the cursor) yields a 422 problem with code
invalid_cursor — restart from the first page by dropping the cursor.
Unsupported filters or parameters are rejected with a 422 problem
rather than ignored, so a typo can never silently change meaning.
A 401 problem means the key is missing, invalid, or expired. A 403
problem with code insufficient_scope means the key is valid but lacks
customisers:read; its required_scopes and granted_scopes members
say which scope is missing. A 429 problem means too many requests: wait
retry_after seconds, then retry. Error responses use RFC 9457
problem+json with a machine-readable code, a documentation link in
type, and a request_id to quote when contacting support.
Authorisation
Bearer token required. Include in the
Authorization header.
Query parameters
How many customisers to return per page, between 1 and 100. Defaults to 20.
Example: 2
Only return customisers that are (`true`) or are not (`false`) live on the storefront.
Example: true
Only return customisers using this pricing model. One of `simple_letter`, `advanced_letter` or `frame_fit`.
Example: simple_letter
curl https://web.signcustomiser.com/api/v3/customisers?limit=2&cursor=&filter%5Bactive%5D=true&filter%5Bpricing_model%5D=simple_letter \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'{
"data": [
{
"object": "customiser",
"id": 42,
"name": "Neon sign builder",
"active": true,
"pricing_model": "simple_letter",
"pricing_model_display_name": "Simple Letter",
"sign_category": "neon",
"product_family": "neon",
"selection_mode": "single_style",
"created_at": "2026-01-12T03:14:15Z",
"updated_at": "2026-06-01T22:09:41Z"
},
{
"object": "customiser",
"id": 57,
"name": "Metal letters",
"active": true,
"pricing_model": "advanced_letter",
"pricing_model_display_name": "Advanced Letter",
"sign_category": "metal_channel_letter",
"product_family": "channel_letter",
"selection_mode": "per_word",
"created_at": "2026-02-03T11:00:00Z",
"updated_at": "2026-06-14T09:27:03Z"
}
],
"pagination": {
"has_more": true,
"next_cursor": "eyJ2IjoxLCJhIjo1NywiZiI6IjZiOGY0YTJjOWQxZTBiN2EifQ.uLXovDLxjWFeqIhqbqcyIA"
},
"links": {
"self": "https://web.signcustomiser.com/api/v3/customisers?limit=2",
"documentation": "https://www.signcustomiser.com/help/api/",
"next": "https://web.signcustomiser.com/api/v3/customisers?limit=2&cursor=eyJ2IjoxLCJhIjo1NywiZiI6IjZiOGY0YTJjOWQxZTBiN2EifQ.uLXovDLxjWFeqIhqbqcyIA"
},
"meta": {
"api_version": "v3",
"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: Authorization: Bearer <api key>. Keys are created in the merchant admin under Integrate → API Tokens.",
"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:read scope, but the API key grants the following scopes: store:read. Create a key that includes the required scope in the merchant admin under Integrate → API Tokens.",
"required_scopes": [
"customisers:read"
],
"granted_scopes": [
"store:read"
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/invalid_cursor",
"title": "Invalid cursor",
"status": 422,
"code": "invalid_cursor",
"detail": "The cursor is not one this API issued. Cursors are opaque: send the pagination.next_cursor value from a previous response back unchanged, or restart pagination by repeating the request without a cursor.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/unknown_filter",
"title": "Unknown filter",
"status": 422,
"code": "unknown_filter",
"detail": "The request includes filters this endpoint does not support: status. Supported filters: active, pricing_model.",
"errors": [
{
"parameter": "filter[status]",
"code": "unknown_filter",
"detail": "The filter \"status\" is not supported by this endpoint."
}
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/invalid_parameter",
"title": "Invalid query parameter",
"status": 422,
"code": "invalid_parameter",
"detail": "The filter[pricing_model] value is not a supported pricing model.",
"errors": [
{
"parameter": "filter[pricing_model]",
"code": "unsupported_value",
"detail": "The filter[pricing_model] value is not a supported pricing model.",
"allowed_values": [
"simple_letter",
"advanced_letter",
"frame_fit"
]
}
],
"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 request limit for this API key. Wait 60 seconds, then retry.",
"retry_after": 60,
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}