Skip to content
Get Started

Messages

Operations for sending and managing messages

Get messages
GET/api/v2/messages
Get a specific message
GET/api/v2/messages/{message_id}
Send a message
POST/api/send-message
Get message status
GET/api/status
Update an App Card
POST/api/messages/{message_handle}/update-app-card
ModelsExpand Collapse
MessageContent object { account_email, content, date_created, 13 more }
account_email: optional string

Email of the account

content: optional string

Message content

date_created: optional string

When the message was created

formatdate-time
date_sent: optional string

When the message was sent

formatdate-time
date_updated: optional string

When the message was last updated

formatdate-time
from_number: optional string

Sender phone number

is_outbound: optional boolean

Whether this is an outbound message

media_url: optional string

URL of attached media

message_handle: optional string

Unique message identifier

reply_to: optional object { message_handle, part_index }

Immediate parent of an iMessage inline reply. The target must belong to the same account, conversation, and sending line.

message_handle: string

Public handle of the immediate parent message

part_index: optional number

Advanced override for a known part of a multipart target. Omit this in normal reply requests and never guess it; requests default to 0. When replying to an attachment represented by its own webhook, use that webhook’s message_handle and omit part_index so Sendblue can use the stored authoritative part. Responses omit it when no authoritative immediate-parent part is available.

minimum0
maximum50
seat_id: optional string

UUID of the seat that sent the message. Present when seat_id was provided on send, or for dashboard-originated group messages.

formatuuid
send_style: optional "celebration" or "shooting_star" or "fireworks" or 10 more
One of the following:
"celebration"
"shooting_star"
"fireworks"
"lasers"
"love"
"confetti"
"balloons"
"spotlight"
"echo"
"invisible"
"gentle"
"loud"
"slam"
sender_email: optional string

Email of the seat (user) that sent the message. Auto-populated when a seat_id is provided on send. null for messages sent without a seat_id.

formatemail
status: optional "QUEUED" or "SENT" or "DELIVERED" or 2 more
One of the following:
"QUEUED"
"SENT"
"DELIVERED"
"ERROR"
"RECEIVED"
thread_originator: optional object { message_handle, part }

Message that originated an iMessage inline-reply thread.

message_handle: string

Public handle of the thread’s root message

part: optional string

Opaque Apple thread-originator part descriptor

to_number: optional string

Recipient phone number

MessageResponse object { account_email, app_card, content, 17 more }
account_email: optional string

Email of the account that sent the message

app_card: optional object { appName, extensionBundleId, layout, 7 more } or object { balloonBundleId, extensionBundleId, revision, 3 more }

App Card data sent or received with this message.

One of the following:
AppCard object { appName, extensionBundleId, layout, 7 more }

A Sendblue App Card rendered with Apple’s Messages framework. App Cards require a V2 Mac line and an iMessage-capable recipient; they never fall back to SMS. The URL is delivered to the identified Messages extension when the recipient taps the card. An initial App Card may include reply_to to create an inline reply. Later state changes use the update endpoint, which sends a new Apple message in the same App Card session. The feature is unavailable on the free plan.

appName: string
extensionBundleId: string
layout: object { caption, imageSubtitle, imageTitle, 5 more }

Visible card fields mirroring Apple’s MSMessageTemplateLayout.

caption: optional string
imageSubtitle: optional string

Secondary text overlaid on the preview image. Requires imageUrl.

maxLength1024
imageTitle: optional string

Text overlaid on the preview image. Requires imageUrl.

maxLength1024
imageUrl: optional string

HTTPS preview image fetched by the worker and sent as a hidden card attachment. JPEG, PNG, HEIC, HEIF, and WebP are supported up to 10 MB.

formaturi
maxLength2048
subcaption: optional string
summary: optional string

Fallback text used in notifications and non-rendering surfaces.

maxLength1024
trailingCaption: optional string
trailingSubcaption: optional string
teamId: string
url: string

URL delivered to the iMessage extension on tap. HTTPS URLs are limited to 2048 characters; data URLs carrying inline app state are limited to 16384.

formaturi
maxLength16384
appStoreId: optional number

Optional numeric App Store ID for recipients without the extension.

minimum1
fallbackText: optional string

Fallback text for notifications and surfaces that cannot render the card.

maxLength1024
interactive: optional boolean

Use Apple’s live layout when the extension is installed; false always sends the static template layout.

sessionIdentifier: optional string

Optional caller-supplied App Card session UUID. Generated automatically when omitted.

formatuuid
updateMessageHandle: optional string

Original message handle for an App Card continuation returned by the update endpoint.

InboundAppCard object { balloonBundleId, extensionBundleId, revision, 3 more }

