Create sender
Authorization
AuthorizationheaderrequiredBearer YOUR_API_KEY. Create a key in the dashboard.
Body
application/json
namestringrequiredphoneNumberstringPhone number in E.164 format, and it must be a number your project already owns (see
GET /v1/phone-numbers). The number is routed to the sender as part of this call, which is what turns the SMS channel on. Passing a number the project does not own, one already attached to another sender, or one rejected in regulatory review returns 400 rather than creating a sender that cannot send. A number still under review is attached and starts carrying messages when it is approved. Omit for an email-only sender.enableVoicebooleanLet this sender place and answer phone calls. Requires
phoneNumber; enabling it without one returns 400. Check thechannelsarray on the response to confirmvoiceis on.DefaultfalseenableSmsOnewaybooleanEnable the one-way SMS channel (
sms_oneway). No phone number and no credential, so it is the fastest way to get a sender that can send. Recipients cannot reply. Sending to a US or Canadian (+1) number still needs an approved 10DLC campaign, and is refused with403 ten_dlc_requireduntil then. Confirm withsms_onewayin thechannelsarray on the response.DefaultfalsesetAsDefaultbooleanDefaultfalsewebhookUrlstring<uri>HTTPS URL for webhook events.
webhookEventsstring[]Events to subscribe to.
One ofmessage.queuedmessage.sentmessage.deliveredmessage.readmessage.statusmessage.failedmessage.inboundmessage.unsupportedbroadcast.status_changedconversation.newcontact.identity_linkedtemplate.status_changedinvitation.status_changedcall.initiatedcall.answeredcall.completedcall.faileddomain.verifieddomain.failedemailAddressstring<email>From-address for the email channel (e.g. noreply@yourdomain.com). The address's domain must be a verified email domain in your project. Setting this attaches the email channel to the sender.
emailDomainIdstringID of the verified email domain to attach. Optional — resolved from
emailAddress's domain when omitted.emailFromNamestringDisplay name shown in the recipient's inbox for the email channel.
Limitsmax length 100emailReceivingEnabledbooleanEnable inbound email receiving on this sender. Requires a verified inbound MX record on the domain; the request is ignored otherwise. Read
emailReceivingEnabledback off the response to see whether it was applied — it comes backfalsewhen the MX has not verified.webhookSignatureVersionstringSignature scheme for this sender's webhook. Defaults to
v2, which is correct for a new receiver. Passv1+v2when this sender points at an endpoint that already serves an older sender still verifyingv1.One ofv1v1+v2v2
Responses
201Sender created.
idstringrequirednamestringrequiredphoneNumberstringPhone number in E.164 format. Absent on a sender that has none: an email-only sender, or one created with only
enableSmsOneway.channelsstring[]Channels this sender can actually send on right now: configured AND activated. Empty means the sender cannot send or receive anything yet: a phoneNumber alone does not enable SMS or voice, and a connected account that is not activated is left out, because every send on it is refused. Check this rather than inferring capability from phoneNumber or emailAddress, and turn a connected channel on with
POST /v1/senders/{senderId}/channels/{channel}/activate.isDefaultbooleanWhether this sender is the project's default.
DefaultfalsewebhookobjectWebhook configuration for the sender.
5 properties
urlstring<uri>requiredHTTPS URL that will receive webhook events.
eventsstring[]requiredList of events the webhook is subscribed to.
One ofmessage.queuedmessage.sentmessage.deliveredmessage.readmessage.statusmessage.failedmessage.inboundmessage.unsupportedbroadcast.status_changedconversation.newcontact.identity_linkedtemplate.status_changedinvitation.status_changedcall.initiatedcall.answeredcall.completedcall.faileddomain.verifieddomain.failedsecretstringWebhook secret for signature verification. Only returned on create or regenerate.
activebooleanrequiredWhether the webhook is active.
DefaulttruesignatureVersionstringrequiredWhich
X-Zavu-Signaturescheme this receiver is sent.v1:v1=HMAC_SHA256(secret, body). The scheme used before this was configurable. Existing webhooks stay on it until you move them.v2:v2=HMAC_SHA256(secret, "{t}.{body}"). The current scheme, and the default for new senders. It signs the timestamp together with the body.v1+v2: both signatures, sharing onet. The migration setting: a receiver reading either one works, so you can deploy and confirm your new verifier before switching over.
Moving from
v1straight tov2returns400. Setv1+v2first. See https://www.zavu.dev/docs/guides/receiving-messages/signature-migrationOne ofv1v1+v2v2
whatsappobjectWhatsApp Business Account information. Only present if a WABA is connected.
3 properties
phoneNumberIdstringWhatsApp phone number ID from Meta.
displayPhoneNumberstringDisplay phone number.
paymentStatusobjectPayment configuration status from Meta.
3 properties
setupStatusstringPayment setup status (COMPLETE, NOT_STARTED, etc.).
methodStatusstringPayment method status (VALID, NONE, etc.).
canSendTemplatesbooleanWhether template messages can be sent. Requires setupStatus=COMPLETE and methodStatus=VALID.
emailAddressstringFrom-address for the email channel, if configured.
emailReceivingEnabledbooleanWhether inbound email receiving is enabled for this sender.
DefaultfalseemailCatchAllEnabledbooleanWhether catch-all receiving is enabled. When true (and emailReceivingEnabled is true), this sender receives email addressed to any local part at its domain, not just its own address. The original recipient is delivered in the message.inbound webhook's data.to.
DefaultfalsecreatedAtstring<date-time>updatedAtstring<date-time>
400Invalid sender.
codestringrequiredmessagestringrequireddetailsobject
401Unauthorized.
codestringrequiredmessagestringrequireddetailsobject