The headless CMS
built for speed
Define your content structure once. Deliver it globally — as static JSON files over CDN or through a REST API — with familiar response formats out of the box.
Blazingly fast,
built for the edge
Kontena runs on a globally distributed, serverless infrastructure with near-zero latency. Every API read is handled close to your users — not routed through a single origin region.
- ✓Globally distributed — 300+ edge locations worldwide
- ✓Database co-located with the compute layer for low-latency reads
- ✓Static exports served directly from CDN — no origin hit
- ✓Publish returns immediately — CDN files update in the background
Runtime Serverless edge — no cold starts
Database Edge-local — queries stay near your users
Static CDN Global CDN — files served at the edge
Publish Non-blocking — response is instant
Regions 300+ PoPs globally
No servers to manage. No scaling to configure.
Flexible access: Static CDN or REST API
Choose how you consume content. Enable static export on any schema to have published content automatically written as JSON files to the CDN — no API call required at read time. Or query the REST API directly for dynamic, real-time access.
Set static_export: true on your schema. Every publish writes structured JSON to the CDN at a predictable path. Fetch it directly from any client or frontend.
GET https://cdn.example.com/{orgId}/{projectId}/en/collection/blog/index.json
{
"_generated": "2026-05-03T10:00:00.000Z",
"schema": { "slug": "blog", "type": "collection", ... },
"items": [
{ "id": "1", "slug": "hello-world", "publishedAt": "...", "data": { ... } }
],
"total": 1
}Query content dynamically with publicationState, locale, cursor pagination, and per-request format override. Ideal for authenticated or preview use cases.
GET /projects/{projId}/content/collection/blog?format=standard
{
"data": [
{
"id": 1,
"documentId": "abc123",
"slug": "hello-world",
"attributes": {
"title": "Hello World",
"body": "<p>...</p>",
"publishedAt": "2026-05-03T10:00:00.000Z"
}
}
],
"meta": {
"pagination": { "limit": 25, "hasMore": false, "nextCursor": null }
}
}Static file path anatomy
Single content
{orgId}/{projectId}/{locale}/single/{schemaSlug}.jsonCollection index
{orgId}/{projectId}/{locale}/collection/{schemaSlug}/index.jsonCollection item
{orgId}/{projectId}/{locale}/collection/{schemaSlug}/{itemSlug}.jsonSchema-driven:
collections and single content
Every piece of content is backed by a schema you define. Choose collection for repeatable entries (blog posts, products, FAQs) or single for one-per-locale documents (homepage, settings, about page). Schemas are versioned and portable.
collectionMany entries, each with a unique slug. System fields title + slug always present.
singleOne document per locale. Ideal for singleton content like site settings.
14 field types
textrichtextmarkdownnumberbooleandateselectmultiselectrelationmediajsonrepeaterblockscomponentschema definition
{
"name": "blog",
"type": "collection",
"locales": ["en", "id"],
"static_export": true,
"index_fields": ["title", "publishedAt"],
"fields": [
{ "name": "title", "type": "text", "required": true },
{ "name": "body", "type": "richtext" },
{ "name": "cover", "type": "media" },
{ "name": "tags", "type": "multiselect",
"options": { "enum": ["news", "tutorial"] } }
]
}Familiar response
format out of the box
Kontena uses a structured REST response envelope by default — a data[] array with attributes and pagination metadata. Switch formats per request with the ?format= query parameter — no code changes needed.
standardDefault. data[] array with attributes envelope and meta.pagination.
rawFlat list of content objects, no envelope. Ideal for custom integrations.
request — format override
GET /projects/{projId}/content/collection/blog
?format=standard
&publicationState=live
&locale=en
&limit=25or set it globally per deployment
# env var
RESPONSE_FORMAT = "standard"More out of the box
Everything you need to run a production content layer — without the infrastructure overhead.
Multi-locale
Each schema declares its supported locales. Content is stored and exported per locale. Query with ?locale=id for Indonesian, ?locale=en for English.
Draft / Published states
Content lives in draft until explicitly published. Use publicationState=preview to include drafts (e.g. in CMS previews) or live for published-only delivery.
Media integration
The media field type links directly to Berkasna assets. Pick files from the media library inside any content form — no copy-pasting URLs.
Cursor-based pagination
Collections paginate with limit + cursor for stable, efficient reads. Response includes meta.pagination with hasMore and nextCursor.
Index field projection
Set index_fields on a schema to embed a subset of fields in the collection index export — keep index files lean while full item files remain complete.
Instant API docs
Built-in Scalar API reference at /dashboard/kontena/api-docs — always in sync with your deployed API. No external documentation tooling needed.
Ready to build with Kontena?
Create a project, define your schema, and publish content in minutes. No infrastructure to manage.