Create or replace the project webhook
Create or replace the webhook. url must be HTTPS. The signature scheme defaults to v2. A webhook cannot move straight from v1 to v2, or from v2 to v1 (400): a receiver verifying the current scheme would break on the next delivery, so both directions go through v1+v2. Replacing keeps the secret.
Pass disableSenderWebhooks: true to switch off the /v1 sender webhooks of this project in the same call, so each event arrives once.
Authorization
AuthorizationheaderrequiredBearer YOUR_API_KEY. Create a key in the dashboard.
Body
application/json
urlstring<uri>requiredHTTPS only.
eventsstring[]requiredAny event in
WebhookEvent. An unknown value is refused with400anddetails.allowed.One ofmessage.queuedmessage.sentmessage.deliveredmessage.readmessage.failedmessage.inboundmessage.unsupportedbroadcast.status_changedconversation.newcontact.identity_linkedtemplate.status_changedinvitation.status_changedcall.initiatedcall.answeredcall.completedcall.faileddomain.verifieddomain.failedLimitsmin items 1activebooleanDefaulttruesignatureVersionstringWhich
X-Zavu-Signaturescheme this receiver is sent. The header ist=<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 onet. The migration setting: a receiver reading either one works.
Moving straight between
v1andv2, in either direction, returns400. Setv1+v2first. See https://www.zavu.dev/docs/guides/receiving-messages/signature-migrationOne ofv1v1+v2v2disableSenderWebhooksbooleanSwitch off the /v1 sender webhooks of this project in the same call, so each event arrives once. They are only switched off (
webhookActive: falseon /v1); URL, events and secret stay, so /v1 can turn one back on. Off by default: the /v2 webhook is added next to them and both receive every event until you decide.senderWebhookson the response lists what is still on.Defaultfalse
Responses
200Replaced. `secret` is not returned.
webhookobjectrequiredThe 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.5 properties
urlstring<uri>requiredeventsstring[]requiredAny event in
WebhookEvent, includingmessage.*,conversation.newandcall.*.One ofmessage.queuedmessage.sentmessage.deliveredmessage.readmessage.failedmessage.inboundmessage.unsupportedbroadcast.status_changedconversation.newcontact.identity_linkedtemplate.status_changedinvitation.status_changedcall.initiatedcall.answeredcall.completedcall.faileddomain.verifieddomain.failedactivebooleanrequiredsignatureVersionstringrequiredWhich
X-Zavu-Signaturescheme this receiver is sent. The header ist=<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 onet. The migration setting: a receiver reading either one works.
Moving straight between
v1andv2, in either direction, returns400. Setv1+v2first. See https://www.zavu.dev/docs/guides/receiving-messages/signature-migrationOne ofv1v1+v2v2secretstringReturned only by
PUT /v2/webhookwhen it creates the webhook, and byPOST /v2/webhook/secret.
senderWebhooksobject[]required3 properties
addressstringrequiredThe sender's first address; null for a sender with no connected transport.
urlstring<uri>requiredv1SenderIdstringrequiredRead-only; the sender to change on /v1.
disabledSenderWebhooksintegerrequiredHow many /v1 sender webhooks this call switched off.
201Created. `webhook.secret` is returned once.
webhookobjectrequiredThe 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.5 properties
urlstring<uri>requiredeventsstring[]requiredAny event in
WebhookEvent, includingmessage.*,conversation.newandcall.*.One ofmessage.queuedmessage.sentmessage.deliveredmessage.readmessage.failedmessage.inboundmessage.unsupportedbroadcast.status_changedconversation.newcontact.identity_linkedtemplate.status_changedinvitation.status_changedcall.initiatedcall.answeredcall.completedcall.faileddomain.verifieddomain.failedactivebooleanrequiredsignatureVersionstringrequiredWhich
X-Zavu-Signaturescheme this receiver is sent. The header ist=<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 onet. The migration setting: a receiver reading either one works.
Moving straight between
v1andv2, in either direction, returns400. Setv1+v2first. See https://www.zavu.dev/docs/guides/receiving-messages/signature-migrationOne ofv1v1+v2v2secretstringReturned only by
PUT /v2/webhookwhen it creates the webhook, and byPOST /v2/webhook/secret.
senderWebhooksobject[]required3 properties
addressstringrequiredThe sender's first address; null for a sender with no connected transport.
urlstring<uri>requiredv1SenderIdstringrequiredRead-only; the sender to change on /v1.
disabledSenderWebhooksintegerrequiredHow many /v1 sender webhooks this call switched off.
400Invalid URL, an event that does not exist (`details.unknown`, `details.allowed`, and `details.errors` naming each by index), or `v1` to `v2` / `v2` to `v1` directly (go through `v1+v2`; `details.errors[0].path` is `["signatureVersion"]`).
codestringrequiredmessagestringrequireddetailsobjectMachine-readable context. Keys that mean the same thing everywhere: -
errors: present on every400 invalid_requestfor an invalid body or query parameter,[{path, message, ...}],pathnaming the field (["to"],["contacts", 2, "recipient"],["limit"]). -recommendation: one sentence saying what to do next. -dashboardUrl: the dashboard screen that fixes it. -connect: on409 no_channel, the channels this project can connect to reach the recipient, each{type, request, note, available, dashboardUrl?};requestis the exact call (POST /v2/channelswith its body, orPOST /v2/numbers), or null for a channel connected from the dashboard (WhatsApp, Instagram, Messenger).available: falsesays why innote(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.1 properties
errorsobject[]3 properties
pathobject[]requiredmessagestringrequiredcodestring
401Unauthorized.
codestringrequiredmessagestringrequireddetailsobjectMachine-readable context. Keys that mean the same thing everywhere: -
errors: present on every400 invalid_requestfor an invalid body or query parameter,[{path, message, ...}],pathnaming the field (["to"],["contacts", 2, "recipient"],["limit"]). -recommendation: one sentence saying what to do next. -dashboardUrl: the dashboard screen that fixes it. -connect: on409 no_channel, the channels this project can connect to reach the recipient, each{type, request, note, available, dashboardUrl?};requestis the exact call (POST /v2/channelswith its body, orPOST /v2/numbers), or null for a channel connected from the dashboard (WhatsApp, Instagram, Messenger).available: falsesays why innote(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.1 properties
errorsobject[]3 properties
pathobject[]requiredmessagestringrequiredcodestring