Skip to main content
When a contact posts a WhatsApp status (a story), the linked number receives it. Zavu delivers it as a dedicated message.status webhook event — not as an inbound message. It never enters the inbox and never creates a conversation, so it can’t flood your threads. You only receive it if you explicitly subscribe.
message.status is currently emitted for the WhatsApp Alternative channel only. It is opt-in: add message.status to your sender’s webhookEvents. Media bytes are not downloaded — only metadata and any text/caption is delivered.

Subscribe

Add message.status to the sender’s subscribed events (via the API or the dashboard):
curl -X PATCH https://api.zavu.dev/v1/senders/sender_12345 \
  -H "Authorization: Bearer $ZAVU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "webhookUrl": "https://api.example.com/webhooks/zavu",
    "webhookEvents": ["message.inbound", "message.status"]
  }'
await zavu.senders.update("sender_12345", {
  webhookUrl: "https://api.example.com/webhooks/zavu",
  webhookEvents: ["message.inbound", "message.status"],
});
If a sender is not subscribed to message.status, story updates are silently dropped — they are never delivered by default. This keeps existing integrations unaffected.

The message.status event

message.status
{
  "id": "evt_1736850000000_abc123",
  "type": "message.status",
  "timestamp": 1736850000000,
  "senderId": "sender_12345",
  "projectId": "proj_abc",
  "data": {
    "messageId": "jx77...",
    "channel": "whatsapp_alt",
    "from": "+14155551234",
    "to": "+13125551212",
    "messageType": "image",
    "text": "At the beach",
    "mimetype": "image/jpeg",
    "providerTimestamp": 1736849999000
  }
}

Fields on data

FieldPresentDescription
fromalwaysThe contact who posted the status, in E.164.
toalwaysYour linked number.
channelalwayswhatsapp_alt.
messageTypealwaysThe story type: text, image, video, or audio.
textwhen presentThe caption, or the text of a text story.
mimetypemedia storiesMIME type of the story media (bytes are not included).
providerTimestampwhen knownWhen WhatsApp originally received the status (Unix ms).

Handling it

app.post("/webhooks/zavu", (req, res) => {
  const { type, data } = req.body;
  if (type === "message.status") {
    console.log(`${data.from} posted a ${data.messageType} story${data.text ? `: ${data.text}` : ""}`);
  }
  res.sendStatus(200);
});
@app.post("/webhooks/zavu")
async def zavu_webhook(payload: dict):
    if payload["type"] == "message.status":
        data = payload["data"]
        caption = f": {data['text']}" if data.get("text") else ""
        print(f"{data['from']} posted a {data['messageType']} story{caption}")
    return {"ok": True}
Your own status posts are not delivered — only statuses from your contacts trigger the event. Media bytes are intentionally omitted; use messageType and mimetype to know the story kind.

Next steps

Groups

Identify group messages and their author.

Receiving Messages

Configure and verify your sender webhook.