Blooio API Reference
Messages

Send a message

POST
/chats/{chatId}/messages

Send a message to a chat. The chatId can be: (1) E.164 phone number, (2) email address, (3) group ID (grp_xxxx), or (4) comma-separated list of phone/email for multi-recipient chats. For multi-recipient, an unnamed group is automatically created or reused if the exact participant combination already exists. For explicit groups, the group must be linked to an existing iMessage chat.

iMessage send-with-effect: set the optional effect field to attach an Apple expressive send (slam, loud, gentle, invisible-ink) or screen effect (echo, spotlight, balloons, confetti, love, lasers, fireworks, celebration). Effects are an iMessage-only feature — when the recipient is on SMS/RCS the message is delivered without the animation. Effects are not supported in multipart (parts) mode.

Threaded replies (iMessage inline reply): set the optional reply_to field to send the outgoing message as a reply to a specific earlier message. Two shapes are accepted: { "message_id": "msg_…" } references a Blooio-minted message in the same chat (most common — the message_id returned by an earlier send or surfaced on a message.received webhook), or { "guid": "…", "part_index": 0 } references the raw iMessage GUID for the rare case where the parent wasn't recorded by Blooio. The reply must target the same chat and the same from-number as the new send, and the parent must be no older than 30 days (the iMessage on-device retention horizon). Reply support is iMessage-only and is rejected on Twilio, dashboard-Twilio, and hybrid send paths; it's also rejected on multi-message fan-outs (text array or per-part URL-balloon batch). See the 400 responses for the full set of reply_target_* error codes.

Authorization

BearerAuth
AuthorizationBearer <token>

API key authentication. Use your API key as the bearer token.

In: header

Path Parameters

chatId*string

Chat identifier. Can be: (1) phone number in E.164 format (e.g., +15551234567), (2) email address, (3) group ID (grp_xxxx), or (4) comma-separated list of phone numbers/emails for multi-recipient group chats (e.g., +15551234567,+15559876543). All values should be URL-encoded.

Header Parameters

Idempotency-Key?string

Unique key to prevent duplicate message sends. If the same key is used again, the original message_id and status are returned.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/chats/%2B15551234567/messages" \  -H "Content-Type: application/json" \  -d '{}'
{
  "message_id": "string",
  "message_ids": [
    "string"
  ],
  "count": 0,
  "status": "queued",
  "group_id": "string",
  "group_created": true,
  "participants": [
    "string"
  ],
  "parent_unresolved": true
}
{
  "message_id": "string",
  "message_ids": [
    "string"
  ],
  "count": 0,
  "status": "queued",
  "group_id": "string",
  "group_created": true,
  "participants": [
    "string"
  ],
  "parent_unresolved": true
}
{
  "error": "ApiError",
  "message": "You can only reply to messages from the last 30 days",
  "status": 400,
  "code": "reply_target_expired"
}
{
  "error": "string",
  "message": "string",
  "status": 0,
  "code": "string"
}
{
  "error": "ApiError",
  "message": "Inbound-only plan: outbound is restricted to contacts who messaged this number first.",
  "status": 403,
  "code": "inbound_only_no_prior_inbound",
  "allocation_id": "alloc_...",
  "external_id": "+15555550199"
}
{
  "error": "ApiError",
  "message": "Reply target message not found",
  "status": 404,
  "code": "reply_target_not_found"
}
{
  "error": "string",
  "message": "string",
  "status": 0,
  "code": "string"
}
{
  "error": "string",
  "message": "string",
  "status": 0,
  "code": "string"
}