Skip to main content
B
Behind the CMO

Developers

Behind the CMO Content API

A public, read-only JSON API over our archive. No API key, no OAuth, no rate-limit tier — built so AI agents and applications can query what we publish without scraping it.

Quick start

Every endpoint is a GET returning JSON. Authentication is not required and not supported.

curl https://www.behindthecmo.com/api/v1/posts.json

Response envelope

Successful responses share one shape. generatedAt is the freshness bound — the API is statically generated and refreshes on each deploy.

{
  "apiVersion": "1.0.0",
  "generatedAt": "2026-08-24T03:00:00.000Z",
  "total": 138,
  "data": [ ... ]
}

Endpoints

Operation Path Description
getApiIndex /api/v1.json Endpoint directory. Start here.
listPosts /api/v1/posts.json Every published article, newest first.
getPost /api/v1/posts/{slug}.json A single article by slug.
listResources /api/v1/resources.json Free benchmarks, frameworks, and tools.
listAuthors /api/v1/authors.json Authors and contributors with article counts.
listTopics /api/v1/topics.json The eight editorial topics with article counts.

Full specification with typed response schemas: /openapi.json

Markdown for agents

Every article is also available as plain markdown — no navigation chrome, no layout HTML. Append .md to any article URL, or send an Accept: text/markdown header.

curl https://www.behindthecmo.com/p/the-revops-land-grab.md

curl -H "Accept: text/markdown" \
  https://www.behindthecmo.com/p/the-revops-land-grab/

Errors

Failures return RFC 9457 problem details as application/problem+json — never an HTML error page.

{
  "type": "https://www.behindthecmo.com/developers/#error-post_not_found",
  "title": "Article not found",
  "status": 404,
  "code": "post_not_found",
  "detail": "No article exists with slug 'nope'.",
  "resolution": "Call listPosts and match on the slug field."
}
post_not_found HTTP 404
No article exists with that slug. Call listPosts and match on the slug field.
not_found HTTP 404
Unknown API path. Call getApiIndex for the current endpoint list.

Free tier and sandbox

The API is entirely free. There is no signup, no API key, no OAuth flow, and no quota to negotiate — every endpoint is open to anonymous GET requests. Because the API is read-only, production doubles as the sandbox: you can safely call any endpoint while developing without side effects.

Responses carry RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, and RateLimit-Policy headers so you can self-throttle. A throttled request would return 429 with Retry-After.

Versioning and deprecation policy

The API is versioned in the URL path — currently /api/v1/. Additive changes (new fields, new endpoints) ship in place without a version bump. Breaking changes ship under a new path segment, /api/v2/, leaving v1 in place.

  • 1.A version is announced as deprecated at least 180 days before it is retired.
  • 2.During that window every response from the retiring version carries a Deprecation header (RFC 9745) and a Sunset header (RFC 8594) with the exact retirement date.
  • 3.Those responses also carry Link: <…>; rel="successor-version" pointing at the replacement endpoint.
  • 4.The machine-readable state of all of this lives in x-api-lifecycle in the OpenAPI spec.

Current status: v1 is stable. Nothing is deprecated and no sunset date is set.

Discovery files

Terms

Metadata returned by this API is free to use, including commercially, with attribution to Behind the CMO and a link to the canonical article URL. Article text remains © Behind the CMO. Please cite the url field rather than reproducing full articles.

Questions or a use case we should know about? Email [email protected].