Skip to main content

Top-level keys

KeyTypeRequiredDescription
versionnumberYesSchema version. Must be 1.
titlestring | LocaleMapYesForm display title.
descriptionstring | LocaleMapNoSubtitle below the title.
sectionsSection[]YesOne or more form sections. Minimum: 1.
connectionsConnection[]NoWebhook, email, and/or Airtable connections.
completionCompletionNoThank-you page configuration.
localestringNoLock form to a locale (en or es).
start_datestring (ISO 8601)NoForm is inaccessible before this date.
end_datestring (ISO 8601)NoForm is inaccessible after this date.
mixpanelstringNoMixpanel project token for analytics.

Section

KeyTypeRequiredDescription
idstringYesUnique identifier. No spaces. Used in next references and ?step= URL param.
titlestring | LocaleMapYesSection heading.
fieldsField[]YesFields in this section. Minimum: 1.
nextstring | NavigationRule[]YesWhere 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

KeyTypeRequiredDescription
idstringYesUnique identifier within the form. Used in submission data.
typestringYesThe field type.
labelstring | LocaleMapYesField label shown to the user.
placeholderstring | LocaleMapNoInput placeholder text.
validatorsValidator[]NoValidation rules.
visible_whenstringNoJS 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.
ValidatorDescription
"required"Field must not be empty.
type: patternInput must match the given regex. Properties: regex (required), message (optional).
type: minMinimum value. Meaning varies by field type: character count (text), numeric value (number), date (date), selection count (multiple_select). Properties: value (required), message (optional).
type: maxMaximum 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.

next:
  - when: "data.role === 'Software Engineer'"
    go: eng_questions
  - when: "data.role === 'Product Manager'"
    go: pm_questions
  - else: general_questions
KeyTypeRequiredDescription
whenstringYes (conditional rules)JS expression evaluated against data.
gostringYes (conditional rules)Section ID, "done", or https:// URL.
elsestringYes (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
KeyTypeDescription
titlestring | LocaleMapThank-you page heading. Supports {{data.fieldId}}.
messagestring | LocaleMapBody text. Supports {{data.fieldId}}.
button.labelstring | LocaleMapCTA button label.
button.urlstring | LocaleMapCTA 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.