Custom pages contain a title, sanitized HTML content, a URL slug, SEO fields, and a storefront template. Reads require read_pages; writes require write_pages.
Creation requires a title and defaults to draft. Omit the slug or leave it empty to generate it from the title. Updates preserve omitted fields; a supplied update slug must be non-empty. Set create_redirect when changing a slug to control the redirect from the old address. Unknown request fields are rejected.
Use Page translations for localized content. Translation reads require read_pages and read_translations; writes require write_pages and write_translations. A source field with translations cannot be cleared until those translations are removed.
Endpoints#
Page limits
Fetch Page limits and per-field constraints.
Returns the per-field maximum lengths, enum values, and request caps that apply to Page endpoints. max_per_store is this store's plan cap, count is how many exist now, and usage is the localized label.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
List pages
List pages for the store.
Returns paginated Pages. Use search or status to filter. total counts matching pages; store_total counts all pages in the store, including those excluded by filters. Use store_total with the page limit when showing remaining capacity. Missing or non-positive pagination values use the contract defaults, values above the maximum are capped, and invalid sort values are rejected. storefront_url is the canonical absolute URL on the store's primary domain. storefront_path is the domain-independent baseline route; join it to the storefront address you are targeting. Hosted storefront responses apply translated slugs and locale/country prefixes.
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size. |
search
|
string |
Search Pages by title or slug. |
status
|
string |
Filter by status. |
sort_by
|
string |
Sort field from the Page list contract.
Allowed values
titlestatuscreated_atupdated_at |
sort_direction
|
string |
Sort direction from the Page list contract.
Allowed values
ascdesc |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400PAGE_SEARCH_TOO_LONGSearch exceeds the Page contract max length.
-
400PAGE_STATUS_FILTER_INVALIDStatus is not draft or published.
-
400PAGE_LIST_INVALID_SORT_BYSort field is not supported.
-
400PAGE_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
Search pages
Search pages for picker UIs.
Returns lightweight page options. Missing or non-positive pagination values use the contract defaults, and limit is capped by the Page contract.
Query parameters
| Name | Type | Description |
|---|---|---|
q
|
string |
Search query. |
status
|
string |
Filter by status. |
limit
|
integer |
Suggestion count. |
offset
|
integer |
Result offset. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400PAGE_SEARCH_TOO_LONGSearch exceeds the Page contract max length.
-
400PAGE_STATUS_FILTER_INVALIDStatus is not draft or published.
Get a page
Fetch one page by id.
Returns the Page if it belongs to the token's store. storefront_url is the canonical absolute URL on the store's primary domain. storefront_path is the domain-independent baseline route; join it to the storefront address you are targeting. Hosted storefront responses apply translated slugs and locale/country prefixes.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Page id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_PAGE_IDThe Page id is not a valid UUID.
-
404NOT_FOUNDPage does not exist in this store.
List page metafields
List a page's custom-data values visible to the token.
Returns a paginated list. Definitions are filtered through the token's access rules; app-owned definitions follow their declared app and merchant access.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Page id. |
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number (default 1). |
limit
|
integer |
Page size; capped by the metafield list limit. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400VALIDATION_LIST_INVALID_PAGEPage must be a positive integer.
-
400VALIDATION_LIST_INVALID_LIMITLimit must be a positive integer.
-
404NOT_FOUNDThe resource does not exist in this store.
Set page metafields
Create, update, or delete page custom-data values.
Send namespace-and-key entries. A string value creates or replaces a value; null or an empty string deletes it. The complete value change succeeds or fails together. Omitted entries are preserved.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Page id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
metafields
required
|
array<object> |
Entries shaped as |
Errors
-
400STORE_API_INVALID_REQUEST_BODYThe body or entry shape is invalid. Each entry requires an explicit value, including null for deletion.
-
400METAFIELD_NO_WRITESProvide at least one metafield entry.
-
400METAFIELD_DUPLICATE_WRITEA namespace and key occur more than once.
-
400PRODUCT_METAFIELD_DEF_NOT_FOUNDThe namespace and key do not identify a definition visible to this token. For an app token only its own definitions count: merchant-owned and other apps' definitions return this code.
-
403METAFIELD_WRITE_MERCHANT_READ_ONLYThe definition does not grant value write access.
-
403STORE_API_SCOPE_REQUIREDBinding a nonempty file_reference or list.file_reference also requires read_files. Clearing a reference does not.
-
404NOT_FOUNDThe resource does not exist in this store. A file reference names a file that does not exist in this store.
-
400METAFIELD_VALUE_TOO_LONGThe value exceeds its size limit: the definition's max_value_length, or the platform value size limit for the type.
-
400METAFIELD_VALUE_STRING_TOO_LONGA string value exceeds the definition's max_value_length or the platform string limit.
-
400METAFIELD_VALUE_TOO_SHORTA string value is shorter than the definition's min_length rule.
-
400METAFIELD_VALUE_PATTERN_MISMATCHA string value does not match the definition's pattern rule.
-
400METAFIELD_VALUE_INTEGER_INVALIDAn integer value is not a whole number in the 64-bit range.
-
400METAFIELD_VALUE_INTEGER_TOO_LONGAn integer value has more digits than the definition or the platform integer limit allows.
-
400METAFIELD_VALUE_DECIMAL_INVALIDA decimal value is not a finite decimal number.
-
400METAFIELD_VALUE_DECIMAL_TOO_LONGA decimal value, written out in full, is longer than the definition or the platform decimal limit allows.
-
400METAFIELD_VALUE_BELOW_MINAn integer or decimal value is below the definition's min rule.
-
400METAFIELD_VALUE_ABOVE_MAXAn integer or decimal value is above the definition's max rule.
-
400METAFIELD_VALUE_BOOLEAN_INVALIDA boolean value is not true or false.
-
400METAFIELD_VALUE_DATE_INVALIDA date value is not a calendar date in YYYY-MM-DD form.
-
400METAFIELD_VALUE_DATETIME_INVALIDA datetime value is not YYYY-MM-DDTHH:mm, YYYY-MM-DDTHH:mm:ss or an RFC 3339 timestamp.
-
400METAFIELD_VALUE_JSON_INVALIDA json value is not valid JSON.
-
400METAFIELD_VALUE_JSON_UNSAFE_LINKA json value contains a link whose scheme is not http, https, mailto or tel.
-
400METAFIELD_VALUE_URL_INVALIDA url value, or an item of a list.url value, is not an absolute URL with a host.
-
400METAFIELD_VALUE_URL_SCHEMEA url value, or an item of a list.url value, does not use http or https.
-
400METAFIELD_VALUE_URL_TOO_LONGA url value, or an item of a list.url value, exceeds the definition's max_value_length or the platform URL limit.
-
400METAFIELD_VALUE_NOT_IN_CHOICESA single_select value is not one of the definition's choice keys.
-
400METAFIELD_LIST_CHOICE_INVALIDAn item of a list.single_select value is not one of the definition's choice keys; the message names the item.
-
400METAFIELD_LIST_STRINGS_INVALIDA list.string or list.single_select value is not a JSON array of strings.
-
400METAFIELD_LIST_URLS_INVALIDA list.url value is not a JSON array of strings.
-
400METAFIELD_LIST_FILES_INVALIDA list.file_reference value is not a JSON array of strings.
-
400METAFIELD_LIST_IDS_INVALIDA list.product_reference or list.variant_reference value is not a JSON array of integers.
-
400METAFIELD_LIST_EMPTYA list value other than list.string is an empty array. Send null or an empty string to remove the value instead.
-
400METAFIELD_LIST_TOO_MANYA list value has more items than the definition's max_list_items or the platform list limit for the type.
-
400METAFIELD_LIST_ITEM_EMPTYAn item of a list.string value is empty or only whitespace; the message names the item.
-
400METAFIELD_LIST_ITEM_TOO_LONGAn item of a list.string value exceeds the definition's max_value_length or the platform string limit; the message names the item.
-
400METAFIELD_VALUE_FILE_UUID_INVALIDA file_reference value, or an item of a list.file_reference value, is not a file UUID.
-
400METAFIELD_VALUE_ID_INVALIDA product_reference or variant_reference value is not an integer ID.
-
400METAFIELD_VALUE_ID_POSITIVEA product_reference or variant_reference value is not a positive integer.
-
400METAFIELD_VALUE_ID_TOO_LONGA product_reference or variant_reference value exceeds the platform reference ID limit.
-
400METAFIELD_LIST_ITEMS_POSITIVEAn item of a list.product_reference or list.variant_reference value is not a positive integer.
-
400METAFIELD_REFERENCE_PRODUCT_MISSINGA product reference names a product that does not exist in this store.
-
400METAFIELD_REFERENCE_VARIANT_MISSINGA variant reference names a variant that does not exist in this store.
-
400INVALID_INPUTA file reference names a file that is not an uploaded file.
Create a page
Create a page.
Creates a Page. title is required. Omitted status defaults to draft. slug is optional on create; when omitted or empty, the backend generates it from the title. Optional SEO, content, and template fields follow the Page resource contract. Send a UUID Idempotency-Key header. Exact retries replay the original response for seven days without creating another page; reusing a key with different content returns 409. storefront_url is the canonical absolute URL on the store's primary domain. storefront_path is the domain-independent baseline route; join it to the storefront address you are targeting. Hosted storefront responses apply translated slugs and locale/country prefixes.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Idempotency-Key
required
|
uuid |
Stable UUID for this create request. Reuse with identical content after a timeout; retained for seven days. |
Body parameters
| Name | Type | Description |
|---|---|---|
title
required
|
string |
Page title. |
slug
|
string |
Optional slug. Omit to generate from title. |
content
|
string |
Optional sanitized HTML content. |
seo_title
|
string |
Optional SEO title. |
seo_description
|
string |
Optional SEO description. |
status
|
string |
Page status: draft or published. Omit to create a draft. |
robots
|
string |
Search visibility: index or noindex. noindex does not restrict who can open the page. |
template_handle
|
string |
Template assignment. On create, omitting this field or sending an empty string assigns |
Errors
-
400CONTENT_REQUEST_KEY_REQUIREDA UUID Idempotency-Key header is required.
-
409CONTENT_REQUEST_KEY_CONFLICTThe key was used with different content.
-
400PAGE_LIMIT_REACHEDThe store's page limit has been reached.
-
400PAGE_PLAN_LIMIT_REACHEDThis store is at its plan page cap.
-
400STORE_API_INVALID_REQUEST_BODYThe request body is malformed or contains an unknown field.
-
400PAGE_TITLE_REQUIREDTitle is empty after normalization.
-
400PAGE_TITLE_TOO_LONGTitle exceeds the Page contract max length.
-
400PAGE_SLUG_INVALID_FORMATSlug is not valid for Page URLs.
-
400PAGE_SLUG_TOO_LONGSlug exceeds the Page contract max length.
-
400PAGE_CONTENT_TOO_LONGContent exceeds the Page contract max length.
-
400PAGE_SEO_TITLE_TOO_LONGSEO title exceeds the Page contract max length.
-
400PAGE_SEO_DESCRIPTION_TOO_LONGSEO description exceeds the Page contract max length.
-
400PAGE_STATUS_INVALIDStatus is not one of the allowed values.
-
400TEMPLATE_HANDLE_INVALIDTemplate handle is not valid for Page templates.
-
400TEMPLATE_HANDLE_NOT_FOUNDTemplate handle does not exist on the store's primary active theme for Page.
-
409PAGE_SLUG_DUPLICATESlug already exists in this store.
Update a page
Update a page.
Updates provided Page fields. Omitted fields are left unchanged. When slug is supplied it must be non-empty and valid. Slugs are generated from the title only during create. storefront_url is the canonical absolute URL on the store's primary domain. storefront_path is the domain-independent baseline route; join it to the storefront address you are targeting. Hosted storefront responses apply translated slugs and locale/country prefixes.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Page id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
title
|
string |
Page title. |
slug
|
string |
Optional slug. Omit it to keep the current slug; when supplied it must be non-empty and valid. |
content
|
string |
Optional sanitized HTML content. |
seo_title
|
string |
Optional SEO title. |
seo_description
|
string |
Optional SEO description. |
status
|
string |
Page status: draft or published. Omit to leave the current status unchanged. |
robots
|
string |
Template assignment. Omit to leave the current assignment unchanged, use default_page to reset to the default Page template, and do not send an empty string. |
template_handle
|
string |
Template assignment. On create, omitting this field or sending an empty string assigns |
create_redirect
|
boolean |
When the slug changes, create a redirect from the old page URL to the new one. Defaults to true. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYThe request body is malformed or contains an unknown field.
-
400PAGE_TITLE_REQUIREDTitle is empty after normalization.
-
400PAGE_TITLE_TOO_LONGTitle exceeds the Page contract max length.
-
400PAGE_SLUG_INVALID_FORMATSlug is not valid for Page URLs.
-
400PAGE_SLUG_TOO_LONGSlug exceeds the Page contract max length.
-
400PAGE_CONTENT_TOO_LONGContent exceeds the Page contract max length.
-
400PAGE_SEO_TITLE_TOO_LONGSEO title exceeds the Page contract max length.
-
400PAGE_SEO_DESCRIPTION_TOO_LONGSEO description exceeds the Page contract max length.
-
400PAGE_STATUS_INVALIDStatus is not one of the allowed values.
-
409TRANSLATION_SOURCE_FIELD_HAS_TRANSLATIONSA source field cannot be cleared while it has translations in any locale.
-
400TEMPLATE_HANDLE_INVALIDTemplate handle is not valid for Page templates.
-
400TEMPLATE_HANDLE_NOT_FOUNDTemplate handle does not exist on the store's primary active theme for Page.
-
404NOT_FOUNDPage does not exist in this store.
-
409PAGE_SLUG_DUPLICATESlug already exists in this store.
Delete a page
Delete a page.
Deletes a Page, its custom-data values, and all related translations atomically. Value and translation deletion webhooks are queued before the Page deletion event. If menus link to the Page, the first request returns CONFIRMATION_REQUIRED; repeat it with the returned token to delete the Page and durably queue removal of those menu links.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Page id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
confirmed
|
boolean |
Set true when repeating a delete that returned |
confirmation_token
|
string |
Token returned by the first delete attempt. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYThe delete request body is malformed.
-
400STORE_API_INVALID_PAGE_IDA Page id is not a valid UUID.
-
400PAGE_CONFIRMATION_INVALIDThe confirmation token is missing, expired, or does not match this delete.
-
404NOT_FOUNDPage does not exist in this store.
-
409CONFIRMATION_REQUIREDMenus link to the requested Page; repeat the request with the returned confirmation token to remove those links and delete.
Bulk delete pages
Delete multiple pages.
Deletes the existing requested Pages in one transaction and reports missing ids per item. If menus link to any requested Page, the first request returns CONFIRMATION_REQUIRED; repeat it with the returned token to continue and durably queue removal of those menu links. The request is capped by the Page bulk contract.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
ids
required
|
array<uuid> |
Page ids to delete. |
confirmed
|
boolean |
Set true when repeating a delete that returned |
confirmation_token
|
string |
Token returned by the first delete attempt. |
Errors
-
400PAGE_BULK_NO_IDSProvide at least one page ID.
-
400PAGE_BULK_DELETE_TOO_MANYThe selection exceeds the bulk-delete limit.
-
400STORE_API_INVALID_REQUEST_BODYThe delete request body is malformed.
-
400STORE_API_INVALID_PAGE_IDA Page id is not a valid UUID.
-
400PAGE_CONFIRMATION_INVALIDThe confirmation token is missing, expired, or does not match this delete.
-
409CONFIRMATION_REQUIREDMenus link to the requested Page; repeat the request with the returned confirmation token to remove those links and delete.
Fields#
Field |
Type |
Create |
Update |
Required |
Translatable |
|---|---|---|---|---|---|
|
string |
Yes |
Yes |
create |
Yes |
|
string |
Yes |
Yes |
Yes |
|
|
string |
Yes |
Yes |
Yes |
|
|
string |
Yes |
Yes |
Yes |
|
|
string |
Yes |
Yes |
Yes |
|
|
string |
Yes |
Yes |
No |
|
|
string |
Yes |
Yes |
No |
|
|
string (UUID) or null |
No |
No |
No |
|
|
string |
Yes |
Yes |
No |
|
|
boolean |
No |
Yes |
No |
|
|
string (RFC 3339) |
No |
No |
No |
|
|
string (RFC 3339) |
No |
No |
No |
|
|
url |
No |
No |
No |
No |
|
string |
No |
No |
No |
No |
Webhook events#
Subscribe to these events to keep your integration in sync with pages. Each event shows the required Store API scope and store permission, the available payload fields, and an example payload. Subscription setup is validated against those permissions; delivery is always restricted to the subscription's store.
Page created
Fired when a custom page is created.
Payload fields
| Field | Type | Description |
|---|---|---|
page.id |
string |
Always present |
page.title |
string |
Selectable in the Payload builder |
page.slug |
string |
Selectable in the Payload builder |
page.content |
string |
Selectable in the Payload builder |
page.status |
string |
Selectable in the Payload builder |
page.seo_title |
string |
Selectable in the Payload builder |
page.seo_description |
string |
Selectable in the Payload builder |
page.template_handle |
string |
Selectable in the Payload builder |
page.created_at |
string |
Selectable in the Payload builder |
page.updated_at |
string |
Selectable in the Payload builder |
Page updated
Fired when a custom page is updated.
Payload fields
| Field | Type | Description |
|---|---|---|
page.id |
string |
Always present |
page.title |
string |
Selectable in the Payload builder |
page.slug |
string |
Selectable in the Payload builder |
page.content |
string |
Selectable in the Payload builder |
page.status |
string |
Selectable in the Payload builder |
page.seo_title |
string |
Selectable in the Payload builder |
page.seo_description |
string |
Selectable in the Payload builder |
page.template_handle |
string |
Selectable in the Payload builder |
page.created_at |
string |
Selectable in the Payload builder |
page.updated_at |
string |
Selectable in the Payload builder |
Page deleted
Fired when a custom page is deleted.
Payload fields
| Field | Type | Description |
|---|---|---|
page.id |
string |
Always present |
page.title |
string |
Selectable in the Payload builder |
page.slug |
string |
Selectable in the Payload builder |