Field-type reference
The 16 field kinds, how each is configured, and the exact JSON value each returns
The 16 field kinds kura supports, what each one is for, how it's configured, and the exact JSON value your frontend reads back from the API.
Two things that apply to every field
The field key is derived from its label. When a field is created, its key is
the label lowercased, with non-alphanumeric runs collapsed to _, trimmed, and
capped at 48 characters. So a label Price (EUR) becomes the key price_eur. The key is what appears in the JSON your frontend
reads.
id and slug are always returned on every entry,
regardless of fields= or exclude=.
Three kinds can't be filtered or sorted on: rich_text, coordinates, and gallery (they're object- or array-valued).
Everything else is filterable and sortable - see the REST API reference.
The schema is additive in v0.1: you can add kinds and fields, but not rename or delete them. Choose field labels carefully the first time (see MCP setup).
Text-like fields
text
A single-line string. Config: required, maxLength, minLength, pattern (a regex, validated server-side), format ("plain" | "id" | "email" | "url"), placeholder.
Value: a string. "Riko Realty"
long_text
Multi-line plain text. Config: required, maxLength.
Value: a plain multi-line string.
markdown
Config: required, maxLength.
Value: the raw markdown string - NOT rendered. Your frontend renders it. (This
is the key difference from rich_text, which is returned as HTML.)
url
Config: required, maxLength.
Value: a string.
slug
A lowercase-hyphenated identifier. Config: required, maxLength.
Value: a "lowercase-hyphen" string (or null).
color
Config: required.
Value: a hex string, "#aabbcc".
enum
A pick-one from a fixed list. Config: required, options (a list of { value, label }).
Value: the selected value string, e.g. "available".
Numbers and booleans
number
Config: required, min, max, integer (whole
numbers only), step.
Value: a number.
boolean
Config: default.
Value: true / false.
Dates
date
Config: required, min, max (both "YYYY-MM-DD").
Value: a "YYYY-MM-DD" string (or null).
datetime
Config: required.
Value: an ISO 8601 UTC string, e.g. "2026-06-20T15:00:00.000Z" (or null).
Media
image
Config: required.
Value: a relative "/media/{key}" string (e.g. "/media/abc123.jpg"). Prefix it with KURA_BASE_URL to load it - see
the REST API reference.
gallery
An ordered set of images. Config: required, maxItems, minItems (if required and minItems is unset, the minimum
is 1).
Value: an array of "/media/{key}" strings. Not
filterable/sortable.
Structured
coordinates
A map point. Config: required, defaultLat, defaultLon, defaultZoom.
Value: { "lat": number, "lon": number } (or null). Keys are lat and lon (not lng). Not filterable/sortable.
rich_text
Formatted text edited in a WYSIWYG editor. Config: required, maxBytes (default 100000). Stored as a TipTap document; the API returns it as a rendered HTML
string, ready to drop into your page. Not filterable/sortable.
relation
A link to entries of another content type. Config: required, target_type (the referenced content-type slug), many (boolean).
Value: single -> a slug string (or null); many: true -> an array of slug strings. These are bare slugs with no ?expand - fetch the linked entry with a second request (see the REST API reference).
Defining these from your AI tool? See MCP setup - the add_field tool takes the kind plus these config options. Building a
form your editor fills in? That's automatic: kura generates the admin form from the fields you
define - see the admin walkthrough.