Sawala CloudSawala CloudBeta

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.

Performance

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
Sawala Cloud — edge infrastructure

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.

Delivery

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.

Static CDNzero API calls at read time

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
}
REST APIlive, filterable queries

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}.json

Collection index

{orgId}/{projectId}/{locale}/collection/{schemaSlug}/index.json

Collection item

{orgId}/{projectId}/{locale}/collection/{schemaSlug}/{itemSlug}.json
Structure

Schema-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.

collection

Many entries, each with a unique slug. System fields title + slug always present.

single

One document per locale. Ideal for singleton content like site settings.

14 field types

textrichtextmarkdownnumberbooleandateselectmultiselectrelationmediajsonrepeaterblockscomponent

schema 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"] } }
  ]
}
Compatibility

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.

standard

Default. data[] array with attributes envelope and meta.pagination.

raw

Flat 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=25

or 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.