Storefront page SEO translations

Read and write localized storefront page seo fields through the Store API.

Translate seo_title, seo_description, social_title and social_description of a storefront's home, shop and search pages for an enabled language other than the store's default. The social image and robots settings are shared by all languages; set them for one country and language with Country page SEO. Supply strings; an empty string clears a translation and omitted fields remain unchanged. A page nobody has edited can be translated without changing its source fields.

Source edits mark translations outdated but keep serving them until replaced or removed. A field without a translation shows the generated default for that language, never the default-language text. Generated copy exists in ar, bn, cs, da, de, en, es, fi, fr, he, id, it, ja, ko, ms, nb, nl, no, pl, pt, pt-BR, pt-PT, ru, sv, th, tr, vi, zh, zh-CN and zh-TW; other languages get the English generated copy, so supply your own text for them. A translated title is final: the title pattern and store-name suffix are not applied to it. Reads require read_storefront and read_translations; writes require write_storefront and write_translations.

Get storefront page SEO translation

GET read_storefront + read_translations

Get translated SEO for a storefront's home, shop or search page in one locale.

The locale must be enabled and cannot be the store's default language. Fields without a translation in this locale are omitted from the response. The storefront does not show the source-language text for them: shoppers browsing in this locale get the generated default for this language. Generated copy exists in ar, bn, cs, da, de, en, es, fi, fr, he, id, it, ja, ko, ms, nb, nl, no, pl, pt, pt-BR, pt-PT, ru, sv, th, tr, vi, zh, zh-CN and zh-TW; other languages get the English generated copy, so write your own text for them.

Path parameters

Name Type Description
storefrontId required uuid

Storefront id from List storefronts.

Example: 0b7c2f0e-6a43-4f7e-9d1c-3f2a8e5b9c41
pageType required string

Storefront page: home, shop or search.

Allowed values
homeshopsearch
Example: shop
locale required string

Enabled non-default store locale.

Example: fr

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 INVALID_INPUT

    The storefront id is not a UUID.

  • 404 STOREFRONT_NOT_FOUND

    No storefront with this id belongs to the store.

  • 400 STORE_API_INVALID_REQUEST_BODY

    The body has an invalid shape. Translation values must be strings.

  • 400 PAGE_SEO_PAGE_TYPE_INVALID

    A page type is not home, shop or search.

  • 400 TRANSLATION_LOCALE_REQUIRED

    A locale is required.

  • 400 TRANSLATION_LOCALE_NOT_ENABLED

    The locale is not enabled for this store.

  • 400 TRANSLATION_DEFAULT_LOCALE_FORBIDDEN

    The source language cannot be a translation target.

  • 400 TRANSLATION_FIELD_NOT_TRANSLATABLE

    Only the four SEO and social text fields can be translated.

  • 400 TRANSLATION_FIELDS_REQUIRED

    Provide at least one field.

  • 400 TRANSLATION_NO_SOURCE_TEXT

    Save source text before adding its translation.

  • 404 TRANSLATION_RESOURCE_NOT_FOUND

    Save source SEO before writing translations for this page.

  • 409 TRANSLATION_MUTATION_CONFLICT

    The idempotency key was already used for another translation change.

  • 400 PAGE_SEO_META_TITLE_INVALID_CHARS

    A translated title contains unsupported characters.

  • 400 PAGE_SEO_META_TITLE_TOO_LONG

    A translated title exceeds its limit.

  • 400 PAGE_SEO_META_DESCRIPTION_INVALID_CHARS

    A translated description contains unsupported characters.

  • 400 PAGE_SEO_META_DESCRIPTION_TOO_LONG

    A translated description exceeds its limit.

Set storefront page SEO translation

PUT write_storefront + write_translations

Set or clear translated SEO fields for a storefront's home, shop or search page.

Only seo_title, seo_description, social_title and social_description are translatable; the social image and robots settings are shared by all languages (set them per country with Update country page SEO). An empty value clears only that locale's translation, after which the page shows the generated default for that language. A page nobody has edited can be translated: its row is created without changing any source field. Writes are atomic. A write waits at most 2 seconds for other translation writes of the same item or of a clashing name or slug (for example a translation CSV import writing the same language); writes of other items, types and languages never wait. A row or call that fails with TRANSLATION_WRITE_BUSY (HTTP 503) saved nothing: send it again after error.details.retry_after_seconds (the call's Retry-After header says the same). Every row or call either saved or reports an error; none is left in an unknown state.

Path parameters

Name Type Description
storefrontId required uuid

Storefront id from List storefronts.

Example: 0b7c2f0e-6a43-4f7e-9d1c-3f2a8e5b9c41
pageType required string

Storefront page: home, shop or search.

Allowed values
homeshopsearch
Example: shop
locale required string

Enabled non-default store locale.