App Card session metadata received from an iMessage contact.

balloonBundleId: string
extensionBundleId: string
revision: number

Retry-stable occurrence revision assigned to this inbound App Card state.

minimum1
sessionIdentifier: string
teamId: string
url: string
content: optional string

Message content

date_created: optional string

When the message was created

formatdate-time
date_updated: optional string

When the message was last updated

formatdate-time
error_code: optional number

Numeric error code if message failed

error_message: optional string

Error message if message failed

from_number: optional string

Sending phone number

is_outbound: optional boolean

Whether this is an outbound message

location: optional object { latitude, longitude, accuracy, 3 more }

Decoded Find My location share coordinates.

latitude: number
longitude: number
accuracy: optional number

Horizontal accuracy in meters

formatdouble
altitude: optional number

Altitude in meters

formatdouble
duration: optional string

Share duration selected by the recipient

timestamp: optional string
media_url: optional string

URL of attached media

message_handle: optional string

Unique identifier for tracking the message

message_type: optional "message" or "group" or "location"
One of the following:
"message"
"group"
"location"
number: optional string

Recipient phone number

reply_to: optional object { message_handle, part_index }

Immediate parent of an iMessage inline reply. The target must belong to the same account, conversation, and sending line.

message_handle: string

Public handle of the immediate parent message

part_index: optional number

Advanced override for a known part of a multipart target. Omit this in normal reply requests and never guess it; requests default to 0. When replying to an attachment represented by its own webhook, use that webhook’s message_handle and omit part_index so Sendblue can use the stored authoritative part. Responses omit it when no authoritative immediate-parent part is available.

minimum0
maximum50
seat_id: optional string

UUID of the seat that sent the message. Present when seat_id was provided on send, or for dashboard-originated group messages.

formatuuid
send_style: optional "celebration" or "shooting_star" or "fireworks" or 10 more

The iMessage expressive message style

One of the following:
"celebration"
"shooting_star"
"fireworks"
"lasers"
"love"
"confetti"
"balloons"
"spotlight"
"echo"
"invisible"
"gentle"
"loud"
"slam"
sender_email: optional string

Email of the seat (user) that sent the message. Auto-populated when a seat_id is provided on send. null for messages sent without a seat_id.

formatemail
status: optional "QUEUED" or "SENT" or "DELIVERED" or "ERROR"
One of the following:
"QUEUED"
"SENT"
"DELIVERED"
"ERROR"
thread_originator: optional object { message_handle, part }

Message that originated an iMessage inline-reply thread.

message_handle: string

Public handle of the thread’s root message

part: optional string

Opaque Apple thread-originator part descriptor

MessageListResponse object { data, pagination, status }
data: optional array of object { accountEmail, content, date_sent, 27 more }
accountEmail: optional string

Email of the account

content: optional string

Message content

date_sent: optional string

When the message was sent

formatdate-time
date_updated: optional string

When the message was last updated

formatdate-time
error_code: optional number

Numeric error code if message failed

error_detail: optional string

Detailed error information

error_message: optional string

Error message if message failed

error_reason: optional string

Error reason if message failed

from_number: optional string

Sender phone number

group_display_name: optional string

Display name for group messages

group_id: optional string

Group ID for group messages

is_outbound: optional boolean

Whether this is an outbound message

location: optional object { latitude, longitude, accuracy, 3 more }

Decoded Find My location share coordinates.

latitude: number
longitude: number
accuracy: optional number

Horizontal accuracy in meters

formatdouble
altitude: optional number

Altitude in meters

formatdouble
duration: optional string

Share duration selected by the recipient

timestamp: optional string
media_url: optional string

URL of attached media

message_handle: optional string

Unique message identifier

message_type: optional "message" or "group" or "location"
One of the following:
"message"
"group"
"location"
number: optional string

Primary phone number (to_number for outbound, from_number for inbound)

opted_out: optional boolean

Whether the recipient has opted out

participants: optional array of string

List of participants for group messages

plan: optional string

Account plan used for this message

reply_to: optional object { message_handle, part_index }

Immediate parent of an iMessage inline reply. The target must belong to the same account, conversation, and sending line.

message_handle: string

Public handle of the immediate parent message

part_index: optional number

Advanced override for a known part of a multipart target. Omit this in normal reply requests and never guess it; requests default to 0. When replying to an attachment represented by its own webhook, use that webhook’s message_handle and omit part_index so Sendblue can use the stored authoritative part. Responses omit it when no authoritative immediate-parent part is available.

minimum0
maximum50
seat_id: optional string

UUID of the seat that sent the message. Present when seat_id was provided on send, or for dashboard-originated group messages.

formatuuid
send_style: optional "celebration" or "shooting_star" or "fireworks" or 10 more

