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.
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.
curl -X POST "https://ryzeapi.cloud/api/message/form/$Instance_Name" \ -H "token: $Token_Instance" \ -H "Content-Type: application/json" \ -d '{ "number": "5511999999999", "message": "To finish your support request, please complete your details:", "formType": "contact_details", "buttonLabel": "Fill in details", "fullNameVisible": true, "phoneNumberVisible": true, "emailVisible": true, "cpfOrCnpjVisible": false, "deliveryAddressVisible": false }'
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.
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
{ "success": true, "message": "Form message sent successfully", "status": "sent", "data": { "messageId": "3EB08FCF27E532F1B0F5", "direction": "sent", "messageType": "interactive", "content": "Lock in your spot in the course with 50% off!", "source": "api", "timestamp": "2026-04-30T14:30:00Z", "chat": { "jid": "5511999999999@s.whatsapp.net", "isGroup": false }, "sender": { "jid": "5511777777777@s.whatsapp.net", "instance": "my-instance" } }}
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.
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.
Escape hatch for fully custom flows. When provided, the server sends this literal JSON as the Native Flow button params and ignoresformType, 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.
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.