A post belongs to one blog and keeps its content in revisions, like a page. It has authors, categories and tags, and can be featured or have its comments locked.
Posts
Blog posts, listed by blog id or slug, read by id or by URL, created, changed, duplicated and deleted.
About posts
Content lives in revisions; an edit makes one, and the request decides whether it goes live.
Revisions, publishing and approvalpublished is a date and time; a future one schedules the post.
A post can take a custom URL instead of the blog's path and its own slug.
Taxonomy, URLs and SEOA translation is a post of its own, linked through sourcePost.
Key fields
id- integer
- The post id.
name- string
- The live revision's name.
slug- string
- The post's path segment within its blog.
fullPath- string
- The path on the site. Computed.
blog- Blog
- The blog the post belongs to.
published- datetime
- When the post went, or goes, public.
authors- Author[]
- The bylines.
activeRevision- PostRevision
- The live revision.
categories, tags- list
- The post's taxonomy.
List blog posts#
/cdna-api/blogs/blog/{blog.id}/posts
Lists blog posts. Without limit every match comes back.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
- Model
- Post, in the Reference
Parameters
blog.idpathrequired- integer
- The blog id.
propertiesquery- selector
- The fields and relations to return, such as
{id,name,slug,fullPath,published}. filtersquery- name=value
- Any stored field, or a relation with a dot, such as
parent.id=12. Prefix the name with!,>,<,%or|. Use stored field names exactly as in the model, and comparetotalCountwith the unfiltered list's to confirm a filter applied. orderByquery- string
field:ASCorfield:DESC, comma-separated. Stored fields only.limitquery- integer
- Records per response. There is no default.
offsetquery- integer
- Records to skip.
retrieveUnpublishedquery- 1
- Include unpublished records.
Example
GET /cdna-api/blogs/blog/5/posts?limit=2&properties={id,name,slug,fullPath,published} HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json{
"result": "success",
"totalCount": 78,
"data": [
{
"id": 78,
"name": "Render a list of child pages under the current page",
"slug": "list-child-pages",
"fullPath": "/how-to/list-child-pages",
"published": "2026-09-30T00:00:00+00:00"
},
{
"id": 79,
"name": "Decide between a custom field and a layout area",
"slug": "custom-field-or-area",
"fullPath": "/how-to/custom-field-or-area",
"published": "2026-09-30T00:00:00+00:00"
}
]
}List blog posts by blog slug#
/cdna-api/blogs/blog/{blog.slug}/posts
Lists blog posts, with the parent given by its slug instead of its id.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
- Model
- Post, in the Reference
Parameters
blog.slugpathrequired- string
- The blog slug.
propertiesquery- selector
- The fields and relations to return, such as
{id,name,slug,fullPath,published}. filtersquery- name=value
- Any stored field, or a relation with a dot, such as
parent.id=12. Prefix the name with!,>,<,%or|. Use stored field names exactly as in the model, and comparetotalCountwith the unfiltered list's to confirm a filter applied. orderByquery- string
field:ASCorfield:DESC, comma-separated. Stored fields only.limitquery- integer
- Records per response. There is no default.
offsetquery- integer
- Records to skip.
retrieveUnpublishedquery- 1
- Include unpublished records.
Example
GET /cdna-api/blogs/blog/how-to/posts?limit=2&properties={id,name,slug,fullPath,published} HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json{
"result": "success",
"totalCount": 78,
"data": [
{
"id": 78,
"name": "Render a list of child pages under the current page",
"slug": "list-child-pages",
"fullPath": "/how-to/list-child-pages",
"published": "2026-09-30T00:00:00+00:00"
},
{
"id": 79,
"name": "Decide between a custom field and a layout area",
"slug": "custom-field-or-area",
"fullPath": "/how-to/custom-field-or-area",
"published": "2026-09-30T00:00:00+00:00"
}
]
}Show a blog post#
/cdna-api/blogs/post/{id}
Reads one blog post by its id.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
- Model
- Post, in the Reference
Parameters
idpathrequired- integer
- The blog post id.
propertiesquery- selector
- The fields and relations to return, such as
{id,name,slug,fullPath,published}.
Example
GET /cdna-api/blogs/post/128?properties={id,name,slug,fullPath,published} HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json{
"result": "success",
"data": {
"id": 128,
"name": "Page through a large API result set without timing out",
"slug": "page-through-a-large-result-set",
"fullPath": "/how-to/page-through-a-large-result-set",
"published": "2026-09-30T00:00:00+00:00"
}
}Show a blog post by its URL#
/cdna-api/blogs/post/{blog.slug}/{slug}
Finds a blog post by its path, the way the public site does: a custom URL first, then the slugs.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
- Model
- Post, in the Reference
Parameters
blog.slugpathrequired- string
- The blog slug.
slugpathrequired- string
- The blog post slug.
propertiesquery- selector
- The fields and relations to return, such as
{id,name,slug,fullPath,published}.
Example
GET /cdna-api/blogs/post/how-to/page-through-a-large-result-set?properties={id,name,slug,fullPath,published} HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json{
"result": "success",
"data": {
"id": 128,
"name": "Page through a large API result set without timing out",
"slug": "page-through-a-large-result-set",
"fullPath": "/how-to/page-through-a-large-result-set",
"published": "2026-09-30T00:00:00+00:00"
}
}Create a blog post#
/cdna-api/blogs/post/{blog.id}
Creates a blog post.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
Parameters
blog.idpathrequired- integer
- The blog id.
revisionsbody- object
- A new revision:
name,layoutandareas, ortextfor a record with a body. Areas left out are empty.
Example
POST /cdna-api/blogs/post/3 HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json
Content-Type: application/json
{
"revisions": {
"name": "New blog post",
"text": "Content of blog post"
}
}{
"result": "success",
"data": {
"post": {
"lastRevision": 58,
"name": "New blog post",
"text": "Content of blog post",
"imageTargetFolderPath": "images/blogs/3/22",
"fullSlug": "new-blog-post-1",
"fullPath": "/blogs/new-blog-from-api/new-blog-post-1",
"originalPath": "/blogs/new-blog-from-api/new-blog-post-1",
"imageSelectorStartPath": "images/blogs/3/22",
"id": 22,
"slug": "new-blog-post-1"
}
},
"message": "The Post has been added successfully."
}Edit a blog post#
/cdna-api/blogs/post/{id}
Changes a blog post. Fields left out keep their values.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
Parameters
idpathrequired- integer
- The blog post id.
revisionsbody- object
- A new revision:
name,layoutandareas, ortextfor a record with a body. Areas left out are empty.
A revisions object makes a new revision that is not live unless the request also sends "activeRevision": true, and it holds only the areas sent. To change some areas and keep the rest, use patchRevision with originRevision.
Example
PUT /cdna-api/blogs/post/22 HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json
Content-Type: application/json
{
"revisions": {
"name": "New blog post title",
"text": "Changed text => saved in new revision"
}
}{
"result": "success",
"data": {
"post": {
"lastRevision": 59,
"name": "New blog post",
"text": "Content of blog post",
"imageTargetFolderPath": "images/blogs/3/22",
"fullSlug": "new-blog-post-1",
"fullPath": "/blogs/new-blog-from-api/new-blog-post-1",
"originalPath": "/blogs/new-blog-from-api/new-blog-post-1",
"imageSelectorStartPath": "images/blogs/3/22",
"id": 22,
"slug": "new-blog-post-1"
}
},
"message": "The Post has been saved successfully."
}Delete a blog post#
/cdna-api/blogs/post/{id}
Deletes a blog post.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
Parameters
idpathrequired- integer
- The blog post id.
Example
DELETE /cdna-api/blogs/post/22 HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json{
"result": "success",
"data": [],
"message": "The Post has successfully been deleted."
}Duplicate a blog post#
/cdna-api/blogs/duplicate-post/{id}
Copies a blog post into the same blog. The copy is unpublished.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
Parameters
idpathrequired- integer
- The blog post id.
Example
POST /cdna-api/blogs/duplicate-post/128 HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/jsonCheck that a blog post slug is free#
/cdna-api/blogs/check-post-slug
Answers {"result":"success"} when no blog post uses the slug. A slug in use, or one with characters a slug cannot have, answers HTTP 200 too, with "result": "error" and a message.
- Access
- Admin users and integrations, with an OAuth access token or an API key.
Parameters
slugbodyrequired- string
- The slug to check.
idbody- integer
- A record to leave out of the check, when renaming it.
sitebody- integer
- The site to check in.
Example
POST /cdna-api/blogs/check-post-slug HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json
Content-Type: application/json
{
"slug": "api-sandbox-post"
}{
"result": "success"
}