Blog Posts

Blog Posts require blog scopes. Reads use read_blog; writes use write_blog. Blog Posts support title, slug, content, excerpt, featured_image_id, author_ref, seo_title, seo_description, status, publish_at, category_ids, tag_ids, and template_handle fields. author_ref must reference a blog author in the same store; responses enrich it as author. slug is optional on create and generated from the title when omitted; on update, a supplied slug must be non-empty and valid. Assigning a non-empty featured_image_id also requires read_files for the referenced upload image. On create, omitting template_handle assigns default_blog. Use default_blog for the default Blog Post template, or pass an alternate Blog Post template handle configured for the store. Omit template_handle on update to leave the current assignment unchanged; an empty string is invalid. AI translation is not exposed through the Store API.

Endpoints#

Blog Post limits

GET read_blog

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.

Headers

Name Type Description
Authorization required string

Bearer Store API token.

List blog posts

GET read_blog

List blog posts for the store.

Returns paginated Blog Posts. Filter by search, status, author, category, tag, or publication date. Invalid pagination, UUID, and sort parameters are rejected instead of silently defaulted.

Query parameters

Name Type Description
page integer

Page number.

Example: 1
limit integer

Page size.

Example: 20
search string

Search Blog Posts by title or slug.

Example: launch-notes
status string

Filter by status.

Example: published
author_ref uuid

Filter by blog author id.

Example: 44bf70b7-88e2-4770-a30e-d7a1db522499
category_id uuid

Filter by assigned blog category id.

Example: 3a588f80-fd8c-4d46-af1b-00a1c4a7f85a
tag_id uuid

Filter by assigned blog tag id.

Example: 6e8b7dd1-7ad5-453d-8a87-67daf4ca9f93
publication_date_from date

Include posts published or scheduled on or after this store-local date (YYYY-MM-DD).

Example: 2026-02-01
publication_date_to date

Include posts published or scheduled on or before this store-local date (YYYY-MM-DD).

Example: 2026-02-28
sort_by string

Sort field from the Blog Post list contract.

Allowed values
titlestatusauthorcomment_countpublished_atpublish_atcreated_atupdated_at
Example: created_at
sort_direction string

Sort direction from the Blog Post list contract.

Allowed values
ascdesc
Example: desc

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 within the Blog Post contract cap.

  • 400 VALIDATION_LIST_INVALID_SORT_BY

    Sort field is not supported.

  • 400 VALIDATION_LIST_INVALID_SORT_DIRECTION

    Sort direction must be asc or desc.

  • 400 BLOG_POST_SEARCH_TOO_LONG

    Search exceeds the Blog Post contract max length.

  • 400 BLOG_POST_STATUS_FILTER_INVALID

    Status is not one of the allowed values.

  • 400 BLOG_POST_PUBLICATION_DATE_FILTER_INVALID

    Publication dates must use YYYY-MM-DD and form a valid range.

  • 400 STORE_API_INVALID_REQUEST_BODY

    An author id is not a UUID.

  • 400 STORE_API_INVALID_CATEGORY_ID

    Category id is not a UUID.

  • 400 STORE_API_INVALID_TAG_ID

    Tag id is not a UUID.

Search blog posts

GET read_blog

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.

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

Get a blog post

GET read_blog

Fetch one blog post by id.

Returns the Blog Post if it belongs to the token's store.

Path parameters

Name Type Description
id required uuid

Blog Post id.

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

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

Create a blog post

POST write_blog

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.

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
title required string

Blog Post title.

Example: Launch notes
slug string

Optional slug. Omit to generate from title.

Example: launch-notes
content string

Optional sanitized HTML content.

Example: <p>What changed in this release.</p>
excerpt string

Optional excerpt.

Example: What changed in this release.
featured_image_id string

Optional image file id. Non-empty values must reference an image in this store.

Example: f_8f2a1c2b9d4e
author_ref required uuid

Store-scoped blog author id.

Example: 44bf70b7-88e2-4770-a30e-d7a1db522499
seo_title string

Optional SEO title.

Example: Launch notes
seo_description string

Optional SEO description.

Example: Read the latest launch notes.
status required string

Post status: draft, scheduled, published, or archived.

Example: published
publish_at string

Store-time publish date. Required when status is scheduled.

Example: 2026-02-10T09:00:00
template_handle string

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

