View as Markdown

WhatsApp calls

Place a call inside WhatsApp, without the customer having to dial a number.

Permission first

You cannot call a customer who has not allowed it. That is a Meta requirement, and the first obstacle of any call integration.

GET  /whatsapp/calls/permissions/{phone}
POST /whatsapp/calls/permissions

Check the state before each attempt: a permission has a validity period, it is not granted once and for all. The request goes out as a message, which the customer answers yes or no.

The call button

POST /whatsapp/calls/button

Sends a message carrying a call button: the customer initiates, which sidesteps the permission question. Often the simplest path for support.

POST /whatsapp/calls/deeplink

Returns a link to drop into an email, an invoice or a web page, which opens WhatsApp on a call to your number.

Placing a call

POST /whatsapp/calls/connect
POST /whatsapp/calls/{id}/pre-accept
POST /whatsapp/calls/{id}/accept
POST /whatsapp/calls/{id}/reject
POST /whatsapp/calls/{id}/terminate
GET  /whatsapp/calls/{id}/media

These routes exchange SDP offers and answers: they only serve an integration that carries the WebRTC media layer itself. If you simply want to receive calls, the button is enough.

pre-accept before accept shortens the silence on pickup: media negotiation happens while it is still ringing.

Monitoring

GET   /whatsapp/calls/settings
PATCH /whatsapp/calls/settings
GET   /whatsapp/calls/health
GET   /whatsapp/calls/analytics

health reports the state of the call channel on Meta's side. Check it first when calls fail without a clear reason.