Send a message
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 API key authentication. Use your API key as the bearer token.
In: header
Path Parameters
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
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"
}