API reference
Retrieve published blog posts from your ContioReach workspace.
This is the endpoint behind your blog listing, article routes, category pages, and search.
curl "https://cms-api.contioreach.com/v1/blogs?limit=10&minimal=true" \
-H "X-API-Key: YOUR_API_KEY"| Parameter | Type | Description |
|---|---|---|
| page | number | Page of results to return. Starts at 1. |
| limit | number | Posts per page. Defaults to 10, maximum 100. |
| slug | string | Return the single post matching this slug. |
| category | string | Filter by category slug. |
| author | string | Filter by author slug. |
| tags | string | Filter by tag slug, or several separated by commas. |
| search | string | Full-text search. Results are ordered by relevance instead of publish date. |
| minimal | boolean | Defaults to true, which omits the article body. Set to false to include content. |
minimal defaults to true, so a request that leaves it out gets no content field. Pass minimal=false on article pages.
Without slug, data is an array and meta carries the pagination state.
{
"success": true,
"data": [
{
"id": "18c366b1-cd1f-45c3-b7cf-6ebb44172177",
"title": "How to turn off AI Overviews in Google Search?",
"slug": "turn-off-ai-overviews-google-search",
"excerpt": "Google won't let you disable AI Overviews outright…",
"description": "Google won't let you disable AI Overviews outright…",
"metaTitle": "How to Turn Off AI Overviews in Google Search (2026)",
"coverImage": "https://contiocdn.com/…/cover.webp",
"coverImageAlt": "Google search results page with an AI Overview panel",
"publishedAt": "2026-08-21T06:23:29.009Z",
"createdAt": "2026-08-21T06:19:01.152Z",
"updatedAt": "2026-08-21T06:26:48.423Z",
"primaryKeyword": "turn off AI Overviews in Google",
"secondaryKeywords": ["disable AI Overviews", "Google AI Overview settings"],
"readingTime": null,
"authors": [ { "id": "…", "name": "Team Contioreach", "slug": "team-contioreach", "bio": "…", "image": "…", "twitter": null, "website": null } ],
"tags": [],
"categories": [ { "id": "…", "name": "Headless CMS", "slug": "headless-cms" } ]
}
],
"meta": {
"page": 1,
"limit": 1,
"total": 64,
"totalPages": 64,
"hasNextPage": true,
"hasPrevPage": false
}
}When you pass slug, data is a single object rather than an array, and the response carries no meta. Handle both shapes if the same helper serves listings and article pages.
{
"success": true,
"data": {
"id": "18c366b1-cd1f-45c3-b7cf-6ebb44172177",
"title": "How to turn off AI Overviews in Google Search?",
"slug": "turn-off-ai-overviews-google-search",
"excerpt": "…",
"description": "…",
"metaTitle": "How to Turn Off AI Overviews in Google Search (2026)",
"coverImage": "https://contiocdn.com/…/cover.webp",
"coverImageAlt": "Google search results page with an AI Overview panel",
"publishedAt": "2026-08-21T06:23:29.009Z",
"createdAt": "2026-08-21T06:19:01.152Z",
"updatedAt": "2026-08-21T06:26:48.423Z",
"primaryKeyword": "turn off AI Overviews in Google",
"secondaryKeywords": ["disable AI Overviews", "Google AI Overview settings"],
"readingTime": 13,
"authors": [ … ],
"tags": [ … ],
"categories": [ … ],
"content": "<p><strong>Quick answer:</strong> You cannot fully…</p>"
}
}content holds the full article body as HTML and is included only when you pass minimal=false. readingTime is calculated from content, so it is a number here and null in listing responses.
| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier. |
| title | string | Article title. |
| slug | string | URL-safe identifier for your article route. |
| excerpt | string | Short summary for cards and listings. |
| description | string | Meta description for the article. |
| metaTitle | string | SEO title for the page <title> and og:title. Falls back to title when not set. |
| coverImage | string | Absolute URL of the cover image. |
| coverImageAlt | string | Alt text for the cover image. Falls back to title when not set. |
| publishedAt | string | ISO 8601 publication timestamp. |
| createdAt | string | ISO 8601 creation timestamp. |
| updatedAt | string | ISO 8601 last-modified timestamp. |
| primaryKeyword | string | Target keyword for the article. |
| secondaryKeywords | string[] | Supporting keywords for the article. Empty array when none are set. |
| readingTime | number | null | Estimated reading time in minutes. null unless minimal=false. |
| authors | array | Author objects. See the Authors API for the field list. |
| categories | array | Category objects with id, name, and slug. |
| tags | array | Tag objects with id, name, and slug. |
| content | string | Article body as HTML. Only present when minimal=false. |
const params = new URLSearchParams({
page: "1",
limit: "12",
minimal: "true"
});
const res = await fetch(
`https://cms-api.contioreach.com/v1/blogs?${params}`,
{ headers: { "X-API-Key": process.env.CMS_API_KEY } }
);
const { data, meta } = await res.json();const res = await fetch(
`https://cms-api.contioreach.com/v1/blogs?slug=${slug}&minimal=false`,
{ headers: { "X-API-Key": process.env.CMS_API_KEY } }
);
const { data } = await res.json();
// data is an object here, not an array
const post = Array.isArray(data) ? data[0] : data;const res = await fetch(
"https://cms-api.contioreach.com/v1/blogs" +
"?category=headless-cms&tags=seo,ai&minimal=true",
{ headers: { "X-API-Key": process.env.CMS_API_KEY } }
);const res = await fetch(
"https://cms-api.contioreach.com/v1/blogs?search=seo&limit=10&minimal=true",
{ headers: { "X-API-Key": process.env.CMS_API_KEY } }
);| Status | Code | Meaning |
|---|---|---|
| 401 | INVALID_API_KEY | The API key is missing, incorrect, or inactive. |
| 429 | USAGE_LIMIT_EXCEEDED | Your plan's monthly API calls are used up. Requests resume when the allowance resets. |
| 404 | NOT_FOUND | No post matches the requested slug. |
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Blog not found"
}
}Was this page helpful?