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.