Queek docs
Merchant endpoint reference

Translations

GET
/locales

Requires scope merchant-locales-read.

Lists the store’s enabled locales with catalogue names, publish state and the primary flag.

Authorization

merchantKey
X-Client-Key<token>

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

X-Client-Key*string

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.

X-Request-Id?string

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    }  ]}
POST
/locales

Requires scope merchant-locales-write.

Enables a catalogue locale on the store; answers the added locale, unpublished until published.

Authorization

merchantKey
X-Client-Key<token>

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

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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  }}
PATCH
/locales/{locale}

Requires scope merchant-locales-write.

Publishes or unpublishes an enabled locale. {locale} is a catalogue code of this store.

Authorization

merchantKey
X-Client-Key<token>

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

locale*string

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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  }}
DELETE
/locales/{locale}

Requires scope merchant-locales-write.

Removes a locale with all of its translations. {locale} is a catalogue code of this store.

Authorization

merchantKey
X-Client-Key<token>

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

locale*string

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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  }}
GET
/translatable-resources

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
X-Client-Key<token>

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

limit?|
Range1 <= value <= 100
starting_after?string|null
type*string

Value in

  • "product"
  • "product_variation"
  • "product_variation_item"
  • "collection"
  • "category"
  • "page"
  • "post"
  • "menu"
  • "theme_string"

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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"}
GET
/translatable-resources/{type}/{id}

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
X-Client-Key<token>

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

type*string
id*string

Query Parameters

locale?|
Lengthlength <= 12

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"
  • null

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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"      }    ]  }}
DELETE
/translations/{type}/{id}

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
X-Client-Key<token>

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

type*string
id*string

Query Parameters

locales[]?array<>

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"
keys[]?array<>

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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  }}
PUT
/translations/{type}/{id}

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
X-Client-Key<token>

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

type*string
id*string

Header Parameters

X-Client-Key*string

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.

X-Request-Id?string

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.

Idempotency-Key?string

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"      }    ]  }}