Example: fr

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Idempotency-Key string

Optional key for this translation write. Reuse it only with the same payload when repeating the request.

Body parameters

Name Type Description
translations required object

Field-keyed translations.

Example: {"seo_title":"Boutique","seo_description":"Découvrez tous nos produits."}

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 INVALID_INPUT

    The storefront id is not a UUID.

  • 404 STOREFRONT_NOT_FOUND

    No storefront with this id belongs to the store.

  • 400 STORE_API_INVALID_REQUEST_BODY

    The body has an invalid shape. Translation values must be strings.

  • 400 PAGE_SEO_PAGE_TYPE_INVALID

    A page type is not home, shop or search.

  • 400 TRANSLATION_LOCALE_REQUIRED

    A locale is required.

  • 400 TRANSLATION_LOCALE_NOT_ENABLED

    The locale is not enabled for this store.

  • 400 TRANSLATION_DEFAULT_LOCALE_FORBIDDEN

    The source language cannot be a translation target.

  • 400 TRANSLATION_FIELD_NOT_TRANSLATABLE

    Only the four SEO and social text fields can be translated.

  • 400 TRANSLATION_FIELDS_REQUIRED

    Provide at least one field.

  • 400 TRANSLATION_NO_SOURCE_TEXT

    Save source text before adding its translation.

  • 404 TRANSLATION_RESOURCE_NOT_FOUND

    Save source SEO before writing translations for this page.

  • 409 TRANSLATION_MUTATION_CONFLICT

    The idempotency key was already used for another translation change.

  • 400 PAGE_SEO_META_TITLE_INVALID_CHARS

    A translated title contains unsupported characters.

  • 400 PAGE_SEO_META_TITLE_TOO_LONG

    A translated title exceeds its limit.

  • 400 PAGE_SEO_META_DESCRIPTION_INVALID_CHARS

    A translated description contains unsupported characters.

  • 400 PAGE_SEO_META_DESCRIPTION_TOO_LONG

    A translated description exceeds its limit.

  • 503 TRANSLATION_WRITE_BUSY

    Other translation writes held the item or a clashing name or slug for more than 2 seconds; nothing was saved. Send the request again after error.details.retry_after_seconds (also the Retry-After header).

  • 400 STORE_API_BODY_PROPERTY_UNKNOWN

    The body has a property this request does not accept. The message and error.details.properties list the allowed and required properties (nested for each object or list of objects).

  • 400 STORE_API_BODY_PROPERTY_INVALID

    A body property has the wrong type (error.details.expected_type). The message and error.details.properties list the allowed and required properties.

Batch get storefront page SEO translations

GET read_storefront + read_translations

Get translations for several of a storefront's system pages.

Omit page_types to return home, shop and search. Otherwise pass a comma-separated subset; duplicates and unknown values are rejected. Fields without a translation in this locale are omitted from the response. The storefront does not show the source-language text for them: shoppers browsing in this locale get the generated default for this language. Generated copy exists in ar, bn, cs, da, de, en, es, fi, fr, he, id, it, ja, ko, ms, nb, nl, no, pl, pt, pt-BR, pt-PT, ru, sv, th, tr, vi, zh, zh-CN and zh-TW; other languages get the English generated copy, so write your own text for them.

Path parameters

Name Type Description
storefrontId required uuid

Storefront id from List storefronts.

Example: 0b7c2f0e-6a43-4f7e-9d1c-3f2a8e5b9c41
locale required string

Enabled non-default store locale.

Example: fr

Query parameters

Name Type Description
page_types string

Comma-separated page types from home, shop and search.

Example: home,shop

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 INVALID_INPUT

    The storefront id is not a UUID.

  • 404 STOREFRONT_NOT_FOUND

    No storefront with this id belongs to the store.

  • 400 STORE_API_INVALID_REQUEST_BODY

    The body has an invalid shape. Translation values must be strings.

  • 400 PAGE_SEO_PAGE_TYPE_INVALID

    A page type is not home, shop or search.

  • 400 TRANSLATION_LOCALE_REQUIRED

    A locale is required.

  • 400 TRANSLATION_LOCALE_NOT_ENABLED

    The locale is not enabled for this store.

  • 400 TRANSLATION_DEFAULT_LOCALE_FORBIDDEN

    The source language cannot be a translation target.

  • 400 TRANSLATION_FIELD_NOT_TRANSLATABLE

    Only the four SEO and social text fields can be translated.

  • 400 TRANSLATION_FIELDS_REQUIRED

    Provide at least one field.

  • 400 TRANSLATION_NO_SOURCE_TEXT

    Save source text before adding its translation.

  • 404 TRANSLATION_RESOURCE_NOT_FOUND

    Save source SEO before writing translations for this page.

  • 409 TRANSLATION_MUTATION_CONFLICT

    The idempotency key was already used for another translation change.

  • 400 PAGE_SEO_META_TITLE_INVALID_CHARS

    A translated title contains unsupported characters.

  • 400 PAGE_SEO_META_TITLE_TOO_LONG

    A translated title exceeds its limit.

  • 400 PAGE_SEO_META_DESCRIPTION_INVALID_CHARS

    A translated description contains unsupported characters.

  • 400 PAGE_SEO_META_DESCRIPTION_TOO_LONG

    A translated description exceeds its limit.

