$ cli-blog docs
API ReferenceAPI Reference

Posts

Resource overviewThe core Markdown content resource and its complete publishing lifecycle.
AuthenticationPublic reads or private writes
Common workflowCreate a draft, attach relations, publish it, then fetch lean or expanded delivery responses.
Read the action guide
Key type: Public or private key

Discover localized blog posts with efficient cursor pagination by default, or opt into exact numbered pagination with page and per_page. Numbered pagination cannot be combined with after or limit. Archive filters, featured state, full-text search, field groups, and opt-in related objects are supported. Locale requests do not fall back in v1; omitted locale uses the organization primary/default locale.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Query Parameters

after?string

Opaque cursor returned by a previous post list using the same filters and sort.

limit?|

Maximum posts to return. Defaults to 20. The maximum accepted value is 100.

page?|

One-based exact page number. Supplying page selects numbered pagination and cannot be combined with after or limit.

per_page?|

Items per numbered page. Requires page, defaults to 20, and cannot be combined with after or limit.

locale?string

BCP 47 post locale to list, for example en-US or es-MX. Category/tag slug filters resolve in this locale. Omitted locale uses the organization's primary/default locale.

status?string

Private-key filter for editorial states. Public API keys always see published posts only.

author_id?string

Comma-separated author profile IDs. Values inside this author group match any; author filters intersect with taxonomy and search filters.

author_slug?string

Comma-separated organization-scoped author slugs.

author_match?string

Whether the positive values in this relation group must match any value or all values.

exclude_author_id?string

Comma-separated author profile IDs that matching posts must not have.

exclude_author_slug?string

Comma-separated author slugs that matching posts must not have.

category_id?string

Comma-separated shared category concept IDs assigned to matching posts.

category_slug?string

Comma-separated category slugs in the requested locale.

category_match?string

Whether the positive values in this relation group must match any value or all values.

exclude_category_id?string

Comma-separated category IDs that matching posts must not have.

exclude_category_slug?string

Comma-separated category slugs that matching posts must not have.

tag_id?string

Comma-separated shared tag concept IDs assigned to matching posts.

tag_slug?string

Comma-separated tag slugs in the requested locale.

tag_match?string

Whether the positive values in this relation group must match any value or all values.

exclude_tag_id?string

Comma-separated tag IDs that matching posts must not have.

exclude_tag_slug?string

Comma-separated tag slugs that matching posts must not have.

search?string

Postgres full-text search over post title, excerpt, and Markdown body.

sort?string

Post ordering field. Public archives default to published_at; search defaults to relevance.

direction?string

Sort direction. Defaults to desc.

fields?array<>

Post field groups to return. Identity fields id, object, content_type, organization_id, and locale are always returned. Lists default to summary; post retrieval defaults to every group.

  • summary: title, slug, excerpt, is_featured, featured_media_asset_id, media_asset_ids, published_at, created_at, updated_at
  • content: body_markdown and table_of_contents derived from H1/H2 headings
  • seo: seo_title, seo_description, canonical_url, focus_keyphrase, seo_keywords, robots_index, robots_follow, Open Graph fields, X/Twitter fields, schema_type
  • workflow: status, scheduled_at, version
  • metadata: metadata
include?array<>

