The narrative version is on fields. This is the lookup
table.
Columns generated
Builder
Column
Notes
field.text
text
field.richtext
jsonb
A document tree, or a legacy HTML string
field.number
double precision
integer when integer: true
field.money
integer
Minor units — cents
field.boolean
boolean
DEFAULT false when required
field.date
date
No time, no zone
field.datetime
timestamptz
field.select
text
field.multiselect
jsonb
An array
field.json
jsonb
field.media
uuid
jsonb array when multiple: true; no foreign key
field.relation
<field>_id uuid
A join table when many: true; nothing when inverse
Options by builder
Builder
Its own options
text
minLength, maxLength, pattern
richtext
minLength, maxLength, structure
number
min, max, integer
money
min, max (minor units)
select / multiselect
options
media
multiple, accept: { kinds, mimeTypes }
relation
to, many, onDelete, unique, syncAcrossLocales
relationInverse
of, field, many
boolean, date, datetime, json
—
Every builder also takes required, localized, lang and admin.
Filterable and sortable
Builder
Filterable
Sortable
Reached by ?search=
text
✅
✅
✅
richtext
—
—
✅
number, money
✅
✅
—
boolean
✅
✅
—
date, datetime
✅
✅
—
select
✅
✅
✅
multiselect
—
—
—
json
—
—
—
media
—
—
—
relation
Via a dotted path
—
—
Plus the envelope: id, createdAt, updatedAt, publishedAt, and on
localized types locale and localeGroupId. On the admin API status is
filterable too; on the public API it is not.
Locale behaviour
Declaration
Behaviour on an i18n type
Unmarked
Shared — one value for the record, written to every sibling
localized: true
Per locale
relation, sync on, non-i18n target
Shared — the same target id everywhere
relation, sync on, i18n target
Mirrored — resolved to each sibling’s own locale
relation, syncAcrossLocales: false
Independent per locale
relationInverse
Never propagates
Envelope columns
Column
Type
Present when
id
uuid
Always. Primary key.
workspace_id
uuid
Always. No foreign key.
created_at
timestamptz
Always. Not null.
updated_at
timestamptz
Always. Not null.
status
text
publishable: true
published_at
timestamptz
publishable: true
deleted_at
timestamptz
paranoid: true
locale
text
i18n: true
locale_group_id
uuid
i18n: true
All nine names are reserved unconditionally, including on types that set
neither flag.
Validation
Builder
Checked for
text
Length in grapheme clusters, pattern
richtext
Text length, structural rules
number
Range, whole number
money
Range, at most two fractional digits
date
Shape and a date that exists on the calendar
datetime
ISO-8601 with a time component
select / multiselect
Membership of options
relation / media
A uuid, and a target in this workspace
required is a NOT NULL column on a non-publishable type, and a publish-time
rule on a publishable one.