Keystone Developers
Open Keystone
API reference

Console API

Blog posts

7 endpoints.

GET/api/v1/admin/businesses/{business_id}/blog_posts

List blog posts for a business

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
statusquerystring

Status bucket filter: all|draft|published|pending|archived

default "all"
searchquerystring | null

Search title and excerpt

cursorquerystring | null

Pagination cursor

limitqueryinteger

Page size

default 8
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_list_BlogPostListItemData__
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredBlogPostListItemData[]
BlogPostListItemData[] fields
FieldTypeDescription
idrequiredstring
business_idrequiredstring
titlerequiredstring
slugrequiredstring
statusrequiredstring
status_bucketrequiredstring
publish_datestring | null
thumbnail_photo_idstring | null
author_previewBlogPostAuthorPreviewData[]
BlogPostAuthorPreviewData[] fields

Nested object (not expanded)

excerptstring | null
is_featuredbooleandefault false
media_statusstring | null
updated_atrequiredinteger
metadataResponseMetadata | null
ResponseMetadata fields
FieldTypeDescription
paginationPaginationMetadata | null
PaginationMetadata fields
FieldTypeDescription
limitrequiredinteger
next_cursorstring | null
prev_cursorstring | null
has_morerequiredboolean
has_prevbooleandefault false
total_countinteger | null
status_countsobject | null
object | null fields

Map of string to integer

lifecycle_countsLifecycleCounts | null
LifecycleCounts fields
FieldTypeDescription
leadintegerdefault 0
prospectintegerdefault 0
customerintegerdefault 0
former_customerintegerdefault 0
classification_countsClassificationCounts | null
ClassificationCounts fields
FieldTypeDescription
signalobject
object fields

Nested object (not expanded)

touchobject
object fields

Nested object (not expanded)

stageobject
object fields

Nested object (not expanded)

metaResponseMeta | null
ResponseMeta fields
FieldTypeDescription
totalinteger | null
total_countinteger | null
pageinteger | null
per_pageinteger | null
  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/blog_posts

Create a blog post

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
authorizationheaderstring | null

Request bodyrequired

application/jsonBlogPostWriteBody
FieldTypeDescription
titlerequiredstring
slugrequiredstring
statusrequiredstring
publish_datestring | null
excerptstring | null
content_markdownstring | null
content_htmlstring | null
tagsstring[]
string[] fields
photo_idsstring[]
string[] fields
is_featuredbooleandefault false
seo_titlestring | null
seo_descriptionstring | null
seo_keywordsstring[]
string[] fields
author_team_member_idsstring[]
string[] fields
workflow_run_idstring | null
thread_idstring | null
media_statusstring | null
briefobject | null

Responses

201Successful Response
application/jsonSuccessResponse_BlogPostData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredBlogPostData
BlogPostData fields

BlogPostData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/businesses/{business_id}/blog_posts/{blog_post_id}

Get a single blog post

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
blog_post_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_BlogPostData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredBlogPostData
BlogPostData fields
FieldTypeDescription
idrequiredstring
business_idrequiredstring
titlerequiredstring
slugrequiredstring
statusrequiredstring
status_bucketrequiredstring
publish_datestring | null
excerptstring | null
content_markdownstring | null
content_htmlstring | null
tagsstring[] | null
string[] | null fields
photo_idsstring[] | null
string[] | null fields
is_featuredbooleandefault false
seo_titlestring | null
seo_descriptionstring | null
seo_keywordsstring[] | null
string[] | null fields
workflow_run_idstring | null
thread_idstring | null
media_statusstring | null
briefobject | null
author_previewBlogPostAuthorPreviewData[]
BlogPostAuthorPreviewData[] fields

BlogPostAuthorPreviewData (not expanded)

authorsBlogPostAuthorData[]
BlogPostAuthorData[] fields

BlogPostAuthorData (not expanded)

created_atrequiredinteger
updated_atrequiredinteger
metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

PUT/api/v1/admin/businesses/{business_id}/blog_posts/{blog_post_id}

Update a blog post

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
blog_post_idrequiredpathstring (uuid)
authorizationheaderstring | null

Request bodyrequired

application/jsonBlogPostWriteBody

BlogPostWriteBody, expanded above.

Responses

200Successful Response
application/jsonSuccessResponse_BlogPostData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredBlogPostData
BlogPostData fields

BlogPostData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

DELETE/api/v1/admin/businesses/{business_id}/blog_posts/{blog_post_id}

Delete a blog post

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
blog_post_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

204Successful Response
  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/businesses/{business_id}/blog_posts/generate

Generate a blog post using AI

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
Idempotency-Keyheaderstring | null
X-Workflow-Bypassheaderstring | null
authorizationheaderstring | null

Request bodyrequired

application/jsonBlogPostGenerateRequest
FieldTypeDescription
promptrequiredstring

User prompt describing the blog post to generate

providerstring | null

Optional AI provider override: openai, anthropic, gemini

new_blog_candidate_idstring (uuid) | null

A new-blog candidate id (blog_suggestions, scope new_post); its brief drives the post

Responses

200Successful Response
application/jsonSuccessResponse_BlogPostGenerateResponse_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredBlogPostGenerateResponse
BlogPostGenerateResponse fields
FieldTypeDescription
titlerequiredstring
slugrequiredstring
excerptrequiredstring
content_markdownrequiredstring
tagsstring[]
string[] fields
media_briefobject

Hero-photo brief for the workflow worker to resolve against the media library. Empty unless blog_media_brief_enabled is on.

body_imagesobject[]

Inline photo briefs, each paired with a [[ks-image:N]] marker in content_markdown. Empty unless blog_body_images_enabled is on.

object[] fields
seo_titlestring | null
seo_descriptionstring | null
seo_keywordsstring[]
string[] fields
briefobject | null
metadatarequiredBlogPostGenerateMetadata
BlogPostGenerateMetadata fields
FieldTypeDescription
providerrequiredstring
modelrequiredstring
latency_msrequiredinteger
generation_statusstringdefault "completed"
workflow_run_idstring | null
thread_idstring | null
blog_postBlogPostData | null
BlogPostData fields

BlogPostData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/businesses/{business_id}/blog_posts/generate/stream

Stream blog generation status events (SSE)

Parameters

NameInTypeDescription
business_idrequiredpathstring (uuid)
workflow_run_idrequiredquerystring

Workflow run id returned by generate endpoint

authorizationheaderstring | null

Responses

200Successful Response
application/jsonany
  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.