Skip to main content

REST Delivery API

Base: /api/delivery/projects/{slug}/sites/{siteSlug}/.... All endpoints are GET. Edge-cacheable with surrogate keys.

Endpoints

/api/delivery/projects/{slug}/sites/{siteSlug}/
entries/{id} single entry by id
routes?path=/about path → entry / redirect / 404
content/{contentTypeApiName} paginated list
media/{assetId}?locale=en-US asset with locale overlay
sitemap?format=xml|json sitemap.xml or JSON inventory

Auth

Authorization: Bearer <delivery-or-preview-key>

No auth = delivery mode. preview keys add drafts.

Headers

Cache-Control: public, max-age=60, stale-while-revalidate=3600
Surrogate-Key: entry:{id} type:{apiName} site:{slug} project:{slug}
X-Krios-Data-Region: us-east (when KRIOS_DATA_REGION is set)
X-Request-Id: {uuid}

Most delivery endpoints use max-age=60. Media and sitemap responses use max-age=300.

Endpoints in detail

Entry by ID

GET /api/delivery/projects/{slug}/sites/{siteSlug}/entries/{id}?locale=en-US&include=1

Returns the entry with its field values resolved for locale. include controls reference expansion (0..3).

Route resolution

GET /api/delivery/projects/{slug}/sites/{siteSlug}/routes?path=/about/team&locale=en-US

Returns one of:

{ "data": { "kind": "entry", "entry": { ... } } }
{ "data": { "kind": "redirect", "target": "/new-path", "status": 301 } }

A path with no match returns HTTP 404:

{ "error": "route_not_found", "message": "No route matches the requested path" }

Content list

GET /api/delivery/projects/{slug}/sites/{siteSlug}/content/{contentTypeApiName}?page=1&limit=25&orderBy=updatedAt:desc

Returns paginated entries with full field values:

{
"data": [ { "_id": "ckl_…", "_type": "articlePage", "_slug": "hello-world", "_siteId": "site_…", "_locale": "en-US", "_publishedAt": "2026-01-01T00:00:00Z", "fields": { ... } }, ... ],
"meta": { "total": 142, "page": 1, "limit": 25, "pages": 6 }
}

Media asset

GET /api/delivery/projects/{slug}/sites/{siteSlug}/media/{assetId}?locale=en-US

Returns the asset metadata with locale-overlay applied (altText, title, description from MediaAssetLocale).

Sitemap

GET /api/delivery/projects/{slug}/sites/{siteSlug}/sitemap?locale=en-US&format=xml

XML sitemap with <xhtml:link rel="alternate" hreflang="..."> for every supported locale that has a published route. JSON format available too. Capped at 50,000 URLs per response.

Examples

Single entry, expanded refs

curl -H "Authorization: Bearer $KEY" \
"https://cms.example.com/api/delivery/projects/demo/sites/main/entries/$ID?include=1"

Route resolution

curl -H "Authorization: Bearer $KEY" \
"https://cms.example.com/api/delivery/projects/demo/sites/main/routes?path=/blog/hello-world"

List articles, page 2

curl -H "Authorization: Bearer $KEY" \
"https://cms.example.com/api/delivery/projects/demo/sites/main/content/articlePage?page=2&limit=10&orderBy=updatedAt:desc"