Skip to main content
POST
Send Form
Auth: TokenAccount or TokenInstanceRate-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.
Client compatibility: Native Flows are not yet supported on WhatsApp Web/Desktop. The form button will only render for recipients on the official Android and iOS apps, on other clients the message will appear without the interactive button.

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 official contact_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 returned messageType 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

string
required
Instance name (e.g., $Instance_Name).

Headers

string
required
TokenAccount or TokenInstance.
string
required
application/json

Request body

string
required
Destination: phone (5511999999999) or JID (@s.whatsapp.net, @lid, @g.us).
string
required
Text shown in the message bubble, above the button that opens the Flow.
string
default:"registration_offer"
Pre-configured form type: "contact_details" (Customer details) or "registration_offer" (Registration offer). Ignored if buttonParamsJSON is provided.
string
default:"Add information"
Text displayed on the button that opens the Flow (flow_cta).
string
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.
string
Flow ID in WhatsApp Business. Defaults per formType:
  • contact_details1889354358373616
  • registration_offer892701196712475
Override only if you intend to use a custom Flow by name (without using buttonParamsJSON).
string
default:"4"
flow_message_version value sent to WhatsApp.
int
default:"3"
message_version of the Native Flow payload.
string
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.
boolean
default:"true"
Shows the “Full name” field in the form. Ignored if buttonParamsJSON is provided.
boolean
default:"true"
Shows the “Phone number” field.
boolean
default:"true"
Shows the “Email” field.
boolean
default:"true"
Shows the “CPF/CNPJ” field.
boolean
default:"true"
Shows the “Delivery address” field.
string
Offer title displayed inside the Flow. Used when formType=registration_offer.
string
Offer description displayed inside the Flow. Used when formType=registration_offer.
int
default:"0"
Time in seconds to wait before sending. During the interval, the server shows the “typing…” indicator to the recipient.
string
ID of the message to reply to. The original message must belong to the same instance and be saved in the database.
boolean
default:"false"
When true and replyTo points to a message originating from a group, the reply is redirected to the private chat of the original author.
string
default:"api"
Origin identifier for traceability (e.g., crm, landing-sales, n8n).

Notes

  • The contact_details and registration_offer Flows are pre-approved WhatsApp templates ready to use. If you need a form with specific fields (custom questions, screen logic), use buttonParamsJSON with your own Flow.
  • The flowToken is 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 buttonParamsJSON is sent, every other Flow-related field is ignored, you take full control of the payload, including flow_id, flow_action, flow_action_payload and flow_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_response event, it isn’t a regular text message, so handle the webhook accordingly.

Errors

Error envelope: