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().

SurfaceChannel
WhatsAppWhatsApp Business numbers
InstagramInstagram DMs
MessengerFacebook 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 EXTERNAL

Publish 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.

Channels | Wabery Docs | Wabery