Blog tags organize posts by topic. Reads require read_blog; writes require write_blog. Names and slugs must be unique in the store. An omitted create slug is generated from the name. An update preserves an omitted slug and rejects a supplied blank slug.
Deleting an assigned tag requires confirmation and removes its assignments without deleting posts. Bulk deletion reports deleted IDs and failures separately. Translate names and slugs through Blog Tag translations.
Endpoints#
Blog Tag limits
Fetch Blog Tag limits and per-field constraints.
Returns the per-field maximum lengths and request caps that apply to Blog Tag endpoints. Useful for clients to validate inputs before sending them and to size UIs. 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 tags
List blog tags for the store.
Returns paginated Blog Tags. 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. Use search to filter by name or slug. Invalid pagination and unsupported sort values are rejected.
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size, up to |
search
|
string |
Search Blog Tags by name or slug. |
sort_by
|
string |
Sort field from the Blog Tag list contract.
Allowed values
namepost_countcreated_atupdated_at |
sort_direction
|
string |
Sort direction from the Blog Tag 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 a positive integer within the contract cap.
-
400VALIDATION_LIST_INVALID_SORT_BYSort field is not supported for this endpoint.
-
400VALIDATION_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
-
400BLOG_TAG_SEARCH_TOO_LONGSearch exceeds the Blog Tag contract max length.
Get a blog tag
Fetch one blog tag by id.
Returns the Blog Tag if it belongs to the token's store.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Blog Tag id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STORE_API_INVALID_TAG_IDBlog Tag id is not a valid UUID.
-
404NOT_FOUNDBlog Tag does not exist in this store.
Create a blog tag
Create a blog tag.
Creates a Blog Tag. name is required. slug is optional on create; when omitted or empty, it is generated from the name.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
name
required
|
string |
Blog Tag name. |
slug
|
string |
Optional slug. Omit to generate from name. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400BLOG_TAG_NAME_REQUIREDName is empty after normalization.
-
400BLOG_TAG_NAME_TOO_LONGName exceeds the Blog Tag contract max length.
-
400BLOG_TAG_SLUG_FORMATSlug is not valid for Blog Tag URLs.
-
400BLOG_TAG_SLUG_TOO_LONGSlug exceeds the Blog Tag contract max length.
-
400BLOG_TAG_SLUG_GENERATION_FAILEDA slug could not be generated from the supplied name.
-
400BLOG_TAG_UNIQUE_SLUG_GENERATION_FAILEDA unique generated slug could not be found; supply a slug explicitly.
-
400BLOG_TAG_LIMIT_REACHEDStore Blog Tag cap has been reached.
-
409BLOG_TAG_DUPLICATEName or slug already exists in this store.
-
400BLOG_TAG_PLAN_LIMIT_REACHEDThis store is at its plan blog tag cap.
Update a blog tag
Update a blog tag.
Updates provided Blog Tag 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 name.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Blog Tag id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
name
|
string |
Blog Tag name. |
slug
|
string |
New slug. Omit to leave the current slug unchanged; an empty value is invalid. |
Errors
-
400STORE_API_INVALID_TAG_IDBlog Tag id is not a valid UUID.
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
404NOT_FOUNDBlog Tag does not exist in this store.
-
400BLOG_TAG_NAME_REQUIREDName is empty after normalization.
-
400BLOG_TAG_NAME_TOO_LONGName exceeds the Blog Tag contract max length.
-
400BLOG_TAG_SLUG_FORMATSlug is not valid for Blog Tag URLs.
-
400BLOG_TAG_SLUG_TOO_LONGSlug exceeds the Blog Tag contract max length.
-
400BLOG_TAG_SLUG_GENERATION_FAILEDA slug could not be generated from the supplied name.
-
400BLOG_TAG_UNIQUE_SLUG_GENERATION_FAILEDA unique generated slug could not be found; supply a slug explicitly.
-
400BLOG_TAG_LIMIT_REACHEDStore Blog Tag cap has been reached.
-
409BLOG_TAG_DUPLICATEName or slug already exists in this store.
-
400BLOG_TAG_SLUG_REQUIREDSlug is empty on update. Blank slug auto-generation is only available on create.
Delete a blog tag
Delete a blog tag.
Deletes a Blog Tag. If the tag is assigned to blog posts, retry with the returned confirmation token; confirmed delete removes the tag from those posts.
Path parameters
| Name | Type | Description |
|---|---|---|
id
required
|
uuid |
Blog Tag id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
confirmed
|
boolean |
On a confirmation retry, set this to true and send the returned confirmation_token. Omit it on the first request. |
confirmation_token
|
string |
Token from the CONFIRMATION_REQUIRED response. Omit it on the first request and resend the exact same id selection when using it. |
Errors
-
400STORE_API_INVALID_TAG_IDBlog Tag id is not a valid UUID.
-
400STORE_API_INVALID_REQUEST_BODYA non-empty delete body is not valid JSON.
-
400BLOG_TAG_CONFIRMATION_INVALIDConfirmation token is missing, expired, or mismatched.
-
404NOT_FOUNDBlog Tag does not exist in this store.
-
404BLOG_TAG_NOT_FOUNDBlog Tag disappeared while deletion was being committed.
-
409CONFIRMATION_REQUIREDDelete requires confirmation. Details include localized warnings and a confirmation token.
-
409BLOG_TAG_BULK_RACEDAssignments changed while deletion was running; retry with fresh state.
Bulk delete blog tags
Delete multiple blog tags.
Deletes multiple Blog Tags in one request. When any selected tag is assigned to blog posts, the request returns a confirmation token; retry with it to remove them all together. Missing or blocked tags are reported in failed; eligible tags are reported in deleted. A confirmation-required response makes no changes until confirmed.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
tag_ids
required
|
array<uuid> |
Blog Tag ids to delete. |
confirmed
|
boolean |
On a confirmation retry, set this to true and send the returned confirmation_token. Omit it on the first request. |
confirmation_token
|
string |
Token from the CONFIRMATION_REQUIRED response. Omit it on the first request and resend the exact same id selection when using it. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest body is not valid JSON.
-
400STORE_API_INVALID_TAG_IDOne tag id is not a valid UUID.
-
400BLOG_TAG_BULK_NO_IDSNo Blog Tag ids were provided.
-
400BLOG_TAG_BULK_DELETE_TOO_MANYBatch exceeds the Blog Tag bulk delete cap.
-
400BLOG_TAG_CONFIRMATION_INVALIDConfirmation token is missing, expired, or mismatched.
-
404NOT_FOUNDOne or more blog tags do not exist in this store.
-
404BLOG_TAG_NOT_FOUNDA blog tag disappeared while deletion was being committed.
-
409CONFIRMATION_REQUIREDDelete requires confirmation. Details include localized warnings and a confirmation token.
-
409BLOG_TAG_BULK_RACEDAssignments changed while deletion was running; retry with fresh state.
Fields#
Field |
Type |
Create |
Update |
Required |
Translatable |
|---|---|---|---|---|---|
|
string |
Yes |
Yes |
create |
Yes |
|
string |
Yes |
Yes |
Yes |
|
|
integer |
No |
No |
No |
|
|
string (RFC 3339) |
No |
No |
No |
|
|
string (RFC 3339) |
No |
No |
No |
Webhook events#
Subscribe to these events to keep your integration in sync with blog tags. 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.
Blog tag created
Fired when a blog tag is created.
Payload fields
| Field | Type | Description |
|---|---|---|
blog_tag.id |
string |
Always present |
blog_tag.name |
string |
Selectable in the Payload builder |
blog_tag.slug |
string |
Selectable in the Payload builder |
blog_tag.post_count |
integer |
Selectable in the Payload builder |
blog_tag.created_at |
string |
Selectable in the Payload builder |
Blog tag updated
Fired when a blog tag is updated.
Payload fields
| Field | Type | Description |
|---|---|---|
blog_tag.id |
string |
Always present |
blog_tag.name |
string |
Selectable in the Payload builder |
blog_tag.slug |
string |
Selectable in the Payload builder |
blog_tag.post_count |
integer |
Selectable in the Payload builder |
blog_tag.created_at |
string |
Selectable in the Payload builder |
Blog tag deleted
Fired when a blog tag is deleted.
Payload fields
| Field | Type | Description |
|---|---|---|
blog_tag.id |
string |
Always present |
blog_tag.name |
string |
Selectable in the Payload builder |
blog_tag.slug |
string |
Selectable in the Payload builder |