Translations
Requires scope merchant-locales-read.
Lists the store’s enabled locales with catalogue names, publish state and the primary flag.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/locales" \ -H "X-Client-Key: {{merchantKey}}"{ "status": "success", "message": "Locales retrieved", "data": [ { "locale": "en", "name": "English", "native_name": "English", "html_lang": "en", "dir": "ltr", "published": true, "is_primary": true }, { "locale": "fr", "name": "French", "native_name": "Français", "html_lang": "fr", "dir": "ltr", "published": true, "is_primary": false }, { "locale": "de", "name": "German", "native_name": "Deutsch", "html_lang": "de", "dir": "ltr", "published": false, "is_primary": false } ]}Requires scope merchant-locales-write.
Enables a catalogue locale on the store; answers the added locale, unpublished until published.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
POST locales {locale} — enable a catalogue locale on the store. The code must be a supported catalogue code; anything else is a 422, never a guess.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/locales" \ -H "X-Client-Key: {{merchantKey}}" \ -H "Content-Type: application/json" \ -d '{ "locale": "fr" }'{ "status": "success", "message": "Locale added", "data": { "locale": "fr", "name": "French", "native_name": "Français", "html_lang": "fr", "dir": "ltr", "published": false, "is_primary": false }}Requires scope merchant-locales-write.
Publishes or unpublishes an enabled locale. {locale} is a catalogue code of this store.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Path Parameters
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
PATCH locales/{locale} — publish or unpublish an enabled locale by sending
published. An unknown code, or a code the store never added, answers 404.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PATCH "https://example.com/locales/fr" \ -H "X-Client-Key: {{merchantKey}}" \ -H "Content-Type: application/json" \ -d '{ "published": true }'{ "status": "success", "message": "Locale updated", "data": { "locale": "fr", "name": "French", "native_name": "Français", "html_lang": "fr", "dir": "ltr", "published": true, "is_primary": false }}Requires scope merchant-locales-write.
Removes a locale with all of its translations. {locale} is a catalogue code of this store.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Path Parameters
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X DELETE "https://example.com/locales/de" \ -H "X-Client-Key: {{merchantKey}}"{ "status": "success", "message": "Locale removed", "data": { "locale": "de", "deleted": true }}Requires scope merchant-translations-read.
Lists one resource type’s translatable content — the current source value, digest and kind per key — with cursor pagination (limit + starting_after, has_more/next_cursor). theme_string is the store’s own singleton: the page carries every theme key of the active theme with has_more false — English comes from the theme registry sync (themes.en_default), with the deprecated owner-asserted theme_strings_en config row as fallback.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Query Parameters
1 <= value <= 100Value in
- "product"
- "product_variation"
- "product_variation_item"
- "collection"
- "category"
- "page"
- "post"
- "menu"
- "theme_string"
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/translatable-resources?limit=2&type=product" \ -H "X-Client-Key: {{merchantKey}}"{ "data": [ { "type": "product", "id": 20417, "content": [ { "key": "title", "value": "Jollof Rice Party Pack", "digest": "717305e87d2a399c8e9bb34ec9185ed112d0f79dad537eef7390b4a16fd23227", "type": "text" }, { "key": "description", "value": "Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10.", "digest": "fe36ee78505f529bfdd4a2712f6d5cee201e4260b3d9a814535b1b6b92d3622c", "type": "html" }, { "key": "excerpt", "value": "Smoky party jollof for 10, with fried plantain and grilled chicken.", "digest": "5fd1090cc7510d55f0cba61ef520a4e5b8c2fbce650a2032ae84cf2a1c0584cd", "type": "text" } ] }, { "type": "product", "id": 20418, "content": [ { "key": "title", "value": "Homemade Chapman", "digest": "1b3a09a0177033cf7132f3b625228c66f2112485288611e3fd4309e4cbc3b4ed", "type": "text" }, { "key": "description", "value": "Our house Chapman, mixed fresh every morning. Served chilled.", "digest": "5dc5de76314169d70ac5f1008ed3c62e6ed0ac4ebd6b6be334e3a316a355c8e6", "type": "html" }, { "key": "excerpt", "value": "Fresh Chapman with cucumber and orange slices.", "digest": "da2da5ed20ba1c1a185ffcf1ed030b1e0f4d0455283599b9b950d7fba32b42e9", "type": "text" } ] } ], "has_more": true, "next_cursor": "eyJpZCI6MjA0MTgsIl9wb2ludHNUb05leHRJdGVtcyI6dHJ1ZX0"}Requires scope merchant-translations-read.
Retrieves one resource’s translatable content with its stored translations, each flagged outdated when the source changed since. {id} is a p_id or UUID of this store. For theme_string, {id} is the store’s own p_id, slug or UUID and keys are <theme-slug>.<dotted-key> against the store’s English defaults (e.g. roast.cart.title) — served from the active theme’s registry-synced en_default, with the deprecated owner-asserted theme_strings_en config row as fallback.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Path Parameters
Query Parameters
length <= 12Value in
- "en"
- "fr"
- "es"
- "pt"
- "pt-BR"
- "de"
- "it"
- "nl"
- "pl"
- "ru"
- "uk"
- "tr"
- "ar"
- "ur"
- "fa"
- "he"
- "hi"
- "ja"
- "ko"
- "zh-CN"
- "zh-TW"
- "id"
- "ms"
- "vi"
- "th"
- "tl"
- "sw"
- "ha"
- "yo"
- "ig"
- "pcm"
- null
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/translatable-resources/product/20417?locale=fr" \ -H "X-Client-Key: {{merchantKey}}"{ "status": "success", "message": "Translatable resource retrieved", "data": { "type": "product", "id": 20417, "content": [ { "key": "title", "value": "Jollof Rice Party Pack", "digest": "717305e87d2a399c8e9bb34ec9185ed112d0f79dad537eef7390b4a16fd23227", "type": "text" }, { "key": "description", "value": "Firewood-smoked party jollof cooked to order, served with dodo and six pieces of grilled chicken. Feeds 10.", "digest": "fe36ee78505f529bfdd4a2712f6d5cee201e4260b3d9a814535b1b6b92d3622c", "type": "html" }, { "key": "excerpt", "value": "Smoky party jollof for 10, with fried plantain and grilled chicken.", "digest": "5fd1090cc7510d55f0cba61ef520a4e5b8c2fbce650a2032ae84cf2a1c0584cd", "type": "text" } ], "translations": [ { "key": "title", "locale": "fr", "value": "Pack Fête Jollof", "outdated": false, "updated_at": "2026-09-30T12:00:00+01:00" } ] }}Requires scope merchant-translations-write.
Removes one resource’s translations, optionally narrowed to locales and/or keys. {id} is a p_id or UUID of this store. For theme_string, narrowing to keys prunes a retired theme slug’s dormant overrides.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Path Parameters
Query Parameters
Value in
- "en"
- "fr"
- "es"
- "pt"
- "pt-BR"
- "de"
- "it"
- "nl"
- "pl"
- "ru"
- "uk"
- "tr"
- "ar"
- "ur"
- "fa"
- "he"
- "hi"
- "ja"
- "ko"
- "zh-CN"
- "zh-TW"
- "id"
- "ms"
- "vi"
- "th"
- "tl"
- "sw"
- "ha"
- "yo"
- "ig"
- "pcm"
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X DELETE "https://example.com/translations/product/20417" \ -H "X-Client-Key: {{merchantKey}}"{ "status": "success", "message": "Translations removed", "data": { "type": "product", "id": 20417, "deleted": 2 }}Requires scope merchant-translations-write.
Registers up to 100 translations on one resource against the current source digests — all or nothing. A stale digest, unknown locale or unknown key answers a per-item translation_* code and writes nothing. {id} is a p_id or UUID of this store. Translator flow for theme_string: English defaults arrive via the theme registry sync (no English write path here — the owner-asserted theme_strings_en config row is a deprecated fallback only), echo each key’s current digest, then write at most 100 keys per call — N sequential calls carry a full dictionary.
Authorization
merchantKey The store's private API key (sk_live_…, sk_test_… on a dev store) from Dashboard → Settings → API keys. It is bound to one store and carries the scopes the merchant granted; each operation names the scope it needs. Server-side only — never ship it to a browser or an app bundle.
In: header
Path Parameters
Header Parameters
A private API key (sk_live_…, sk_test_… on a dev store) minted under Dashboard → Settings → API keys. The key is bound to ONE store, so no vendor header or vendor_id is sent; its scopes decide which operations it may call. pk_ public keys never reach this API. Keep it on your server.
Your own correlation id (8–128 chars, ^[A-Za-z0-9_.:-]+$). Echoed back on the response and on every log line of the request; one is generated when you omit it.
Retry-safe write key. The same key with the same body replays the stored response for 24h with Idempotent-Replayed: true; with a different body it is 409 idempotency_key_reuse; while the first call is still running it is 409 idempotency_key_in_progress.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
PUT translations/{type}/{id} — register a batch of translations against the current source digests. The body shape is validated first (at most 100 items); then each item's locale, key and digest is checked against the live source text. Failures answer per-item codes (translation_unknown_locale, translation_unknown_key, translation_digest_stale) and nothing is written unless every item passes.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PUT "https://example.com/translations/product/20417" \ -H "X-Client-Key: {{merchantKey}}" \ -H "Content-Type: application/json" \ -d '{ "translations": [ { "locale": "fr", "key": "title", "value": "Pack Fête Jollof", "digest": "717305e87d2a399c8e9bb34ec9185ed112d0f79dad537eef7390b4a16fd23227" } ] }'{ "status": "success", "message": "Translations registered", "data": { "type": "product", "id": 20417, "translations": [ { "key": "title", "locale": "fr", "value": "Pack Fête Jollof", "outdated": false, "updated_at": "2026-09-30T12:00:00+01:00" } ] }}