Send a message on a specific channel
/channels/{channelId}/messagesLegacy exact-channel alias. New integrations should use POST /messages with an optional from selector. 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
channelIdRequiredstringUnique identifier of the channel (the sending surface), prefixed with ch_. Returned by the List channels endpoint.
Headers
AuthorizationRequiredstringYour API key, sent as a bearer token: Authorization: Bearer <api_key>. Editing this stays in sync with the API key box on the right.
Idempotency-KeyoptionalstringOptional 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
JSONtoRequiredRecipientA recipient: a single identifier, a list, a comma-separated string, an existing { group_id } with an exact or hybrid owner sender, 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.
toRequiredRecipientA recipient: a single identifier, a list, a comma-separated string, an existing { group_id } with an exact or hybrid owner sender, 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.
identifierRequiredstringtypeoptionalstringOptional advisory address-kind hint. Routing infers the address kind from the identifier and channel, so this value does not change delivery.
contentRequiredMessageContent
contentRequiredMessageContenttypeRequired"text"textRequiredstringreply_tooptionalstringMessage id to reply to.
effectoptionalstringiMessage screen/bubble effect (Blooio).
link_previewoptionalLinkPreview
link_previewoptionalLinkPreviewimageUrloptionalstringtitleoptionalstringdry_runoptionalbooleanValidate and route only; do not send.
Returns
idoptionalstringchat_idoptionalstringchannel_idoptionalstringchannel_typeoptionalstring"blooio""twilio""whatsapp""whatsapp_business""rcs_business"protocoloptionalstringTransport state or resolved wire service; never null. pending = accepted and dispatched, wire service not resolved yet; imessage / rcs / sms = the device-confirmed transport (iMessage blue bubble, RCS, or SMS/MMS green bubble); whatsapp = sent over WhatsApp; unknown = accepted but the transport could not be resolved before the tracking window closed (see error).
"pending""unknown""imessage""sms""rcs""whatsapp"directionoptionalstring"inbound""outbound"typeoptionalstringstatusoptionalstringInitial lifecycle state for the send: normally queued (accepted for delivery), or failed if rejected before dispatch. Later transitions (sent → delivered / read, or failed) are reported via the message status endpoint and message.* webhooks.
group_idoptionalstringExisting group id for a group-targeted send.
hybridoptionalobjectHybrid routing phase and optional transition placement.
erroroptionalobject | nullfallbackoptionalobjectPresent when a send could not be delivered on the requested channel and a different channel should be tried.
fallbackoptionalobjectPresent when a send could not be delivered on the requested channel and a different channel should be tried.
recommendedoptionalbooleanTrue when falling back to another channel is recommended.
reasonoptionalstringtooptionalstringRecipient identifier. Present only on per-recipient items inside a fan-out (FanOutResult) response.
dry_runoptionalbooleanwould_sendoptionalbooleanpreviewoptionalobjectpolloptionalobject
polloptionalobjecttitleoptionalstringoptionsoptionalstring[]routingoptionalRoutingMetadataHow Blooio selected the concrete sender channel.
routingoptionalRoutingMetadataHow Blooio selected the concrete sender channel.
modeoptionalstring"explicit""priority""hybrid"channel_typeoptionalstring"blooio""twilio""whatsapp""whatsapp_business""rcs_business"numberoptionalstringsender_keyoptionalstringpriority_idoptionalstringpriorityoptionalintegerResponse codes
Sends a live request with your values and shows the real response below. Your key is stored only in this browser.
curl -X POST https://api.blooio.com/v4/channels/ch_a1b2c3d4/messages \{ "id": "obj_a1b2c3d4", "chat_id": "chat_a1b2c3d4", "channel_id": "ch_a1b2c3d4", "channel_type": "blooio", "protocol": "pending", "direction": "inbound", "type": "string", "status": "active", "group_id": "grp_a1b2c3d4", "hybrid": {}, "error": {}, "fallback": { "recommended": false, "reason": "string" }, "to": "+15551234567", "dry_run": false, "would_send": false, "preview": {}, "poll": { "title": "Example title", "options": [ "string" ] }, "routing": { "mode": "explicit", "channel_type": "blooio", "number": "+15551234567", "sender_key": "string", "priority_id": "obj_a1b2c3d4", "priority": 0 }}