Pages

Create, read, update, delete, bulk manage, translate, and subscribe to custom pages through the Store API.

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

GET read_pages

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

GET read_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.

Example: 1
limit integer

Page size.

Example: 20
search string

Search Pages by title or slug.

Example: about-us
status string

Filter by status.

Example: published
sort_by string

Sort field from the Page list contract.

Allowed values
titlestatuscreated_atupdated_at
Example: created_at
sort_direction string

Sort direction from the Page list contract.

Allowed values
ascdesc
Example: desc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 PAGE_SEARCH_TOO_LONG

    Search exceeds the Page contract max length.

  • 400 PAGE_STATUS_FILTER_INVALID

    Status is not draft or published.

  • 400 PAGE_LIST_INVALID_SORT_BY

    Sort field is not supported.

  • 400 PAGE_LIST_INVALID_SORT_DIRECTION

    Sort direction must be asc or desc.

Search pages

GET read_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.

Example: about
status string

Filter by status.

Example: published
limit integer

Suggestion count.

Example: 10
offset integer

Result offset.

Example: 0

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 PAGE_SEARCH_TOO_LONG

    Search exceeds the Page contract max length.

  • 400 PAGE_STATUS_FILTER_INVALID

    Status is not draft or published.

Get a page

GET read_pages

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 STORE_API_INVALID_PAGE_ID

    The Page id is not a valid UUID.

  • 404 NOT_FOUND

    Page does not exist in this store.

List page metafields

GET read_pages

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31

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

  • 400 VALIDATION_LIST_INVALID_PAGE

    Page must be a positive integer.

  • 400 VALIDATION_LIST_INVALID_LIMIT

    Limit must be a positive integer.

  • 404 NOT_FOUND

    The resource does not exist in this store.

Set page metafields

PUT write_pages

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
metafields required array<object>

Entries shaped as {namespace, key, value}. value is required in every entry; send null or an empty string to delete the stored value.

