API Reference

Posts

Blog posts, listed by blog id or slug, read by id or by URL, created, changed, duplicated and deleted.

Posts in Postman

About posts

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.

Revisions Yes

Content lives in revisions; an edit makes one, and the request decides whether it goes live.

Revisions, publishing and approval
Publishing Scheduled

published is a date and time; a future one schedules the post.

Revisions, publishing and approval
Custom URLs Yes

A post can take a custom URL instead of the blog's path and its own slug.

Taxonomy, URLs and SEO
Languages Yes

A translation is a post of its own, linked through sourcePost.

Multi-brand and languages
Custom fields No

Posts have no custom fields; extra data goes in layout areas.

Custom fields

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#

GET /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 compare totalCount with the unfiltered list's to confirm a filter applied.
orderByquery
string
field:ASC or field: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

List blog posts
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
Response 200 OK
{
  "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"
    }
  ]
}
Open in Postman docs Real response from this documentation site

List blog posts by blog slug#

GET /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 compare totalCount with the unfiltered list's to confirm a filter applied.
orderByquery
string
field:ASC or field: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

List blog posts by blog slug
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
Response 200 OK
{
  "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"
    }
  ]
}
Open in Postman docs Real response from this documentation site

Show a blog post#

GET /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

Show a blog post
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
Response 200 OK
{
  "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"
  }
}
Open in Postman docs Real response from this documentation site

Show a blog post by its URL#

GET /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

Show a blog post by its URL
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
Response 200 OK
{
  "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"
  }
}
Open in Postman docs Real response from this documentation site

Create a blog post#

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, layout and areas, or text for a record with a body. Areas left out are empty.

Example

Create a blog post
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"
  }
}
Response 200 OK
{
  "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."
}
Open in Postman docs Saved response from the Postman collection, shortened

Edit a blog post#

PUT /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, layout and areas, or text for 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

Edit a blog post
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"
  }
}
Response 200 OK
{
  "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."
}
Open in Postman docs Saved response from the Postman collection, shortened

Delete a blog post#

DELETE /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 a blog post
DELETE /cdna-api/blogs/post/22 HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json
Response 200 OK
{
  "result": "success",
  "data": [],
  "message": "The Post has successfully been deleted."
}
Open in Postman docs Saved response from the Postman collection

Duplicate a blog post#

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

Duplicate a blog post
POST /cdna-api/blogs/duplicate-post/128 HTTP/1.1
Host: hub.coredna.com
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json

Check that a blog post slug is free#

POST /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

Check that a blog post slug is free
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"
}
Response 200 OKFree
{
  "result": "success"
}
Real response from this documentation site