Blocks
Blocks
Every question type, what it accepts, and what it returns.
A form is a list of blocks. Each one has a type that decides what it collects,
how it is validated, and what shape the answer takes on the wire.
Everything on these pages is generated from the same schemas the API validates against, so if a page says a value is valid, it is.
| Type | Family | How it is answered | Answer |
|---|---|---|---|
Welcome welcome | Content | matched exactly — never sent to a model | never |
Message statement | Content | matched exactly — never sent to a model | never |
Short text short_text | Text | extracted from free text by the agent, then re-validated | string |
Long text long_text | Text | extracted from free text by the agent, then re-validated | string |
Email email | Contact | extracted from free text by the agent, then re-validated | string |
Phone phone | Contact | extracted from free text by the agent, then re-validated | string |
Website url | Contact | extracted from free text by the agent, then re-validated | string |
Number number | Numbers & dates | extracted from free text by the agent, then re-validated | number |
Date date | Numbers & dates | extracted from free text by the agent, then re-validated | string |
Yes / No yes_no | Choice | matched exactly — never sent to a model | boolean |
Single select single_select | Choice | matched exactly — never sent to a model | string |
Multi select multi_select | Choice | matched exactly — never sent to a model | string[] |
Poll poll | Choice | matched exactly — never sent to a model | string |
Dropdown dropdown | Choice | matched exactly — never sent to a model | string |
Picture choice picture_choice | Choice | matched exactly — never sent to a model | string[] |
Rating rating | Scale | matched exactly — never sent to a model | number |
NPS nps | Scale | matched exactly — never sent to a model | number |
Opinion scale opinion_scale | Scale | matched exactly — never sent to a model | number |
Ranking ranking | Choice | extracted from free text by the agent, then re-validated | string[] |
Matrix matrix | Scale | extracted from free text by the agent, then re-validated | Record<string, string | string[]> |
File upload file_upload | Advanced | arrives out of band (an upload, a payment, or a booking) | { fileId: string; filename: string; mime: string; size: number; r2Key: string }[] |
Signature signature | Advanced | arrives out of band (an upload, a payment, or a booking) | { fileId: string; r2Key: string; signedName?: string } |
Payment payment | Advanced | arrives out of band (an upload, a payment, or a booking) | { status: "pending" | "paid"; method?: "link" | "upi"; reference?: string; amount?: number } |
Scheduling scheduling | Advanced | arrives out of band (an upload, a payment, or a booking) | { provider: string; url: string; slotIso?: string; confirmedAt?: number } |
Contact info contact_info | Contact | extracted from free text by the agent, then re-validated | Record<'first_name' | 'last_name' | 'email' | 'phone', string> |
Address address | Contact | extracted from free text by the agent, then re-validated | Partial<Record<'street' | 'city' | 'state' | 'postal' | 'country' | 'location', string>> |
Field group field_group | Advanced | extracted from free text by the agent, then re-validated | Record<string, string | number | boolean>[] |
Consent legal_consent | Advanced | matched exactly — never sent to a model | boolean |
The same information is available as JSON at GET /v1/blocks, which is the right
source if you are building a UI that renders every type.