Flows
WhatsApp Flows let you send structured, multi-step experiences inside WhatsApp.
The important part of this API is that you do not need to call Meta directly for Flow management. Use your organization API key and our API will use the stored WABA credentials internally.
What You Can Do
- create a Flow for a WABA
- upload or replace its
flow.json - preview it
- publish it
- send it later with
POST /v1/phones/{phoneId}/messages
All Flow management endpoints are scoped under:
/v1/wabas/{wabaId}/flows
Golden Path
- Create the Flow shell with
POST /v1/wabas/{wabaId}/flows - Replace the JSON with
PUT /v1/wabas/{wabaId}/flows/{flowId}/json - Preview it with
GET /v1/wabas/{wabaId}/flows/{flowId}/preview - Publish it with
POST /v1/wabas/{wabaId}/flows/{flowId}/publish - Send it to a user with a normal
type: "flow"message
Create a Flow
POST /v1/wabas/{wabaId}/flows
{
"name": "Fint Discovery Sandbox",
"categories": ["LEAD_GENERATION", "OTHER"],
"flowJson": {
"version": "7.1",
"routing_model": {
"DISCOVER_SCREEN": ["CONFIRM_SCREEN"],
"CONFIRM_SCREEN": []
},
"screens": [
{
"id": "DISCOVER_SCREEN",
"title": "Descubri eventos",
"layout": {
"type": "SingleColumnLayout",
"children": []
}
},
{
"id": "CONFIRM_SCREEN",
"title": "Confirmar",
"terminal": true,
"success": true,
"layout": {
"type": "SingleColumnLayout",
"children": []
}
}
]
}
}
Example response:
{
"data": {
"id": "123456789012345",
"name": "Fint Discovery Sandbox",
"status": "DRAFT",
"categories": ["LEAD_GENERATION", "OTHER"],
"validationErrors": null,
"jsonVersion": "7.1",
"dataApiVersion": null,
"endpointUri": null,
"preview": null,
"raw": {}
}
}
Replace Flow JSON
PUT /v1/wabas/{wabaId}/flows/{flowId}/json
This endpoint is intentionally simpler than Meta's asset upload API. You send JSON directly:
{
"fileName": "fint-discovery-v1.json",
"flowJson": {
"version": "7.1",
"screens": []
}
}
Preview a Flow
GET /v1/wabas/{wabaId}/flows/{flowId}/preview
Returns the raw preview payload from Meta so you can validate compilation and preview metadata.
Publish a Flow
POST /v1/wabas/{wabaId}/flows/{flowId}/publish
Once published, you can send the Flow in a normal outbound message:
{
"type": "flow",
"to": "5491155551234",
"bodyText": "Te ayudo a descubrir el mejor evento",
"flowToken": "session_123",
"flowId": "123456789012345",
"flowCta": "Buscar eventos",
"flowAction": "navigate",
"screen": "DISCOVER_SCREEN",
"data": {
"source": "fint-bot"
}
}
See the Sending Messages guide for the full outbound message format.
Notes
wabaIdin the path is your internal WABA UUID, not the raw Meta numeric IDflowIdis the Meta Flow ID returned by create/list/get- if you need dynamic data or server-side screen resolution, configure
endpointUriand implement Meta's encrypted Flow endpoint contract - this API abstracts credentials, but Flow runtime behavior still follows Meta's product rules