Related objects to expand separately from fields.

  • authors: byline author profile objects
  • categories: assigned categories localized to the post locale
  • tags: assigned tags localized to the post locale
  • media: media assets referenced by the post, including featured and social preview assets
  • translations: linked localized post availability

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/posts"
{  "object": "list",  "has_more": true,  "next_cursor": "string",  "page": 0,  "per_page": 0,  "total_items": 0,  "total_pages": 0,  "data": [    {      "id": "string",      "object": "post",      "organization_id": "string",      "content_type": "blog_post",      "locale": "string",      "status": "string",      "title": "string",      "slug": "string",      "is_featured": true,      "excerpt": "string",      "body_markdown": "string",      "table_of_contents": [        {          "id": "string",          "depth": 1,          "text": "string"        }      ],      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "featured_media_asset_id": "string",      "media_asset_ids": [        "string"      ],      "published_at": "string",      "scheduled_at": "string",      "version": 0,      "metadata": null,      "created_at": "string",      "updated_at": "string",      "authors": [        {          "id": "string",          "object": "author",          "organization_id": "string",          "public_name": "string",          "slug": "string",          "bio": "string",          "avatar_media_id": "string",          "avatar_url": "string",          "website_url": "string",          "metadata": null,          "created_at": "string",          "updated_at": "string"        }      ],      "categories": [        {          "id": "string",          "object": "taxonomy_term",          "organization_id": "string",          "taxonomy_type": "string",          "parent_taxonomy_term_id": "string",          "locale": "string",          "name": "string",          "slug": "string",          "description": "string",          "seo_title": "string",          "seo_description": "string",          "canonical_url": "string",          "focus_keyphrase": "string",          "seo_keywords": [            "string"          ],          "robots_index": true,          "robots_follow": true,          "open_graph_title": "string",          "open_graph_description": "string",          "open_graph_media_asset_id": "string",          "twitter_title": "string",          "twitter_description": "string",          "twitter_media_asset_id": "string",          "schema_type": "string",          "metadata": null,          "created_at": "string",          "updated_at": "string",          "translations": [            {              "id": "string",              "locale": "string",              "name": "string",              "slug": "string"            }          ]        }      ],      "tags": [        {          "id": "string",          "object": "taxonomy_term",          "organization_id": "string",          "taxonomy_type": "string",          "parent_taxonomy_term_id": "string",          "locale": "string",          "name": "string",          "slug": "string",          "description": "string",          "seo_title": "string",          "seo_description": "string",          "canonical_url": "string",          "focus_keyphrase": "string",          "seo_keywords": [            "string"          ],          "robots_index": true,          "robots_follow": true,          "open_graph_title": "string",          "open_graph_description": "string",          "open_graph_media_asset_id": "string",          "twitter_title": "string",          "twitter_description": "string",          "twitter_media_asset_id": "string",          "schema_type": "string",          "metadata": null,          "created_at": "string",          "updated_at": "string",          "translations": [            {              "id": "string",              "locale": "string",              "name": "string",              "slug": "string"            }          ]        }      ],      "media": [        {          "id": "string",          "object": "media_asset",          "organization_id": "string",          "url": "string",          "original_filename": "string",          "alt_text": "string",          "caption": "string",          "mime_type": "string",          "width": 0,          "height": 0,          "size_bytes": 0,          "metadata": null,          "created_at": "string",          "updated_at": "string"        }      ],      "translations": [        {          "id": "string",          "locale": "string",          "slug": "string",          "status": "string"        }      ]    }  ]}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
Key type: Private key

