> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zavu.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Sending & Receiving

> Send messages on the whatsapp_alt channel and receive inbound messages through your sender webhook.

Once a session is `ready` and linked to a sender, you send and receive with the same APIs as every other channel — just route on the `whatsapp_alt` channel.

## Sending

Set `channel: "whatsapp_alt"` and target the sender that owns the linked session with the `Zavu-Sender` header (or omit it to use the project default).

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.zavu.dev/v1/messages \
    -H "Authorization: Bearer $ZAVU_API_KEY" \
    -H "Zavu-Sender: sender_12345" \
    -H "Content-Type: application/json" \
    -d '{
      "to": "+14155551234",
      "channel": "whatsapp_alt",
      "text": "Hello from Zavu!"
    }'
  ```

  ```typescript TypeScript theme={null}
  const { message } = await zavu.messages.send({
    to: "+14155551234",
    channel: "whatsapp_alt",
    text: "Hello from Zavu!",
  }, {
    headers: { "Zavu-Sender": "sender_12345" },
  });
  ```

  ```python Python theme={null}
  resp = zavu.messages.send(
      to="+14155551234",
      channel="whatsapp_alt",
      text="Hello from Zavu!",
      extra_headers={"Zavu-Sender": "sender_12345"},
  )
  ```
</CodeGroup>

<Note>
  `whatsapp_alt` is only accepted for teams with the WhatsApp Alternative feature enabled, and the sender must have a connected `whatsapp_alt` session. Without a linked session the send is rejected.
</Note>

### Supported message types

WhatsApp Alternative carries conversational content: text, media (image, video, audio, document, sticker), location, contacts, and reactions. It does **not** use WhatsApp templates or the 24-hour window — those are concepts of the official WhatsApp Business Platform. Media and reactions are sent the same way as the official WhatsApp channel; see the [WhatsApp message guides](/guides/whatsapp/messages/text).

<Warning>
  Because the number is a QR-linked device, keep to consented, conversational messaging. High-volume or unsolicited sending risks WhatsApp blocking the number. For large marketing sends, use the official WhatsApp channel with approved templates.
</Warning>

## Receiving

Inbound messages arrive through your sender's webhook as `message.inbound` events — the **same shape as every other channel**, so your existing webhook handler works without changes.

```json Webhook payload theme={null}
{
  "id": "evt_1736850000000_abc123",
  "type": "message.inbound",
  "timestamp": 1736850000000,
  "senderId": "sender_12345",
  "projectId": "proj_abc",
  "data": {
    "messageId": "jx77...",
    "to": "+13125551212",
    "channel": "whatsapp_alt",
    "status": "received"
  }
}
```

Subscribe to `message.inbound` on the sender and verify the signature exactly as documented in [Receiving Messages](/guides/receiving-messages/webhooks). Delivery and read receipts arrive as `message.delivered` / `message.read` for outbound messages.

Group messages arrive on the **same** `message.inbound` event, with extra group fields on `data`. See [Groups](/guides/whatsapp-alt/groups) for how to identify a group message and its author.

## Uniform across channels

The value of `whatsapp_alt` is that it plugs into the same surface as the rest of Zavu:

* **Same send API** — only `channel` changes.
* **Same webhooks** — `message.inbound`, `message.delivered`, `message.read`, `message.failed`.
* **Same contacts and conversations** — a linked number's conversations live alongside your SMS, email, and official WhatsApp threads.

## Next steps

<CardGroup cols={2}>
  <Card title="Receiving Messages" icon="inbox" href="/guides/receiving-messages/webhooks">
    Configure and verify your sender webhook.
  </Card>

  <Card title="Egress & Fallback" icon="route" href="/guides/whatsapp-alt/egress">
    Keep the linked number 100% active.
  </Card>
</CardGroup>
