# Get the project webhook

> One webhook for the whole project and every event, message., conversation.new and call. included. Payloads name addresses (from, to) and the transport (type), never a sender id; see WebhookPayloadV2.

`GET https://api.zavu.dev/v2/webhook`

One webhook for the whole project and every event, `message.*`, `conversation.new` and `call.*` included. Payloads name addresses (`from`, `to`) and the transport (`type`), never a sender id; see `WebhookPayloadV2`.

**Alongside /v1 webhooks.** Configuring this webhook is the opt-in. From then on each event is delivered here *in addition to* any /v1 sender webhook or /v1 project webhook subscribed to it, as independent deliveries with different event ids. Nothing is deduplicated. `senderWebhooks` lists the /v1 sender webhooks still on; switch them off with `disableSenderWebhooks` on `PUT` once this one is verified.

It does not share storage with `/v1/invitations/webhook`.

## Responses

### 200

The webhook (null when none), and the /v1 sender webhooks still on.

- `webhook` (object, required, nullable): The one webhook for everything in the project. Stored apart from the /v1 project webhook (`/v1/invitations/webhook`); neither API reads or writes the other's.
  - `url` (string<uri>, required)
  - `events` (string[], required): Any event in `WebhookEvent`, including `message.*`, `conversation.new` and `call.*`. One of: `message.queued`, `message.sent`, `message.delivered`, `message.read`, `message.failed`, `message.inbound`, `message.unsupported`, `broadcast.status_changed`, `conversation.new`, `contact.identity_linked`, `template.status_changed`, `invitation.status_changed`, `call.initiated`, `call.answered`, `call.completed`, `call.failed`, `domain.verified`, `domain.failed`.
  - `active` (boolean, required)
  - `signatureVersion` (string, required): Which `X-Zavu-Signature` scheme this receiver is sent. The header is `t=<unix seconds>` followed by the signatures. - `v1`: `v1=HMAC_SHA256(secret, body)`. - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the default for a new /v2 webhook. It signs the timestamp together with the body. - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver reading either one works. Moving straight between `v1` and `v2`, in either direction, returns `400`. Set `v1+v2` first. See https://www.zavu.dev/docs/guides/receiving-messages/signature-migration One of: `v1`, `v1+v2`, `v2`.
  - `secret` (string): Returned only by `PUT /v2/webhook` when it creates the webhook, and by `POST /v2/webhook/secret`.
- `senderWebhooks` (object[], required)
  - `address` (string, required, nullable): The sender's first address; null for a sender with no connected transport.
  - `url` (string<uri>, required)
  - `v1SenderId` (string, required): Read-only; the sender to change on /v1.

### 401

Unauthorized.

- `code` (string, required)
- `message` (string, required)
- `details` (object): Machine-readable context. Keys that mean the same thing everywhere: - `errors`: present on every `400 invalid_request` for an invalid body or query parameter, `[{path, message, ...}]`, `path` naming the field (`["to"]`, `["contacts", 2, "recipient"]`, `["limit"]`). - `recommendation`: one sentence saying what to do next. - `dashboardUrl`: the dashboard screen that fixes it. - `connect`: on `409 no_channel`, the channels this project can connect to reach the recipient, each `{type, request, note, available, dashboardUrl?}`; `request` is the exact call (`POST /v2/channels` with its body, or `POST /v2/numbers`), or null for a channel connected from the dashboard (WhatsApp, Instagram, Messenger). `available: false` says why in `note` (one-way SMS closed until business verification is approved). - `address` / `from`: the address the error is about, under the name the request used for it.
  - `errors` (object[])
    - `path` (object[], required)
    - `message` (string, required)
    - `code` (string)

## Example

```bash
curl -X GET "https://api.zavu.dev/v2/webhook" \
  -H "Authorization: Bearer $ZAVUDEV_API_KEY"
```

```typescript
import Zavudev from "@zavudev/sdk";

const zavu = new Zavudev({ apiKey: process.env.ZAVUDEV_API_KEY });

const result = await zavu.v2.webhook.retrieve();

console.log(result);
```
