Messages
Send Form
Sends a button that opens a WhatsApp Native Flow for structured data capture
POST
Send Form
Auth:
Custom flow via
Escape hatch for your own flows (built in WhatsApp Business Manager). When
Error envelope:
TokenAccount or TokenInstance • Rate-limit: Global (100/min) • Idempotent: no
Description
Sends a message with a button that opens a WhatsApp Native Flow, a native form that collects structured data (name, phone, email, CPF/CNPJ, address) without leaving the conversation. It supports two ready-made flows:contact_details (Customer details) and registration_offer (Registration offer), plus an escape hatch via buttonParamsJSON for fully custom flows. Ideal for lead capture, sign-ups and offers with quick confirmation.
Examples
Registration offer (registration_offer)
Sends an offer with title and description. The button opens the default registration Flow with configurable visible fields.Contact data capture (contact_details)
Uses WhatsApp’s officialcontact_details flow. Hide fields you don’t want to ask for via the *Visible flags. Here we ask for name, phone and email only.
Custom flow via buttonParamsJSON
Escape hatch for your own flows (built in WhatsApp Business Manager). When buttonParamsJSON is provided, the server ignores every other flow-related field (formType, flowId, visibility flags, offerName, etc.) and uses the literal JSON as the Native Flow button params.
Create Flows
Open the WhatsApp Business Manager to create and manage your custom Flows (get the
flow_id here).Flows Playground
Test and prototype Flow schemas in Meta’s official playground before shipping to production.
Success response
The returnedmessageType is interactive (a form is a variation of a Native Flow interactive message), and content echoes the message you sent. Save the messageId (and the flowToken, generated automatically when you don’t send one) to correlate with the flow response on the webhook.
200 OK
When the user fills in and submits the form, WhatsApp sends an
interactive_response message carrying the flow_token (the UUID you provided or the one auto-generated) and the JSON with the answers. Capture it via webhook/websocket to correlate with the original send.Path parameters
Instance name (e.g.,
$Instance_Name).Headers
TokenAccount or TokenInstance.application/jsonRequest body
Destination: phone (
5511999999999) or JID (@s.whatsapp.net, @lid, @g.us).Text shown in the message bubble, above the button that opens the Flow.
Pre-configured form type:
"contact_details" (Customer details) or "registration_offer" (Registration offer). Ignored if buttonParamsJSON is provided.Text displayed on the button that opens the Flow (
flow_cta).Token to correlate the form response with the send. When omitted, the server generates a UUID automatically. You can use this token to tie it back to a lead/opportunity in your CRM.
Flow ID in WhatsApp Business. Defaults per
formType:contact_details→1889354358373616registration_offer→892701196712475
buttonParamsJSON).flow_message_version value sent to WhatsApp.message_version of the Native Flow payload.Escape hatch for fully custom flows. When provided, the server sends this literal JSON as the Native Flow button
params and ignores formType, flowId, flowToken, flowMessageVersion, messageVersion, every *Visible flag, offerName and offerDescription. Useful to integrate with flows you’ve built in WhatsApp Business Manager with custom schemas.Shows the “Full name” field in the form. Ignored if
buttonParamsJSON is provided.Shows the “Phone number” field.
Shows the “Email” field.
Shows the “CPF/CNPJ” field.
Shows the “Delivery address” field.
Offer title displayed inside the Flow. Used when
formType=registration_offer.Offer description displayed inside the Flow. Used when
formType=registration_offer.Time in seconds to wait before sending. During the interval, the server shows the “typing…” indicator to the recipient.
ID of the message to reply to. The original message must belong to the same instance and be saved in the database.
When
true and replyTo points to a message originating from a group, the reply is redirected to the private chat of the original author.Origin identifier for traceability (e.g.,
crm, landing-sales, n8n).Notes
- The
contact_detailsandregistration_offerFlows are pre-approved WhatsApp templates ready to use. If you need a form with specific fields (custom questions, screen logic), usebuttonParamsJSONwith your own Flow. - The
flowTokenis your identifier to tie the form response back to the originating record (lead, order, etc.). If you don’t send one, save the auto-generated UUID so you can correlate later. - When
buttonParamsJSONis sent, every other Flow-related field is ignored, you take full control of the payload, includingflow_id,flow_action,flow_action_payloadandflow_message_version. - Native Flow only works in 1-to-1 chats (
@s.whatsapp.net) and groups (@g.us); newsletters (@newsletter) are not supported by WhatsApp. - The form response arrives as an
interactive_responseevent, it isn’t a regular text message, so handle the webhook accordingly.
Errors
| HTTP | Internal status | Message |
|---|---|---|
| 400 | , | Instance name is required |
| 400 | , | Invalid request: <detail> |
| 400 | , | Number is required |
| 400 | , | Message is required |
| 400 | invalid_number | Invalid phone number format: <detail> |
| 400 | reply_message_not_found | Original message not found (ID: ...) |
| 400 | reply_message_instance_mismatch | Original message does not belong to this instance |
| 400 | private_reply_failed | (reason for the private redirect failure) |
| 404 | , | Instance not found |
| 500 | send_failed | Failed to send message: <reason> |
| 503 | disconnected | Instance is not connected to WhatsApp |