Send a JSON body to create a localized blog post entry. Pair status "scheduled" with the same request's scheduled_at; timestamps at or before now are accepted and publish on the next scheduler run.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/posts" \  -H "Content-Type: application/json" \  -d '{    "title": "string"  }'
{  "id": "string",  "object": "post",  "organization_id": "string",  "content_type": "blog_post",  "locale": "string",  "status": "string",  "title": "string",  "slug": "string",  "is_featured": true,  "excerpt": "string",  "body_markdown": "string",  "table_of_contents": [    {      "id": "string",      "depth": 1,      "text": "string"    }  ],  "seo_title": "string",  "seo_description": "string",  "canonical_url": "string",  "focus_keyphrase": "string",  "seo_keywords": [    "string"  ],  "robots_index": true,  "robots_follow": true,  "open_graph_title": "string",  "open_graph_description": "string",  "open_graph_media_asset_id": "string",  "twitter_title": "string",  "twitter_description": "string",  "twitter_media_asset_id": "string",  "schema_type": "string",  "featured_media_asset_id": "string",  "media_asset_ids": [    "string"  ],  "published_at": "string",  "scheduled_at": "string",  "version": 0,  "metadata": null,  "created_at": "string",  "updated_at": "string",  "authors": [    {      "id": "string",      "object": "author",      "organization_id": "string",      "public_name": "string",      "slug": "string",      "bio": "string",      "avatar_media_id": "string",      "avatar_url": "string",      "website_url": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string"    }  ],  "categories": [    {      "id": "string",      "object": "taxonomy_term",      "organization_id": "string",      "taxonomy_type": "string",      "parent_taxonomy_term_id": "string",      "locale": "string",      "name": "string",      "slug": "string",      "description": "string",      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string",      "translations": [        {          "id": "string",          "locale": "string",          "name": "string",          "slug": "string"        }      ]    }  ],  "tags": [    {      "id": "string",      "object": "taxonomy_term",      "organization_id": "string",      "taxonomy_type": "string",      "parent_taxonomy_term_id": "string",      "locale": "string",      "name": "string",      "slug": "string",      "description": "string",      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string",      "translations": [        {          "id": "string",          "locale": "string",          "name": "string",          "slug": "string"        }      ]    }  ],  "media": [    {      "id": "string",      "object": "media_asset",      "organization_id": "string",      "url": "string",      "original_filename": "string",      "alt_text": "string",      "caption": "string",      "mime_type": "string",      "width": 0,      "height": 0,      "size_bytes": 0,      "metadata": null,      "created_at": "string",      "updated_at": "string"    }  ],  "translations": [    {      "id": "string",      "locale": "string",      "slug": "string",      "status": "string"    }  ]}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
Key type: Public or private key

Returns published posts in the source post's locale. Posts that share tags, categories, or authors rank first; the newest published posts fill any remaining positions. Tag overlap carries the most weight, followed by category and author overlap. Internal scores are not returned. The source post and its translations are excluded.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Path Parameters

id*string

Source post ID or locale-scoped post slug.

Query Parameters

after?string

Opaque cursor returned by the previous related-post page.

limit?|

Maximum related posts to return. Defaults to 4. The maximum accepted value is 12.

locale?string

Source post locale for slug lookup. Omit it to use the organization primary/default locale. Results always use the source post's locale.

fields?array<>

Post field groups to return. Identity fields id, object, content_type, organization_id, and locale are always returned. Lists default to summary; post retrieval defaults to every group.

  • summary: title, slug, excerpt, is_featured, featured_media_asset_id, media_asset_ids, published_at, created_at, updated_at
  • content: body_markdown and table_of_contents derived from H1/H2 headings
  • seo: seo_title, seo_description, canonical_url, focus_keyphrase, seo_keywords, robots_index, robots_follow, Open Graph fields, X/Twitter fields, schema_type
  • workflow: status, scheduled_at, version
  • metadata: metadata
include?array<>

Related objects to expand separately from fields.

  • authors: byline author profile objects
  • categories: assigned categories localized to the post locale
  • tags: assigned tags localized to the post locale
  • media: media assets referenced by the post, including featured and social preview assets
  • translations: linked localized post availability

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/posts/string/related"
{  "object": "list",  "has_more": true,  "next_cursor": "string",  "page": 0,  "per_page": 0,  "total_items": 0,  "total_pages": 0,  "data": [    {      "id": "string",      "object": "post",      "organization_id": "string",      "content_type": "blog_post",      "locale": "string",      "status": "string",      "title": "string",      "slug": "string",      "is_featured": true,      "excerpt": "string",      "body_markdown": "string",      "table_of_contents": [        {          "id": "string",          "depth": 1,          "text": "string"        }      ],      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "featured_media_asset_id": "string",      "media_asset_ids": [        "string"      ],      "published_at": "string",      "scheduled_at": "string",      "version": 0,      "metadata": null,      "created_at": "string",      "updated_at": "string",      "authors": [        {          "id": "string",          "object": "author",          "organization_id": "string",          "public_name": "string",          "slug": "string",          "bio": "string",          "avatar_media_id": "string",          "avatar_url": "string",          "website_url": "string",          "metadata": null,          "created_at": "string",          "updated_at": "string"        }      ],      "categories": [        {          "id": "string",          "object": "taxonomy_term",          "organization_id": "string",          "taxonomy_type": "string",          "parent_taxonomy_term_id": "string",          "locale": "string",          "name": "string",          "slug": "string",          "description": "string",          "seo_title": "string",          "seo_description": "string",          "canonical_url": "string",          "focus_keyphrase": "string",          "seo_keywords": [            "string"          ],          "robots_index": true,          "robots_follow": true,          "open_graph_title": "string",          "open_graph_description": "string",          "open_graph_media_asset_id": "string",          "twitter_title": "string",          "twitter_description": "string",          "twitter_media_asset_id": "string",          "schema_type": "string",          "metadata": null,          "created_at": "string",          "updated_at": "string",          "translations": [            {              "id": "string",              "locale": "string",              "name": "string",              "slug": "string"            }          ]        }      ],      "tags": [        {          "id": "string",          "object": "taxonomy_term",          "organization_id": "string",          "taxonomy_type": "string",          "parent_taxonomy_term_id": "string",          "locale": "string",          "name": "string",          "slug": "string",          "description": "string",          "seo_title": "string",          "seo_description": "string",          "canonical_url": "string",          "focus_keyphrase": "string",          "seo_keywords": [            "string"          ],          "robots_index": true,          "robots_follow": true,          "open_graph_title": "string",          "open_graph_description": "string",          "open_graph_media_asset_id": "string",          "twitter_title": "string",          "twitter_description": "string",          "twitter_media_asset_id": "string",          "schema_type": "string",          "metadata": null,          "created_at": "string",          "updated_at": "string",          "translations": [            {              "id": "string",              "locale": "string",              "name": "string",              "slug": "string"            }          ]        }      ],      "media": [        {          "id": "string",          "object": "media_asset",          "organization_id": "string",          "url": "string",          "original_filename": "string",          "alt_text": "string",          "caption": "string",          "mime_type": "string",          "width": 0,          "height": 0,          "size_bytes": 0,          "metadata": null,          "created_at": "string",          "updated_at": "string"        }      ],      "translations": [        {          "id": "string",          "locale": "string",          "slug": "string",          "status": "string"        }      ]    }  ]}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
Key type: Private key

Lists stored revision snapshots for a localized post entry. Cursor pagination is the default; page and per_page opt into exact numbered pagination and cannot be combined with after or limit.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Path Parameters

id*string

Post ID or locale-scoped post slug.

Query Parameters

after?string

Opaque cursor returned by the previous revision list page.

limit?|

Maximum post revisions to return. Defaults to 20. The maximum accepted value is 100.

page?|

One-based exact page number. Supplying page selects numbered pagination and cannot be combined with after or limit.

per_page?|

Items per numbered page. Requires page, defaults to 20, and cannot be combined with after or limit.

locale?string

Post locale for slug lookup. Omit it to use the organization primary/default locale.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/posts/string/revisions"
{  "object": "list",  "has_more": true,  "next_cursor": "string",  "page": 0,  "per_page": 0,  "total_items": 0,  "total_pages": 0,  "data": [    {      "id": "string",      "object": "post_revision",      "parent_post_id": "string",      "title": "string",      "version": 0,      "created_at": "string",      "updated_at": "string"    }  ]}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
Key type: Private key

Retrieves one revision snapshot for Markdown diff and restore workflows.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Path Parameters

id*string

Post ID or locale-scoped post slug.

revisionId*string

Stored post revision ID.

Query Parameters

locale?string

Post locale for slug lookup. Omit it to use the organization primary/default locale.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/posts/string/revisions/string"
{  "id": "string",  "object": "post_revision",  "parent_post_id": "string",  "title": "string",  "version": 0,  "created_at": "string",  "updated_at": "string",  "body_markdown": "string"}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
Key type: Public or private key

Resolve an old locale-scoped post slug after a slug change. Customer sites can use the returned to_slug and status_code to issue their own redirect on the public blog domain.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Path Parameters

slug*string

Previous locale-scoped post slug.

Query Parameters

locale?string

Locale where the old slug was valid. Omit it to use the organization primary/default locale.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/posts/slug-redirects/string"
{  "object": "slug_redirect",  "content_type": "blog_post",  "locale": "string",  "from_slug": "string",  "to_slug": "string",  "post_id": "string",  "status_code": 0}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
Key type: Public or private key

Retrieve a localized post by ID or locale-scoped slug. Use fields for field groups and include for related authors, categories, tags, or media.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Path Parameters

id*string

Post ID or locale-scoped post slug.

Query Parameters

locale?string

Post locale for slug lookup. Omitted locale uses the organization's primary/default locale; v1 has no fallback.

fields?array<>

Post field groups to return. Identity fields id, object, content_type, organization_id, and locale are always returned. Lists default to summary; post retrieval defaults to every group.

  • summary: title, slug, excerpt, is_featured, featured_media_asset_id, media_asset_ids, published_at, created_at, updated_at
  • content: body_markdown and table_of_contents derived from H1/H2 headings
  • seo: seo_title, seo_description, canonical_url, focus_keyphrase, seo_keywords, robots_index, robots_follow, Open Graph fields, X/Twitter fields, schema_type
  • workflow: status, scheduled_at, version
  • metadata: metadata
include?array<>

Related objects to expand separately from fields.

  • authors: byline author profile objects
  • categories: assigned categories localized to the post locale
  • tags: assigned tags localized to the post locale
  • media: media assets referenced by the post, including featured and social preview assets
  • translations: linked localized post availability

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/posts/string"
{  "id": "string",  "object": "post",  "organization_id": "string",  "content_type": "blog_post",  "locale": "string",  "status": "string",  "title": "string",  "slug": "string",  "is_featured": true,  "excerpt": "string",  "body_markdown": "string",  "table_of_contents": [    {      "id": "string",      "depth": 1,      "text": "string"    }  ],  "seo_title": "string",  "seo_description": "string",  "canonical_url": "string",  "focus_keyphrase": "string",  "seo_keywords": [    "string"  ],  "robots_index": true,  "robots_follow": true,  "open_graph_title": "string",  "open_graph_description": "string",  "open_graph_media_asset_id": "string",  "twitter_title": "string",  "twitter_description": "string",  "twitter_media_asset_id": "string",  "schema_type": "string",  "featured_media_asset_id": "string",  "media_asset_ids": [    "string"  ],  "published_at": "string",  "scheduled_at": "string",  "version": 0,  "metadata": null,  "created_at": "string",  "updated_at": "string",  "authors": [    {      "id": "string",      "object": "author",      "organization_id": "string",      "public_name": "string",      "slug": "string",      "bio": "string",      "avatar_media_id": "string",      "avatar_url": "string",      "website_url": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string"    }  ],  "categories": [    {      "id": "string",      "object": "taxonomy_term",      "organization_id": "string",      "taxonomy_type": "string",      "parent_taxonomy_term_id": "string",      "locale": "string",      "name": "string",      "slug": "string",      "description": "string",      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string",      "translations": [        {          "id": "string",          "locale": "string",          "name": "string",          "slug": "string"        }      ]    }  ],  "tags": [    {      "id": "string",      "object": "taxonomy_term",      "organization_id": "string",      "taxonomy_type": "string",      "parent_taxonomy_term_id": "string",      "locale": "string",      "name": "string",      "slug": "string",      "description": "string",      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string",      "translations": [        {          "id": "string",          "locale": "string",          "name": "string",          "slug": "string"        }      ]    }  ],  "media": [    {      "id": "string",      "object": "media_asset",      "organization_id": "string",      "url": "string",      "original_filename": "string",      "alt_text": "string",      "caption": "string",      "mime_type": "string",      "width": 0,      "height": 0,      "size_bytes": 0,      "metadata": null,      "created_at": "string",      "updated_at": "string"    }  ],  "translations": [    {      "id": "string",      "locale": "string",      "slug": "string",      "status": "string"    }  ]}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
Key type: Private key

Send a JSON body to update a post by ID or locale-scoped slug. Pair status "scheduled" with the same request's scheduled_at; timestamps at or before now are accepted and publish on the next scheduler run. Use expected_version when you need optimistic conflict protection.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Path Parameters

id*string

Query Parameters

locale?string

Post locale for slug lookup. Omit it to use the organization primary/default locale.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/posts/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "id": "string",  "object": "post",  "organization_id": "string",  "content_type": "blog_post",  "locale": "string",  "status": "string",  "title": "string",  "slug": "string",  "is_featured": true,  "excerpt": "string",  "body_markdown": "string",  "table_of_contents": [    {      "id": "string",      "depth": 1,      "text": "string"    }  ],  "seo_title": "string",  "seo_description": "string",  "canonical_url": "string",  "focus_keyphrase": "string",  "seo_keywords": [    "string"  ],  "robots_index": true,  "robots_follow": true,  "open_graph_title": "string",  "open_graph_description": "string",  "open_graph_media_asset_id": "string",  "twitter_title": "string",  "twitter_description": "string",  "twitter_media_asset_id": "string",  "schema_type": "string",  "featured_media_asset_id": "string",  "media_asset_ids": [    "string"  ],  "published_at": "string",  "scheduled_at": "string",  "version": 0,  "metadata": null,  "created_at": "string",  "updated_at": "string",  "authors": [    {      "id": "string",      "object": "author",      "organization_id": "string",      "public_name": "string",      "slug": "string",      "bio": "string",      "avatar_media_id": "string",      "avatar_url": "string",      "website_url": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string"    }  ],  "categories": [    {      "id": "string",      "object": "taxonomy_term",      "organization_id": "string",      "taxonomy_type": "string",      "parent_taxonomy_term_id": "string",      "locale": "string",      "name": "string",      "slug": "string",      "description": "string",      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string",      "translations": [        {          "id": "string",          "locale": "string",          "name": "string",          "slug": "string"        }      ]    }  ],  "tags": [    {      "id": "string",      "object": "taxonomy_term",      "organization_id": "string",      "taxonomy_type": "string",      "parent_taxonomy_term_id": "string",      "locale": "string",      "name": "string",      "slug": "string",      "description": "string",      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string",      "translations": [        {          "id": "string",          "locale": "string",          "name": "string",          "slug": "string"        }      ]    }  ],  "media": [    {      "id": "string",      "object": "media_asset",      "organization_id": "string",      "url": "string",      "original_filename": "string",      "alt_text": "string",      "caption": "string",      "mime_type": "string",      "width": 0,      "height": 0,      "size_bytes": 0,      "metadata": null,      "created_at": "string",      "updated_at": "string"    }  ],  "translations": [    {      "id": "string",      "locale": "string",      "slug": "string",      "status": "string"    }  ]}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
Key type: Private key

Delete a post by ID or locale-scoped slug.

Authorization

ApiKeyAuth
x-api-key<token>

Organization API key. Each key selects exactly one organization; do not send an organization ID separately. Public keys use the cli_blog_pk_ prefix and are intended for published-content delivery reads. Private keys use the cli_blog_sk_ prefix, belong only in trusted environments, and are required for write, publish, delete, and editorial-state workflows when their scopes allow it.

In: header

Path Parameters

id*string

Query Parameters

locale?string

Post locale for slug lookup. Omit it to use the organization primary/default locale.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/v1/posts/string"
{  "id": "string",  "object": "post",  "organization_id": "string",  "content_type": "blog_post",  "locale": "string",  "status": "string",  "title": "string",  "slug": "string",  "is_featured": true,  "excerpt": "string",  "body_markdown": "string",  "table_of_contents": [    {      "id": "string",      "depth": 1,      "text": "string"    }  ],  "seo_title": "string",  "seo_description": "string",  "canonical_url": "string",  "focus_keyphrase": "string",  "seo_keywords": [    "string"  ],  "robots_index": true,  "robots_follow": true,  "open_graph_title": "string",  "open_graph_description": "string",  "open_graph_media_asset_id": "string",  "twitter_title": "string",  "twitter_description": "string",  "twitter_media_asset_id": "string",  "schema_type": "string",  "featured_media_asset_id": "string",  "media_asset_ids": [    "string"  ],  "published_at": "string",  "scheduled_at": "string",  "version": 0,  "metadata": null,  "created_at": "string",  "updated_at": "string",  "authors": [    {      "id": "string",      "object": "author",      "organization_id": "string",      "public_name": "string",      "slug": "string",      "bio": "string",      "avatar_media_id": "string",      "avatar_url": "string",      "website_url": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string"    }  ],  "categories": [    {      "id": "string",      "object": "taxonomy_term",      "organization_id": "string",      "taxonomy_type": "string",      "parent_taxonomy_term_id": "string",      "locale": "string",      "name": "string",      "slug": "string",      "description": "string",      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string",      "translations": [        {          "id": "string",          "locale": "string",          "name": "string",          "slug": "string"        }      ]    }  ],  "tags": [    {      "id": "string",      "object": "taxonomy_term",      "organization_id": "string",      "taxonomy_type": "string",      "parent_taxonomy_term_id": "string",      "locale": "string",      "name": "string",      "slug": "string",      "description": "string",      "seo_title": "string",      "seo_description": "string",      "canonical_url": "string",      "focus_keyphrase": "string",      "seo_keywords": [        "string"      ],      "robots_index": true,      "robots_follow": true,      "open_graph_title": "string",      "open_graph_description": "string",      "open_graph_media_asset_id": "string",      "twitter_title": "string",      "twitter_description": "string",      "twitter_media_asset_id": "string",      "schema_type": "string",      "metadata": null,      "created_at": "string",      "updated_at": "string",      "translations": [        {          "id": "string",          "locale": "string",          "name": "string",          "slug": "string"        }      ]    }  ],  "media": [    {      "id": "string",      "object": "media_asset",      "organization_id": "string",      "url": "string",      "original_filename": "string",      "alt_text": "string",      "caption": "string",      "mime_type": "string",      "width": 0,      "height": 0,      "size_bytes": 0,      "metadata": null,      "created_at": "string",      "updated_at": "string"    }  ],  "translations": [    {      "id": "string",      "locale": "string",      "slug": "string",      "status": "string"    }  ]}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}
{  "error": {    "code": "invalid_request",    "message": "string",    "param": "string"  }}