Batch set storefront page SEO translations

PUT write_storefront + write_translations

Set system page translations for any languages in one call.

Each row is one system page in one language: page_type, locale (any enabled non-default store locale) and fields. Rows for several languages can be mixed in one call; send at most 100 rows (one row = one system page in one locale) and at most one row per system page and locale. Each row is saved on its own: a failing row never stops the others. Empty values clear the matching field translation; omitted fields keep their translation. Every row is validated exactly like the single translation endpoint. The response has totals (rows, saved, failed) and one results entry per row in request order: {page_type, locale, status} with status saved or failed. A failed row carries the full error (code, message, details); its codes are the single endpoint's codes plus TRANSLATION_ROW_DUPLICATE. A saved rich-text row whose unsafe markup was removed lists warnings. A top-level code and message give the outcome: TRANSLATIONS_SAVED (200, every row saved), TRANSLATIONS_PARTIALLY_SAVED (200, success: true; the message counts saved and failed rows and names the failure reasons, e.g. "2 saved, 1 failed. No source text found for the requested fields (description).") TRANSLATIONS_NOT_SAVED_RETRY (503 with a Retry-After header, success: false; no row saved because every row failed only with TRANSLATION_WRITE_BUSY, so the same call can be sent again after error.details.retry_after_seconds) or TRANSLATIONS_NOT_SAVED (422, success: false; no row saved and at least one row failed for another reason). Both carry the same totals and results in error.details. With an Idempotency-Key, repeating the same request re-applies nothing that already saved and retries the failed rows. A write waits at most 2 seconds for other translation writes of the same item or of a clashing name or slug (for example a translation CSV import writing the same language); writes of other items, types and languages never wait. A row or call that fails with TRANSLATION_WRITE_BUSY (HTTP 503) saved nothing: send it again after error.details.retry_after_seconds (the call's Retry-After header says the same). Every row or call either saved or reports an error; none is left in an unknown state.

Path parameters

Name Type Description
storefrontId required uuid

Storefront id from List storefronts.

Example: 0b7c2f0e-6a43-4f7e-9d1c-3f2a8e5b9c41

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Idempotency-Key string

Optional key for this translation write. Reuse it only with the same payload when repeating the request.

Body parameters

Name Type Description
translations required array<object>

Up to 100 rows shaped as {page_type, locale, fields}. Allowed fields are seo_title and seo_description.

Example: [{"fields":{"seo_title":"Acme – Boutique officielle"},"locale":"fr","page_type":"home"},{"fields":{"seo_title":"Acme – Boutique officielle"},"locale":"de","page_type":"home"},{"fields":{"seo_title":"Acme – Boutique officielle"},"locale":"pt-BR","page_type":"home"}]

Errors

  • 401 UNAUTHORIZED

    Authorization header missing, malformed, or token invalid/expired.

  • 402 SUBSCRIPTION_REQUIRED

    The store does not have an active or trialing subscription.

  • 403 STORE_API_SCOPE_REQUIRED

    Token is valid but lacks the required scope for this call.

  • 429 RATE_LIMITED

    The token's request allowance is exhausted. Retry after the Retry-After header.

  • 400 STORE_API_INVALID_REQUEST_BODY

    The body is not valid JSON or a row has an unknown key or a wrongly typed value.

  • 400 TRANSLATION_NO_WRITES_PROVIDED

    translations is empty.

  • 400 TRANSLATION_TOO_MANY_ROWS

    More than 100 rows; nothing is written.

  • 503 TRANSLATIONS_NOT_SAVED_RETRY

    No row saved and every row failed only with TRANSLATION_WRITE_BUSY: send the same request again after error.details.retry_after_seconds (also the Retry-After header). error.details also has totals and one results entry per row with its error.

  • 422 TRANSLATIONS_NOT_SAVED

    No row saved and at least one row failed with an error that sending again will not fix; error.details has totals and one results entry per row with its error.

  • 400 STORE_API_BODY_PROPERTY_UNKNOWN

    The body has a property this request does not accept. The message and error.details.properties list the allowed and required properties (nested for each object or list of objects).

  • 400 STORE_API_BODY_PROPERTY_INVALID

    A body property has the wrong type (error.details.expected_type). The message and error.details.properties list the allowed and required properties.