Example: default_blog
category_ids array<uuid>

Category ids to assign.

Example: 3a588f80-fd8c-4d46-af1b-00a1c4a7f85a
tag_ids array<uuid>

Tag ids to assign.

Example: 6e8b7dd1-7ad5-453d-8a87-67daf4ca9f93

Errors

  • 400 BLOG_POST_AUTHOR_REQUIRED

    Author is required.

  • 400 BLOG_POST_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 BLOG_POST_TITLE_TOO_LONG

    Title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 BLOG_POST_SLUG_FORMAT

    Slug is not valid for Blog Post URLs.

  • 400 BLOG_POST_SLUG_TOO_LONG

    Slug exceeds the Blog Post contract max length.

  • 404 BLOG_AUTHOR_NOT_FOUND

    Author does not exist in this store.

  • 400 BLOG_POST_CONTENT_TOO_LONG

    Content exceeds the Blog Post contract max length.

  • 400 BLOG_POST_EXCERPT_TOO_LONG

    Excerpt exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_TITLE_TOO_LONG

    SEO title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Blog Post contract max length.

  • 400 BLOG_POST_STATUS_INVALID

    Status is not one of the allowed values.

  • 400 BLOG_POST_PUBLISH_DATE_REQUIRED

    Scheduled posts require publish_at.

  • 400 BLOG_POST_CATEGORY_IDS_INVALID

    One or more category ids do not exist in this store.

  • 400 BLOG_POST_TAG_IDS_INVALID

    One or more tag ids do not exist in this store.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Blog Post templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

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

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

  • 409 BLOG_POST_SLUG_DUPLICATE

    Slug already exists in this store.

Update a blog post

PUT write_blog

Update a blog post.

Updates provided Blog Post fields. Omitted fields are left unchanged. When slug is provided it must be non-empty and valid; create is the only path that auto-generates a blank slug from the title.

Path parameters

Name Type Description
id required uuid

Blog Post 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

Blog Post title.

Example: Launch notes
slug string

Optional slug. Omit to generate from title.

Example: launch-notes
content string

Optional sanitized HTML content.

Example: <p>What changed in this release.</p>
excerpt string

Optional excerpt.

Example: What changed in this release.
featured_image_id string

Optional image file id. Non-empty values must reference an image in this store.

Example: f_8f2a1c2b9d4e
author_ref uuid

Store-scoped blog author id.

Example: 44bf70b7-88e2-4770-a30e-d7a1db522499
seo_title string

Optional SEO title.

Example: Launch notes
seo_description string

Optional SEO description.

Example: Read the latest launch notes.
status string

Post status: draft, scheduled, published, or archived.

Example: published
publish_at string

Store-time publish date. Required when status is scheduled.

Example: 2026-02-10T09:00:00
template_handle string

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

Example: default_blog
category_ids array<uuid>

Category ids to assign.

Example: 3a588f80-fd8c-4d46-af1b-00a1c4a7f85a
tag_ids array<uuid>

Tag ids to assign.

Example: 6e8b7dd1-7ad5-453d-8a87-67daf4ca9f93
create_redirect boolean

When slug changes, create a redirect from the previous post URL. Defaults to true; set false to suppress it.

Example: true

Errors

  • 400 BLOG_POST_AUTHOR_REQUIRED

    Author is required.

  • 400 BLOG_POST_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 BLOG_POST_TITLE_TOO_LONG

    Title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 BLOG_POST_SLUG_FORMAT

    Slug is not valid for Blog Post URLs.

  • 400 BLOG_POST_SLUG_TOO_LONG

    Slug exceeds the Blog Post contract max length.

  • 404 BLOG_AUTHOR_NOT_FOUND

    Author does not exist in this store.

  • 400 BLOG_POST_CONTENT_TOO_LONG

    Content exceeds the Blog Post contract max length.

  • 400 BLOG_POST_EXCERPT_TOO_LONG

    Excerpt exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_TITLE_TOO_LONG

    SEO title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Blog Post contract max length.

  • 400 BLOG_POST_STATUS_INVALID

    Status is not one of the allowed values.

  • 400 BLOG_POST_PUBLISH_DATE_REQUIRED

    Scheduled posts require publish_at.

  • 400 BLOG_POST_CATEGORY_IDS_INVALID

    One or more category ids do not exist in this store.

  • 400 BLOG_POST_TAG_IDS_INVALID

    One or more tag ids do not exist in this store.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Blog Post templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

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

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

  • 409 BLOG_POST_SLUG_DUPLICATE

    Slug already exists in this store.

