Skip to content

Value types

A field’s type defines what its values mean: text, numbers, dates, choices, or structured data. Choose the type that matches your source data or the answer you need.

See what these fields look like →

Each type has its own settings. For example, text supports minLength; numbers support min.

The same nine types are used on both sides of the config, and nest inside each other.

Type Holds Own keys
text A string minLength, maxLength, pattern
integer A whole number min, max, step
number A number, whole or fractional min, max, step
boolean true / false —
date A date —
enum One of a fixed set choices
object A record with named members fields, table
array A list items
map A dictionary keys, values
{ "name": "title", "type": "text", "minLength": 1, "maxLength": 200 },
{ "name": "email", "type": "text", "pattern": "^[^@\\s]+@[^@\\s]+$" },
{ "name": "rating", "type": "integer", "min": 1, "max": 5, "step": 1 },
{ "name": "score", "type": "number", "min": 0, "max": 1, "step": 0.01 },
{ "name": "flagged", "type": "boolean" },
{ "name": "created", "type": "date" },

pattern is a JavaScript regular expression. It is compiled when the config loads, so a malformed one is a config error rather than a surprise at render time.

A sentiment enum shown as radio buttons.A sentiment enum shown as radio buttons.
Select image to enlarge.
{
"name": "sentiment",
"type": "enum",
"choices": [
{ "name": "positive", "display": "Positive", "shortcut": "p" },
{ "name": "neutral", "display": "Neutral" },
{ "name": "negative", "display": "Negative", "selectedStyle": { "tone": "danger" } },
],
}

A choice’s name is the literal string written to the file; display.title is only what the labeler sees. Choice names are trimmed and cannot be empty — an empty choice would read back as no value at all, making it both unselectable and impossible to round-trip.

See Shortcuts for shortcut, and Display for selectedStyle.

An array of enum choices shown as checkboxes.An array of enum choices shown as checkboxes.
Select image to enlarge.
// A list of strings — renders as chips.
{ "name": "tags", "type": "array", "items": { "type": "text" } },
// A multi-select — an array of enum is the only way to declare one.
{
"name": "issues",
"type": "array",
"items": {
"type": "enum",
"choices": [{ "name": "toxic" }, { "name": "off-topic" }, { "name": "unhelpful" }],
},
},

Use an array of enum for checkboxes that allow several answers. Selected values are written in declaration order, not click order, so the exported cell is stable however the labeler arrived at it.

An array of objects displayed as a table of delivery checks.An array of objects displayed as a table of delivery checks.
Select image to enlarge.
{
"name": "checks",
"type": "array",
"items": {
"type": "object",
"fields": [
{ "name": "name", "type": "text", "display": "Check" },
{ "name": "passed", "type": "boolean", "display": "Passed" },
],
},
},

An array of object renders as a table, one row per element. object.table controls how its members group into displayed columns — see TableView.

Names inside an object are JSON keys from your source payload, not column headers, so they are deliberately unconstrained: colons, slashes and unicode are all fine.

A map of objects displayed with reviewer keys and values.A map of objects displayed with reviewer keys and values.
Select image to enlarge.
{ "name": "tokenCounts", "type": "map", "values": { "type": "integer" } },
{
"name": "annotators",
"type": "map",
"values": {
"type": "object",
"fields": [
{ "name": "role", "type": "text" },
{ "name": "confidence", "type": "number" },
],
},
},

keys defaults to text and is rarely worth stating. A map of object renders as a table keyed by its entries.

An array of objects displayed as a table of delivery checks.An array of objects displayed as a table of delivery checks.
Select image to enlarge.

and map are display-only

Objects and maps have no answer controls. To include them in output, use a matching copy field:

{ "name": "meta", "type": "object", "fields": [ /* … */ ] }
// ✗ "object" fields cannot be filled by a user; give the field a `fill`.
{ "name": "meta", "type": "object", "fields": [ /* … */ ], "fill": { "kind": "copy" } }
// ✓

How source cells are read covers empty values, conversion failures, and the accepted formats.

Use ISO dates such as 2026-10-09 to avoid month/day ambiguity. Date formats and UTC display →

Structured data uses JSON inside a cell. Scalar lists also accept several fallback formats. List parsing and CSV examples →

Value types · Input fields · Output fields