A storefront is a shopper-facing site of the store with its own domains, mode and languages. urls lists its active, HTTPS-ready public domain names, primary first, including the permanent mytringify address on the primary storefront. The included address cannot be renamed. public_contact_email is the store’s explicitly public contact email, or empty when unset; it never substitutes private login, sender or reply-to data. Reads require read_storefront; changes require write_storefront. Each change runs the same checks as Store Admin and is recorded in the store's activity log.
The title pattern (title_template) formats generated page titles from the tokens in tokens. A title saved on a page, a translation or a country row is final and never formatted, and the home page's generated title is the store name. A non-empty pattern replaces the automatic store-name suffix: add_store_name_to_page_titles appends – and the store name only while no pattern is set. The same rule applies to every page type, content pages and policies included. The store-name suffix and the share image (the picture shown when a page is shared on social networks and in messaging apps, used when a page has no image of its own) apply to every storefront in the store. Assigning a share image also requires read_site_assets. Set a different pattern or share image for one language, or one language in one country, with SEO overrides; manage the home, shop and search pages' own SEO with Home, Shop and Search page SEO.
A storefront's status (mode) is live, maintenance or coming_soon, and you can change it here as in Store Admin. Taking a live storefront offline needs confirmation: the first request returns CONFIRMATION_REQUIRED with warnings and a single-use token for that storefront and status, and you repeat it with confirmed: true and the token after the merchant approves. Going live is refused until the store is ready; go_live in Get a storefront lists what blocks it. If someone else changed the status after you read it, the change returns STOREFRONT_MODE_CONFLICT.
A password-protected storefront asks every visitor for its password. A new password needs at least 8 characters (password_min_length in Storefront limits) and at most 72 UTF-8 bytes (password_max_bytes); a shorter one returns STOREFRONT_PASSWORD_TOO_SHORT, and a password set before this minimum keeps working until it is changed. Setting a password takes effect at once, with no confirmation, so a live storefront is hidden from shoppers immediately. Links that carry their own authorisation keep working without the password: the checkout return after a payment, /pay/ payment links, order confirmation and order status pages, newsletter confirmation and unsubscribe links, text opt-out and privacy requests. Connected product feeds stay public while a password is on. Development and transfer stores always stay protected; password_locked says so. Mode and password are independent.
Clearing the storefront cache rebuilds the pages of every storefront in the store on their next visit. It is allowed once every 12 hours per store, whoever cleared it last; cache in Get a storefront says when it can be cleared again, and an earlier attempt returns STOREFRONT_CACHE_CLEAR_TOO_SOON (HTTP 429).
A storefront publishes a set of the store's enabled languages, always including its primary language. Enable a language for the store first with Languages. The primary storefront's language always follows the store's default language. Country assignments determine which languages shoppers can select; without one, only the primary language is served. The country mapping, bulk/all-country and localization prompt endpoints below complete setup through this API. Unpublishing and default changes return a country-by-country impact for confirmation; unpublishing retains translations.
Endpoints#
Storefront limits
Get live storefront limits.
Returns the storefront limits Store Admin uses, including password_min_length (the shortest new storefront password, in characters) and password_max_bytes (the longest storefront password, in UTF-8 bytes) and the storefront modes. custom_pixels gives the custom pixel limits: at most max_per_storefront per storefront (disabled ones included), a name of 1 to name_max_length characters (at most 100) and code of at most code_max_length characters (at most 65536), both in Unicode code points, and the allowed consent_categories. Manage custom pixels with List custom pixels and Create a custom pixel.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
List storefronts
List the store's storefronts.
Returns every storefront with its mode, password protection, domains and primary_url (empty until a primary domain is active). Read a storefront's languages with Get storefront languages. urls is an array of active, HTTPS-ready public domain names, primary first, including the permanent mytringify address on the primary storefront. No schemes or paths are included. public_contact_email is the store’s explicitly public contact email, or empty when unset; it never falls back to a private login, sender or reply-to address. Both fields require read_storefront. Refresh urls on domains/create, domains/update and domains/delete; those events also include default_country, default_locale, retired_country, retired_locale, public_ready and address_revision. Read Country URLs for complete canonical addresses and diagnostics. The mytringify subdomain cannot be renamed.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
Get a storefront
Get one storefront and its page-title settings.
Adds the store's add_store_name_to_page_titles and share image to the storefront. Next to storefront (not inside it), data carries go_live: whether the store can go live (ready) and, if not, the blockers to fix first, each with its code, its message in the request language, the record to fix (target, a kind and id) and, for an incomplete primary-location address, missing_fields: each blank field as field (line1, city, postal_code or country) and its label in the request language (a location in India names its postal code "PIN code"); and cache: when the storefront cache was last cleared (last_cleared_at, null if never), when it can be cleared again (next_available_at, null if never cleared), whether it can be cleared now (can_clear, the server's verdict) and the wait between clears in hours (cooldown_hours); and mode_options: the three modes in order, each value with its label and description in the request language (English by default; live says so when a password protects the storefront), and for the offline modes offline_notice, what shoppers see once a live storefront is switched to it. Times are RFC 3339 in the store's timezone with its offset. urls is an array of active, HTTPS-ready public domain names, primary first, including the permanent mytringify address on the primary storefront. No schemes or paths are included. public_contact_email is the store’s explicitly public contact email, or empty when unset; it never falls back to a private login, sender or reply-to address. Both fields require read_storefront. Refresh urls on domains/create, domains/update and domains/delete; those events also include default_country, default_locale, retired_country, retired_locale, public_ready and address_revision. Read Country URLs for complete canonical addresses and diagnostics. The mytringify subdomain cannot be renamed.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront id from List storefronts. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
Change storefront status
Set a storefront live, in maintenance or coming soon.
mode is live, maintenance or coming_soon; the current one is mode in Get a storefront. Maintenance and coming soon take the storefront offline at once: shoppers see the maintenance or coming-soon page instead of the store. Taking a live storefront offline needs confirmation. The first request returns HTTP 409 CONFIRMATION_REQUIRED with error.details: warnings (English), confirmation_token, action, current_mode and target_mode. Show the change to the merchant and, after approval, repeat the same mode with confirmed: true and that confirmation_token. The token is single use, valid for five minutes and good only for this storefront and this target mode; a request that fails does not use it up. Switching to live, or between maintenance and coming soon, needs no confirmation. Going live is refused with STOREFRONT_NOT_READY_TO_GO_LIVE until the store is ready: error.details.blockers lists what to fix, the same list as go_live in Get a storefront. Sending the current mode changes nothing. If the status changed after you read it, the request returns STOREFRONT_MODE_CONFLICT: read the storefront again and decide anew. Password protection is separate and stays as it is. The response has the same shape as Get a storefront (storefront, go_live, cache, mode_options). A change sends storefronts/update.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront id from List storefronts. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
mode
required
|
string |
New status: |
confirmed
|
boolean |
Set true only when repeating the request after |
confirmation_token
|
string |
Single-use token from the |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STORE_API_INVALID_REQUEST_BODYThe body has an unknown field, mode is missing, or a field has the wrong type.
-
400STOREFRONT_MODE_INVALIDmode is not live, maintenance or coming_soon.
-
409CONFIRMATION_REQUIREDTaking a live storefront offline needs confirmation.
error.detailscarrieswarnings,confirmation_token,action,current_modeandtarget_mode; after approval, repeat the same mode withconfirmed: trueand the token. -
400STOREFRONT_CONFIRMATION_INVALIDThe confirmation token is missing, expired, already used, or was issued for another storefront or mode. Send the request again without it to get a new one.
-
400STOREFRONT_NOT_READY_TO_GO_LIVEThe store is not ready to go live.
error.details.blockerslists what to fix, the sameblockersasgo_livein Get a storefront: each with itscode,message,targetand, for an incomplete primary-location address,missing_fields(each blank field'sfieldandlabel). -
404LOCATION_NOT_FOUNDGoing live needs the store's primary location, and it was not found.
-
409STOREFRONT_MODE_CONFLICTThe status was changed by someone else after it was read. Read the storefront again before deciding whether to change it.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Update page titles and share image
Set the page-title template, the store-name suffix and the share image.
These are the defaults for pages that have no title or image of their own. title_template is required: send the complete template, or an empty string for no pattern. It may use only the tokens returned in tokens ({{ page_title }} and {{ shop_name }}), every {{ needs its }}, and it is at most 200 characters (Unicode code points). The pattern formats generated titles only: a title saved on a page, translation or country row is final, and the home page's generated title is the store name. A non-empty pattern replaces the automatic store-name suffix, so add_store_name_to_page_titles has no effect while one is set; without a pattern, the store name is appended to generated titles when it is on. Omit add_store_name_to_page_titles or share_image_id to keep them. share_image_id takes a site asset image id; an empty string or null removes the image, and assigning an image also requires read_site_assets. The store-name suffix and share image apply to every storefront in the store. This pattern and share image are the base for every language and country; set a different pattern or image for one language, or one language in one country, with Set an SEO override. The response includes preview for the saved settings in the storefront primary language. Each preview.samples item has kind, page_name, title and description; description is the computed plain-text meta description, with HTML removed, entities decoded and whitespace collapsed before limiting it to 160 Unicode code points (including the closing ellipsis when shortened). The samples are a generated example product, Shop and Home.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront id from List storefronts. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
title_template
required
|
string |
Pattern for generated page titles. An empty string sets no pattern. |
add_store_name_to_page_titles
|
boolean |
Append the store name to generated page titles. Has no effect while a pattern is set. |
share_image_id
|
string|null |
Site asset image shown when a page is shared. Empty or null removes it. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call. Assigning a share image also requires read_site_assets.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID. share_image_id is not a site asset image.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STORE_API_INVALID_REQUEST_BODYThe body has an unknown field, a field has the wrong type, or title_template is missing.
-
400SEO_TITLE_TEMPLATE_UNBALANCEDtitle_template has an unmatched
{{or}}. -
400SEO_TITLE_TEMPLATE_UNKNOWN_TOKENtitle_template uses a placeholder other than page_title and shop_name.
-
400SEO_TITLE_TEMPLATE_TOO_LONGtitle_template is longer than 200 characters (Unicode code points).
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Set storefront password
Turn password protection on, change the password, or turn it off.
Takes effect at once, with no confirmation step. Send a non-empty password to protect the storefront with it: from then on every visitor must enter it, so a live storefront is hidden from shoppers immediately, and visitors who unlocked it with an earlier password must enter the new one. Send an empty string or null to remove protection and make the storefront public again. Leading and trailing spaces are removed; a password made only of spaces is rejected with INVALID_INPUT. A new password needs at least password_min_length (8) characters, counted as Unicode characters after removing those spaces; a shorter one is rejected with STOREFRONT_PASSWORD_TOO_SHORT. A password set before this minimum keeps working until it is changed. Sending the password already set, or removing protection that is not on, changes nothing. Development and transfer stores always stay password protected (password_locked). Password protection and the storefront's mode are separate; change the mode with Change storefront status. The password is never returned. The response has the same shape as Get a storefront (storefront with password_protected, go_live, cache, mode_options). A change sends storefronts/update.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront id from List storefronts. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
password
required
|
string|null |
New storefront password, at least 8 characters and at most 72 UTF-8 bytes, or an empty string or null to remove protection. Only spaces is rejected. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID. The password is longer than password_max_bytes (
details.max_bytes), or it is made only of spaces (details.fieldispassword). -
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STORE_API_INVALID_REQUEST_BODYThe body has an unknown field, password is missing, or it is not a string or null.
-
400STOREFRONT_PASSWORD_TOO_SHORTThe new password is shorter than password_min_length (8) characters.
details.fieldispasswordanddetails.min_lengthis the minimum. -
403STOREFRONT_PASSWORD_LOCKED_BY_STORE_TYPEDevelopment and transfer stores cannot turn password protection off.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Get storefront languages
Get the languages a storefront publishes.
Returns the storefront's primary_locale, the locales it publishes, the enabled store languages it can publish (available_locales) and its country language rules (country_locales). Adding a language to this set does not make it selectable by shoppers: use Set storefront country languages to assign it to active-market countries and choose each default. Without an explicit country assignment only storefront primary is served.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront id from List storefronts. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
Set storefront languages
Replace the languages a storefront publishes.
Send the complete list. It must include the storefront's primary language, and every code must be a language enabled for the store (enable it first with Set languages). Codes are matched without regard to case; blanks and repeats are ignored. An unchanged list changes nothing. A change publishes storefront/locales/update. Adding a language to this set does not make it selectable by shoppers: use Set storefront country languages to assign it to active-market countries and choose each default. Without an explicit country assignment only storefront primary is served. Merchant connections also need the online_store.storefronts:write staff permission. Changes return HTTP 409 CONFIRMATION_REQUIRED before committing. Show error.details.warnings and impact, including every country's previous/resulting language codes, default_locale and inherits_primary. language_labels supplies localized display names once per storefront; retired_address_units counts removed country/language pairs and urls.translated_slugs counts affected translated resource slugs. Repeat the identical request only after merchant approval with confirmed=true and confirmation_token. The five-minute single-use token is bound to the reviewed outcome; changed state requires a fresh preview. Success code/message and country/language labels are backend-owned and English on the Store API and localized to the merchant interface language on Admin and MCP. Unpublishing retains translations. Removed-language links resolve the original resource before redirecting to its current exact-language slug in the same served country; invalid countries and deleted resources return 404. A translated slug later taken by another resource belongs to that resource. Query strings are preserved.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront id from List storefronts. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
locales
required
|
array<string> |
Every language code the storefront publishes, including its primary language. |
confirmed
|
boolean |
True only after reviewing the returned impact and obtaining approval. |
confirmation_token
|
string |
Single-use token from the first request's error.details. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STORE_API_INVALID_REQUEST_BODYThe body has an unknown field or a field has the wrong type.
-
400STOREFRONT_LANGUAGE_REQUIREDThe language list is empty.
-
400STORE_LANGUAGE_INVALIDA code is not a supported language.
-
400STOREFRONT_LANGUAGE_NOT_ENABLEDA language is not enabled for the store.
-
400STOREFRONT_PRIMARY_LANGUAGE_REQUIREDThe list leaves out the storefront's primary language.
-
409STOREFRONT_LANGUAGES_CHANGEDThe store's languages changed during the save. Read them again and retry.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Set storefront primary language
Change a secondary storefront's primary language.
The primary storefront's language always follows the store's default language; change that with Set default language. The language must be enabled for the store. Selecting the current primary language changes nothing. Merchant connections also need the online_store.storefronts:write staff permission. Changes return HTTP 409 CONFIRMATION_REQUIRED before committing. Show error.details.warnings and impact, including every country's previous/resulting language codes, default_locale and inherits_primary. language_labels supplies localized display names once per storefront; retired_address_units counts removed country/language pairs and urls.translated_slugs counts affected translated resource slugs. Repeat the identical request only after merchant approval with confirmed=true and confirmation_token. The five-minute single-use token is bound to the reviewed outcome; changed state requires a fresh preview. Success code/message and country/language labels are backend-owned and English on the Store API and localized to the merchant interface language on Admin and MCP. Unpublishing retains translations. Removed-language links resolve the original resource before redirecting to its current exact-language slug in the same served country; invalid countries and deleted resources return 404. A translated slug later taken by another resource belongs to that resource. Query strings are preserved.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront id from List storefronts. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
locale
required
|
string |
Language code enabled for the store. |
confirmed
|
boolean |
True only after reviewing the returned impact and obtaining approval. |
confirmation_token
|
string |
Single-use token from the first request's error.details. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STORE_API_INVALID_REQUEST_BODYThe body has an unknown field or a field has the wrong type.
-
400STOREFRONT_LANGUAGE_REQUIREDThe language list is empty.
-
400STORE_LANGUAGE_INVALIDA code is not a supported language.
-
400STOREFRONT_LANGUAGE_NOT_ENABLEDA language is not enabled for the store.
-
400STOREFRONT_PRIMARY_LANGUAGE_REQUIREDThe list leaves out the storefront's primary language.
-
409STOREFRONT_LANGUAGES_CHANGEDThe store's languages changed during the save. Read them again and retry.
-
400STOREFRONT_PRIMARY_LANGUAGE_LOCKEDThe storefront is the store's primary storefront.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Clear storefront cache
Clear the cached pages of every storefront in the store.
Clears the cache of all the store's storefronts, not just one: each page is built again on its next visit, so the first visits after a clear are slower. Saved changes publish on their own; clear the cache only when shoppers still see outdated pages. The cache can be cleared once every 12 hours per store, whoever cleared it last (Store Admin, the mobile app, an app or this API). Read cache in Get a storefront to see whether it can be cleared now. A clear inside the 12 hours is refused with HTTP 429 STOREFRONT_CACHE_CLEAR_TOO_SOON, a Retry-After header and error.details: last_cleared_at, next_available_at and retry_after_seconds; do not retry before next_available_at. Send no body or an empty object. The response reports last_cleared_at, next_available_at, can_clear and cooldown_hours; times are RFC 3339 in the store's timezone with its offset.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400STORE_API_INVALID_REQUEST_BODYThe body is not empty and not a JSON object, or it has a field.
-
429STOREFRONT_CACHE_CLEAR_TOO_SOONThe cache was cleared less than 12 hours ago.
error.detailscarrieslast_cleared_atandnext_available_at(RFC 3339 in the store's timezone with its offset) andretry_after_seconds, and theRetry-Afterheader gives the seconds to wait.
List country URLs
Read each covered country's public addresses and problems.
Read-only, under read_storefront; apps need no domain or email-settings scopes. Returns one row per country of the storefront's active markets: host (the public host its addresses use; empty when none is available), domain_id (only for a dedicated country domain), currency_code, default_language and default_language_label, language_source (country, or storefront_primary when no language selection is saved for the country), languages (localized labels), mode (shared or dedicated), status (ready or configuration_error), configuration_issues (stable codes), configuration_messages (backend wording for those codes), decisions (backend wording for the row's automatic choices) and addresses (locale, locale_name, url, is_default). A row with configuration issues returns no addresses; a dedicated country whose domain is not connected stays dedicated and is never given shared addresses. address_policy is one backend sentence on what a domain or default-language change does to a country's addresses. address_revision increases whenever any address of the storefront changes: if it changes between page reads, restart at page 1; refresh after storefronts/update and domains/* events. Counts reflect the search; total reflects the selected filter. No DNS records, tokens or connection secrets are returned. Use the returned URLs as they are; do not build addresses in an integration. Address grammar: on the shared host the store's primary country in the storefront's primary language is at the root, another language of that country is /{locale}, and every other country-language pair is /{locale}-{country}; a regional language always names the country, for example /pt-BR-us is Brazilian Portuguese in the US and /pt-br is Portuguese in Brazil. A dedicated country domain serves the country's default language at its root and other languages under /{locale}; changing the country's default language changes the language at that root. An address always selects its own country, whatever the shopper's session or location. Addresses for countries or country-language pairs never served return 404; an address in a language later removed from a country that is still served redirects (301) to the same resource in the language that country now uses, and returns 404 when the resource was deleted or when retained links match more than one resource. Links on a previous country domain that is still connected and assigned redirect to the country's current addresses, keeping the language (when still offered there), path and query.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront id. |
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
One-based country page; default 1. |
per_page
|
integer |
Country rows per page; default 25, capped by the live domain list limit. |
search
|
string |
Country or language code, localized/English/native language name, currency or assigned hostname. |
filter
|
string |
all, shared, dedicated or errors. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID, or page/per_page is not a positive integer.
-
400DOMAIN_STOREFRONT_INVALIDNo storefront with this id belongs to the store.
-
400DOMAIN_COUNTRY_URL_FILTER_INVALIDfilter is not all, shared, dedicated or errors.
-
400DOMAIN_SEARCH_TOO_LONGThe search exceeds the live maximum.
List storefront country languages
Read shopper language publication by country.
Active Markets supply countries; each storefront owns its allowed languages and one default. A country without an explicit assignment serves only the storefront primary language. Enabling a store language and adding it to the storefront are prerequisites, not complete shopper publication. address_policy is one backend sentence on what a country default-language (or domain) change does to its addresses; show it before such a change.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront to configure. |
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number starting at 1. |
per_page
|
integer |
Page size, bounded by backend limits. |
search
|
string |
Country search. |
filter
|
string |
all, assigned or unassigned. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
Set storefront country languages
Replace selected countries' allowed languages and defaults.
mappings maps uppercase country codes to {locales:[...],default_locale:...}. Send null for a country to remove its override and serve only storefront primary. Countries omitted from mappings are unchanged. Languages must already belong to this storefront. Writes are set-wise and atomic; a change publishes storefront/locales/update. Changes return HTTP 409 CONFIRMATION_REQUIRED before committing. Show error.details.warnings and impact, including every country's previous/resulting language codes, default_locale and inherits_primary. language_labels supplies localized display names once per storefront; retired_address_units counts removed country/language pairs and urls.translated_slugs counts affected translated resource slugs. Repeat the identical request only after merchant approval with confirmed=true and confirmation_token. The five-minute single-use token is bound to the reviewed outcome; changed state requires a fresh preview. Success code/message and country/language labels are backend-owned and English on the Store API and localized to the merchant interface language on Admin and MCP. Unpublishing retains translations. Removed-language links resolve the original resource before redirecting to its current exact-language slug in the same served country; invalid countries and deleted resources return 404. A translated slug later taken by another resource belongs to that resource. Query strings are preserved. Merchant connections also need the online_store.storefronts:write staff permission.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront to configure. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
mappings
required
|
object |
Country code to language set with one explicit default; null removes the assignment. |
confirmed
|
boolean |
True only after reviewing the returned impact and obtaining approval. |
confirmation_token
|
string |
Single-use token from the first request's error.details. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STORE_API_INVALID_REQUEST_BODYThe body has an unknown field or a field has the wrong type.
-
400STOREFRONT_LANGUAGE_REQUIREDThe language list is empty.
-
400STORE_LANGUAGE_INVALIDA code is not a supported language.
-
400STOREFRONT_LANGUAGE_NOT_ENABLEDA language is not enabled for the store.
-
400STOREFRONT_PRIMARY_LANGUAGE_REQUIREDThe list leaves out the storefront's primary language.
-
409STOREFRONT_LANGUAGES_CHANGEDThe store's languages changed during the save. Read them again and retry.
-
409CONFIRMATION_REQUIREDReview error.details.impact and warnings before repeating with the token.
-
400STORE_LANGUAGE_CONFIRMATION_INVALIDPreview expired or changed. Request a fresh preview.
-
400STOREFRONT_COUNTRY_NOT_SERVEDCountry is not in an active Market.
-
400STOREFRONT_COUNTRY_MAPPINGS_INVALIDEach country needs a nonempty served-language set with exactly one selected default, or null to inherit primary.
-
400STOREFRONT_LANGUAGE_NOT_SERVEDAdd the language to the storefront first.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Assign country default language
Add a served language and make it default in selected countries.
Other allowed languages remain available; country_codes must belong to active Markets. Returns updated country count. Publishes storefront/locales/update. Changes return HTTP 409 CONFIRMATION_REQUIRED before committing. Show error.details.warnings and impact, including every country's previous/resulting language codes, default_locale and inherits_primary. language_labels supplies localized display names once per storefront; retired_address_units counts removed country/language pairs and urls.translated_slugs counts affected translated resource slugs. Repeat the identical request only after merchant approval with confirmed=true and confirmation_token. The five-minute single-use token is bound to the reviewed outcome; changed state requires a fresh preview. Success code/message and country/language labels are backend-owned and English on the Store API and localized to the merchant interface language on Admin and MCP. Unpublishing retains translations. Removed-language links resolve the original resource before redirecting to its current exact-language slug in the same served country; invalid countries and deleted resources return 404. A translated slug later taken by another resource belongs to that resource. Query strings are preserved. Merchant connections also need the online_store.storefronts:write staff permission.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront to configure. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
country_codes
required
|
array<string> |
Countries to change. |
locale
required
|
string |
Served language to add and make default. |
confirmed
|
boolean |
True only after reviewing the returned impact and obtaining approval. |
confirmation_token
|
string |
Single-use token from the first request's error.details. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STORE_API_INVALID_REQUEST_BODYThe body has an unknown field or a field has the wrong type.
-
400STOREFRONT_LANGUAGE_REQUIREDThe language list is empty.
-
400STORE_LANGUAGE_INVALIDA code is not a supported language.
-
400STOREFRONT_LANGUAGE_NOT_ENABLEDA language is not enabled for the store.
-
400STOREFRONT_PRIMARY_LANGUAGE_REQUIREDThe list leaves out the storefront's primary language.
-
409STOREFRONT_LANGUAGES_CHANGEDThe store's languages changed during the save. Read them again and retry.
-
409CONFIRMATION_REQUIREDReview error.details.impact and warnings before repeating with the token.
-
400STORE_LANGUAGE_CONFIRMATION_INVALIDPreview expired or changed. Request a fresh preview.
-
400STOREFRONT_COUNTRY_NOT_SERVEDCountry is not in an active Market.
-
400STOREFRONT_COUNTRY_MAPPINGS_INVALIDEach country needs a nonempty served-language set with exactly one selected default, or null to inherit primary.
-
400STOREFRONT_LANGUAGE_NOT_SERVEDAdd the language to the storefront first.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Assign all country default languages
Add a served language and make it default in every active-market country.
The backend resolves current coverage and shows it for approval. Other allowed languages remain available. Returns updated country count. Publishes storefront/locales/update. Changes return HTTP 409 CONFIRMATION_REQUIRED before committing. Show error.details.warnings and impact, including every country's previous/resulting language codes, default_locale and inherits_primary. language_labels supplies localized display names once per storefront; retired_address_units counts removed country/language pairs and urls.translated_slugs counts affected translated resource slugs. Repeat the identical request only after merchant approval with confirmed=true and confirmation_token. The five-minute single-use token is bound to the reviewed outcome; changed state requires a fresh preview. Success code/message and country/language labels are backend-owned and English on the Store API and localized to the merchant interface language on Admin and MCP. Unpublishing retains translations. Removed-language links resolve the original resource before redirecting to its current exact-language slug in the same served country; invalid countries and deleted resources return 404. A translated slug later taken by another resource belongs to that resource. Query strings are preserved. Merchant connections also need the online_store.storefronts:write staff permission.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront to configure. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
locale
required
|
string |
Served language to add and make default everywhere. |
confirmed
|
boolean |
True only after reviewing the returned impact and obtaining approval. |
confirmation_token
|
string |
Single-use token from the first request's error.details. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STORE_API_INVALID_REQUEST_BODYThe body has an unknown field or a field has the wrong type.
-
400STOREFRONT_LANGUAGE_REQUIREDThe language list is empty.
-
400STORE_LANGUAGE_INVALIDA code is not a supported language.
-
400STOREFRONT_LANGUAGE_NOT_ENABLEDA language is not enabled for the store.
-
400STOREFRONT_PRIMARY_LANGUAGE_REQUIREDThe list leaves out the storefront's primary language.
-
409STOREFRONT_LANGUAGES_CHANGEDThe store's languages changed during the save. Read them again and retry.
-
409CONFIRMATION_REQUIREDReview error.details.impact and warnings before repeating with the token.
-
400STORE_LANGUAGE_CONFIRMATION_INVALIDPreview expired or changed. Request a fresh preview.
-
400STOREFRONT_COUNTRY_NOT_SERVEDCountry is not in an active Market.
-
400STOREFRONT_COUNTRY_MAPPINGS_INVALIDEach country needs a nonempty served-language set with exactly one selected default, or null to inherit primary.
-
400STOREFRONT_LANGUAGE_NOT_SERVEDAdd the language to the storefront first.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Get localization prompt
Read country and language suggestion settings.
Suggestions do not override an explicit country/language URL. Manual switching uses currently served country languages.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront to configure. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
Set localization prompt
Choose country suggestions, manual selector only, or off.
Send the complete settings. mode is off, suggest_country or manual_selector_only; dismissal_days must be within limits.dismissal_days_min and limits.dismissal_days_max from the read. This does not enable languages, assign countries or redirect shoppers automatically. Returns localized backend success wording. Merchant connections also need the online_store.storefronts:write staff permission.
Path parameters
| Name | Type | Description |
|---|---|---|
storefrontId
required
|
uuid |
Storefront to configure. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
mode
required
|
string |
off, suggest_country, manual_selector_only. |
dismissal_days
required
|
integer |
Days to remember a dismissed suggestion, within the returned limits. |
Errors
-
401UNAUTHORIZEDAuthorization header missing, malformed, or token invalid/expired.
-
402SUBSCRIPTION_REQUIREDThe store does not have an active or trialing subscription.
-
403STORE_API_SCOPE_REQUIREDToken is valid but lacks the required scope for this call.
-
429RATE_LIMITEDThe token's request allowance is exhausted. Retry after the Retry-After header.
-
400INVALID_INPUTThe storefront id is not a UUID. Invalid mode.
-
404STOREFRONT_NOT_FOUNDNo storefront with this id belongs to the store.
-
400STOREFRONT_PROMPT_DISMISSAL_DAYS_INVALIDdismissal_days is outside the returned limits.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Webhook events#
Subscribe to storefronts/update when an integration mirrors storefront settings: page titles, the share image, status (mode) and password protection send it, as do domain and market changes made elsewhere. Clearing the storefront cache sends no event. Subscribe to storefront/locales/update for the languages a storefront publishes; it carries the complete language set and every country's language choice. Both are sent after the change commits.
Storefront updated
Fired when storefront configuration changes, including catalog assignment, market assignment, domain assignment, primary-domain changes, domain locale or country pins, mode, password protection, maintenance settings, or coming-soon settings.
Payload fields
| Field | Type | Description |
|---|---|---|
storefront.address_revision |
integer |
Selectable in the Payload builder |
storefront.id |
string |
Always present |
storefront.name |
string |
Selectable in the Payload builder |
storefront.type |
string |
Selectable in the Payload builder |
storefront.is_primary |
boolean |
Selectable in the Payload builder |
storefront.mode |
string |
Selectable in the Payload builder |
storefront.password_protected |
boolean |
Selectable in the Payload builder |
storefront.created_at |
string |
Selectable in the Payload builder |
storefront.updated_at |
string |
Selectable in the Payload builder |
storefront.markets[*].market_id |
string |
Selectable in the Payload builder |
storefront.markets[*].market_name |
string |
Selectable in the Payload builder |
storefront.domains[*].domain_id |
string |
Selectable in the Payload builder |
storefront.domains[*].domain |
string |
Selectable in the Payload builder |
storefront.domains[*].is_primary |
boolean |
Selectable in the Payload builder |
storefront.domains[*].status |
string |
Selectable in the Payload builder |
Storefront languages updated
Fired when the languages a storefront serves change, or the languages a country is served in. The payload carries the storefront's complete language set and every country's language choice.
Payload fields
| Field | Type | Description |
|---|---|---|
storefront_id |
string |
Always present
The storefront whose languages changed. |
locales |
array |
Always present
Every language the storefront serves after the change, as BCP 47 locale codes. |
default_locale |
string |
Always present
The storefront's default language, served where a country has no language choice of its own. |
countries[*].country_code |
string |
Always present |
countries[*].locales |
array |
Always present |
countries[*].default_locale |
string |
Always present |
updated_at |
string |
Always present
When the languages changed, in the store's time zone with its offset (RFC 3339). |
Themes render the coming_soon, password and maintenance surfaces described in Gate pages. The 26 Oct rollout raises the minimum for newly set or changed storefront passwords to 8 characters, retaining the 72-byte maximum; that minimum is pending the companion password-setting change. Unlocking an existing storefront password remains a separate operation. See Gate actions for the storefront HTML routes and their outcomes.
Changes to storefront access settings invalidate the versions checked before stored pages are reused by shoppers and search crawlers. AI crawler copies use eventual version propagation. Saving settings does not publish draft theme content.