Channels
Eight channels.One request shape.
The body you send to /v1/messages does not change when the channel does. What changes is what the channel can carry, what it needs before it can send, and who bills you for it.
The channel field takes any of these, plus auto. Omit it and Zavu resolves one from the recipient and from what the sender is actually wired for.
Capabilities
Pick a message type. The channels answer.
Most rich types have exactly one home. Knowing which before you design a flow around buttons is cheaper than finding out from a 400.
messageType
Carries it
SMS
sms
Not this one
One-way SMS
sms_oneway
Not this one
Voice
voice
Not this one
Not this one
Telegram
telegram
Not this one
Not this one
Messenger
messenger
Not this one
These are the values of messageType. Whichever you pick, the field names never change — only the channel that ends up carrying it.
Routing
Where does this one leave from?
Type a recipient and watch the same decisions the handler makes, in the same order, with the one that settled it named.
messageType
channel
What the sender can send on
Toggle these. Routing only ever picks something the sender is actually wired for.
Resolved channel
"channel": "whatsapp"
How it got there
- 01to is a phone number in E.164, so WhatsApp, SMS, one-way SMS and voice are the candidates.
- 02Nothing was named, so the order is WhatsApp, Instagram, Messenger, Telegram, SMS, one-way SMS, email.
- 03Voice is not in that list. It is used only when you ask for it.
- 04First one this sender can reach that recipient on: whatsapp.
autowhatsapp
The 24-hour window
WhatsApp has one rule worth learning first
A free-form WhatsApp message is only accepted while the contact's last inbound message is under 24 hours old. Run it and see what comes back.
The contact has never written to you, so there is no window to be inside of.
What the API answered
- —
The call
Same body, different destination
to and channel are the only fields that move between these. Everything else is the same request.
import Zavudev from "@zavudev/sdk";
const zavu = new Zavudev();
const { message } = await zavu.messages.send({
to: "+56912345678",
text: "Your order shipped.",
});
// channel: "auto" is the default. The sender's own channels decide
// which one this leaves on.
console.log(message.channel, message.status);The ledger
What each one carries, and what it needs first
A channel is not a checkbox. Each has a shape of message it can render and a piece of setup it will not send without.
Carries
Text, media, documents, stickers, buttons, lists, CTA URL buttons, location and contact requests, reactions, and approved templates.
Needs first
A WhatsApp Business Account connected to the sender. Free-form replies also need an open 24-hour window; templates do not.
SMS
sms
Carries
Plain text, and templates rendered down to text.
Needs first
A phone number assigned to the sender. The number on its own does not turn SMS on.
One-way SMS
sms_oneway
Carries
Plain text. The recipient cannot reply.
Needs first
Nothing. No number, no credential — the fastest route to a sender that can send.
Voice
voice
Carries
Text spoken aloud, or a voice agent that holds the conversation.
Needs first
A phone number and the voice channel switched on. Routing never picks voice on its own; name it. Language follows the recipient's country unless you set voiceLanguage.
Carries
Subject, plain text and HTML, up to 50 attachments and inline images by content id.
Needs first
A verified domain and a from-address on the sender. Recipients are checked before dispatch, so a certain bounce never leaves.
Telegram
telegram
Carries
Text, media and interactive elements. No template approval to wait for.
Needs first
A bot token on the sender. Recipients are numeric chat ids, so the channel has to be named.
Carries
Text to an Instagram inbox.
Needs first
A connected Instagram Business account. Its own window: 24 hours of free replies, then a human agent only, up to seven days.
Messenger
messenger
Carries
Text to a Facebook Page inbox, Marketplace conversations included.
Needs first
A connected Facebook Page. Recipients are numeric chat ids.
A sender reports what it can send on right now in its channels array. Read that rather than inferring capability from a phone number or an email address on the record.
What it costs
Who bills you, and for what
Two of these are ours. The other two are passed through at cost, so you can check them yourself.
WhatsApp · Telegram · Instagram · Messenger
2,000 a month, free
Shared across the four on the free plan. Paid plans have no message caps, and Zavu charges nothing per message on any of them.
WhatsApp conversations
Meta's rates, at cost
Meta bills templates and conversations by country and category, straight to your WhatsApp Business account. We add no markup.
SMS · Voice
Per send
Billed from your prepaid balance on every plan, at published per-destination rates.
$0.40 per 1,000
Transactional. Marketing is $0.80 per 1,000. Billed from the balance in blocks of 1,000 messages.
Free teams start with $2 of credit. Past the free allowance a send returns 429 with a2p_limit_exceeded; at zero balance an email send returns 402 with insufficient_balance.
Pick a channel, or let routing pick it.
Start free, no card. Turn on the rest whenever you want, without touching the code you already wrote.