Example: [{"namespace":"details","key":"subtitle","value":"Our story"}]

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    The body or entry shape is invalid. Each entry requires an explicit value, including null for deletion.

  • 400 METAFIELD_NO_WRITES

    Provide at least one metafield entry.

  • 400 METAFIELD_DUPLICATE_WRITE

    A namespace and key occur more than once.

  • 400 PRODUCT_METAFIELD_DEF_NOT_FOUND

    The 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.

  • 403 METAFIELD_WRITE_MERCHANT_READ_ONLY

    The definition does not grant value write access.

  • 403 STORE_API_SCOPE_REQUIRED

    Binding a nonempty file_reference or list.file_reference also requires read_files. Clearing a reference does not.

  • 404 NOT_FOUND

    The resource does not exist in this store. A file reference names a file that does not exist in this store.

  • 400 METAFIELD_VALUE_TOO_LONG

    The value exceeds its size limit: the definition's max_value_length, or the platform value size limit for the type.

  • 400 METAFIELD_VALUE_STRING_TOO_LONG

    A string value exceeds the definition's max_value_length or the platform string limit.

  • 400 METAFIELD_VALUE_TOO_SHORT

    A string value is shorter than the definition's min_length rule.

  • 400 METAFIELD_VALUE_PATTERN_MISMATCH

    A string value does not match the definition's pattern rule.

  • 400 METAFIELD_VALUE_INTEGER_INVALID

    An integer value is not a whole number in the 64-bit range.

  • 400 METAFIELD_VALUE_INTEGER_TOO_LONG

    An integer value has more digits than the definition or the platform integer limit allows.

  • 400 METAFIELD_VALUE_DECIMAL_INVALID

    A decimal value is not a finite decimal number.

  • 400 METAFIELD_VALUE_DECIMAL_TOO_LONG

    A decimal value, written out in full, is longer than the definition or the platform decimal limit allows.

  • 400 METAFIELD_VALUE_BELOW_MIN

    An integer or decimal value is below the definition's min rule.

  • 400 METAFIELD_VALUE_ABOVE_MAX

    An integer or decimal value is above the definition's max rule.

  • 400 METAFIELD_VALUE_BOOLEAN_INVALID

    A boolean value is not true or false.

  • 400 METAFIELD_VALUE_DATE_INVALID

    A date value is not a calendar date in YYYY-MM-DD form.

  • 400 METAFIELD_VALUE_DATETIME_INVALID

    A datetime value is not YYYY-MM-DDTHH:mm, YYYY-MM-DDTHH:mm:ss or an RFC 3339 timestamp.

  • 400 METAFIELD_VALUE_JSON_INVALID

    A json value is not valid JSON.

  • 400 METAFIELD_VALUE_JSON_UNSAFE_LINK

    A json value contains a link whose scheme is not http, https, mailto or tel.

  • 400 METAFIELD_VALUE_URL_INVALID

    A url value, or an item of a list.url value, is not an absolute URL with a host.

  • 400 METAFIELD_VALUE_URL_SCHEME

    A url value, or an item of a list.url value, does not use http or https.

  • 400 METAFIELD_VALUE_URL_TOO_LONG

    A url value, or an item of a list.url value, exceeds the definition's max_value_length or the platform URL limit.

  • 400 METAFIELD_VALUE_NOT_IN_CHOICES

    A single_select value is not one of the definition's choice keys.

  • 400 METAFIELD_LIST_CHOICE_INVALID

    An item of a list.single_select value is not one of the definition's choice keys; the message names the item.

  • 400 METAFIELD_LIST_STRINGS_INVALID

    A list.string or list.single_select value is not a JSON array of strings.

  • 400 METAFIELD_LIST_URLS_INVALID

    A list.url value is not a JSON array of strings.

  • 400 METAFIELD_LIST_FILES_INVALID

    A list.file_reference value is not a JSON array of strings.

  • 400 METAFIELD_LIST_IDS_INVALID

    A list.product_reference or list.variant_reference value is not a JSON array of integers.

  • 400 METAFIELD_LIST_EMPTY

    A list value other than list.string is an empty array. Send null or an empty string to remove the value instead.

  • 400 METAFIELD_LIST_TOO_MANY

    A list value has more items than the definition's max_list_items or the platform list limit for the type.

  • 400 METAFIELD_LIST_ITEM_EMPTY

    An item of a list.string value is empty or only whitespace; the message names the item.

  • 400 METAFIELD_LIST_ITEM_TOO_LONG

    An item of a list.string value exceeds the definition's max_value_length or the platform string limit; the message names the item.

  • 400 METAFIELD_VALUE_FILE_UUID_INVALID

    A file_reference value, or an item of a list.file_reference value, is not a file UUID.

  • 400 METAFIELD_VALUE_ID_INVALID

    A product_reference or variant_reference value is not an integer ID.

  • 400 METAFIELD_VALUE_ID_POSITIVE

    A product_reference or variant_reference value is not a positive integer.

  • 400 METAFIELD_VALUE_ID_TOO_LONG

    A product_reference or variant_reference value exceeds the platform reference ID limit.

  • 400 METAFIELD_LIST_ITEMS_POSITIVE

    An item of a list.product_reference or list.variant_reference value is not a positive integer.

  • 400 METAFIELD_REFERENCE_PRODUCT_MISSING

    A product reference names a product that does not exist in this store.

  • 400 METAFIELD_REFERENCE_VARIANT_MISSING

    A variant reference names a variant that does not exist in this store.

  • 400 INVALID_INPUT

    A file reference names a file that is not an uploaded file.

Create a page

POST write_pages

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.

Example: 550e8400-e29b-41d4-a716-446655440000

Body parameters

Name Type Description
title required string

Page title.

Example: About us
slug string

Optional slug. Omit to generate from title.

Example: about-us
content string

Optional sanitized HTML content.

Example: <p>Learn more about our store.</p>
seo_title string

Optional SEO title.

Example: About us
seo_description string

Optional SEO description.

Example: Learn more about our store.
status string

Page status: draft or published. Omit to create a draft.

Example: published
robots string

Search visibility: index or noindex. noindex does not restrict who can open the page.

Example: index
template_handle string

Template assignment. On create, omitting this field or sending an empty string assigns default_page. Use default_page for the default Page template, or pass an alternate Page template handle configured for the store. On update, omit template_handle to leave the assignment unchanged, use default_page to reset it to default, and do not send an empty string.

Example: default_page

Errors

  • 400 CONTENT_REQUEST_KEY_REQUIRED

    A UUID Idempotency-Key header is required.

  • 409 CONTENT_REQUEST_KEY_CONFLICT

    The key was used with different content.

  • 400 PAGE_LIMIT_REACHED

    The store's page limit has been reached.

  • 400 PAGE_PLAN_LIMIT_REACHED

    This store is at its plan page cap.

  • 400 STORE_API_INVALID_REQUEST_BODY

    The request body is malformed or contains an unknown field.

  • 400 PAGE_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 PAGE_TITLE_TOO_LONG

    Title exceeds the Page contract max length.

  • 400 PAGE_SLUG_INVALID_FORMAT

    Slug is not valid for Page URLs.

  • 400 PAGE_SLUG_TOO_LONG

    Slug exceeds the Page contract max length.

  • 400 PAGE_CONTENT_TOO_LONG

    Content exceeds the Page contract max length.

  • 400 PAGE_SEO_TITLE_TOO_LONG

    SEO title exceeds the Page contract max length.

  • 400 PAGE_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Page contract max length.

  • 400 PAGE_STATUS_INVALID

    Status is not one of the allowed values.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Page templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

    Template handle does not exist on the store's primary active theme for Page.

  • 409 PAGE_SLUG_DUPLICATE

    Slug already exists in this store.

