Channels
One schema for WhatsApp, Instagram, and Messenger.
A channel is a connected messaging account you send and receive through.
Wabery normalizes all three behind one schema. API calls target a concrete
channel_id returned by channels.list().
| Surface | Channel |
|---|---|
| WhatsApp Business numbers | |
| Instagram DMs | |
| Messenger | Facebook Messenger |
Connect a channel
Link an account from the dashboard under Channels, or bring an existing
WhatsApp Business number. Once connected, your wab_live_ key can send and
receive on it. The free sandbox gives you a shared test number with no setup.
Targeting a channel
Every send takes a channelId:
await wabery.messages.send({
channelId: "channel_...",
conversationId: "conversation_...",
text: "Thanks for reaching out!",
});curl https://api.wabery.com/v1/messages \
-H "Authorization: Bearer $WABERY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel_id": "channel_...",
"conversation_id": "conversation_...",
"text": "Thanks for reaching out!"
}'Use the channel_id returned by the API. For WhatsApp dedicated channels you
can send to an E.164 phone number (+14155550100); otherwise send on an
existing conversationId.
Routing inbound messages
Each channel has a routing_mode that decides what happens to inbound messages
on it — EXTERNAL forwards to your project webhook, FLOWS runs native
automations, NONE records only. For a dedicated number this overrides the
project's routing_mode, so a channel left in FLOWS under an EXTERNAL
project never reaches your webhook. New channels inherit the project's routing at
connect time. See Webhooks → Channel routing
for the full precedence rules.
channels.list() / channels.get(id) include a routing_warning when a channel
would silently drop inbound. Set a channel's routing in code:
const { data } = await wabery.channels.list();
data.forEach((c) => c.routing_warning && console.warn(c.id, c.routing_warning));
await wabery.channels.update("channel_...", { routingMode: "EXTERNAL" });wabery channels list
wabery channels update channel_... --routing-mode EXTERNALPublish readiness
WhatsApp channels include publish_readiness on channels.list(),
channels.get(id), and project responses. Use it before publishing Flows or
submitting templates:
{
"can_publish_flows": false,
"can_submit_templates": false,
"business_verification_status": "not_verified",
"account_review_status": "APPROVED",
"phone_number_status": "CONNECTED",
"blockers": ["BUSINESS_NOT_VERIFIED"]
}The shared Wabery sandbox can publish Flows when the sandbox WhatsApp Business
Account is verified, but it cannot submit templates because templates belong to
Wabery's sandbox account. Dedicated WhatsApp numbers must have a Meta-verified
business account before Flows or templates are submitted; otherwise Meta leaves
Flows in draft and rejects template publishing. Wabery returns 412 with the same
publish_readiness blockers instead of queueing work that cannot succeed.
The 24-hour window
WhatsApp, Instagram, and Messenger all restrict free-form messages to a window after the user's last message (24 hours on WhatsApp). Outside the window you must use an approved template. Wabery returns a clear error when a send falls outside the window — see Errors & rate limits.