Channels
Channels
A channel is one of your own senders, connected to OmniMessage by signing in with the provider or with its credentials. You send from channels and receive on them.
Bring your own channels#
OmniMessage does not rent you numbers or accounts. You connect senders that you own: a WhatsApp Business number, a Telegram bot, an SMS number, a Facebook Page, an Instagram or TikTok business account. Your brand, your number and your provider relationship stay yours.
The OmniMessage fee is charged per outbound message. Fees charged by the provider itself, such as WhatsApp conversation fees or carrier fees for SMS, remain between you and that provider and are not part of your OmniMessage balance.
Channel types#
| Type | Channel | Identifier | Recipient (to) | Connect through |
|---|---|---|---|---|
whatsapp | WhatsApp Business | Phone number (E.164) | Phone number (E.164) | Console (Facebook login or credentials), API (credentials) |
telegram | Telegram | Bot username (read from Telegram) | Chat ID | Console or API (bot token) |
sms | SMS | Phone number (E.164) | Phone number (E.164) | Console or API (credentials) |
sms_otp | SMS OTP | Sender ID | Phone number (E.164) | Console or API (credentials) |
messenger | Messenger | Facebook Page ID | Page-scoped user ID | Console (Facebook login) |
instagram | Instagram account ID | Instagram-scoped user ID | Console (Facebook login) | |
tiktok | TikTok | TikTok business ID | TikTok conversation user ID | Console (TikTok login) |
The channel object#
{
"id": "ch_7Hq2mN5vB8cX1zL0pK3j",
"object": "channel",
"mode": "live",
"type": "whatsapp",
"name": "Support line",
"identifier": "+971800123456",
"status": "active",
"connection_status": "connected",
"capabilities": [
"text",
"attachments",
"template",
"button",
"list",
"cta_url",
"location",
"contacts",
"flow",
"product",
"product_list",
"catalog",
"carousel",
"location_request"
],
"created_at": "2026-10-01T08:00:00.000Z"
}| Field | Description |
|---|---|
type | The channel type. Decides the recipient format, the supported message types and the per-message price. |
identifier | The sender identity on the channel. Outbound messages carry it as from. Unique per channel type. |
status | active or suspended. A suspended channel cannot send. |
connection_status | State of the link to the provider. See below. |
capabilities | The message types this channel accepts as type. Read it instead of hard-coding support. |
mode | live for channels you connected, test for the built-in sandbox channels. |
Connect a channel#
In the console, open Channels, choose Connect channel and pick a type. The type decides how the sender is authorised:
| Channel | In the console | With an API key |
|---|---|---|
| WhatsApp Business | Continue with Facebook: Meta Embedded Signup creates or selects the WhatsApp Business account and the number. A number that is already on the Cloud API can be connected with its IDs and a system user token instead. | POST /v1/channels with the IDs and a system user token. |
| Messenger | Continue with Facebook, then pick the Page. | Not available. |
| Continue with Facebook, then pick the Page the Instagram professional account is linked to. | Not available. | |
| TikTok | Continue with TikTok and approve access. | Not available. |
| Telegram | Paste the bot token. The bot username is read from Telegram. | POST /v1/channels with the bot token. |
| SMS | Paste the Twilio account SID, auth token and phone number SID. | POST /v1/channels with the same values. |
| SMS OTP | Paste the API key of the OTP route and the sender ID. | POST /v1/channels with the same values. |
Messenger, Instagram and TikTok are authorised by a person signing in to the provider and granting access in a pop-up window, so they cannot be created with an API key. The sign-in window is opened by the console; allow pop-ups for it if your browser blocks the window.
curl https://api.omnimessage.co/v1/channels \
-H "Authorization: Bearer om_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"type": "whatsapp",
"name": "Support line",
"identifier": "+971800123456",
"credentials": {
"wab_account_id": "104857600123456",
"phone_number_id": "209715200654321",
"access_token": "EAAG..."
}
}'{
"id": "ch_7Hq2mN5vB8cX1zL0pK3j",
"object": "channel",
"mode": "live",
"type": "whatsapp",
"name": "Support line",
"identifier": "+971800123456",
"status": "active",
"connection_status": "pending",
"capabilities": [
"text",
"attachments",
"template",
"button",
"list",
"cta_url",
"location",
"contacts",
"flow",
"product",
"product_list",
"catalog",
"carousel",
"location_request"
],
"created_at": "2026-10-01T08:00:00.000Z"
}- A new channel is
pendingand becomesconnectedwhen the provider confirms the link, usually within seconds. The console shows this while you wait. - Tokens, authorisation codes and credentials are passed to the delivery layer once. They are not stored by the API or returned by any endpoint.
- An
identifiercan be connected once per channel type. A second attempt fails with409 channel_identifier_taken. - If the provider refuses the credentials, the request fails with
422 upstream_rejectedand the provider reason inmessage. - To renew an expired token or changed permissions, open the channel in the console and choose Reconnect. It repeats the same sign-in or credential step and keeps the channel ID.
Connection status#
connection_status | Meaning | Can send |
|---|---|---|
pending | The channel was created and the provider has not confirmed the link yet. | No |
connected | The link is healthy. | Yes |
reconnecting | The link dropped or a new authorisation was sent, and the provider has not confirmed it yet. | No |
disconnected | The link is down, typically because a token expired or was revoked. Open the channel in the console and choose Reconnect. | No |
blocked | The provider blocked the sender. Resolve it with the provider. | No |
Sending on a channel that is not connected fails with 422 channel_not_connected and nothing is charged. Subscribe to channel.connected and channel.disconnected to follow changes without polling.
Capabilities#
Each channel type supports a set of message types. The support matrix shows the common ones; the channel object lists them all.
| Channel | Message types |
|---|---|
| WhatsApp Business | text, attachments, template, button, list, cta_url, location, contacts, flow, product, product_list, catalog, carousel, location_request |
| Telegram | text, attachments, button, location, contacts, poll |
| SMS | text, attachments |
| SMS OTP | text |
| Messenger | text, attachments, button, carousel, product_list, receipt |
text, attachments, button, carousel, product_list | |
| TikTok | text, attachments, button |
Sandbox channels#
In test mode you do not connect anything. Every account has a sandbox channel per type with the ID ch_test_<type>, for example ch_test_whatsapp. See Test mode.
Rename or delete#
PATCH /v1/channels/{id} changes the display name. DELETE /v1/channels/{id} disconnects the sender and removes the channel; messages already sent remain retrievable.