Update a page

PUT write_pages

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
title string

Page title.

Example: About us
slug string

Optional slug. Omit it to keep the current slug; when supplied it must be non-empty and valid.

Example: about-us
content string

Optional sanitized HTML content.

Example: <p>Learn more about our store.</p>
seo_title string

Optional SEO title.

Example: About us
seo_description string

Optional SEO description.

Example: Learn more about our store.
status string

Page status: draft or published. Omit to leave the current status unchanged.

Example: published
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.

Example: index
template_handle string

Template assignment. On create, omitting this field or sending an empty string assigns default_page. Use default_page for the default Page template, or pass an alternate Page template handle configured for the store. On update, omit template_handle to leave the assignment unchanged, use default_page to reset it to default, and do not send an empty string.

Example: default_page
create_redirect boolean

When the slug changes, create a redirect from the old page URL to the new one. Defaults to true.

Example: true

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    The request body is malformed or contains an unknown field.

  • 400 PAGE_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 PAGE_TITLE_TOO_LONG

    Title exceeds the Page contract max length.

  • 400 PAGE_SLUG_INVALID_FORMAT

    Slug is not valid for Page URLs.

  • 400 PAGE_SLUG_TOO_LONG

    Slug exceeds the Page contract max length.

  • 400 PAGE_CONTENT_TOO_LONG

    Content exceeds the Page contract max length.

  • 400 PAGE_SEO_TITLE_TOO_LONG

    SEO title exceeds the Page contract max length.

  • 400 PAGE_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Page contract max length.

  • 400 PAGE_STATUS_INVALID

    Status is not one of the allowed values.

  • 409 TRANSLATION_SOURCE_FIELD_HAS_TRANSLATIONS

    A source field cannot be cleared while it has translations in any locale.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Page templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

    Template handle does not exist on the store's primary active theme for Page.

  • 404 NOT_FOUND

    Page does not exist in this store.

  • 409 PAGE_SLUG_DUPLICATE

    Slug already exists in this store.

Delete a page

DELETE write_pages

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31

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_REQUIRED.

Example: false
confirmation_token string

Token returned by the first delete attempt.

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    The delete request body is malformed.

  • 400 STORE_API_INVALID_PAGE_ID

    A Page id is not a valid UUID.

  • 400 PAGE_CONFIRMATION_INVALID

    The confirmation token is missing, expired, or does not match this delete.

  • 404 NOT_FOUND

    Page does not exist in this store.

  • 409 CONFIRMATION_REQUIRED

    Menus link to the requested Page; repeat the request with the returned confirmation token to remove those links and delete.

Bulk delete pages

POST write_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.

Example: ["5ff7d4ea-3250-4a4d-9d26-07f64d917d31"]
confirmed boolean

Set true when repeating a delete that returned CONFIRMATION_REQUIRED.

Example: false
confirmation_token string

Token returned by the first delete attempt.

Errors

  • 400 PAGE_BULK_NO_IDS

    Provide at least one page ID.

  • 400 PAGE_BULK_DELETE_TOO_MANY

    The selection exceeds the bulk-delete limit.

  • 400 STORE_API_INVALID_REQUEST_BODY

    The delete request body is malformed.

  • 400 STORE_API_INVALID_PAGE_ID

    A Page id is not a valid UUID.

  • 400 PAGE_CONFIRMATION_INVALID

    The confirmation token is missing, expired, or does not match this delete.

  • 409 CONFIRMATION_REQUIRED

    Menus 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

title

string

Yes

Yes

create

Yes

slug

string

Yes

Yes

Yes

content

string

Yes

Yes

Yes

seo_title

string

Yes

Yes

Yes

seo_description

string

Yes

Yes

Yes

status

string

Yes

Yes

No

robots

string

Yes

Yes

No

social_image_id

string (UUID) or null

No

No

No

template_handle

string

Yes

Yes

No

create_redirect

boolean

No

Yes

No

created_at

string (RFC 3339)

No

No

No

updated_at

string (RFC 3339)

No

No

No

storefront_url

url

No

No

No

No

storefront_path

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

EVENT pages/create App scope: read_pages Staff permission: pages:write

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

EVENT pages/update App scope: read_pages Staff permission: pages:write

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

EVENT pages/delete App scope: read_pages Staff permission: pages:write

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