Request
Usetype as interactive and set interactive.type to flow.
Use this endpoint to send a Flow inside the 24h Customer Service Window. To send a Flow outside the 24h window, wrap it in an approved template with a Flow button and use Send Template instead.
Field types
to: string (required)type: string =interactive(required)interactive: object (required)interactive.type: string =flow(required)interactive.header: object (optional)interactive.header.type: string (optional, usuallytext)interactive.header.text: string (optional)interactive.body: object (required)interactive.body.text: string (required)interactive.footer: object (optional)interactive.footer.text: string (optional)interactive.action: object (required)interactive.action.name: string =flow(required)interactive.action.parameters: object (required)interactive.action.parameters.flow_message_version: string =3(required)interactive.action.parameters.flow_token: string (required, unique per send)interactive.action.parameters.flow_id: string (required ifflow_nameis not provided)interactive.action.parameters.flow_name: string (required ifflow_idis not provided)interactive.action.parameters.flow_cta: string (required)interactive.action.parameters.flow_action: string =navigateordata_exchange(optional, defaultnavigate)interactive.action.parameters.flow_action_payload: object (optional whenflow_actionisnavigate, must be omitted whenflow_actionisdata_exchange)interactive.action.parameters.flow_action_payload.screen: string (optional, defaultFIRST_ENTRY_SCREEN)interactive.action.parameters.flow_action_payload.data: object (optional, must be a non-empty object when provided)interactive.action.parameters.mode: string =publishedordraft(optional, defaultpublished)tags: array of strings (optional)metadata: object | string (optional)
Field behavior and limits
interactive.body.textis required, max 1024 characters.interactive.header.textis optional, max 60 characters.interactive.footer.textis optional, max 60 characters.interactive.action.parameters.flow_ctais the button label, max 20 characters and must not contain emojis or markdown.interactive.action.parameters.flow_tokenmust be unique per send. It is echoed back in the inbound payload when the user submits the Flow, so use it to correlate the response with the original send.interactive.action.parameters.flow_idis the ID issued by Meta when the Flow is published.flow_nameis supported as an alternative.interactive.action.parameters.modedefaults topublished. Usedraftonly while testing —draftmode delivers only to numbers registered as testers in Meta.interactive.action.parameters.flow_action_payload.screenis optional. If omitted, Meta usesFIRST_ENTRY_SCREEN. When provided, it must match the ID of the first screen to render.interactive.action.parameters.flow_action_payload.datais the input data for the first screen. When provided, it must be a non-empty object.- When
flow_actionisdata_exchange,flow_action_payloadmust be omitted. Meta calls the Flow’s data endpoint to populate the first screen. - Flow messages render on the WhatsApp native mobile app. WhatsApp Web shows a simplified fallback.
Handling the response
When the user completes and submits the Flow, an inbound event arrives with the structured fields the user filled in, plus the sameflow_token you sent. Use the token to correlate the response with the original send.
For the conceptual model, screen design, and pricing, see WhatsApp Flows. For the authoritative Flow JSON schema and screen elements, see Meta’s Flow documentation.