# Chatform > A form builder whose forms are answered as a conversation. It reads what people write, asks again when an answer is too thin to use, and answers the respondent's own questions from a knowledge base the author writes. A fact sheet written to be quoted, including what chatform cannot do, is at https://chatform.in/ai-info. The same facts as JSON are at https://chatform.in/.well-known/brand-facts.json. The OpenAPI spec is at https://api.chatform.in/openapi.json. Every documentation page below is also available as markdown by appending `.md` to its URL. ## Start here - [For AI assistants](https://chatform.in/ai-info): What chatform is, what it costs, and the things it genuinely cannot do. - [Why conversation works](https://chatform.in/why-conversation-works): The peer-reviewed research on conversational data collection, with DOIs — and what it does not show. - [Pricing](https://chatform.in/pricing): Plans, limits and the full feature matrix. ## Guides, by what you are trying to do - [Contact form that qualifies](https://chatform.in/use-cases/contact-form-alternative): Most contact forms give you a name, an email and one useless sentence. This one asks what a human would ask next — budget, timing, what they actually need — so you can quote instead of scheduling a call. Free, with a prompt you can paste in. - [Admission enquiry](https://chatform.in/use-cases/admission-enquiry-form): An admission enquiry form that answers what parents actually want to know — fees, batches, timings — and then takes their number and books a campus visit. Free, works from a WhatsApp link or a QR on your flyer. - [Appointment booking](https://chatform.in/use-cases/appointment-booking-form): Set up a booking form that asks for the day, the time and everything you need before the appointment — and answers your customer's questions while they book. Free, no card, and a prompt you can paste in. - [Quote requests](https://chatform.in/use-cases/quote-request-form): A quote request form that asks for the room size, the photos and the budget before you commit to a site visit. Sorts the real jobs from the price-shoppers. Free, with a prompt you can paste in. - [Photography enquiries](https://chatform.in/use-cases/photography-inquiry-form): A wedding enquiry form that checks the date, gives your package range, and only puts real couples in your inbox. Stop answering thirty “what are your rates?” DMs a week. Free, with a prompt to paste in. - [Client intake](https://chatform.in/use-cases/client-intake-form): An intake form clients finish, that gets past “I want to grow” to the thing they actually need. Saves your first session for work instead of discovery. Free, with a prompt you can paste in. - [Testimonials](https://chatform.in/use-cases/testimonial-request-form): Most testimonial forms collect “great service, thanks!”, which you cannot put on a website. This one asks what it was like before, so you get a specific, quotable line — plus permission to publish it. Free, with a prompt to paste in. - [Customer feedback](https://chatform.in/use-cases/customer-feedback-form): A feedback form people scan at the table and actually finish. Two stars asks what happened, straight away. Five stars gets your Google review link. Free, with a prompt you can paste in. - [Waitlist signup](https://chatform.in/use-cases/waitlist-form): An email box gets you a list. This gets you a list plus a sentence from each person about what they are using now and what is broken about it. Free, unlimited signups, prompt included. - [Webinar & workshop signups](https://chatform.in/use-cases/webinar-registration-form): A registration form that asks each person what they want answered on the call. You get a higher show-up rate and the agenda writes itself. Free, unlimited registrations, prompt included. - [Volunteer signups](https://chatform.in/use-cases/volunteer-signup-form): A volunteer form that asks what they care about before it asks about Tuesday mornings. Better matched volunteers, fewer no-shows, waivers signed on the phone. Free, unlimited signups. - [Exit interviews](https://chatform.in/use-cases/exit-interview-form): Exit interviews die on one-word answers, and nobody asks the follow-up because it is awkward. This form does. Free, anonymous if you want it, prompt included. - [Job applications](https://chatform.in/use-cases/job-application-form): An application form that asks the deal-breaker questions first, so you read ten good CVs instead of eighty. Free, unlimited applications, works from a QR in the window. ## Comparisons - [Typeform alternative](https://chatform.in/typeform-alternative): An affordable Typeform alternative built as a conversation, not a slideshow of one field per screen. Unlimited responses free, AI that answers the respondent's questions, and a headless API. Compared honestly, with prices read in September 2026. - [Google Forms alternative](https://chatform.in/google-forms-alternative): A Google Forms alternative that reads the answers instead of just filing them: AI that follows up on thin replies and answers questions back. Free, unlimited responses, and honest about what Google Forms still does better. - [Jotform alternative](https://chatform.in/jotform-alternative): A Jotform alternative for teams who want the conversation, not the catalogue: unlimited free responses, a headless conversation API, and logic that is linted before publish. Prices read in September 2026. - [Tally alternative](https://chatform.in/tally-alternative): A Tally alternative for the forms where a one-word answer is a wasted response: AI that reads what people write, asks again when an answer is thin, and answers their questions back. Free plan compared honestly, prices read in September 2026. ## Writing - [Nineteen operators, and a linter that won't let you publish a dead end](https://chatform.in/blog/logic-that-cannot-ship-broken): Conditional logic is easy to build and hard to keep correct. Here is the branching model chatform uses, and the check that runs before a form can go live. - [The model runs the conversation. It never owns it.](https://chatform.in/blog/the-model-never-owns-the-conversation): How chatform constrains a language model to six verbs, checks every one against a state machine before it takes effect, and keeps collecting answers when the AI budget runs out. ## Documentation - [Authentication](https://chatform.in/docs/authentication): Four kinds of key, and which one belongs where. - [Embedding](https://chatform.in/docs/embed): A script tag or an iframe. No backend, no keys. - [Errors](https://chatform.in/docs/errors): One envelope, and what each status actually means. - [Exports](https://chatform.in/docs/exports): Ask for every response as one file, and collect it when it is ready. - [Files](https://chatform.in/docs/files): Upload a file into a response, and read one back out. - [Building your own interface](https://chatform.in/docs/headless): Run the conversation yourself — in your own UI, your own product, or somewhere that is not a browser. - [Idempotency](https://chatform.in/docs/idempotency): Retry a write safely, when you cannot tell whether the first one landed. - [Chatform for developers](https://chatform.in/docs): Embed a form, drive one from your backend, or build your own interface on the same engine. - [Pagination](https://chatform.in/docs/pagination): Cursors, and why they are not page numbers. - [Quickstart](https://chatform.in/docs/quickstart): From an API key to a stored answer in about five minutes. - [Rate limits and quotas](https://chatform.in/docs/rate-limits): Three limits, and how to tell them apart. - [The response lifecycle](https://chatform.in/docs/responses): Open a response, answer into it, complete it — and why partial answers are first-class. - [Scopes](https://chatform.in/docs/scopes): What a key is allowed to do, and how to give it as little as possible. - [SDKs](https://chatform.in/docs/sdk): A typed client for JavaScript, and React bindings. - [Google Sheets & Excel](https://chatform.in/docs/spreadsheets): A file when you want a snapshot, a URL when you want a sheet that stays right. - [Versioning](https://chatform.in/docs/versioning): What can change under you, and what cannot. - [Webhooks](https://chatform.in/docs/webhooks): Get told when something happens, instead of asking. - [Address](https://chatform.in/docs/blocks/address): A postal address. - [Common fields](https://chatform.in/docs/blocks/common-fields): The fields every block has, whatever it collects. - [Contact info](https://chatform.in/docs/blocks/contact_info): Name, email and phone collected together in one step. - [Date](https://chatform.in/docs/blocks/date): A date, or a date and time they choose — an arrival time, a preferred day. This is the right type when YOU are asking them when; `scheduling` is for booking against a calendar you own. - [Dropdown](https://chatform.in/docs/blocks/dropdown): Pick one from a long list — a country, a plan. - [Email](https://chatform.in/docs/blocks/email): An email address, validated as one. - [File upload](https://chatform.in/docs/blocks/file_upload): A file or image — a CV, a screenshot, a receipt. - [Blocks](https://chatform.in/docs/blocks): Every question type, what it accepts, and what it returns. - [Consent](https://chatform.in/docs/blocks/legal_consent): Agreeing to terms, a waiver, a code of conduct. Put the wording in `description`. By default the only answer is yes; add decline=true when a refusal has to be a real answer you can route on — an eligibility gate, a policy someone may decline. - [Long text](https://chatform.in/docs/blocks/long_text): A paragraph. Only when you genuinely want prose. - [Matrix](https://chatform.in/docs/blocks/matrix): A grid — the same choice made once per row. - [Multi select](https://chatform.in/docs/blocks/multi_select): Pick any number from a list. - [NPS](https://chatform.in/docs/blocks/nps): The 0–10 'how likely are you to recommend us' question. - [Number](https://chatform.in/docs/blocks/number): A quantity — how many guests, how many seats, a budget. - [Opinion scale](https://chatform.in/docs/blocks/opinion_scale): Agree/disagree on a numbered scale. - [Payment](https://chatform.in/docs/blocks/payment): Takes money. Use this whenever the request mentions a price, a fee, a ticket, a deposit or a UPI id — never a text question asking them to confirm they paid. - [Phone](https://chatform.in/docs/blocks/phone): A phone number, validated as one. - [Picture choice](https://chatform.in/docs/blocks/picture_choice): Pick by image. The builder attaches the pictures afterwards. - [Ranking](https://chatform.in/docs/blocks/ranking): Drag a list into order of preference. `options` are the things being ranked. - [Rating](https://chatform.in/docs/blocks/rating): Stars, 1 to `scale`. - [Scheduling](https://chatform.in/docs/blocks/scheduling): Books a slot on a calendar the builder already owns — Cal.com, Calendly, a Meet room. Needs their booking link. If you do not have one, use `date` instead and ask them for a time directly. - [Short text](https://chatform.in/docs/blocks/short_text): One line of free text — a name, a job title, a company. - [Signature](https://chatform.in/docs/blocks/signature): A signature drawn with a finger or mouse, for agreements. - [Single select](https://chatform.in/docs/blocks/single_select): Pick one from a short list. - [Message](https://chatform.in/docs/blocks/statement): Says something and moves on. Collects no answer. - [Website](https://chatform.in/docs/blocks/url): A web address. - [Welcome](https://chatform.in/docs/blocks/welcome): The opening greeting. Always the first block, never used again. - [Yes / No](https://chatform.in/docs/blocks/yes_no): A yes/no answer. The best decider for a branch. - [Report missing billing configuration](https://chatform.in/docs/api/billing/getApiBillingConfigCheck): - [Plan, features, limits, usage and permissions for the active organization](https://chatform.in/docs/api/billing/getApiBillingEntitlements): - [Public plan catalogue](https://chatform.in/docs/api/billing/getApiBillingPlans): - [Current usage vs plan limits](https://chatform.in/docs/api/billing/getApiBillingUsage): - [Start a Dodo checkout for a plan](https://chatform.in/docs/api/billing/postApiBillingCheckout): - [Open the Dodo customer portal](https://chatform.in/docs/api/billing/postApiBillingPortal): - [Service health](https://chatform.in/docs/api/health/getHealth): - [Follow a signed download link](https://chatform.in/docs/api/public/getDByKindById): You never build this URL yourself — `GET /v1/exports/{id}` and `GET /v1/files/{id}` return it complete. It carries no API key, expires within minutes, and answers 404 for anything it cannot serve, including a link that has expired. - [A form's responses as CSV, for a spreadsheet to pull](https://chatform.in/docs/api/public/getPFeedByToken): Built for you by the dashboard — paste it into Google Sheets as `=IMPORTDATA("…")` or into Excel via Data → From Web. The URL is the credential; rotate it if it leaks. - [Public rendering config for a published form](https://chatform.in/docs/api/public/getPFormsBySlugConfig): - [Create a chat session for a published form](https://chatform.in/docs/api/public/postPFormsBySlugSessions): - [Confirm an upload — flips pending → confirmed and notifies the session](https://chatform.in/docs/api/public/postPSessionsByIdUploadsByFileIdConfirm): - [Register an upload — returns a fileId to PUT against](https://chatform.in/docs/api/public/postPSessionsByIdUploadsIntent): - [Upload the bytes for a registered intent](https://chatform.in/docs/api/public/putPSessionsByIdUploadsByFileId): PUT the raw file body — not multipart, not base64 — to the `uploadUrl` returned by the intent step. The declared size must match within 1KB, and the object is not visible to the form until `confirm`. - [Soft-delete a form](https://chatform.in/docs/api/dashboard/deleteApiFormsById): - [Revoke the spreadsheet feed](https://chatform.in/docs/api/dashboard/deleteApiFormsByIdIntegrationsSpreadsheet): - [Delete responses](https://chatform.in/docs/api/dashboard/deleteApiFormsByIdSubmissions): - [Revoke an API key](https://chatform.in/docs/api/dashboard/deleteApiKeysById): - [Delete a webhook](https://chatform.in/docs/api/dashboard/deleteApiWebhooksById): - [Activity log for the organization](https://chatform.in/docs/api/dashboard/getApiAuditLogs): - [Export the activity log as CSV](https://chatform.in/docs/api/dashboard/getApiAuditLogsExport): - [Auth liveness check](https://chatform.in/docs/api/dashboard/getApiAuthOk): - [Configured sign-in providers](https://chatform.in/docs/api/dashboard/getApiAuthProviders): - [List forms in the active workspace](https://chatform.in/docs/api/dashboard/getApiForms): - [Get a form with its working document](https://chatform.in/docs/api/dashboard/getApiFormsById): - [Analytics summary (counts, funnel, per-question distributions)](https://chatform.in/docs/api/dashboard/getApiFormsByIdAnalytics): - [This form's change history, grouped by publish](https://chatform.in/docs/api/dashboard/getApiFormsByIdHistory): - [List a form's non-webhook integrations](https://chatform.in/docs/api/dashboard/getApiFormsByIdIntegrations): - [List submissions (with answers + transcripts)](https://chatform.in/docs/api/dashboard/getApiFormsByIdSubmissions): - [Export submissions as CSV](https://chatform.in/docs/api/dashboard/getApiFormsByIdSubmissionsExport): - [Export submissions as an Excel workbook](https://chatform.in/docs/api/dashboard/getApiFormsByIdSubmissionsExportXlsx): - [Every published version of this form](https://chatform.in/docs/api/dashboard/getApiFormsByIdVersions): - [One published version, optionally diffed against another](https://chatform.in/docs/api/dashboard/getApiFormsByIdVersionsByVersion): - [Public summary of an invitation link](https://chatform.in/docs/api/dashboard/getApiInvitationPreview): - [List the organization's API keys (metadata only)](https://chatform.in/docs/api/dashboard/getApiKeys): - [Available API key scopes and key types](https://chatform.in/docs/api/dashboard/getApiKeysScopes): - [List official templates](https://chatform.in/docs/api/dashboard/getApiTemplates): - [Get one template, including its document](https://chatform.in/docs/api/dashboard/getApiTemplatesBySlug): - [List webhooks](https://chatform.in/docs/api/dashboard/getApiWebhooks): - [Recent deliveries for a webhook](https://chatform.in/docs/api/dashboard/getApiWebhooksByIdDeliveries): - [Deprecated alias of /ai/edit-form, for bundles loaded before the rename](https://chatform.in/docs/api/dashboard/postApiAiAddBlocks): Returns the proposed document without saving it. An edit may add no questions at all — most requests about a working form change the routing. - [AI-edit an existing form: add, change or remove questions, and rewire the flow](https://chatform.in/docs/api/dashboard/postApiAiEditForm): Returns the proposed document without saving it. An edit may add no questions at all — most requests about a working form change the routing. - [Generate a form document from a natural-language prompt](https://chatform.in/docs/api/dashboard/postApiAiGenerateForm): - [Generate a form and create it, streaming progress as server-sent events](https://chatform.in/docs/api/dashboard/postApiAiGenerateFormStream): Server-sent events: `stage` (a step started or finished), `question` (one drafted question), `sources` (pages read), `done` (the created form), `error`. The form is created and saved server-side, so a `done` event means it exists. - [Create a form](https://chatform.in/docs/api/dashboard/postApiForms): - [Create, update or rotate the spreadsheet feed](https://chatform.in/docs/api/dashboard/postApiFormsByIdIntegrationsSpreadsheet): - [Start a preview chat session against the working draft](https://chatform.in/docs/api/dashboard/postApiFormsByIdPreviewSessions): - [Publish the working document as a new version](https://chatform.in/docs/api/dashboard/postApiFormsByIdPublish): - [Restore a published version into the working document](https://chatform.in/docs/api/dashboard/postApiFormsByIdVersionsByVersionRestore): - [Create an API key — the raw key is shown ONCE](https://chatform.in/docs/api/dashboard/postApiKeys): - [Rotate an API key, keeping the old one alive for a grace period](https://chatform.in/docs/api/dashboard/postApiKeysByIdRotate): - [Create a form from a template](https://chatform.in/docs/api/dashboard/postApiTemplatesBySlugUse): - [Create a webhook (secret returned once)](https://chatform.in/docs/api/dashboard/postApiWebhooks): - [Send a signed test event](https://chatform.in/docs/api/dashboard/postApiWebhooksByIdTest): - [Update the working document (autosave target)](https://chatform.in/docs/api/dashboard/putApiFormsByIdDoc): - [Delete a form (soft — responses are kept)](https://chatform.in/docs/api/v1/deleteV1FormsById): - [Retract one answer, moving the flow back to it](https://chatform.in/docs/api/v1/deleteV1ResponsesByIdAnswersByRef): - [Delete a webhook endpoint](https://chatform.in/docs/api/v1/deleteV1WebhooksById): - [Every block type: config schema, what you receive, what you send](https://chatform.in/docs/api/v1/getV1Blocks): - [One block type](https://chatform.in/docs/api/v1/getV1BlocksByType): - [Session state](https://chatform.in/docs/api/v1/getV1ChatSessionsBySid): - [The session's events — streamed, or pulled since a sequence number](https://chatform.in/docs/api/v1/getV1ChatSessionsBySidEvents): - [The webhook event catalog](https://chatform.in/docs/api/v1/getV1Events): - [List recent exports](https://chatform.in/docs/api/v1/getV1Exports): Newest first, optionally narrowed to one form. Exports are deleted 24 hours after they are requested, so this is a short window rather than a history. - [Check an export and get its download link](https://chatform.in/docs/api/v1/getV1ExportsById): Poll until `status` is `ready`, then follow `download_url`. A `failed` export carries the reason in `error`. The link is re-minted on every read, so read again rather than storing one. - [A respondent's uploaded file, with a short-lived download link](https://chatform.in/docs/api/v1/getV1FilesById): File-upload answers carry a `fileId`. This resolves one to its metadata and a signed URL that needs no API key — safe to hand to a browser, and expired within minutes. - [List forms](https://chatform.in/docs/api/v1/getV1Forms): - [Read a form — its public config, or the document behind it](https://chatform.in/docs/api/v1/getV1FormsById): - [Counts, per-question funnel and answer distributions](https://chatform.in/docs/api/v1/getV1FormsByIdAnalytics): - [List a form's responses, newest first](https://chatform.in/docs/api/v1/getV1FormsByIdResponses): - [Who this key is, what it may do, and what is left of the plan](https://chatform.in/docs/api/v1/getV1Me): - [Read one response](https://chatform.in/docs/api/v1/getV1ResponsesById): - [Where the flow is waiting on this response](https://chatform.in/docs/api/v1/getV1ResponsesByIdNext): - [Session state](https://chatform.in/docs/api/v1/getV1SessionsBySid): - [The session's events — streamed, or pulled since a sequence number](https://chatform.in/docs/api/v1/getV1SessionsBySidEvents): - [List webhook endpoints](https://chatform.in/docs/api/v1/getV1Webhooks): - [Recent delivery attempts, for working out why an endpoint is quiet](https://chatform.in/docs/api/v1/getV1WebhooksByIdDeliveries): - [Skip, edit, restart, stop, or submit](https://chatform.in/docs/api/v1/postV1ChatSessionsBySidActions): - [Send a message or a structured answer, and get the turn's result](https://chatform.in/docs/api/v1/postV1ChatSessionsBySidMessages): - [Issue a fresh respondent token, invalidating the old one](https://chatform.in/docs/api/v1/postV1ChatSessionsBySidTokenRotate): - [Create a form](https://chatform.in/docs/api/v1/postV1Forms): - [Open a conversation on a published form](https://chatform.in/docs/api/v1/postV1FormsByIdChatSessions): - [Start an export of a form's responses](https://chatform.in/docs/api/v1/postV1FormsByIdExports): Returns immediately with a queued export. Poll `GET /v1/exports/{id}` until `status` is `ready`, then follow `download_url`. - [Publish the working document as a new immutable version](https://chatform.in/docs/api/v1/postV1FormsByIdPublish): - [Open a response (optionally with answers, optionally completing it)](https://chatform.in/docs/api/v1/postV1FormsByIdResponses): - [Open a conversation on a published form](https://chatform.in/docs/api/v1/postV1FormsByIdSessions): - [Abandon an unfinished response](https://chatform.in/docs/api/v1/postV1ResponsesByIdAbandon): - [Record one or more answers on an open response](https://chatform.in/docs/api/v1/postV1ResponsesByIdAnswers): - [Complete a response](https://chatform.in/docs/api/v1/postV1ResponsesByIdComplete): - [Skip, edit, restart, stop, or submit](https://chatform.in/docs/api/v1/postV1SessionsBySidActions): - [Send a message or a structured answer, and get the turn's result](https://chatform.in/docs/api/v1/postV1SessionsBySidMessages): - [Issue a fresh respondent token, invalidating the old one](https://chatform.in/docs/api/v1/postV1SessionsBySidTokenRotate): - [Confirm an upload — flips pending → confirmed and notifies the session](https://chatform.in/docs/api/v1/postV1SessionsBySidUploadsByFileIdConfirm): - [Register an upload — returns a fileId to PUT against](https://chatform.in/docs/api/v1/postV1SessionsBySidUploadsIntent): - [Create a webhook endpoint — the signing secret is returned ONCE](https://chatform.in/docs/api/v1/postV1Webhooks): - [Replay one delivery](https://chatform.in/docs/api/v1/postV1WebhooksByIdDeliveriesByDeliveryIdReplay): - [Replace the working document, returning lint issues](https://chatform.in/docs/api/v1/putV1FormsByIdDoc): - [Upload the bytes for a registered intent](https://chatform.in/docs/api/v1/putV1SessionsBySidUploadsByFileId): PUT the raw file body — not multipart, not base64 — to the `uploadUrl` returned by the intent step. The declared size must match within 1KB, and the object is not visible to the form until `confirm`.