Skip to content

Content model

Types, the 20 field types, languages, drafts and versions.

DocsContent

Docs menuContent model

A project holds the content of one site or app. Its structure is a set of types, each with its fields, and a list of languages.

Types

KindHoldsRead with
Collectionmany entries: articles, products, eventsentries(type), entry(type, slug)
Singletonexactly one entry: site settings, a home pagesingleton(type)

Every type has a key (article, site_settings), a name and a title field, the field the admin uses as the entry's title in lists, search and references. Keys use lowercase letters, digits and underscores, and start with a letter.

Fields

TypeStoresNotes
texta short stringup to 500 characters by default
longtexta long stringup to 20,000 characters by default
numbera numberoptional min, max, integer
booleantrue or false
date2026-10-12
datetime2026-10-12T18:00:00.000Zany offset in, returned in UTC
time18:3024-hour clock
selectone value, or several with multiplefrom a fixed list of choices
slugmy-first-postunique in the type, can follow a text field with from
urlhttps://example.comhttp and https only
emailhello@example.comstored in lowercase
color#1f5c4asix-digit hex
referencethe id of another entryto limits the types, multiple allows several
listrepeated items, each with its own fieldsup to 500 items
groupa set of fields kept together
jsonany JSON valuefor data that has no form yet
mediaone file from the media library, or several with multiplekinds limits it to images, video or files; images need alt text to publish
rich_textformatted text: headings, lists, quotes, code, links and imagesdelivered as JSON and as safe HTML
embeda YouTube or Vimeo videoany link to the video works, stored as provider and id
blocksthe sections of a page: an ordered list of blocks, each of a kind you define with its own fieldstop level only; the list is shared by all languages, the fields inside a block can be translated

Fields can be nested in lists and groups up to three levels deep.

Each field can also have:

  • required: publishing is blocked until it has a value, in every language for fields that change per language
  • help: a line under the field in the editor
  • maxLength and pattern for text; patterns run on RE2, so they always finish in linear time
  • unique for text and slug

Languages

A project has a list of languages and a main one, for example en and ro with en as main. A field marked per language keeps one value for each language; the others keep a single value.

When you ask the Delivery API for locale=ro, every translated field comes back in Romanian and any field without a Romanian value falls back to the main language, field by field. The _locale on each entry tells you which language you asked for.

Drafts, versions and publishing

Every save is a version you can open and restore. An entry is in one of three states:

  • draft: never published, invisible to the Delivery API
  • published: the live copy matches the last save
  • changed: published, with newer edits waiting

Publishing copies the current version to the live copy in one step. Unpublishing removes it from the Delivery API; the entry and its versions stay in the admin.

Changing the structure

You can add, rename and reorder fields at any time. A removed field keeps its data, so bringing it back restores the values. The Delivery API only returns fields that exist in the current structure, so a removed field never leaks to your site.

When the structure changes while someone has an entry open, saving returns 409 schema_changed and the editor asks them to reload, so no one overwrites a field they could not see.