url). For the inbound Meta → Vobiz contract and how to register a subscription, see the Webhooks overview and the Webhooks API.
All outbound webhooks are HTTP POST requests with Content-Type: application/json, signed with the X-Webhook-Signature header (see Verifying signatures).
Common Envelope
Every outbound webhook body is the same envelope. Only thepayload object differs per event type.
| Field | Type | Description |
|---|---|---|
event_id | string (UUID) | Unique identifier for this delivery. Use it to deduplicate retries. |
event_type | string | One of message.inbound, message.status, or call.<event>. |
account_id | string | Your Vobiz account ID, e.g. MA_XXXXXXXX. |
occurred_at | string (RFC3339, UTC) | When Vobiz processed the event. |
payload | object | Event-specific data — the relevant slice of the underlying WhatsApp Cloud API payload. |
Envelope shape
X-Webhook-Event request header carries the same value as event_type, so you can route on the header before parsing the body.
There are exactly three outbound event types:
message.inbound, message.status, and call.<event>. There is no separate message.delivered, message.read, message.sent, or message.failed event — those are delivery states reported inside message.status.message.inbound
An end customer sent a message to your WhatsApp number. This is the event you build conversational experiences and auto-replies on. Thepayload contains the WhatsApp Cloud API change value: the channel metadata, the sender in contacts[], and the message in messages[] (with the WhatsApp message id wamid and the type-specific content).
message.inbound
Message types
Themessages[].type field reflects the WhatsApp message type, e.g. text, image, video, audio, document, location, contacts, button, interactive. Text content is in text.body; media and interactive messages carry their own type-specific object alongside.
message.status
A delivery-status update for a message you sent. Thepayload contains the change value with a statuses[] array; each entry has the WhatsApp message id (id = the wamid returned when you sent the message), the recipient_id, and a status.
status is one of:
| Status | Meaning |
|---|---|
sent | Accepted by WhatsApp and on its way. |
delivered | Reached the recipient’s device (double gray ticks). |
read | Opened by the recipient (blue ticks; only if read receipts are enabled). |
failed | Delivery failed. |
delivered and read are values of status inside a single message.status event — they are not separate event types. Use the id to correlate the update back to the message you sent.message.status
call.<event>
WhatsApp Business Calling lifecycle events. Theevent_type suffix mirrors Meta’s call event, so values you may receive include:
call.connect— a call is being set up (carries the SDP offer in the session).call.status_change— the call status changed (e.g. ringing → accepted).call.terminate— the call ended.
payload contains the change value with a calls[] array. Each call entry includes id, from, to, event, status, direction, and (for connect) a session with the SDP.
call.connect
Handling tips
- Deduplicate on
event_id— Vobiz may retry a delivery, and the underlying WhatsApp event can repeat. - Verify the signature on every request before trusting the body (see the overview).
- Respond fast — return
200quickly and process asynchronously; Vobiz uses a short per-delivery timeout.