Delete a blog post

DELETE write_blog

Delete a blog post.

Deletes a Blog Post together with its category/tag assignments and translations.

Path parameters

Name Type Description
id required uuid

Blog Post id.

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

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 BLOG_POST_BULK_NO_IDS

    No Blog Post ids were provided.

  • 400 BLOG_POST_BULK_DELETE_TOO_MANY

    Batch exceeds the Blog Post bulk delete cap.

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

Bulk delete blog posts

POST write_blog

Delete multiple blog posts.

Deletes multiple Blog Posts in one request. 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.

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

Errors

  • 400 BLOG_POST_BULK_NO_IDS

    No Blog Post ids were provided.

  • 400 BLOG_POST_BULK_DELETE_TOO_MANY

    Batch exceeds the Blog Post bulk delete cap.

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

Bulk update blog post status

POST write_blog

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.

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

New post status: draft, published, or archived.

Example: published

Errors

  • 400 BLOG_POST_AUTHOR_REQUIRED

    Author is required.

  • 400 BLOG_POST_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 BLOG_POST_TITLE_TOO_LONG

    Title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 BLOG_POST_SLUG_FORMAT

    Slug is not valid for Blog Post URLs.

  • 400 BLOG_POST_SLUG_TOO_LONG

    Slug exceeds the Blog Post contract max length.

  • 404 BLOG_AUTHOR_NOT_FOUND

    Author does not exist in this store.

  • 400 BLOG_POST_CONTENT_TOO_LONG

    Content exceeds the Blog Post contract max length.

  • 400 BLOG_POST_EXCERPT_TOO_LONG

    Excerpt exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_TITLE_TOO_LONG

    SEO title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Blog Post contract max length.

  • 400 BLOG_POST_STATUS_INVALID

    Status is not one of the allowed values.

  • 400 BLOG_POST_PUBLISH_DATE_REQUIRED

    Scheduled posts require publish_at.

  • 400 BLOG_POST_CATEGORY_IDS_INVALID

    One or more category ids do not exist in this store.

  • 400 BLOG_POST_TAG_IDS_INVALID

    One or more tag ids do not exist in this store.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Blog Post templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

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

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

  • 409 BLOG_POST_SLUG_DUPLICATE

    Slug already exists in this store.

  • 400 BLOG_POST_BULK_NO_IDS

    No Blog Post ids were provided.

  • 400 BLOG_POST_BULK_UPDATE_TOO_MANY

    Batch exceeds the Blog Post bulk update cap.

Bulk assign categories

POST write_blog

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31
category_ids required array<uuid>

Category ids to add.

Example: 3a588f80-fd8c-4d46-af1b-00a1c4a7f85a

Errors

  • 400 BLOG_POST_AUTHOR_REQUIRED

    Author is required.

  • 400 BLOG_POST_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 BLOG_POST_TITLE_TOO_LONG

    Title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 BLOG_POST_SLUG_FORMAT

    Slug is not valid for Blog Post URLs.

  • 400 BLOG_POST_SLUG_TOO_LONG

    Slug exceeds the Blog Post contract max length.

  • 404 BLOG_AUTHOR_NOT_FOUND

    Author does not exist in this store.

  • 400 BLOG_POST_CONTENT_TOO_LONG

    Content exceeds the Blog Post contract max length.

  • 400 BLOG_POST_EXCERPT_TOO_LONG

    Excerpt exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_TITLE_TOO_LONG

    SEO title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Blog Post contract max length.

  • 400 BLOG_POST_STATUS_INVALID

    Status is not one of the allowed values.

  • 400 BLOG_POST_PUBLISH_DATE_REQUIRED

    Scheduled posts require publish_at.

  • 400 BLOG_POST_CATEGORY_IDS_INVALID

    One or more category ids do not exist in this store.

  • 400 BLOG_POST_TAG_IDS_INVALID

    One or more tag ids do not exist in this store.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Blog Post templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

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

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

  • 409 BLOG_POST_SLUG_DUPLICATE

    Slug already exists in this store.

  • 400 BLOG_POST_BULK_NO_IDS

    No Blog Post ids were provided.

  • 400 BLOG_POST_BULK_UPDATE_TOO_MANY

    Batch exceeds the Blog Post bulk update cap.

