WhatsApp API Platform
Session Messages

Send Flow Message

POST
/api/v1/messages/send#flow

Send a WhatsApp Flow as a session message. Tapping the CTA opens the Flow inside WhatsApp.

The Flow itself is authored and published in Meta Business Manager — this API only sends it. Pass either flow_id or flow_name, never both.

flow_token is pass-through: whatever you set is echoed back verbatim when the customer submits, so use it to correlate the submission with your own records. The submission arrives as an inbound message with message_type: flow_response and is delivered to your webhook through the message.incoming event.

Being a session message, this only reaches customers inside the 24-hour window. To open a Flow from a business-initiated message, send a template with a FLOW button instead.

Authorization

ApiKeyAuth
X-API-Key<token>

API key from your dashboard (Settings > API Keys)

In: header

Header Parameters

X-AGENT-ID?string

Optional. Attribute this send to a specific agent, overriding the agent bound to the API key. The agent must belong to your account and be active (role AGENT, parent = your account) — otherwise the request returns 400. Drives customer assignment, agent allotment limits, and the wallet ledger entry.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://loading/api/v1/messages/send#flow" \  -H "X-AGENT-ID: agt_abc123" \  -H "Content-Type: application/json" \  -d '{    "to": "919876543210",    "message": {      "message_type": "flow",      "text": "Book your appointment in a few taps.",      "footer_text": "Takes under a minute",      "flow": {        "flow_id": "1572550654182298",        "flow_token": "order-8891",        "cta": "Book now",        "action": "navigate",        "screen": "RECOMMEND"      }    }  }'
{
  "success": true,
  "data": {
    "id": "clx9abc123def456"
  }
}
{
  "success": false,
  "message": "to field is required"
}
{
  "success": false,
  "message": "user not authenticated"
}
{
  "success": false,
  "message": "insufficient balance to send message"
}
{
  "success": false,
  "message": "internal server error"
}