Send a message
/messagesThe primary endpoint for starting a message. from is optional: 1. Automatic — omit from to use hybrid/default-priority/implicit Blooio routing.
2. Hybrid owner — { "from": { "type": "hybrid", "number": "+15551234567" } } uses the uniquely resolved, hybrid-enabled owner of that representative number for a one-to-one phone send or an existing group owned by that hybrid sender.
3. Channel type — { "from": { "type": "blooio" } } walks the priority using only that type.
4. Natural number — { "from": { "type": "blooio", "number": "+15551234567" } } selects an exact numbered sender.
5. Sender key — { "from": { "type": "rcs_business", "sender_key": "support" } } selects an exact non-numbered sender.
6. Technical id — { "from": { "id": "ch_..." } } is the advanced exact-channel form. Type/priority routing is history-first and content-aware. Poll content currently routes only through Blooio. Existing groups require an exact sender whose channel owns the group or a hybrid sender that owns that channel. Legacy top-level channel_id and priority_id remain supported. Returns the chosen channel_id, chat_id, and routing explanation.
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
JSONfromoptionalSenderSelectorOptional sender selection. Omit it for automatic routing. Exact selectors bypass priority routing.
fromoptionalSenderSelectorOptional sender selection. Omit it for automatic routing. Exact selectors bypass priority routing.
idRequiredstringExact technical channel id (ch_...).
channel_idoptionalstringLegacy exact-channel selector. Prefer from.id.
priority_idoptionalstringLegacy priority selector. Prefer from.priority_id.
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.
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/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 }}