The iMessage expressive message style

One of the following:
"celebration"
"shooting_star"
"fireworks"
"lasers"
"love"
"confetti"
"balloons"
"spotlight"
"echo"
"invisible"
"gentle"
"loud"
"slam"
sendblue_number: optional string

Sendblue phone number used

sender_email: optional string

Email of the seat (user) that sent the message. Auto-populated when a seat_id is provided on send. null for messages sent without a seat_id.

formatemail
service: optional "iMessage" or "SMS" or "RCS"

The messaging service used

One of the following:
"iMessage"
"SMS"
"RCS"
status: optional "REGISTERED" or "PENDING" or "SENT" or 7 more
One of the following:
"REGISTERED"
"PENDING"
"SENT"
"DELIVERED"
"RECEIVED"
"QUEUED"
"ERROR"
"DECLINED"
"ACCEPTED"
"SUCCESS"
thread_originator: optional object { message_handle, part }

Message that originated an iMessage inline-reply thread.

message_handle: string

Public handle of the thread’s root message

part: optional string

Opaque Apple thread-originator part descriptor

to_number: optional string

Recipient phone number

was_downgraded: optional boolean

Whether the message was downgraded from iMessage to SMS

Whether there are more messages available

Number of messages returned in this request

Number of messages skipped

Total number of messages matching the filters

status: optional string
MessageRetrieveResponse object { data, status }
data: optional object { accountEmail, content, date_sent, 27 more }
accountEmail: optional string

Email of the account

content: optional string

Message content

date_sent: optional string

When the message was sent

formatdate-time
date_updated: optional string

When the message was last updated

formatdate-time
error_code: optional number

Numeric error code if message failed

error_detail: optional string

Detailed error information

error_message: optional string

Error message if message failed

error_reason: optional string

Error reason if message failed

from_number: optional string

Sender phone number

group_display_name: optional string

Display name for group messages

group_id: optional string

Group ID for group messages

is_outbound: optional boolean

Whether this is an outbound message

location: optional object { latitude, longitude, accuracy, 3 more }

Decoded Find My location share coordinates.

latitude: number
longitude: number
accuracy: optional number

Horizontal accuracy in meters

formatdouble
altitude: optional number

Altitude in meters

formatdouble
duration: optional string

Share duration selected by the recipient

timestamp: optional string
media_url: optional string

URL of attached media

message_handle: optional string

Unique message identifier

message_type: optional "message" or "group" or "location"
One of the following:
"message"
"group"
"location"
number: optional string

Primary phone number (to_number for outbound, from_number for inbound)

opted_out: optional boolean

Whether the recipient has opted out

participants: optional array of string

List of participants for group messages

plan: optional string

Account plan used for this message

reply_to: optional object { message_handle, part_index }

Immediate parent of an iMessage inline reply. The target must belong to the same account, conversation, and sending line.

message_handle: string

Public handle of the immediate parent message

part_index: optional number

Advanced override for a known part of a multipart target. Omit this in normal reply requests and never guess it; requests default to 0. When replying to an attachment represented by its own webhook, use that webhook’s message_handle and omit part_index so Sendblue can use the stored authoritative part. Responses omit it when no authoritative immediate-parent part is available.

minimum0
maximum50
seat_id: optional string

UUID of the seat that sent the message. Present when seat_id was provided on send, or for dashboard-originated group messages.

formatuuid
send_style: optional "celebration" or "shooting_star" or "fireworks" or 10 more

The iMessage expressive message style

One of the following:
"celebration"
"shooting_star"
"fireworks"
"lasers"
"love"
"confetti"
"balloons"
"spotlight"
"echo"
"invisible"
"gentle"
"loud"
"slam"
sendblue_number: optional string

Sendblue phone number used

sender_email: optional string

Email of the seat (user) that sent the message. Auto-populated when a seat_id is provided on send. null for messages sent without a seat_id.

formatemail
service: optional "iMessage" or "SMS" or "RCS"

The messaging service used

One of the following:
"iMessage"
"SMS"
"RCS"
status: optional "REGISTERED" or "PENDING" or "SENT" or 7 more
One of the following:
"REGISTERED"
"PENDING"
"SENT"
"DELIVERED"
"RECEIVED"
"QUEUED"
"ERROR"
"DECLINED"
"ACCEPTED"
"SUCCESS"
thread_originator: optional object { message_handle, part }

Message that originated an iMessage inline-reply thread.

message_handle: string

Public handle of the thread’s root message

part: optional string

Opaque Apple thread-originator part descriptor

to_number: optional string

Recipient phone number

was_downgraded: optional boolean

Whether the message was downgraded from iMessage to SMS

status: optional string