chatformdocs
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.

TypeFamilyHow it is answeredAnswer
Welcome welcomeContentmatched exactly — never sent to a modelnever
Message statementContentmatched exactly — never sent to a modelnever
Short text short_textTextextracted from free text by the agent, then re-validatedstring
Long text long_textTextextracted from free text by the agent, then re-validatedstring
Email emailContactextracted from free text by the agent, then re-validatedstring
Phone phoneContactextracted from free text by the agent, then re-validatedstring
Website urlContactextracted from free text by the agent, then re-validatedstring
Number numberNumbers & datesextracted from free text by the agent, then re-validatednumber
Date dateNumbers & datesextracted from free text by the agent, then re-validatedstring
Yes / No yes_noChoicematched exactly — never sent to a modelboolean
Single select single_selectChoicematched exactly — never sent to a modelstring
Multi select multi_selectChoicematched exactly — never sent to a modelstring[]
Poll pollChoicematched exactly — never sent to a modelstring
Dropdown dropdownChoicematched exactly — never sent to a modelstring
Picture choice picture_choiceChoicematched exactly — never sent to a modelstring[]
Rating ratingScalematched exactly — never sent to a modelnumber
NPS npsScalematched exactly — never sent to a modelnumber
Opinion scale opinion_scaleScalematched exactly — never sent to a modelnumber
Ranking rankingChoiceextracted from free text by the agent, then re-validatedstring[]
Matrix matrixScaleextracted from free text by the agent, then re-validatedRecord<string, string | string[]>
File upload file_uploadAdvancedarrives out of band (an upload, a payment, or a booking){ fileId: string; filename: string; mime: string; size: number; r2Key: string }[]
Signature signatureAdvancedarrives out of band (an upload, a payment, or a booking){ fileId: string; r2Key: string; signedName?: string }
Payment paymentAdvancedarrives out of band (an upload, a payment, or a booking){ status: "pending" | "paid"; method?: "link" | "upi"; reference?: string; amount?: number }
Scheduling schedulingAdvancedarrives out of band (an upload, a payment, or a booking){ provider: string; url: string; slotIso?: string; confirmedAt?: number }
Contact info contact_infoContactextracted from free text by the agent, then re-validatedRecord<'first_name' | 'last_name' | 'email' | 'phone', string>
Address addressContactextracted from free text by the agent, then re-validatedPartial<Record<'street' | 'city' | 'state' | 'postal' | 'country' | 'location', string>>
Field group field_groupAdvancedextracted from free text by the agent, then re-validatedRecord<string, string | number | boolean>[]
Consent legal_consentAdvancedmatched exactly — never sent to a modelboolean

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.