BetaThe V4 API is in beta — endpoints and functionality may change.

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 it

to 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 it

What 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.