Message content
Flat v4 content fields: text, attachments, parts, rich links, polls, and custom bubbles.
Content is defined by top-level fields whose names identify the shape — there is no content wrapper and no type discriminator. Provide exactly one content field (text may accompany attachments); conflicting fields return 422 invalid_content.
Text
{
"to": "+15551234567",
"text": "Hello!",
"reply_to": "msg_parent"
}Optional top-level modifiers (where the channel supports them) include effect for iMessage screen/bubble effects and link_preview overrides. reply_to stays top-level because it modifies the whole outgoing message.
Attachments
{
"to": "+15551234567",
"attachments": ["https://cdn.example.com/photo.jpg"],
"text": "Optional caption"
}attachments is an array of public URLs. See Attachments for URL requirements and common formats.
Parts
Use parts when you need several parts delivered as one message (text + media, or multiple media items) on channels that support it:
{
"to": "+15551234567",
"parts": [
{ "text": "Here are the photos" },
{ "url": "https://cdn.example.com/one.jpg" },
{ "url": "https://cdn.example.com/two.jpg" }
]
}Prefer plain attachments for a simple attachment list.
Rich link
Some channels support a structured rich-link payload (title, image, URL):
{
"to": "+15551234567",
"rich_link": { "url": "https://example.com/launch", "title": "Launch day" }
}If unsupported, Blooio falls back or returns a capability error.
Poll
Polls are normal message content on Blooio. Constrain routing with "channel_type": "blooio" so only poll-capable channels are considered:
{
"channel_type": "blooio",
"to": "+15551234567",
"poll": {
"title": "Which day works?",
"options": ["Monday", "Wednesday", "Friday"]
}
}Dedicated chat poll endpoints remain available for compatibility. Vote and results live under /chats/{chatId}/polls.
Custom bubble (iMessage app)
Point at your own iMessage app extension and Blooio assembles and sends the app balloon (Blooio iMessage only). Recipients who have your app render its interactive card; everyone else sees a template card plus Apple's App Store fallback:
{
"to": "+15551234567",
"imessage_app": {
"bundle_id": "com.example.app.imessage",
"team_id": "TEAMID1234",
"url": "https://example.com/state?s=eyJzdGVwIjoxfQ",
"app_name": "Example App",
"caption": "Your turn!"
}
}Inbound custom bubbles arrive as a message.received webhook with message_type: "imessage_app" and a structured imessage_app object. See Custom bubbles (iMessage apps) for the full send and receive field guide.
Capability-aware routing
When from is omitted, Blooio skips channels that cannot deliver the content (for example polls on Twilio). An exact from fails clearly if that channel cannot send the content.