Blog posts contain a title, sanitized HTML content, an author, optional categories and tags, and publishing and SEO settings. Reads require read_blog; writes require write_blog. Setting a non-empty featured_image_id also requires read_files.
Create a post as a draft, publish it, or schedule its publication. author_ref must identify an author in the same store. Category and tag arrays replace the current assignments when supplied; omit them to preserve assignments or send [] to clear them. A JSON null clears an optional field such as excerpt, SEO, the featured image, or publish_at. Omitting the field leaves the stored value. An omitted or empty update slug preserves the current address. POST /blog/posts/{id}/preview returns a short private draft URL; the response is not cacheable.
Large deletions and author reassignments run as jobs. A scheduled post that cannot be published reports schedule_state and a merchant message.
Translate post content through Blog Post translations. Translation calls require the corresponding blog and translation scopes. Metafield definitions are discovered by namespace and key; the dedicated metafield endpoints document their access rules.
Endpoints#
Blog Post limits
Fetch Blog Post limits and per-field constraints.
Returns the per-field maximum lengths, enum values, and request caps that apply to Blog Post 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 blog posts
List blog posts for the store.
Returns paginated Blog Posts. total counts matches for the current filters; store_total counts all records in the store and can be compared with the store capacity returned by the limits endpoint. Filter by search, status, author, category, tag, or publication date. Invalid pagination, UUID, and sort parameters are rejected instead of silently defaulted. 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, up to |
search
|
string |
Search Blog Posts by title or slug. |
status
|
string |
Filter by status. |
author_ref
|
uuid |
Filter by blog author id. |
category_id
|
uuid |
Filter by assigned blog category id. |
tag_id
|
uuid |
Filter by assigned blog tag id. |
publication_date_from
|
date |
Include posts published or scheduled on or after this store-local date (YYYY-MM-DD). |
publication_date_to
|
date |
Include posts published or scheduled on or before this store-local date (YYYY-MM-DD). |
sort_by
|
string |
Sort field from the Blog Post list contract.
Allowed values
titlestatusauthorcomment_countpublished_atpublish_atcreated_atupdated_at |
sort_direction
|
string |
Sort direction from the Blog Post list contract.
Allowed values
ascdesc |
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 within the Blog Post contract cap.
-
400VALIDATION_LIST_INVALID_SORT_BYSort field is not supported.
-
400VALIDATION_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
-
400BLOG_POST_SEARCH_TOO_LONGSearch exceeds the Blog Post contract max length.
-
400BLOG_POST_STATUS_FILTER_INVALIDStatus is not one of the allowed values.
-
400BLOG_POST_PUBLICATION_DATE_FILTER_INVALIDPublication dates must use YYYY-MM-DD and form a valid range.
-
400STORE_API_INVALID_REQUEST_BODYAn author id is not a UUID.
-
400STORE_API_INVALID_CATEGORY_IDCategory id is not a UUID.
-
400STORE_API_INVALID_TAG_IDTag id is not a UUID.
Search blog posts
Search blog posts for picker UIs.
Returns lightweight post options. limit is strict and capped by the Blog Post 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
-
400VALIDATION_LIST_INVALID_LIMITLimit must be a positive integer within the picker cap.
-
400INVALID_INPUTOffset must be zero or greater.
-
400BLOG_POST_SEARCH_TOO_LONGSearch exceeds the Blog Post contract max length.
-
400BLOG_POST_STATUS_FILTER_INVALIDStatus is not one of the allowed values.
Get a blog post
Fetch one blog post by id.
Returns the Blog Post 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 |
Blog Post id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400BLOG_POST_IDS_INVALIDBlog Post id is not a valid UUID.
-
404NOT_FOUNDBlog Post does not exist in this store.
List blog post metafields
List custom-data values visible to the token.
Definitions are filtered through the token's access rules.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Blog Post 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 blog post metafields
Create, update, or delete 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 |
Blog Post 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 blog post
Create a blog post.
Creates a Blog Post. title, author_ref, and status are required. author_ref must identify an author in this store. slug is optional on create; when omitted or empty, the backend generates it from the title. 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. |
Body parameters
| Name | Type | Description |
|---|---|---|
title
required
|
string |
Blog Post title. |
slug
|
string |
Optional slug. Omit to generate from title. |
content
|
string |
Optional sanitized HTML content. |
excerpt
|
string |
Optional excerpt. |
featured_image_id
|
string |
Optional image file id. Non-empty values must reference an image in this store. |
author_ref
required
|
uuid |
Store-scoped blog author id. |
seo_title
|
string |
Optional SEO title. |
seo_description
|
string |
Optional SEO description. |
status
required
|
string |
Post status: draft, scheduled, published, or archived. |
publish_at
|
string |
Publication time, as a local datetime in the store timezone or RFC 3339 with an offset. Required for scheduled status. |
template_handle
|
string |
Template assignment. On create, omitting this field or sending an empty string assigns |
category_ids
|
array<uuid> |
Category ids to assign. |
tag_ids
|
array<uuid> |
Tag ids to assign. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is malformed or contains an unknown field.
-
400BLOG_POST_AUTHOR_REQUIREDAuthor is required.
-
400BLOG_POST_TITLE_REQUIREDTitle is empty after normalization.
-
400BLOG_POST_TITLE_TOO_LONGTitle exceeds the Blog Post contract max length.
-
400BLOG_POST_SLUG_FORMATSlug is not valid for Blog Post URLs.
-
400BLOG_POST_SLUG_TOO_LONGSlug exceeds the Blog Post contract max length.
-
404BLOG_AUTHOR_NOT_FOUNDAuthor does not exist in this store.
-
400BLOG_POST_CONTENT_TOO_LONGContent exceeds the Blog Post contract max length.
-
400BLOG_POST_EXCERPT_TOO_LONGExcerpt exceeds the Blog Post contract max length.
-
400BLOG_POST_SEO_TITLE_TOO_LONGSEO title exceeds the Blog Post contract max length.
-
400BLOG_POST_SEO_DESCRIPTION_TOO_LONGSEO description exceeds the Blog Post contract max length.
-
400BLOG_POST_STATUS_INVALIDStatus is not one of the allowed values.
-
400BLOG_POST_PUBLISH_DATE_REQUIREDScheduled posts require publish_at.
-
400BLOG_POST_CATEGORY_IDS_INVALIDOne or more category ids do not exist in this store.
-
400BLOG_POST_TAG_IDS_INVALIDOne or more tag ids do not exist in this store.
-
400BLOG_POST_CATEGORIES_TOO_MANYCategory assignments exceed the per-post cap.
-
400BLOG_POST_TAGS_TOO_MANYTag assignments exceed the per-post cap.
-
400TEMPLATE_HANDLE_INVALIDTemplate handle is not valid for Blog Post templates.
-
400TEMPLATE_HANDLE_NOT_FOUNDTemplate handle does not exist on the store's primary active theme for Blog Post.
-
409BLOG_POST_SLUG_DUPLICATESlug already exists in this store.
-
404NOT_FOUNDThe featured image does not exist in this store.
-
400INVALID_INPUTfeatured_image_id is malformed, is not an image, or belongs to another store.
-
403STORE_API_SCOPE_REQUIREDA non-empty featured_image_id requires read_files in addition to write_blog.
-
400BLOG_POST_PUBLISH_AT_INVALID_FORMATpublish_at is not a valid store-local or RFC 3339 datetime.
-
400BLOG_POST_SCHEDULED_DATE_PASTThe supplied schedule is too far in the past.
-
400BLOG_POST_LIMIT_REACHEDThe store's blog post limit has been reached.
-
400BLOG_POST_PLAN_LIMIT_REACHEDThis store is at its plan blog post cap.
Update a blog post
Update a blog post.
Updates provided Blog Post fields. Omitted fields are left unchanged. A blank slug keeps the current slug; a non-empty slug is normalized and validated. Set create_redirect to false to suppress the default redirect when the slug changes. 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 |
Blog Post id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
title
|
string |
Blog Post title. |
slug
|
string |
Optional slug. Omit to generate from title. |
content
|
string |
Optional sanitized HTML content. |
excerpt
|
string |
Optional excerpt. |
featured_image_id
|
string |
Optional image file id. Non-empty values must reference an image in this store. |
author_ref
|
uuid |
Store-scoped blog author id. |
seo_title
|
string |
Optional SEO title. |
seo_description
|
string |
Optional SEO description. |
status
|
string |
Post status: draft, scheduled, published, or archived. |
publish_at
|
string |
Publication time, as a local datetime in the store timezone or RFC 3339 with an offset. Required for scheduled status. |
template_handle
|
string |
Template assignment. On create, omitting this field or sending an empty string assigns |
category_ids
|
array<uuid> |
Category ids to assign. |
tag_ids
|
array<uuid> |
Tag ids to assign. |
create_redirect
|
boolean |
When slug changes, create a redirect from the previous post URL. Defaults to true; set false to suppress it. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is malformed or contains an unknown field.
-
400BLOG_POST_AUTHOR_REQUIREDAuthor is required.
-
400BLOG_POST_TITLE_REQUIREDTitle is empty after normalization.
-
400BLOG_POST_TITLE_TOO_LONGTitle exceeds the Blog Post contract max length.
-
400BLOG_POST_SLUG_FORMATSlug is not valid for Blog Post URLs.
-
400BLOG_POST_SLUG_TOO_LONGSlug exceeds the Blog Post contract max length.
-
404BLOG_AUTHOR_NOT_FOUNDAuthor does not exist in this store.
-
400BLOG_POST_CONTENT_TOO_LONGContent exceeds the Blog Post contract max length.
-
400BLOG_POST_EXCERPT_TOO_LONGExcerpt exceeds the Blog Post contract max length.
-
400BLOG_POST_SEO_TITLE_TOO_LONGSEO title exceeds the Blog Post contract max length.
-
400BLOG_POST_SEO_DESCRIPTION_TOO_LONGSEO description exceeds the Blog Post contract max length.
-
400BLOG_POST_STATUS_INVALIDStatus is not one of the allowed values.
-
400BLOG_POST_PUBLISH_DATE_REQUIREDScheduled posts require publish_at.
-
400BLOG_POST_CATEGORY_IDS_INVALIDOne or more category ids do not exist in this store.
-
400BLOG_POST_TAG_IDS_INVALIDOne or more tag ids do not exist in this store.
-
400BLOG_POST_CATEGORIES_TOO_MANYCategory assignments exceed the per-post cap.
-
400BLOG_POST_TAGS_TOO_MANYTag assignments exceed the per-post cap.
-
400TEMPLATE_HANDLE_INVALIDTemplate handle is not valid for Blog Post templates.
-
400TEMPLATE_HANDLE_NOT_FOUNDTemplate handle does not exist on the store's primary active theme for Blog Post.
-
409BLOG_POST_SLUG_DUPLICATESlug already exists in this store.
-
404NOT_FOUNDThe featured image does not exist in this store.
-
400INVALID_INPUTfeatured_image_id is malformed, is not an image, or belongs to another store.
-
403STORE_API_SCOPE_REQUIREDA non-empty featured_image_id requires read_files in addition to write_blog.
-
400BLOG_POST_PUBLISH_AT_INVALID_FORMATpublish_at is not a valid store-local or RFC 3339 datetime.
-
400BLOG_POST_SCHEDULED_DATE_PASTThe supplied schedule is too far in the past.
-
409TRANSLATION_SOURCE_FIELD_HAS_TRANSLATIONSRemove translations before clearing their source field.
-
400BLOG_POST_IDS_INVALIDBlog Post id is not a valid UUID.
-
404NOT_FOUNDBlog Post does not exist in this store.
Delete a blog post
Delete a blog post.
Deletes a Blog Post together with its category/tag assignments, comments, and translations. Each cascaded comment emits blog_comments/delete. Menu references require confirmation and are removed after the confirmed delete.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Blog Post id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
confirmed
|
boolean |
Set true only when retrying after |
confirmation_token
|
string |
Single-use token returned by |
Errors
-
400STORE_API_INVALID_REQUEST_BODYBlog Post id or delete request body is invalid.
-
404NOT_FOUNDBlog Post does not exist in this store.
-
400BLOG_POST_CONFIRMATION_INVALIDConfirmation token is missing, expired, or does not match this delete.
-
409CONFIRMATION_REQUIREDMenus reference this post. Review the warnings and retry with the returned token.
Bulk delete blog posts
Delete multiple blog posts.
Deletes multiple Blog Posts in one request together with their assignments, comments, and translations. Each cascaded comment emits blog_comments/delete. Menu references require confirmation and are removed after the confirmed delete. The request is capped by the Blog Post bulk contract.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
post_ids
required
|
array<uuid> |
Blog Post ids to delete. |
confirmed
|
boolean |
Set true only when retrying after |
confirmation_token
|
string |
Single-use token returned by |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is malformed, contains unknown fields, or includes a malformed UUID.
-
400BLOG_POST_BULK_NO_IDSNo Blog Post ids were provided.
-
400BLOG_POST_BULK_DELETE_TOO_MANYBatch exceeds the Blog Post bulk delete cap.
-
400BLOG_POST_IDS_INVALIDOne or more post ids do not exist in this store.
-
400BLOG_POST_CONFIRMATION_INVALIDConfirmation token is missing, expired, or does not match the exact selected ids.
-
409CONFIRMATION_REQUIREDMenus reference one or more selected posts. Review the warnings and retry with the returned token.
Bulk update blog post status
Update status for multiple blog posts.
Sets draft, published, or archived status on all supplied post ids. Schedule posts individually because this endpoint does not accept a publish date.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
post_ids
required
|
array<uuid> |
Blog Post ids to update. |
status
required
|
string |
New post status: draft, published, or archived. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is malformed, contains unknown fields, or includes a malformed UUID.
-
400BLOG_POST_BULK_NO_IDSNo Blog Post ids were provided.
-
400BLOG_POST_BULK_UPDATE_TOO_MANYBatch exceeds the Blog Post bulk update cap.
-
400BLOG_POST_IDS_INVALIDOne or more post ids do not exist in this store.
-
400BLOG_POST_STATUS_INVALIDStatus must be draft, published, or archived.
-
400BLOG_POST_PUBLISH_DATE_REQUIREDScheduled status is not supported by this bulk endpoint.
-
400BLOG_POST_AUTHOR_REQUIREDA selected post needs an author before it can be published.
Bulk assign categories
Assign categories to multiple blog posts.
Adds the supplied categories to each post while keeping existing categories.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
post_ids
required
|
array<uuid> |
Blog Post ids to update. |
category_ids
required
|
array<uuid> |
Category ids to add. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is malformed, contains unknown fields, or includes a malformed UUID.
-
400BLOG_POST_BULK_NO_IDSNo Blog Post ids were provided.
-
400BLOG_POST_BULK_UPDATE_TOO_MANYBatch exceeds the Blog Post bulk update cap.
-
400BLOG_POST_IDS_INVALIDOne or more post ids do not exist in this store.
-
400STORE_API_INVALID_CATEGORY_IDA category id is not a valid UUID.
-
400BLOG_POST_CATEGORY_IDS_INVALIDCategory ids are empty or do not exist in this store.
-
400BLOG_POST_CATEGORIES_TOO_MANYThe resulting category set exceeds the per-post cap.
Bulk assign tags
Assign tags to multiple blog posts.
Adds the supplied tags to each post while keeping existing tags.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
post_ids
required
|
array<uuid> |
Blog Post ids to update. |
tag_ids
required
|
array<uuid> |
Tag ids to add. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is malformed, contains unknown fields, or includes a malformed UUID.
-
400BLOG_POST_BULK_NO_IDSNo Blog Post ids were provided.
-
400BLOG_POST_BULK_UPDATE_TOO_MANYBatch exceeds the Blog Post bulk update cap.
-
400BLOG_POST_IDS_INVALIDOne or more post ids do not exist in this store.
-
400STORE_API_INVALID_TAG_IDA tag id is not a valid UUID.
-
400BLOG_POST_TAG_IDS_INVALIDTag ids are empty or do not exist in this store.
-
400BLOG_POST_TAGS_TOO_MANYThe resulting tag set exceeds the per-post cap.
Bulk remove categories
Remove categories from multiple blog posts.
Removes the supplied categories from each post while keeping every other category assignment.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
post_ids
required
|
array<uuid> |
Blog Post ids to update. |
category_ids
required
|
array<uuid> |
Category ids to remove. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is malformed, contains unknown fields, or includes a malformed UUID.
-
400BLOG_POST_BULK_NO_IDSNo Blog Post ids were provided.
-
400BLOG_POST_BULK_UPDATE_TOO_MANYBatch exceeds the Blog Post bulk update cap.
-
400BLOG_POST_IDS_INVALIDOne or more post ids do not exist in this store.
-
400STORE_API_INVALID_CATEGORY_IDA category id is not a valid UUID.
-
400BLOG_POST_CATEGORY_IDS_INVALIDCategory ids are empty or do not exist in this store.
Bulk remove tags
Remove tags from multiple blog posts.
Removes the supplied tags from each post while keeping every other tag assignment.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
post_ids
required
|
array<uuid> |
Blog Post ids to update. |
tag_ids
required
|
array<uuid> |
Tag ids to remove. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is malformed, contains unknown fields, or includes a malformed UUID.
-
400BLOG_POST_BULK_NO_IDSNo Blog Post ids were provided.
-
400BLOG_POST_BULK_UPDATE_TOO_MANYBatch exceeds the Blog Post bulk update cap.
-
400BLOG_POST_IDS_INVALIDOne or more post ids do not exist in this store.
-
400STORE_API_INVALID_TAG_IDA tag id is not a valid UUID.
-
400BLOG_POST_TAG_IDS_INVALIDTag ids are empty or do not exist in this store.
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 |
No |
|
|
string (UUID) |
Yes |
Yes |
create |
No |
|
string |
No |
No |
No |
|
|
string |
Yes |
Yes |
Yes |
|
|
string |
Yes |
Yes |
Yes |
|
|
string |
Yes |
Yes |
create |
No |
|
string |
Yes |
Yes |
No |
|
|
string (RFC 3339) |
No |
No |
No |
|
|
string |
Yes |
Yes |
No |
|
|
array |
Yes |
Yes |
No |
|
|
array |
Yes |
Yes |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
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 blog posts. 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.
Metafield events are filtered for every subscriber. An app receives events for definitions it owns. With the event's required scope, it also receives merchant-owned definitions and definitions shared by another app through app_access: shared; another app's private definitions are not delivered. A store-level webhook endpoint receives merchant-owned definitions and app-owned definitions unless merchant_access is hidden. If an event cannot identify the definition owner or its access settings, Tringify does not deliver it.
Blog post created
Fired when a blog post is created.
Payload fields
| Field | Type | Description |
|---|---|---|
blog_post.id |
string |
Always present |
blog_post.title |
string |
Selectable in the Payload builder |
blog_post.slug |
string |
Selectable in the Payload builder |
blog_post.content |
string |
Selectable in the Payload builder |
blog_post.excerpt |
string |
Selectable in the Payload builder |
blog_post.featured_image_id |
string |
Selectable in the Payload builder |
blog_post.featured_image_url |
string |
Selectable in the Payload builder |
blog_post.featured_image_cdn_url |
string |
Selectable in the Payload builder |
blog_post.author_ref |
string |
Selectable in the Payload builder |
blog_post.author.id |
string |
Always present |
blog_post.author.name |
string |
Selectable in the Payload builder |
blog_post.author.slug |
string |
Selectable in the Payload builder |
blog_post.author.bio |
string |
Selectable in the Payload builder |
blog_post.author.avatar_url |
string |
Selectable in the Payload builder |
blog_post.author.created_at |
string |
Selectable in the Payload builder |
blog_post.seo_title |
string |
Selectable in the Payload builder |
blog_post.seo_description |
string |
Selectable in the Payload builder |
blog_post.template_handle |
string |
Selectable in the Payload builder |
blog_post.status |
string |
Selectable in the Payload builder |
blog_post.publish_at |
string |
Selectable in the Payload builder |
blog_post.published_at |
string |
Selectable in the Payload builder |
blog_post.comment_count |
integer |
Selectable in the Payload builder |
blog_post.categories[*].id |
string |
Always present |
blog_post.categories[*].name |
string |
Selectable in the Payload builder |
blog_post.categories[*].slug |
string |
Selectable in the Payload builder |
blog_post.categories[*].description |
string |
Selectable in the Payload builder |
blog_post.categories[*].seo_title |
string |
Selectable in the Payload builder |
blog_post.categories[*].seo_description |
string |
Selectable in the Payload builder |
blog_post.categories[*].template_handle |
string |
Selectable in the Payload builder |
blog_post.categories[*].post_count |
integer |
Selectable in the Payload builder |
blog_post.categories[*].created_at |
string |
Selectable in the Payload builder |
blog_post.categories[*].updated_at |
string |
Selectable in the Payload builder |
blog_post.tags[*].id |
string |
Always present |
blog_post.tags[*].name |
string |
Selectable in the Payload builder |
blog_post.tags[*].slug |
string |
Selectable in the Payload builder |
blog_post.tags[*].post_count |
integer |
Selectable in the Payload builder |
blog_post.tags[*].created_at |
string |
Selectable in the Payload builder |
blog_post.created_at |
string |
Selectable in the Payload builder |
blog_post.updated_at |
string |
Selectable in the Payload builder |
Blog post updated
Fired when a blog post is updated.
Possible changed_fields values
The changed_fields array names exactly which of these changed in this event — use it to skip processing updates your integration doesn't care about.
author_ref categories publish_at published_at status tags
Payload fields
| Field | Type | Description |
|---|---|---|
blog_post.id |
string |
Always present |
blog_post.title |
string |
Selectable in the Payload builder |
blog_post.slug |
string |
Selectable in the Payload builder |
blog_post.content |
string |
Selectable in the Payload builder
The post's sanitized HTML. Omitted from updates sent by a bulk action, which never changes content; read the post when you need it. |
blog_post.excerpt |
string |
Selectable in the Payload builder |
blog_post.featured_image_id |
string |
Selectable in the Payload builder |
blog_post.featured_image_url |
string |
Selectable in the Payload builder |
blog_post.featured_image_cdn_url |
string |
Selectable in the Payload builder |
blog_post.author_ref |
string |
Selectable in the Payload builder |
blog_post.author.id |
string |
Always present |
blog_post.author.name |
string |
Selectable in the Payload builder |
blog_post.author.slug |
string |
Selectable in the Payload builder |
blog_post.author.bio |
string |
Selectable in the Payload builder |
blog_post.author.avatar_url |
string |
Selectable in the Payload builder |
blog_post.author.created_at |
string |
Selectable in the Payload builder |
blog_post.seo_title |
string |
Selectable in the Payload builder |
blog_post.seo_description |
string |
Selectable in the Payload builder |
blog_post.template_handle |
string |
Selectable in the Payload builder |
blog_post.status |
string |
Selectable in the Payload builder |
blog_post.publish_at |
string |
Selectable in the Payload builder |
blog_post.published_at |
string |
Selectable in the Payload builder |
blog_post.comment_count |
integer |
Selectable in the Payload builder |
blog_post.categories[*].id |
string |
Always present |
blog_post.categories[*].name |
string |
Selectable in the Payload builder |
blog_post.categories[*].slug |
string |
Selectable in the Payload builder |
blog_post.categories[*].description |
string |
Selectable in the Payload builder |
blog_post.categories[*].seo_title |
string |
Selectable in the Payload builder |
blog_post.categories[*].seo_description |
string |
Selectable in the Payload builder |
blog_post.categories[*].template_handle |
string |
Selectable in the Payload builder |
blog_post.categories[*].post_count |
integer |
Selectable in the Payload builder |
blog_post.categories[*].created_at |
string |
Selectable in the Payload builder |
blog_post.categories[*].updated_at |
string |
Selectable in the Payload builder |
blog_post.tags[*].id |
string |
Always present |
blog_post.tags[*].name |
string |
Selectable in the Payload builder |
blog_post.tags[*].slug |
string |
Selectable in the Payload builder |
blog_post.tags[*].post_count |
integer |
Selectable in the Payload builder |
blog_post.tags[*].created_at |
string |
Selectable in the Payload builder |
blog_post.created_at |
string |
Selectable in the Payload builder |
blog_post.updated_at |
string |
Selectable in the Payload builder |
changed_fields |
array |
Selectable in the Payload builder
Present only on updates from a bulk action across several posts: the fields that action changed (status, publish_at and published_at, categories, tags, or author_ref when a deleted author's posts move to another author). These updates leave out blog_post.content. |
Blog post deleted
Fired when a blog post is deleted.
Payload fields
| Field | Type | Description |
|---|---|---|
blog_post.id |
string |
Always present |
blog_post.title |
string |
Selectable in the Payload builder |
blog_post.slug |
string |
Selectable in the Payload builder |
Blog post metafield value created
Fired when a blog post metafield value is created.
Payload fields
| Field | Type | Description |
|---|---|---|
blog_post.id |
string |
Always present |
blog_post.title |
string |
Selectable in the Payload builder |
blog_post.slug |
string |
Selectable in the Payload builder |
metafield.definition.id |
string |
Selectable in the Payload builder |
metafield.definition.owner_type |
string |
Selectable in the Payload builder |
metafield.definition.namespace |
string |
Selectable in the Payload builder |
metafield.definition.key |
string |
Selectable in the Payload builder |
metafield.definition.name |
string |
Selectable in the Payload builder |
metafield.definition.description |
string |
Selectable in the Payload builder |
metafield.definition.type |
string |
Selectable in the Payload builder |
metafield.definition.is_translatable |
boolean |
Selectable in the Payload builder |
metafield.definition.max_value_length |
integer |
Selectable in the Payload builder |
metafield.definition.max_list_items |
integer |
Selectable in the Payload builder |
metafield.definition.sort_order |
integer |
Selectable in the Payload builder |
metafield.definition.app_id |
string |
Selectable in the Payload builder |
metafield.definition.app_access |
string |
Selectable in the Payload builder |
metafield.definition.merchant_access |
string |
Selectable in the Payload builder |
metafield.definition.created_at |
string |
Selectable in the Payload builder |
metafield.definition.updated_at |
string |
Selectable in the Payload builder |
metafield.definition.usage_count |
integer |
Selectable in the Payload builder |
metafield.value |
string |
Selectable in the Payload builder |
metafield.display_value |
string |
Selectable in the Payload builder |
metafield.display_value_map |
object |
Selectable in the Payload builder |
metafield.created_at |
string |
Selectable in the Payload builder |
metafield.updated_at |
string |
Selectable in the Payload builder |
Blog post metafield value updated
Fired when a blog post metafield value changes.
Possible changed_fields values
The changed_fields array names exactly which of these changed in this event — use it to skip processing updates your integration doesn't care about.
value
Payload fields
| Field | Type | Description |
|---|---|---|
blog_post.id |
string |
Always present |
blog_post.title |
string |
Selectable in the Payload builder |
blog_post.slug |
string |
Selectable in the Payload builder |
previous.definition.id |
string |
Selectable in the Payload builder |
previous.definition.owner_type |
string |
Selectable in the Payload builder |
previous.definition.namespace |
string |
Selectable in the Payload builder |
previous.definition.key |
string |
Selectable in the Payload builder |
previous.definition.name |
string |
Selectable in the Payload builder |
previous.definition.description |
string |
Selectable in the Payload builder |
previous.definition.type |
string |
Selectable in the Payload builder |
previous.definition.is_translatable |
boolean |
Selectable in the Payload builder |
previous.definition.max_value_length |
integer |
Selectable in the Payload builder |
previous.definition.max_list_items |
integer |
Selectable in the Payload builder |
previous.definition.sort_order |
integer |
Selectable in the Payload builder |
previous.definition.app_id |
string |
Selectable in the Payload builder |
previous.definition.app_access |
string |
Selectable in the Payload builder |
previous.definition.merchant_access |
string |
Selectable in the Payload builder |
previous.definition.created_at |
string |
Selectable in the Payload builder |
previous.definition.updated_at |
string |
Selectable in the Payload builder |
previous.definition.usage_count |
integer |
Selectable in the Payload builder |
previous.value |
string |
Selectable in the Payload builder |
previous.display_value |
string |
Selectable in the Payload builder |
previous.display_value_map |
object |
Selectable in the Payload builder |
previous.created_at |
string |
Selectable in the Payload builder |
previous.updated_at |
string |
Selectable in the Payload builder |
current.definition.id |
string |
Selectable in the Payload builder |
current.definition.owner_type |
string |
Selectable in the Payload builder |
current.definition.namespace |
string |
Selectable in the Payload builder |
current.definition.key |
string |
Selectable in the Payload builder |
current.definition.name |
string |
Selectable in the Payload builder |
current.definition.description |
string |
Selectable in the Payload builder |
current.definition.type |
string |
Selectable in the Payload builder |
current.definition.is_translatable |
boolean |
Selectable in the Payload builder |
current.definition.max_value_length |
integer |
Selectable in the Payload builder |
current.definition.max_list_items |
integer |
Selectable in the Payload builder |
current.definition.sort_order |
integer |
Selectable in the Payload builder |
current.definition.app_id |
string |
Selectable in the Payload builder |
current.definition.app_access |
string |
Selectable in the Payload builder |
current.definition.merchant_access |
string |
Selectable in the Payload builder |
current.definition.created_at |
string |
Selectable in the Payload builder |
current.definition.updated_at |
string |
Selectable in the Payload builder |
current.definition.usage_count |
integer |
Selectable in the Payload builder |
current.value |
string |
Selectable in the Payload builder |
current.display_value |
string |
Selectable in the Payload builder |
current.display_value_map |
object |
Selectable in the Payload builder |
current.created_at |
string |
Selectable in the Payload builder |
current.updated_at |
string |
Selectable in the Payload builder |
changed_fields |
array |
Selectable in the Payload builder |
Blog post metafield value deleted
Fired when a blog post metafield value is deleted, including when its blog post is deleted.
Payload fields
| Field | Type | Description |
|---|---|---|
blog_post.id |
string |
Always present |
blog_post.title |
string |
Selectable in the Payload builder |
blog_post.slug |
string |
Selectable in the Payload builder |
metafield.definition.id |
string |
Selectable in the Payload builder |
metafield.definition.owner_type |
string |
Selectable in the Payload builder |
metafield.definition.namespace |
string |
Selectable in the Payload builder |
metafield.definition.key |
string |
Selectable in the Payload builder |
metafield.definition.name |
string |
Selectable in the Payload builder |
metafield.definition.description |
string |
Selectable in the Payload builder |
metafield.definition.type |
string |
Selectable in the Payload builder |
metafield.definition.is_translatable |
boolean |
Selectable in the Payload builder |
metafield.definition.max_value_length |
integer |
Selectable in the Payload builder |
metafield.definition.max_list_items |
integer |
Selectable in the Payload builder |
metafield.definition.sort_order |
integer |
Selectable in the Payload builder |
metafield.definition.app_id |
string |
Selectable in the Payload builder |
metafield.definition.app_access |
string |
Selectable in the Payload builder |
metafield.definition.merchant_access |
string |
Selectable in the Payload builder |
metafield.definition.created_at |
string |
Selectable in the Payload builder |
metafield.definition.updated_at |
string |
Selectable in the Payload builder |
metafield.definition.usage_count |
integer |
Selectable in the Payload builder |
metafield.value |
string |
Selectable in the Payload builder |
metafield.display_value |
string |
Selectable in the Payload builder |
metafield.display_value_map |
object |
Selectable in the Payload builder |
metafield.created_at |
string |
Selectable in the Payload builder |
metafield.updated_at |
string |
Selectable in the Payload builder |
Blog settings updated
Fired when blog comment settings change.
Payload fields
| Field | Type | Description |
|---|---|---|
settings.comments_mode |
string |
Always present |
settings.comments_moderation |
boolean |
Selectable in the Payload builder |
settings.updated_at |
string |
Always present |