sent -> delivered -> read / failed) on your own webhook - all scoped to a Developer App you own.
This page is the integrator’s overview: what to set up, the rules the API enforces, and how the pieces fit together. For payload-level detail, see the Karibu WhatsApp API reference.
Prerequisites
To send WhatsApp messages you need:- A workspace with WhatsApp enabled (at least one approved sender number / WABA configured). New senders are onboarded via the Briq dashboard.
- A Developer App linked to that workspace. Every WhatsApp endpoint is workspace-scoped - a key with no workspace is rejected with 403. See Developer Apps.
- An active developer API key (
X-API-Keyheader). Generate one in the Briq dashboard. - At least one approved template if you intend to start conversations or message users outside the 24-hour window.
- Recipient phone numbers in E.164 digits-only format (no
+, no spaces) - e.g.255712345678.
The two rules that matter most
These two rules trip up most integrations. Internalize them before writing code.What you can send
| Type | Endpoint | Window-gated? |
|---|---|---|
| Freeform text | POST /v1/whatsapp/messages/send-text | Yes (default) |
| Pre-approved template | POST /v1/whatsapp/messages/send-template | No - opens/refreshes the window |
| Media (image/document/video) | POST /v1/whatsapp/messages/send-media | Yes (default) |
| Interactive (buttons/lists) | POST /v1/whatsapp/messages/send-interactive | Yes (default) |
| Read receipt for an inbound message | POST /v1/whatsapp/messages/{message_id}/read | n/a |
Async sends: 200 vs 202
A successful send returns one of two statuses - treat both as success:200(status: "sent") - the provider accepted the message immediately;provider_message_idis present.202(status: "pending") - the message was queued to Briq’s async engine;provider_message_idisnulland is filled in later.
data.message_id returned by the send is the same id that appears in every webhook event - use it to correlate.
Two response shapes
Know which shape each endpoint uses so you parse correctly:- Messages endpoints (
/v1/whatsapp/messages/*) return an envelope:{ "success", "data", "errors", "request_id" }. Readerrors[].codeon failure. - Read endpoints (senders, conversations, templates) return the bare resource - a JSON array or object with no envelope. Errors use
{ "detail": "..." }.
End-to-end flow
A typical first-contact notification flow:- Find your sender. Call
GET /v1/whatsapp/sendersto get asender_id. -> Senders & conversations - Register a webhook for
service_type: "whatsapp"and fetch its signing secret. -> Delivery events - Open the conversation with a template (first contact is always outside the window). -> Templates
- Continue with freeform messages (text/media/interactive) while the window is open. -> Sending messages
- Track delivery via
whatsapp.sent->whatsapp.delivered->whatsapp.read(orwhatsapp.failed) on your webhook. - Read inbound replies by polling the Conversations API (inbound webhooks are upcoming).
Quick start
For complete payload tables, error matrices, and copy-pasteable client snippets in cURL, Python, Node.js, and PHP, see the Karibu WhatsApp API reference.