Bulk assign tags

POST write_blog

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31
tag_ids required array<uuid>

Tag ids to add.

Example: 6e8b7dd1-7ad5-453d-8a87-67daf4ca9f93

Errors

  • 400 BLOG_POST_AUTHOR_REQUIRED

    Author is required.

  • 400 BLOG_POST_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 BLOG_POST_TITLE_TOO_LONG

    Title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 BLOG_POST_SLUG_FORMAT

    Slug is not valid for Blog Post URLs.

  • 400 BLOG_POST_SLUG_TOO_LONG

    Slug exceeds the Blog Post contract max length.

  • 404 BLOG_AUTHOR_NOT_FOUND

    Author does not exist in this store.

  • 400 BLOG_POST_CONTENT_TOO_LONG

    Content exceeds the Blog Post contract max length.

  • 400 BLOG_POST_EXCERPT_TOO_LONG

    Excerpt exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_TITLE_TOO_LONG

    SEO title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Blog Post contract max length.

  • 400 BLOG_POST_STATUS_INVALID

    Status is not one of the allowed values.

  • 400 BLOG_POST_PUBLISH_DATE_REQUIRED

    Scheduled posts require publish_at.

  • 400 BLOG_POST_CATEGORY_IDS_INVALID

    One or more category ids do not exist in this store.

  • 400 BLOG_POST_TAG_IDS_INVALID

    One or more tag ids do not exist in this store.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Blog Post templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

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

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

  • 409 BLOG_POST_SLUG_DUPLICATE

    Slug already exists in this store.

  • 400 BLOG_POST_BULK_NO_IDS

    No Blog Post ids were provided.

  • 400 BLOG_POST_BULK_UPDATE_TOO_MANY

    Batch exceeds the Blog Post bulk update cap.

Bulk remove categories

POST write_blog

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31
category_ids required array<uuid>

Category ids to remove.

Example: 3a588f80-fd8c-4d46-af1b-00a1c4a7f85a

Errors

  • 400 BLOG_POST_AUTHOR_REQUIRED

    Author is required.

  • 400 BLOG_POST_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 BLOG_POST_TITLE_TOO_LONG

    Title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 BLOG_POST_SLUG_FORMAT

    Slug is not valid for Blog Post URLs.

  • 400 BLOG_POST_SLUG_TOO_LONG

    Slug exceeds the Blog Post contract max length.

  • 404 BLOG_AUTHOR_NOT_FOUND

    Author does not exist in this store.

  • 400 BLOG_POST_CONTENT_TOO_LONG

    Content exceeds the Blog Post contract max length.

  • 400 BLOG_POST_EXCERPT_TOO_LONG

    Excerpt exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_TITLE_TOO_LONG

    SEO title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Blog Post contract max length.

  • 400 BLOG_POST_STATUS_INVALID

    Status is not one of the allowed values.

  • 400 BLOG_POST_PUBLISH_DATE_REQUIRED

    Scheduled posts require publish_at.

  • 400 BLOG_POST_CATEGORY_IDS_INVALID

    One or more category ids do not exist in this store.

  • 400 BLOG_POST_TAG_IDS_INVALID

    One or more tag ids do not exist in this store.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Blog Post templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

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

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

  • 409 BLOG_POST_SLUG_DUPLICATE

    Slug already exists in this store.

  • 400 BLOG_POST_BULK_NO_IDS

    No Blog Post ids were provided.

  • 400 BLOG_POST_BULK_UPDATE_TOO_MANY

    Batch exceeds the Blog Post bulk update cap.

Bulk remove tags

POST write_blog

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.

Example: 5ff7d4ea-3250-4a4d-9d26-07f64d917d31
tag_ids required array<uuid>

Tag ids to remove.

Example: 6e8b7dd1-7ad5-453d-8a87-67daf4ca9f93

