Content Delivery API Reference

Beta

Anonymous, edge-cached read and form-submission API served directly from each Kanorio site (https://{site}/api/v1, including permanent system hosts https://s-xxx.kanorio.com/api/v1). Generated directly from packages/shared/openapi/delivery.json.

Before you start

  • No API key is required for published content. Browser fetch is supported via CORS allowed origins.
  • Every response carries weak ETag, X-Kanorio-Cache-Tags, X-Request-Id, and X-RateLimit-* headers.
  • To read unpublished drafts on your server, send X-Kanorio-Preview: knr_pv_<token> (or ?preview=1 with a server-held PAT).
  • Collections items and pages return a top-level assets map with CDN URL, width, height, and 16px WebP LQIP placeholder.

Base URL

https://{site}/api/v1

Endpoint descriptions match what AI assistants read.

Site Meta, Search & OpenAPI

GET/openapi.json

delivery_openapi

BetaRead-only

OpenAPI 3.1 specification for this site's Content Delivery API

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited
curl
curl -X GET "https://{site}/api/v1/openapi.json"
GET/site

delivery_site

BetaRead-only

Public site meta

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited
curl
curl -X GET "https://{site}/api/v1/site"

Header & Footer Globals

GET/globals/headers/{key}

delivery_globals_header_get

BetaRead-only

Global header navigation by key ('primary' or secondary header key) with siteSettings and assets

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • keystringRequired

Query parameters

  • localestring
curl
curl -X GET "https://{site}/api/v1/globals/headers/{key}"

Pages & Redirects

GET/redirects

delivery_redirects

BetaRead-only

Enabled redirect rules (owner-defined and system 301s from page renames) for the external front end to apply

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited
curl
curl -X GET "https://{site}/api/v1/redirects"
GET/pages

delivery_pages_list

BetaRead-only

Published pages and hierarchy tree (paths, parentSlug, breadcrumbs, SEO)

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Query parameters

  • localestring
curl
curl -X GET "https://{site}/api/v1/pages"
GET/pages/{slug}

delivery_page_get

BetaRead-only

One published page by slug (supports 2-level path and 'home' alias) with sections and assets map

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • slugstringRequired

Query parameters

  • localestring
curl
curl -X GET "https://{site}/api/v1/pages/{slug}"

Collections & Blog Items

GET/collections

delivery_collections_list

BetaRead-only

Collections and their fields (self-describing). System collections also list virtualFields (projection-only fields such as blog segments/toc/contentHtml and taxonomy counts) with scope item|fieldData and a TypeScript type literal.

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited
curl
curl -X GET "https://{site}/api/v1/collections"
GET/collections/{key}/items

delivery_collection_items

BetaRead-only

Published items of a collection

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • keystringRequired

Query parameters

  • limitinteger
  • offsetinteger
  • cursorstring
  • fieldsstring
  • expandstring
  • formatsstring

    Comma-separated blog content formats: markdown, html, plaintext

  • previewstring
curl
curl -X GET "https://{site}/api/v1/collections/{key}/items"
GET/collections/{key}/items/{slug}

delivery_collection_item

BetaRead-only

One published item by slug

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • keystringRequired
  • slugstringRequired

Query parameters

  • fieldsstring
  • expandstring
  • formatsstring

    Comma-separated blog content formats: markdown, html, plaintext

  • previewstring
curl
curl -X GET "https://{site}/api/v1/collections/{key}/items/{slug}"

Forms & Anti-Abuse Challenge

GET/forms/{id}

delivery_form_get

BetaRead-only

Public online form definition (fields, availability, consent)

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • idstringRequired
curl
curl -X GET "https://{site}/api/v1/forms/{id}"
GET/forms/{id}/challenge

delivery_form_challenge

BetaRead-only

Fetch a server-signed anti-spam challenge for form submission

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • idstringRequired
curl
curl -X GET "https://{site}/api/v1/forms/{id}/challenge"
POST/forms/{id}/submit

delivery_form_submit

Beta

Submit answers to an online form

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • idstringRequired
curl
curl -X POST "https://{site}/api/v1/forms/{id}/submit" \
  -H "Content-Type: application/json" \
  -d '{"answers":null,"consent":true,"consentTextId":"string","locale":"string","pagePath":"string","_hp":"string","_challenge":{"nonce":"string","ts":1,"sig":"string"}}'

Products & Catalog

GET/products

delivery_products_list

BetaRead-only

Published products listed in the shop (no deliverable outline)

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Query parameters

  • pageinteger
  • limitinteger
  • categorystring
  • localestring
curl
curl -X GET "https://{site}/api/v1/products"
GET/products/{slug}

delivery_products_get

BetaRead-only

One product, including the public outline of its deliverables

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • slugstringRequired

Query parameters

  • localestring
curl
curl -X GET "https://{site}/api/v1/products/{slug}"

Free Preview Units

POST/units/{id}/open

delivery_units_open_preview

Beta

Open a free-preview unit anonymously (isPreview only)

Permission
none
Rate limit
20 misses/s per site (burst 100), 10/s per IP; cache hits are unlimited

Path parameters

  • idstringRequired
curl
curl -X POST "https://{site}/api/v1/units/{id}/open" \
  -H "Content-Type: application/json" \
  -d '{"mode":"read"}'

Error codes

Failures always return an error object with code, message and details. Branch on code; the message wording may change. The table lists every error code and its HTTP status.
Example: the page changed after you read it (409)
{
  "error": {
    "code": "ITEM_NOT_FOUND",
    "message": "Item not found."
  }
}
BAD_REQUEST / QUERY_INVALID
400
UNAUTHORIZED / PREVIEW_UNAUTHORIZED
401
FORBIDDEN / NO_ENTITLEMENT / NOT_YET_RELEASED
403
NOT_FOUND / COLLECTION_NOT_FOUND / ITEM_NOT_FOUND
404
RATE_LIMITED
429