A field is a question that stores an answer under its stable id. The same field definition drives the dashboard builder, SDK renderers, server validation, response grid, exports, and integrations.
Field catalog
| Field | Kind | Stored value | Best for |
|---|---|---|---|
| Short text | short_text | string | Names and brief answers |
| Long text | long_text | string | Feedback and explanations |
email | string | Email addresses | |
| Phone | phone | string | International phone numbers |
| Number | number | number | Quantities and measurements |
| URL | url | string | HTTP and HTTPS links |
| Select | select | option ID or other text | One visible choice |
| Multi-select | multi_select | string array | Several choices |
| Dropdown | dropdown | option ID or other text | One compact choice |
| Checkbox | checkbox | boolean | Consent or one toggle |
| Rating | rating | integer | Star ratings and CSAT |
| Linear scale | linear_scale | integer | NPS and numbered scales |
| Ranking | ranking | string array | A complete preference order |
| Matrix | matrix | row-to-column object | Repeated questions on one scale |
| Signature | signature | image data string | Drawn acknowledgement |
| Date | date | YYYY-MM-DD string | Calendar dates |
| File upload | file_upload | file reference array | Files in connected storage |
| Hidden | hidden | string | Source and account context |
| Custom | custom | arbitrary JSON | A renderer you own |
| Calculated | calculated | number (server-computed) | Totals and derived values |
| Repeating group | repeating_group | array of instance objects | Guests, line items, and other "one row per thing" questions |
Shared options
Every field has id, kind, and label. Most fields also accept:
| Option | Type | Behavior |
|---|---|---|
description | string | Supporting copy under the label |
required | boolean | Rejects an empty answer when true |
placeholder | string | Hint text where the renderer has a text control |
visibleIf | Condition[] | Shows the field only when every condition matches |
Field IDs are response keys. Keep them stable after launch, even when the label changes. Hidden or unreachable fields are removed before server validation, so a skipped required field doesn't block a valid conditional path.
Content blocks
heading, paragraph, and divider are layout blocks, not fields. They can use visibleIf, but they never create an answer in a response.
Minimal field example
In the dashboard
- Open a form in the editor.
- Select Add block and choose a field type.
- Set the label and any type-specific options.
- Publish the draft before public forms use the change.
In code
ts
import { defineForm } from "@usefillo/core";
const contact = defineForm({
id: "contact",
pages: [{
id: "main",
blocks: [
{ id: "email", kind: "email", label: "Work email", required: true },
],
}],
});Related
- Schema and validation: See how Fillo validates a complete schema and response.
- Code-defined forms: Author the same field catalog with
defineFormor JSX. - Logic: Show fields and route pages from earlier answers.