Errors

  • 400 BLOG_POST_AUTHOR_REQUIRED

    Author is required.

  • 400 BLOG_POST_TITLE_REQUIRED

    Title is empty after normalization.

  • 400 BLOG_POST_TITLE_TOO_LONG

    Title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 BLOG_POST_SLUG_FORMAT

    Slug is not valid for Blog Post URLs.

  • 400 BLOG_POST_SLUG_TOO_LONG

    Slug exceeds the Blog Post contract max length.

  • 404 BLOG_AUTHOR_NOT_FOUND

    Author does not exist in this store.

  • 400 BLOG_POST_CONTENT_TOO_LONG

    Content exceeds the Blog Post contract max length.

  • 400 BLOG_POST_EXCERPT_TOO_LONG

    Excerpt exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_TITLE_TOO_LONG

    SEO title exceeds the Blog Post contract max length.

  • 400 BLOG_POST_SEO_DESCRIPTION_TOO_LONG

    SEO description exceeds the Blog Post contract max length.

  • 400 BLOG_POST_STATUS_INVALID

    Status is not one of the allowed values.

  • 400 BLOG_POST_PUBLISH_DATE_REQUIRED

    Scheduled posts require publish_at.

  • 400 BLOG_POST_CATEGORY_IDS_INVALID

    One or more category ids do not exist in this store.

  • 400 BLOG_POST_TAG_IDS_INVALID

    One or more tag ids do not exist in this store.

  • 400 TEMPLATE_HANDLE_INVALID

    Template handle is not valid for Blog Post templates.

  • 400 TEMPLATE_HANDLE_NOT_FOUND

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

  • 404 BLOG_POST_NOT_FOUND

    Blog Post does not exist in this store.

  • 409 BLOG_POST_SLUG_DUPLICATE

    Slug already exists in this store.

  • 400 BLOG_POST_BULK_NO_IDS

    No Blog Post ids were provided.

  • 400 BLOG_POST_BULK_UPDATE_TOO_MANY

    Batch exceeds the Blog Post bulk update cap.

Fields#

Field

Kind

Create

Update

Required

Translatable

title

text

Yes

Yes

create

Yes

slug

slug

Yes

Yes

Yes

content

rich_text

Yes

Yes

Yes

excerpt

textarea

Yes

Yes

Yes

featured_image_id

image

Yes

Yes

No

author_ref

id

Yes

Yes

create

No

author

text

No

No

No

seo_title

text

Yes

Yes

Yes

seo_description

textarea

Yes

Yes

Yes

status

select

Yes

Yes

create

No

publish_at

datetime

Yes

Yes

No

published_at

datetime

No

No

No

template_handle

template

Yes

Yes

No

category_ids

id_list

Yes

Yes

No

tag_ids

id_list

Yes

Yes

No

category_count

integer

No

No

No

comment_count

integer

No

No

No

created_at

datetime

No

No

No

updated_at

datetime

No

No

No

storefront_url

url

No

No

No

No

Webhook events#

Blog Post webhook events are declared by the Blog Post resource contract. The event cards below include the topic, subscription scope, store permission, payload schema, and sample payload.

Blog post created

EVENT blog_posts/create write_blog blog:write

Fired when a blog post is created.

Payload fields

Field Type Description
blog_post.id string Always present
blog_post.title string Can be removed/added via the Payload builder
blog_post.slug string Can be removed/added via the Payload builder
blog_post.content string Can be removed/added via the Payload builder
blog_post.excerpt string Can be removed/added via the Payload builder
blog_post.featured_image_id string Can be removed/added via the Payload builder
blog_post.featured_image_url string Can be removed/added via the Payload builder
blog_post.featured_image_cdn_url string Can be removed/added via the Payload builder
blog_post.author_ref string Can be removed/added via the Payload builder
blog_post.author.id string Always present
blog_post.author.name string Can be removed/added via the Payload builder
blog_post.author.slug string Can be removed/added via the Payload builder
blog_post.author.bio string Can be removed/added via the Payload builder
blog_post.author.avatar_url string Can be removed/added via the Payload builder
blog_post.author.created_at string Can be removed/added via the Payload builder
blog_post.seo_title string Can be removed/added via the Payload builder
blog_post.seo_description string Can be removed/added via the Payload builder
blog_post.template_handle string Can be removed/added via the Payload builder
blog_post.status string Can be removed/added via the Payload builder
blog_post.publish_at string Can be removed/added via the Payload builder
blog_post.published_at string Can be removed/added via the Payload builder
blog_post.comment_count integer Can be removed/added via the Payload builder
blog_post.categories[*].id string Always present
blog_post.categories[*].name string Can be removed/added via the Payload builder
blog_post.categories[*].slug string Can be removed/added via the Payload builder
blog_post.categories[*].description string Can be removed/added via the Payload builder
blog_post.categories[*].seo_title string Can be removed/added via the Payload builder
blog_post.categories[*].seo_description string Can be removed/added via the Payload builder
blog_post.categories[*].template_handle string Can be removed/added via the Payload builder
blog_post.categories[*].post_count integer Can be removed/added via the Payload builder
blog_post.categories[*].created_at string Can be removed/added via the Payload builder
blog_post.categories[*].updated_at string Can be removed/added via the Payload builder
blog_post.tags[*].id string Always present
blog_post.tags[*].name string Can be removed/added via the Payload builder
blog_post.tags[*].slug string Can be removed/added via the Payload builder
blog_post.tags[*].post_count integer Can be removed/added via the Payload builder
blog_post.tags[*].created_at string Can be removed/added via the Payload builder
blog_post.created_at string Can be removed/added via the Payload builder
blog_post.updated_at string Can be removed/added via the Payload builder

