Newv4 is now live — a faster API, more channel support, and the headroom to scale. Explore v4
Channelsv4

Send a message on a specific channel

POST/channels/{channelId}/messages

Channel-specific send. Behaves exactly like POST /messages with an explicit channel_id, but the channel is taken from the path. Multiple recipients on a group-capable channel (blooio/whatsapp) form a single group thread; on other channels they fan out to individual sends (max 100).

Path parameters

channelIdRequiredstring

Unique identifier of the channel (the sending surface), prefixed with ch_. Returned by the List channels endpoint.

Headers

AuthorizationRequiredstring

Your API key, sent as a bearer token: Authorization: Bearer <api_key>. Editing this stays in sync with the API key box on the right.

Bearer
Idempotency-Keyoptionalstring

Optional key for safe retries. Replaying the same key with an identical body returns the original result; a different body returns 409. Use a unique value (such as a UUID) per logical request.

Body parameters

JSON
toRequiredRecipient

A recipient: a single identifier, a list, a comma-separated string, or (for routed sends) a { contact_id }. A contact_id enables cross-channel-type routing via the contact's identities; a bare identifier reaches phone/email-addressable channels only.

identifierRequiredstring
contentRequiredMessageContent
typeRequired"text"
textRequiredstring
reply_tooptionalstring

Message id to reply to.

effectoptionalstring

iMessage screen/bubble effect (Blooio).

link_previewoptionalLinkPreview
imageUrloptionalstring
titleoptionalstring
dry_runoptionalboolean

Validate and route only; do not send.

Returns

idoptionalstring
chat_idoptionalstring
channel_idoptionalstring
channel_typeoptionalstring
"blooio""twilio""whatsapp""whatsapp_business""rcs_business"
protocoloptionalstring | null
directionoptionalstring
"inbound""outbound"
typeoptionalstring
statusoptionalstring
erroroptionalobject | null
fallbackoptionalobject

Present when a send could not be delivered on the requested channel and a different channel should be tried.

recommendedoptionalboolean

True when falling back to another channel is recommended.

reasonoptionalstring
tooptionalstring

Recipient identifier. Present only on per-recipient items inside a fan-out (FanOutResult) response.

dry_runoptionalboolean
would_sendoptionalboolean
previewoptionalobject

Response codes

200Dry-run preview
201Message accepted.
207Multi-recipient fan-out with mixed results.
401Your API key is missing or invalid. Pass it as a bearer token.
404No channel was found with the provided `channelId`.
409The request conflicts with the current state of the channel (e.g. it already exists, the chat is closed, or the channel isn't active).
422Validation failed — one or more fields in the request are invalid or missing.
501This channel endpoint is defined but not implemented yet.

Sends a live request with your values and shows the real response below. Your key is stored only in this browser.

Request
curl -X POST https://api.blooio.com/v4/channels/ch_a1b2c3d4/messages \  -H "Authorization: Bearer bl_live_..." \  -H "Idempotency-Key: string" \  -H "Content-Type: application/json" \  -d '{    "to": {      "identifier": "+15551234567"    },    "content": {      "type": "text",      "text": "Hello from Blooio!"    }  }'
Body object
Response objectexample
{  "id": "obj_a1b2c3d4",  "chat_id": "chat_a1b2c3d4",  "channel_id": "ch_a1b2c3d4",  "channel_type": "blooio",  "protocol": "string",  "direction": "inbound",  "type": "string",  "status": "active",  "error": {},  "fallback": {    "recommended": false,    "reason": "string"  },  "to": "+15551234567",  "dry_run": false,  "would_send": false,  "preview": {}}