Docs
Dashboard

API reference

API overview

One base URL, one key, and the whole surface on one page.

https://api.zevcontent.net

Every request carries Authorization: Bearer <key>, and the key selects the project. There is no project id in any URL.

The surface

Custom content

GET /v1/content/{type}A singleton’s values, or a paginated collection
GET /v1/content/{type}/{entryId}One entry by id
POST /v1/content/{type}/entriesCreate an entry (secret key)
PUT /v1/content/{type}Save a singleton (secret key)
GET /v1/schema/content-typesEvery type definition (secret key)
PUT /v1/schema/content-types/{type}Create or update a type (secret key)

See Content.

Blog

GET /v1/blog/articlesPublished articles, newest first
GET /v1/blog/articles/{slug}One article, with its body
GET /v1/blog/searchRanked search, best match first
GET /v1/blog/categoriesEvery category
GET /v1/blog/categories/{slug}One category page
POST /v1/blog/articlesCreate an article (secret key)
PATCH /v1/blog/articles/{slug}Update an article (secret key)
POST /v1/blog/categoriesCreate a category (secret key)

See Blog.

Knowledge base

GET /v1/kb/treeThe navigation tree, sections nested
GET /v1/kb/articlesPublished articles in reading order
GET /v1/kb/articles/{slug}One article, with its body
GET /v1/kb/searchRanked search, best match first
POST /v1/kb/articles/{slug}/voteHelpful / not helpful (publishable key)
POST /v1/kb/articlesCreate an article (secret key)
PATCH /v1/kb/articles/{slug}Update an article (secret key)
POST /v1/kb/collections · POST /v1/kb/sectionsCreate the tree (secret key)

See Knowledge base.

Authors

GET /v1/authorsEvery author
GET /v1/authors/{slug}One author page
POST /v1/authorsCreate an author (secret key)

See Authors.

Utility

GET /v1/introspectionThe whole project, described
GET /v1/changesWhen each module last changed. Poll this and cache.

Or be told instead of asking: Webhooks. | GET /v1/ping | Confirms a key resolves |

Conventions that hold everywhere

The response envelope

A single item:

{ "data": { … }, "meta": { … } }

A listing:

{ "data": [ … ], "meta": { "limit": 20, "has_more": true, "next_offset": 20, "next_cursor": null } }

meta on a built-in module also carries module and release_independent, so a caller inspecting a payload can tell what it is looking at without matching on the URL it asked for.

Stability

These URLs and these keys end up in static builds and mobile releases we do not control, so the rule is additive only: new keys may appear, existing ones do not change meaning and do not disappear.

Two consequences worth knowing:

  • A listing omits body, and always will. Adding it later would be additive; removing it would not, which is why it starts absent.
  • authors and categories are arrays with no singular author/category beside them. Two names for one thing is how a contract rots.

Updated at, Sunday, September 20, 2026