/api/v1/numbersList your numbersCATALOG_READ
The safest call there is: it changes nothing and sends nothing. A 200 here means the key is live and reaching your workspace. Note a number id — the sends below go out from one.
No path parameters and no query string.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/templatesList templatesCATALOG_READ
Everything approved and sendable. Take a name and language from here for the preview, send and campaign calls.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/conversationsList conversationsCONVERSATIONS_READ
Open threads, each with whether it is still inside its 24-hour window and which of your numbers it is on. Start here: a conversation gives you the contact every call below is keyed on. With more than one number, add `from` to see one number's threads only.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsappMessages in a threadMESSAGES_READ
One thread's messages. `contact` is who it is with; `from` narrows to one of your own numbers. Each row carries `hasMedia`, so you know which messages to fetch an attachment for without asking about each one.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsapp/:idGet one messageMESSAGES_READ
One message and its delivery state. Take an id from the list above.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsapp/:id/mediaDownload its mediaMEDIA_READ
Streams the attachment itself — the bytes, under Meta's own content type, not a link to them. Keyed on the message id, so no separate media id is needed. Fetch it for any message the list marked `hasMedia`. Meta drops media after about 30 days, and asking for something older answers 410 rather than 404.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsapp/:id/readMark a message readCONVERSATIONS_WRITE
Sends a read receipt for one message, so the sender sees the blue ticks.
A POST to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/conversations/:id/readMark the thread readCONVERSATIONS_WRITE
Clears the unread count and sends receipts for everything in the thread.
A POST to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsapp/previewPreview a templateWHATSAPP_SEND
Fills a template with your variables and returns the text that would be delivered. Nothing is sent and nobody is charged — the dry run to reach for before any of the sends below.
No path parameters and no query string.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsappSend free textWHATSAPP_SEND
Delivered only inside the 24-hour window. Outside it Meta refuses free text and you need a template.
Delivers to a real phone and is billed.
No path parameters and no query string.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsappSend a templateWHATSAPP_SEND
The only thing that reaches somebody outside a 24-hour window. The template must be APPROVED on the account the number sits on.
Delivers to a real phone and is billed.
No path parameters and no query string.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsappSend mediaWHATSAPP_SEND
An image, video, audio, document or sticker. Give either `link` or `id`, never both — `id` can be the `mediaId` of a message you received, which forwards that attachment without downloading and re-uploading it. Captions are not shown on audio or stickers.
Delivers to a real phone and is billed.
No path parameters and no query string.
The same call for a terminal. Your key is never written in.
/api/v1/messages/whatsappSend buttonsWHATSAPP_SEND
Tappable replies. Free-form, so the 24-hour window applies the same as plain text.
Delivers to a real phone and is billed.
No path parameters and no query string.
The same call for a terminal. Your key is never written in.
/api/v1/conversations/:id/call-permissionCan we call them?CALLS_READ
Whether this contact has allowed calls, when that lapses, and whether you may ask again. Always check before placing one.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/conversations/:id/call-permissionAsk to call themCALLS_WRITE
Sends the contact a permission request in their own thread. Leave `text` out for the default wording.
Sends a message to a real phone.
The same call for a terminal. Your key is never written in.
/api/v1/conversations/:id/callPlace a callCALLS_WRITE
Rings the contact. `sdp` is the WebRTC offer your client produced — this is not something to hand-type, it is here so the shape is visible.
Rings a real phone.
The same call for a terminal. Your key is never written in.
/api/v1/callsList callsCALLS_READ
Call history, inbound and outbound. `from` narrows it to one of your numbers — the same number each row reports as `on`.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/calls/:idGet one callCALLS_READ
One call, with how it ended and how long it ran.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/calls/iceGet ICE serversCALLS_READ
The STUN and TURN servers your WebRTC client needs to negotiate media. Fetch these before answering or placing a call.
No path parameters and no query string.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/calls/:id/offerGet the offerCALLS_WRITE
The caller's SDP offer for an inbound call, which your client answers with the call below.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/calls/:id/answerAnswer a callCALLS_WRITE
Your SDP answer to the offer above. Connects the media.
Connects a live call.
The same call for a terminal. Your key is never written in.
/api/v1/calls/:id/actionReject or hang upCALLS_WRITE
`reject` refuses a ringing call; `terminate` ends a connected one.
Ends a live call.
The same call for a terminal. Your key is never written in.
/api/v1/campaignsCreate a campaignCAMPAIGNS_WRITE
Creates it as a draft — nothing goes out until you start it. `from` is one of your numbers, and the template must be approved on its account.
No path parameters and no query string.
The same call for a terminal. Your key is never written in.
/api/v1/campaignsList campaignsCAMPAIGNS_READ
Every campaign and where it got to.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:idGet one campaignCAMPAIGNS_READ
One campaign with its progress and counts.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:idChange a draftCAMPAIGNS_WRITE
Everything is editable until it starts. `scheduledAt: null` turns a scheduled campaign back into a draft.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:id/recipientsAdd recipientsCAMPAIGNS_WRITE
Adds to the audience. Groups, every contact, bare numbers, or people carrying a name.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:id/recipientsList recipientsCAMPAIGNS_READ
Who it goes to, and what happened to each of them.
A GET to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:id/recipientsRemove recipientsCAMPAIGNS_WRITE
Takes people back out of the audience, by recipient id.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:id/startStart itCAMPAIGNS_WRITE
Begins sending to the whole audience at the rate you set. There is no undo — pausing stops what has not gone yet, not what has.
Sends to every recipient in the audience, to real phones, and is billed per conversation.
A POST to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:id/pausePause itCAMPAIGNS_WRITE
Stops what has not been sent. Anything already delivered stays sent.
A POST to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:id/cancelCancel itCAMPAIGNS_WRITE
Ends it for good. It cannot be started again.
Cannot be undone — the campaign cannot be restarted.
A POST to this route takes no body.
The same call for a terminal. Your key is never written in.
/api/v1/campaigns/:idDelete itCAMPAIGNS_WRITE
Removes the campaign and its recipient list.
Deletes the campaign and everything recorded about who it reached.
A DELETE to this route takes no body.
The same call for a terminal. Your key is never written in.
Press ⌘+↵to send.