Messages
Messages are individual communications within a chat thread.
Messages can include text, media attachments, rich link previews, special effects (like confetti or fireworks), and reactions. All messages are associated with a specific chat and sent from a phone number you own.
Messages support delivery status tracking, read receipts, and editing capabilities.
Rich Link Previews
Send a URL as a link part to deliver it with a rich preview card showing the
page’s title, description, and image (when available). A link part must be the
only part in the message — it cannot be combined with text or media parts.
To send a URL without a preview card, include it in a text part instead.
Limitations:
- A
linkpart cannot be combined with other parts in the same message. - Maximum URL length: 2,048 characters.
Ephemeral Messages (Privacy Tier)
For regulated or sensitive conversations, opt in to the ephemeral messages tier by contacting your Linq support contact. When enabled, every message on the covered phone numbers is automatically given a fixed 24-hour retention window — after that window the platform permanently deletes the message from Linq storage. There is no per-message flag; ephemerality is applied automatically based on your configuration.
You can request it at two scopes:
| Scope | Effect |
|---|---|
| Partner-wide | Every outbound and inbound message on every phone number under your account is retained for 24 hours, then deleted. |
| Per phone number | Only the specified phone numbers have their messages auto-deleted. The rest follow the standard message-retention policy. |
Behavioral differences vs the standard default:
| Aspect | Standard | Ephemeral |
|---|---|---|
| Retention | Retained per the standard message-retention policy | Hard backstop: 24 hours from when the message is created |
| After expiry | Message stays retrievable | Message is permanently deleted — GET /v3/messages/{messageId} returns 404 and it no longer appears in GET /v3/chats/{chatId}/messages |
| Content on expiry | N/A | Text, formatting, and attachment references are scrubbed; the message is gone, not blanked out |
| Cross-partner isolation | Enforced | Enforced |
How the 24-hour window works:
- The window is fixed at 24 hours from message creation (
created_at) and cannot be configured per message. - It mirrors the ephemeral attachments 1-day backstop, so a message and any media it carries expire together.
- Expiry is delivery-independent — the clock starts when the message is created, not when it is delivered or read.
What you observe:
- No expiry timestamp is exposed. API responses and webhook payloads do not include the deletion time. If you need it, compute
created_at + 24hyourself. - No deletion webhook is sent. There is no
message.deletedevent — a message simply stops being retrievable once its window passes. - Delivery is unaffected. Ephemeral messages send, deliver, and fire the usual
message.sent/message.receivedand status webhooks exactly like standard messages. Only retention changes.
When to choose ephemeral:
- You have a compliance requirement that the platform must not retain message content beyond a short window.
- The conversation is high-sensitivity (PHI, financial, identity verification) and you do not want it sitting in storage long-term.
- Your application is the system of record — you capture what you need from the delivery webhook in real time and do not rely on reading message history back from Linq later.
Important: ephemeral applies in both directions — messages you send and messages received by the phone numbers in that scope. Because Linq can no longer return the message after 24 hours, persist anything you need to keep from the webhook payload at the time it is delivered.
Send a message to an existing chat
Get messages from a chat
ModelsExpand Collapse
SentMessage { id, created_at, delivery_status, 9 more } A message that was sent (used in CreateChat and SendMessage responses)
A message that was sent (used in CreateChat and SendMessage responses)
DEPRECATED: Use delivery_status == "read" instead. Whether the message has been read.
parts: Array<TextPartResponse { reactions, type, value, text_decorations } | MediaPartResponse { id, filename, mime_type, 4 more } | LinkPartResponse { reactions, type, value } | IMessageAppPartResponse { app, layout, reactions, 3 more } >Message parts in order (text, media, and link)
Message parts in order (text, media, and link)
TextPartResponse { reactions, type, value, text_decorations } A text message part
A text message part
Reactions on this message part
Reactions on this message part
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
MediaPartResponse { id, filename, mime_type, 4 more } A media attachment part
A media attachment part
Reactions on this message part
Reactions on this message part
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
LinkPartResponse { reactions, type, value } A rich link preview part
A rich link preview part
Reactions on this message part
Reactions on this message part
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
IMessageAppPartResponse { app, layout, reactions, 3 more } An iMessage app card part.
An iMessage app card part.
app: App { bundle_id, name, team_id, app_store_id } Identifies the iMessage app (Messages app extension) that backs the card.
Identifies the iMessage app (Messages app extension) that backs the card.
layout: Layout { caption, image_subtitle, image_title, 4 more } Visible layout of the card. At least one of
caption, subcaption, trailing_caption, trailing_subcaption, or image_url must be
set, otherwise the card renders as an empty bubble.
image_url displays a preview image at the top of the card. The image renders on the
recipient’s card whether or not they have your app installed. The small icon beside the
caption is the app’s own icon and is not settable here.
* Note - requires a trusted chat w/ inbound activity
image_title and image_subtitle render as text overlaid on the image (title bold, subtitle
beneath it). They only appear when image_url is set — without an image there is nothing to
overlay — so setting either without image_url is rejected.
Visible layout of the card. At least one of
caption, subcaption, trailing_caption, trailing_subcaption, or image_url must be
set, otherwise the card renders as an empty bubble.
image_url displays a preview image at the top of the card. The image renders on the
recipient’s card whether or not they have your app installed. The small icon beside the
caption is the app’s own icon and is not settable here.
* Note - requires a trusted chat w/ inbound activity
image_title and image_subtitle render as text overlaid on the image (title bold, subtitle
beneath it). They only appear when image_url is set — without an image there is nothing to
overlay — so setting either without image_url is rejected.
Text shown below image_title, overlaid on the card image. Requires image_url.
Bold text overlaid on the card image. Requires image_url (rejected without it).
Reactions on this message part
Reactions on this message part
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
MessageSendResponse { chat_id, message } Response for sending a message to a chat
Response for sending a message to a chat
A message that was sent (used in CreateChat and SendMessage responses)
A message that was sent (used in CreateChat and SendMessage responses)
DEPRECATED: Use delivery_status == "read" instead. Whether the message has been read.
parts: Array<TextPartResponse { reactions, type, value, text_decorations } | MediaPartResponse { id, filename, mime_type, 4 more } | LinkPartResponse { reactions, type, value } | IMessageAppPartResponse { app, layout, reactions, 3 more } >Message parts in order (text, media, and link)
Message parts in order (text, media, and link)
TextPartResponse { reactions, type, value, text_decorations } A text message part
A text message part
Reactions on this message part
Reactions on this message part
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Text decorations applied to character ranges in the value
Text decorations applied to character ranges in the value
Character range [start, end) in the value string where the decoration applies.
start is inclusive, end is exclusive.
Characters are measured as UTF-16 code units. Most characters count as 1; some emoji count as 2.
MediaPartResponse { id, filename, mime_type, 4 more } A media attachment part
A media attachment part
Reactions on this message part
Reactions on this message part
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
LinkPartResponse { reactions, type, value } A rich link preview part
A rich link preview part
Reactions on this message part
Reactions on this message part
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
IMessageAppPartResponse { app, layout, reactions, 3 more } An iMessage app card part.
An iMessage app card part.
app: App { bundle_id, name, team_id, app_store_id } Identifies the iMessage app (Messages app extension) that backs the card.
Identifies the iMessage app (Messages app extension) that backs the card.
layout: Layout { caption, image_subtitle, image_title, 4 more } Visible layout of the card. At least one of
caption, subcaption, trailing_caption, trailing_subcaption, or image_url must be
set, otherwise the card renders as an empty bubble.
image_url displays a preview image at the top of the card. The image renders on the
recipient’s card whether or not they have your app installed. The small icon beside the
caption is the app’s own icon and is not settable here.
* Note - requires a trusted chat w/ inbound activity
image_title and image_subtitle render as text overlaid on the image (title bold, subtitle
beneath it). They only appear when image_url is set — without an image there is nothing to
overlay — so setting either without image_url is rejected.
Visible layout of the card. At least one of
caption, subcaption, trailing_caption, trailing_subcaption, or image_url must be
set, otherwise the card renders as an empty bubble.
image_url displays a preview image at the top of the card. The image renders on the
recipient’s card whether or not they have your app installed. The small icon beside the
caption is the app’s own icon and is not settable here.
* Note - requires a trusted chat w/ inbound activity
image_title and image_subtitle render as text overlaid on the image (title bold, subtitle
beneath it). They only appear when image_url is set — without an image there is nothing to
overlay — so setting either without image_url is rejected.
Text shown below image_title, overlaid on the card image. Requires image_url.
Bold text overlaid on the card image. Requires image_url (rejected without it).
Reactions on this message part
Reactions on this message part
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question.
Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field.
Sticker reactions have type “sticker” with sticker attachment details in the sticker field.
Type of reaction. Standard iMessage tapbacks are love, like, dislike, laugh, emphasize, question. Custom emoji reactions have type “custom” with the actual emoji in the custom_emoji field. Sticker reactions have type “sticker” with sticker attachment details in the sticker field.