Message content
Flat v4 content fields: text, attachments, parts, rich links, and polls.
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.
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.