Message sending
Send with POST /messages, optional from, chat replies, and routing responses.
The primary way to send in v4 is POST /messages. You pass a recipient and typed content; Blooio picks the sender unless you add from.
Send to a recipient
curl -X POST https://api.blooio.com/v4/messages \
-H "Authorization: Bearer bl_live_..." \
-H "Content-Type: application/json" \
-d '{
"to": "+15551234567",
"content": { "type": "text", "text": "Hello from Blooio!" }
}'Try itto can be a phone number (E.164), an email, or an object for channel-specific identifiers (for example AMB). Multiple recipients fan out into separate sends.
Configure which senders your API key can use on the Channels page in the dashboard. See Channels & senders for from.type, from.number, from.sender_key, and from.id.
Reply in an existing chat
When you already have a chat_id, post to that chat. The channel and peer are inferred — do not send from or to:
curl -X POST https://api.blooio.com/v4/chats/chat_.../messages \
-H "Authorization: Bearer bl_live_..." \
-H "Content-Type: application/json" \
-d '{
"content": { "type": "text", "text": "Following up" }
}'Try itWhat comes back
A successful send returns the message at the top level (not wrapped in data), including chat_id, channel_id, channel_type, status, and often a routing object explaining how the sender was chosen.
{
"id": "msg_...",
"chat_id": "chat_...",
"channel_id": "ch_...",
"channel_type": "blooio",
"status": "queued",
"routing": { "mode": "priority", "channel_type": "blooio", "priority": 1 }
}Use an Idempotency-Key header for safe retries — see Idempotency.
Content
Every send uses a typed content object. Start with text; see Message content for media, multipart, and polls, and Attachments for media URLs.