Blog post updated

EVENT blog_posts/update write_blog blog:write

Fired when a blog post is updated.

Payload fields

Field Type Description
blog_post.id string Always present
blog_post.title string Can be removed/added via the Payload builder
blog_post.slug string Can be removed/added via the Payload builder
blog_post.content string Can be removed/added via the Payload builder
blog_post.excerpt string Can be removed/added via the Payload builder
blog_post.featured_image_id string Can be removed/added via the Payload builder
blog_post.featured_image_url string Can be removed/added via the Payload builder
blog_post.featured_image_cdn_url string Can be removed/added via the Payload builder
blog_post.author_ref string Can be removed/added via the Payload builder
blog_post.author.id string Always present
blog_post.author.name string Can be removed/added via the Payload builder
blog_post.author.slug string Can be removed/added via the Payload builder
blog_post.author.bio string Can be removed/added via the Payload builder
blog_post.author.avatar_url string Can be removed/added via the Payload builder
blog_post.author.created_at string Can be removed/added via the Payload builder
blog_post.seo_title string Can be removed/added via the Payload builder
blog_post.seo_description string Can be removed/added via the Payload builder
blog_post.template_handle string Can be removed/added via the Payload builder
blog_post.status string Can be removed/added via the Payload builder
blog_post.publish_at string Can be removed/added via the Payload builder
blog_post.published_at string Can be removed/added via the Payload builder
blog_post.comment_count integer Can be removed/added via the Payload builder
blog_post.categories[*].id string Always present
blog_post.categories[*].name string Can be removed/added via the Payload builder
blog_post.categories[*].slug string Can be removed/added via the Payload builder
blog_post.categories[*].description string Can be removed/added via the Payload builder
blog_post.categories[*].seo_title string Can be removed/added via the Payload builder
blog_post.categories[*].seo_description string Can be removed/added via the Payload builder
blog_post.categories[*].template_handle string Can be removed/added via the Payload builder
blog_post.categories[*].post_count integer Can be removed/added via the Payload builder
blog_post.categories[*].created_at string Can be removed/added via the Payload builder
blog_post.categories[*].updated_at string Can be removed/added via the Payload builder
blog_post.tags[*].id string Always present
blog_post.tags[*].name string Can be removed/added via the Payload builder
blog_post.tags[*].slug string Can be removed/added via the Payload builder
blog_post.tags[*].post_count integer Can be removed/added via the Payload builder
blog_post.tags[*].created_at string Can be removed/added via the Payload builder
blog_post.created_at string Can be removed/added via the Payload builder
blog_post.updated_at string Can be removed/added via the Payload builder

Blog post deleted

EVENT blog_posts/delete write_blog blog:write

Fired when a blog post is deleted.

Payload fields

Field Type Description
blog_post.id string Always present
blog_post.title string Can be removed/added via the Payload builder
blog_post.slug string Can be removed/added via the Payload builder

Blog settings updated

EVENT blog_settings/update write_blog blog:write

Fired when blog comment settings change.

Payload fields

Field Type Description
settings.comments_mode string Always present
settings.comments_moderation boolean Can be removed/added via the Payload builder
settings.updated_at string Always present