Top-level keys
| Key | Type | Required | Description |
|---|
version | number | Yes | Schema version. Must be 1. |
title | string | LocaleMap | Yes | Form display title. |
description | string | LocaleMap | No | Subtitle below the title. |
sections | Section[] | Yes | One or more form sections. Minimum: 1. |
connections | Connection[] | No | Webhook, email, and/or Airtable connections. |
completion | Completion | No | Thank-you page configuration. |
locale | string | No | Lock form to a locale (en or es). |
start_date | string (ISO 8601) | No | Form is inaccessible before this date. |
end_date | string (ISO 8601) | No | Form is inaccessible after this date. |
mixpanel | string | No | Mixpanel project token for analytics. |
Section
| Key | Type | Required | Description |
|---|
id | string | Yes | Unique identifier. No spaces. Used in next references and ?step= URL param. |
title | string | LocaleMap | Yes | Section heading. |
fields | Field[] | Yes | Fields in this section. Minimum: 1. |
next | string | NavigationRule[] | Yes | Where to go after submission. |
next values
"done" — ends the form; submission marked completed
- Section ID — advances to that section
https://... URL — redirects the browser
NavigationRule[] — conditional navigation (see NavigationRule)
Field
| Key | Type | Required | Description |
|---|
id | string | Yes | Unique identifier within the form. Used in submission data. |
type | string | Yes | The field type. |
label | string | LocaleMap | Yes | Field label shown to the user. |
placeholder | string | LocaleMap | No | Input placeholder text. |
validators | Validator[] | No | Validation rules. |
visible_when | string | No | JS expression; field shown when truthy. Hidden fields excluded from submission data. |
Type-specific properties (options, otp, searchable, outputFormat, min_label, max_label) are documented in each field type’s reference page.
Validator
validators:
- required
- type: pattern
regex: "^\\d{5}$"
message: Please enter a 5-digit ZIP code.
- type: min
value: 10
- type: max
value: 500
message: Must be 500 characters or fewer.
| Validator | Description |
|---|
"required" | Field must not be empty. |
type: pattern | Input must match the given regex. Properties: regex (required), message (optional). |
type: min | Minimum value. Meaning varies by field type: character count (text), numeric value (number), date (date), selection count (multiple_select). Properties: value (required), message (optional). |
type: max | Maximum value. Same type-specific semantics as min. Properties: value (required), message (optional). |
All validators are client-side only. The API does not validate submitted values server-side.
NavigationRule
next:
- when: "data.role === 'Software Engineer'"
go: eng_questions
- when: "data.role === 'Product Manager'"
go: pm_questions
- else: general_questions
| Key | Type | Required | Description |
|---|
when | string | Yes (conditional rules) | JS expression evaluated against data. |
go | string | Yes (conditional rules) | Section ID, "done", or https:// URL. |
else | string | Yes (last rule) | Fallback destination. Required. |
Completion
completion:
title: "Thanks, {{data.full_name}}!"
message: We'll review your application and be in touch.
button:
label: Back to our site
url: https://example.com
| Key | Type | Description |
|---|
title | string | LocaleMap | Thank-you page heading. Supports {{data.fieldId}}. |
message | string | LocaleMap | Body text. Supports {{data.fieldId}}. |
button.label | string | LocaleMap | CTA button label. |
button.url | string | LocaleMap | CTA button URL. Supports {{data.fieldId}}. |
LocaleMap
A locale map is an object where keys are locale codes and values are strings:
title:
en: Join the team
es: Únete al equipo
Supported locales: en, es. Any field that accepts string | LocaleMap can use either format. See Localization for full resolution rules.