---
title: "Fields"
description: "Pick the right Fillo field type and look up its schema options, stored value, and validation behavior."
group: "Build forms"
order: 2
type: "reference"
keywords:
  - "field kinds"
  - "schema"
  - "validation"
  - "blocks"
updated: "2026-07-18"
---

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](/docs/fields/short-text) | `short_text` | string | Names and brief answers |
| [Long text](/docs/fields/long-text) | `long_text` | string | Feedback and explanations |
| [Email](/docs/fields/email) | `email` | string | Email addresses |
| [Phone](/docs/fields/phone) | `phone` | string | International phone numbers |
| [Number](/docs/fields/number) | `number` | number | Quantities and measurements |
| [URL](/docs/fields/url) | `url` | string | HTTP and HTTPS links |
| [Select](/docs/fields/select) | `select` | option ID or other text | One visible choice |
| [Multi-select](/docs/fields/multi-select) | `multi_select` | string array | Several choices |
| [Dropdown](/docs/fields/dropdown) | `dropdown` | option ID or other text | One compact choice |
| [Checkbox](/docs/fields/checkbox) | `checkbox` | boolean | Consent or one toggle |
| [Rating](/docs/fields/rating) | `rating` | integer | Star ratings and CSAT |
| [Linear scale](/docs/fields/linear-scale) | `linear_scale` | integer | NPS and numbered scales |
| [Ranking](/docs/fields/ranking) | `ranking` | string array | A complete preference order |
| [Matrix](/docs/fields/matrix) | `matrix` | row-to-column object | Repeated questions on one scale |
| [Signature](/docs/fields/signature) | `signature` | image data string | Drawn acknowledgement |
| [Date](/docs/fields/date) | `date` | `YYYY-MM-DD` string | Calendar dates |
| [File upload](/docs/fields/file-upload) | `file_upload` | file reference array | Files in connected storage |
| [Hidden](/docs/fields/hidden) | `hidden` | string | Source and account context |
| [Custom](/docs/fields/custom) | `custom` | arbitrary JSON | A renderer you own |
| [Calculated](/docs/fields/calculated) | `calculated` | number (server-computed) | Totals and derived values |
| [Repeating group](/docs/fields/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

1. Open a form in the editor.
2. Select **Add block** and choose a field type.
3. Set the label and any type-specific options.
4. 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](/docs/schema): See how Fillo validates a complete schema and response.
- [Code-defined forms](/docs/authoring): Author the same field catalog with `defineForm` or JSX.
- [Logic](/docs/logic): Show fields and route pages from earlier answers.
