Sign Customiser

List the translation rows of one customiser language, in catalogue order — the order the merchant admin editor presents them in, which groups related copy together and stays stable across pages. Every row carries two phases.

GET/api/v3/customisers/{customiser_id}/languages/{language_code}/translations

Overview

The draft_* members are what a merchant or an AI translation is working on; the published_* members are what the storefront serves. Only publishing the language promotes one to the other. source_text is the copy being translated, in the language named by source_language_code on the language itself. draft_stale and published_stale are true when the value is filled but the source has changed since it was written: the value still serves and still publishes, it simply no longer matches what it was translated from. retired rows are keys whose copy no longer exists. They are kept for history, excluded from publishing and from AI work, and refused on write — use filter[retired]=false to leave them out entirely. The operation is read-only, has no side effects, and is always safe to retry. Requires the customisers:read scope. A 404 problem with code resource_not_found means the customiser or the language does not exist on the store your API key belongs to. A 401 problem means the key is missing, invalid, or expired; a 403 problem with code insufficient_scope means the key lacks customisers:read; a 422 problem means an unknown query parameter, an unknown filter, or an invalid cursor; a 429 problem means too many requests — wait retry_after seconds, then retry.

Authorisation

Bearer token required. Include it in theAuthorization header.

Required scope: customisers:read

Path parameters

customiser_idstringpathrequired

The customiser id, from the list customisers operation.

Example: 1

language_codestringpathrequired

The language tag, from the list customiser languages operation.

Example: fr

Query parameters

limitstringquery

The page size, 1 to 100. Defaults to 20.

Example: 20

cursorstringquery

The opaque next_cursor from a previous page.

Example: eyJ2IjoxfQ

filter%5Bgroup%5Dstringquery

Only rows in one catalogue group.

Example: selections

filter%5Bkey%5Dstringquery

Only the row with this exact catalogue key.

Example: selection:12:label

filter%5Brequired%5Dstringquery

Only required (true) or only optional (false) rows.

Example: true

filter%5Bretired%5Dstringquery

Only retired (true) or only live (false) rows.

Example: false

List language translations
curl https://web.signcustomiser.com/api/v3/customisers/1/languages/fr/translations?limit=20&cursor=eyJ2IjoxfQ&filter%5Bgroup%5D=selections&filter%5Bkey%5D=selection%3A12%3Alabel&filter%5Brequired%5D=true&filter%5Bretired%5D=false \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'
Response
{
  "data": [
    {
      "object": "customiser_language_translation",
      "customiser_id": 42,
      "language_code": "fr",
      "key": "selection:12:label",
      "group": "selections",
      "required": true,
      "retired": false,
      "source_text": "Colour",
      "draft_value": "Couleur",
      "draft_status": "current",
      "draft_origin": "merchant",
      "draft_stale": false,
      "published_value": null,
      "published_status": "missing",
      "published_origin": null,
      "published_stale": false,
      "published_at": null,
      "updated_at": "2026-05-04T09:11:20Z"
    }
  ],
  "pagination": {
    "has_more": false,
    "next_cursor": null
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/languages/fr/translations",
    "documentation": "https://www.signcustomiser.com/help/api/",
    "next": null
  },
  "meta": {
    "api_version": "v3",
    "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
  }
}