All docs
3 min read

Field types

Hosted forms have a fixed list of field types. Each one validates differently, renders differently, and exposes its own config in the builder's inspector.

This page is the reference. For UX walkthroughs see Form builder →.

Input fields

These collect data and end up in the submission payload.

text

Single-line plain text. Most common field.

Config: placeholder, default, validation.min, validation.max, validation.pattern.

email

Single-line, validated as an RFC-5322 email.

Config: same as text. We auto-bind this field as the autoresponder reply_to_field if you don't set one explicitly.

tel

Phone number. We don't validate format (numbering plans are messy) — use validation.pattern if you need a specific shape.

url

URL with http:// or https://. Strips trailing whitespace before validation.

textarea

Multi-line text. Config: rows (defaults to 4) plus the standard validation.min/max.

number

Numeric input. Config: step (default 1), validation.min, validation.max.

date

ISO date picker (YYYY-MM-DD). Config: validation.min, validation.max (also as ISO dates).

select

Dropdown. Requires an options array of { value, label } pairs.

{
  "type": "select",
  "name": "plan",
  "label": "Plan",
  "options": [
    { "value": "free", "label": "Free" },
    { "value": "pro", "label": "Pro" }
  ]
}

radio

Single-choice radio group. Same options shape as select.

checkbox

Multi-choice. Same options shape. The submitted value is an array.

Set multiple: false and one option to make it act like a single boolean checkbox.

consent

A single tickbox for things like terms-of-service or marketing consent. The submitted value is true (we reject the form if required: true and it's not ticked).

Use the label to render the consent text. Inline links are fine — labels render as markdown.

file

File upload. Config:

  • accept — array of MIME types (["image/png", "image/jpeg"]) or extensions ([".pdf"]).
  • multiple — allow multiple files at once.

Caps depend on plan; see Files →.

hidden

A field with no UI. Useful for tracking — your HTML can prefill it (e.g. UTM params) before submission. Validation still applies.

Markup-only blocks

These don't collect data and never appear in the payload. They exist for layout.

heading

A headline. Config: content (the text), level (h1 through h6).

divider

A horizontal rule. No config.

html

A markdown block. Config: content (markdown source). Renders to HTML on the public page.

Special fields

price

Renders a formatted price tag. Config: amount (number), currency (ISO 4217). Use this together with computed to build pricing tables that show a live total.

computed

A read-only field that displays the result of a formula referencing other fields' names:

{
  "type": "computed",
  "name": "total",
  "label": "Total",
  "formula": "quantity * unit_price"
}

The result is included in the submitted payload. Empty formula is allowed (useful while building); the field renders blank until you fill it in.

Field name rules

Every input field has a name that becomes the JSON key in the submission. The rules:

  • a-z, A-Z, 0-9, _, - only.
  • 1–64 characters.
  • Must be unique within the form.

We enforce this at schema-validation time — bad names throw at save, not at submit.

What's next