Core Concepts

How Ondros organizes content — familiar if you've used Contentful, with a few extras.

Organizations (accounts)

The account is the top-level tenant: it owns members, roles, billing, SSO configuration, and spaces. Users can belong to several accounts and switch between them; every API token is scoped to exactly one account.

Roles: ORG_ADMIN, SPACE_ADMIN, EDITOR, AUTHOR, VIEWER (plus custom roles), assigned org-wide or per space. Every endpoint checks a capability derived from your role.

Spaces

A space is one project: content model + entries + media + locales + API keys + webhooks. Plans limit how many spaces an account can have.

Environments

Each space contains isolated environments (master, staging, …). Content types and entries are environment-scoped, and cloning an environment copies both — with reference ids remapped — so you can trial a model change on a clone before it touches production.

Content types & fields

A content type is a schema of typed fields:

TypeNotes
text, longtext, richtextstrings; rich text stores HTML
number, boolean, datetimescalars
selectenum of allowed values
media, media_manylinks to media assets
reference, reference_manylinks to entries — the building block of assemblies
jsonarbitrary structured data
slugURL segment — adding one makes the type's entries pages

Any field can be localized (stored as {locale: value} maps) and carry validations (required, min/max length, pattern, allowed content types for references).

Pages and blocks

A content type is addressable by URL because its model contains a slug field — nothing else marks the difference. landing_page and article have one and get their own URLs; reusable blocks like hero and card don't, so authors are never asked for a slug when creating one. A type may have at most one slug field, and the editor offers to add it when you create the type.

This is also what decides how an entry previews: a page opens at its own URL, a block opens inside a page that references it. See Code Sync.

Entries & workflow

Entries hold draft fields and, separately, the frozen published_fields snapshot. The workflow is draft → in_review → published → archived; the delivery API only ever sees the published snapshot. Every save creates a version you can diff and restore from the history panel.

Locales & fallbacks

Locales are first-class rows per space, picked from an ISO catalog. Each locale may define a fallback (e.g. hi-IN → en → default), and the delivery API walks that chain per field. Request locale=* to get raw locale maps.

API keys — delivery vs preview vs management

KeyPrefixGrants
Deliverycms_del_read published content in its space
Previewcms_pre_read drafts + published (adds status info)
Managementcms_mgm_full space CRUD from scripts/CI

Keys are hashed at rest, shown once at creation, and can be restricted to specific environments. User sessions use short-lived JWTs with refresh rotation instead.

Continue with the SDK Reference or the raw API Reference.