Skip to main content
Version: Latest

Content Types

This page details supported message types and their presentation by channel. Except where from and to are shown, JSON blocks are content fragments: add the sender and recipient from Overview before sending.

Availability by channel​

TypeWhatsAppInstagramMessengerTelegramSMSWeb Chatt
Text✅✅✅✅✅✅
Image✅✅✅✅✅✅
Video✅✅✅✅✅¹✅
Audio✅✅✅✅✅¹✅
Document✅❌✅✅✅¹✅
Sticker✅✅❌✅❌✅
Location✅Text fallbackText fallback✅❌✅
Contact(s)✅Text fallbackText fallback✅❌✅
Interactive✅✅✅✅❌✅
Template✅❌❌❌❌❌
Reaction✅✅✅✅❌✅
Reply✅❌✅✅❌✅
Mark as seen✅✅✅❌❌✅
Is typing✅✅✅✅❌✅
Payment Request✅❌❌❌❌❌
Order Status✅❌❌❌❌❌

¹ Media on SMS is available only for Twilio MMS and remains carrier-dependent. Brazilian SMS is text-only. Additional carrier costs may apply.

² Web Chatt uses the same content shape as the examples on this page (WhatsApp-style payloads from Hub). Send with POST /v1/communication/web-chatt2me/message and from / to as in Web Chatt. The endpoint is included in the OpenAPI reference. Messages for offline visitors are accepted and kept pending. WhatsApp-only types (template, payment request, order status) are not used; mark-as-seen is supported on WhatsApp, Instagram, Messenger, and Web Chatt.

³ For WhatsApp, Instagram, Messenger, Telegram, and SMS, from may be the application channel UUID or the channel-specific alternate — see Sending messages overview. Web Chatt also accepts its configured display name, ignoring case.


Media captions​

Send a caption as content.text alongside one media field in the same content object. Use text, not a separate caption property. Media support does not imply caption support:

ChannelImage + textVideo + textAudio + textDocument + text
TelegramYesYesYesYes
Web ChattYesYesNoYes
WhatsAppYesYesNoYes
InstagramNoNoNoMedia not supported
MessengerNoNoNoNo
Twilio MMSYes¹Yes¹Yes¹Yes¹
Brazilian SMSMedia not supportedMedia not supportedMedia not supportedMedia not supported

¹ Twilio MMS sends text and media in the same MMS, subject to carrier support; this is not a native media caption. Brazilian SMS is text-only.

No means the media can be sent, but companion text is not delivered or displayed as its caption. In those cases, send the media without text and send the text in a separate request. Web Chatt displays image/video/document captions below the attachment, aligned to the left, for both incoming and outgoing messages. Document captions require widget v1.3.3 or later. Web Chatt supports audio, but does not display audio captions; WhatsApp audio has no caption, including when voice: true. Instagram and Messenger discard companion text on media attachments. Instagram also does not support outbound documents.

For example, this sends an image with a caption on Telegram, Web Chatt, or WhatsApp:

{
"content": {
"imageUrl": "https://example.com/image.jpg",
"text": "Your order is ready"
}
}

The request schema accepts optional text on media variants shared by several channels. That acceptance alone does not guarantee that the recipient will see a caption; use the matrix above.


Media size summary​

The limit is selected from the channel and the media field used in content. MB values below are implemented as MiB (1024 × 1024 bytes). URLs must be reachable by the Hub and by the destination provider.

ChannelImageVideoAudioDocumentSticker
WhatsApp5 MB16 MB16 MB100 MiB100 KB static / 500 KB animated
Instagram8 MB25 MB25 MBNot supportedPlatform sticker only
Messenger25 MB25 MB25 MB25 MBNot supported
Telegram10 MB photo / 50 MB animation50 MB50 MB50 MBWebP: 50 MB transport; WebM: 256 KB; TGS: 64 KB
Twilio MMS5 MB total500 KB per media; 5 MB total500 KB per media; 5 MB total500 KB per media; 5 MB totalNot supported
Brazilian SMSNot supportedNot supportedNot supportedNot supportedNot supported
Web Chatt25 MB visitor upload / 50 MB API outbound50 MB50 MB50 MBNot supported by the widget upload flow

Telegram media is uploaded by the Hub with multipart. This is why the supported limits are higher than Telegram's remote-URL limits. Telegram bots can download inbound files only up to 20 MB.

The Web Chatt widget uploads files directly to storage with a short-lived signed POST. The Hub confirms the stored object before acknowledging and persisting the canonical URL; message media is not transported as base64 through the WebSocket.

Outbound media normalization​

The Hub converts only these source formats before provider submission. All other formats remain subject to the selected channel's media rules and size limits. Ordinary WhatsApp document messages have no local MIME or extension allowlist; final format acceptance depends on the provider.

Source inputConversion
image/gifTelegram sends it as animation. WhatsApp converts it to silent H.264 MP4 video. Other supported channels retain GIF.
image/webpStatic PNG for WhatsApp, Telegram and Twilio MMS. Animated WebP becomes silent MP4 animation on WhatsApp/Telegram and GIF on Twilio MMS. Instagram, Messenger and Web Chatt retain supported WebP.
Supported audio in Telegram audioUrlOGG/Opus sent as a native voice message. Use documentUrl to send audio bytes as a generic file.
audio/webm or video/webm in audioUrlM4A for normal WhatsApp audio, Instagram, Messenger and Twilio MMS. For WhatsApp with voice: true, OGG/Opus. Retained for Web Chatt.
MOV/QuickTime, AVI, MKV or WebM in videoUrlH.264/AAC MP4 on all channels. Use documentUrl when the original file bytes must be retained.

If conversion fails, the Hub returns a conversion error and does not submit the original file to the provider.

See each channel guide for the explicit formats and inbound behavior.


Text​

The simplest type. Available on all channels. Telegram converts supported text markers to HTML; see its formatting example.

{
"from": "channel-uuid",
"to": "5511993986082",
"content": {
"text": "Hello! How can I help you?"
}
}

Image​

Send an image via public URL. The caption (text) is optional on WhatsApp, Telegram, Twilio MMS, and Web Chatt. Instagram and Messenger discard this companion text when adapting a media attachment; send a separate text message when the caption is required.

{
"content": {
"imageUrl": "https://example.com/image.jpg",
"text": "Optional caption"
}
}
tip

The URL must be publicly accessible and return the correct content type. Supported MIME types vary by channel; do not use image/* as the value of mimeType.


Video​

The same caption availability as Image applies. Instagram/Messenger media does not retain text.

{
"content": {
"videoUrl": "https://example.com/video.mp4",
"text": "Optional video description"
}
}

Audio​

{
"content": {
"audioUrl": "https://example.com/audio.mp3"
}
}

audioUrl requests the channel's native audio presentation. Use documentUrl when the same bytes must be delivered as a generic file. Telegram always normalizes supported audioUrl input to OGG/Opus and sends a native voice message.

For WhatsApp only, set voice to true to send a voice note (PTT). Omit or set false for a normal audio message. The Hub normalizes supported voice input to OGG/Opus.

{
"content": {
"audioUrl": "https://example.com/voice.ogg",
"voice": true
}
}

Only Telegram supports text as a native audio/voice-message caption among Telegram, Web Chatt, WhatsApp, Instagram, and Messenger. WhatsApp and Web Chatt do not deliver/display audio captions; Instagram and Messenger discard companion text. Send the description separately on those channels. Twilio MMS can carry text alongside audio, subject to carrier support.

Telegram audio with a caption:

{
"content": {
"audioUrl": "https://example.com/audio.mp3",
"text": "Your audio instructions"
}
}

Document (WhatsApp, Messenger, Telegram, Twilio MMS, and Web Chatt)​

For ordinary WhatsApp documentUrl messages, the Hub attempts any file format up to 100 MiB (104,857,600 bytes). Known documented formats include TXT, PDF, DOC/DOCX, PPT/PPTX and XLS/XLSX; this list is not exhaustive. Other formats, such as CSV, may also be accepted. EXE, ZIP and unknown formats are attempted without a guarantee of provider acceptance. Original bytes are preserved. This rule does not extend to template documents or other channels.

enqueued confirms submission, not delivery. Immediate rejection returns status: error in the send response; later provider failures are exposed through subscribed status webhooks as status: error, with the available provider error details.

Example CSV document:

{
"content": {
"documentUrl": "https://example.com/report.csv",
"filename": "report.csv",
"mimeType": "text/csv"
}
}

Send files such as PDFs, spreadsheets, presentations, etc. Optional text is delivered as a caption on WhatsApp, Telegram, and Web Chatt (widget v1.3.3 or later). Messenger discards document captions; send the description separately. Instagram does not support outbound documents. Twilio MMS can carry text alongside a document, subject to carrier support.

{
"content": {
"documentUrl": "https://example.com/file.pdf",
"filename": "Commercial Proposal.pdf",
"mimeType": "application/pdf",
"text": "Your commercial proposal"
}
}
FieldRequiredDescription
documentUrl✅Public URL of the file
filename❌Optional display name; inferred when omitted
mimeType❌MIME type of the file (e.g. application/pdf)
text❌Caption on WhatsApp/Telegram/Web Chatt; see caption support

If filename is omitted, WhatsApp infers a filename from the URL when possible and otherwise leaves it to the provider; Telegram infers from the URL, falling back to document. Other channels use their attachment flow. Supply filename to control the name on channels that support it.


Sticker​

WhatsApp​

{
"content": {
"stickerUrl": "https://example.com/sticker.webp"
}
}

Instagram​

Use the platform sticker identifier:

{
"content": {
"stickerUrl": "like_heart"
}
}

Telegram​

{
"content": {
"stickerUrl": "https://example.com/sticker.webp"
}
}

Telegram stickers must be native WebP, WebM or TGS. WhatsApp accepts GIF, JPEG, PNG or WebP input and normalizes it to the provider's WebP sticker representation. Instagram accepts a platform identifier such as like_heart, not an HTTP URL. Messenger and SMS reject stickerUrl with CHANNEL_MEDIA_NOT_SUPPORTED; use imageUrl to send the same visual as an ordinary image. Web Chatt preserves browser-compatible outbound sticker media.


Location (WhatsApp and Telegram)​

{
"content": {
"location": {
"latitude": -23.5505,
"longitude": -46.6333,
"name": "Chatt2.me HQ",
"address": "Av. Paulista, 1000, São Paulo, SP"
}
}
}
FieldRequiredDescription
latitude✅Between -90 and 90
longitude✅Between -180 and 180
name❌Location name (WhatsApp or Telegram venue)
address❌Text address (WhatsApp or Telegram venue)

Coordinates without a name/address use Telegram's location presentation. A nonempty name or address selects a venue; when only one is supplied the Hub uses it for both required venue fields. WhatsApp keeps the optional label/address. Web Chatt also accepts location content. Instagram and Messenger accept the same input as a text fallback containing name, address, and a Maps link; they do not send a native location card.


Contact(s) (WhatsApp and Telegram)​

Use the Hub's flat camelCase fields. A nested provider name object and wa_id are not public request fields. Prefer a usable display name and a phone; without formattedName, the Hub derives the name from firstName/lastName, then the primary phone. phoneNumber is a simple primary phone; phones preserves multiple entries. Each phone entry uses phone and optional type/waId.

Single contact​

{
"from": "channel-uuid",
"to": "5511993986082",
"content": {
"contact": {
"formattedName": "John Smith",
"firstName": "John",
"lastName": "Smith",
"phoneNumber": "5511999999999",
"phones": [{ "phone": "5511999999999", "type": "CELL", "waId": "5511999999999" }],
"emails": [{ "email": "[email protected]", "type": "WORK" }],
"addresses": [{ "street": "Av. Paulista, 1000", "city": "São Paulo", "state": "SP", "zip": "01310-100", "country": "Brazil", "countryCode": "BR", "type": "WORK" }],
"org": { "company": "Example Ltd.", "department": "Sales", "title": "Manager" },
"urls": [{ "url": "https://example.com", "type": "WORK" }],
"birthday": "1990-06-15"
}
}
}

middleName, prefix, and suffix are also optional. Each nested collection (phones, emails, addresses, urls) has at most 100 entries; contacts itself also has a maximum of 100. emails[].email and urls[].url are required inside their entries; address and organization fields are optional. The waId field is WhatsApp metadata, not the contact's Hub ID.

Multiple contacts​

{
"from": "channel-uuid",
"to": "5511993986082",
"content": {
"contacts": [
{ "formattedName": "John Smith", "firstName": "John", "phoneNumber": "5511999999999" },
{ "formattedName": "Jane Smith", "firstName": "Jane", "phones": [{ "phone": "5511988888888", "type": "CELL" }] }
]
}
}

On Telegram a single contact is a native contact card with a primary phone/name and, when extra fields exist, a generated vCard. If the vCard exceeds 2,048 UTF-8 bytes, the Hub reduces the extra fields (up to three emails and one address, omitting URLs/department), and may truncate the reduced card; full field preservation is not guaranteed. Multiple contacts are delivered as a contacts.vcf document, preserving the generated vCard fields rather than multiple native cards. See Telegram.

Web Chatt also accepts contact content. Instagram and Messenger accept contact(s) as readable text, rather than a native card or vCard; do not rely on those fallbacks to preserve every rich field.


Mark as seen (WhatsApp, Instagram, Messenger, and Web Chatt)​

{
"content": {
"markSeen": true
}
}

WhatsApp marks one target read: specify an inbound Hub ID from payload.message.id in context.messageId, or omit context to select the latest inbound with a usable provider ID for that recipient. A successful result returns the existing target's messageId; it creates no message. If no target is found, the result has status: "error", messageId: "", and errorMessage: "No message to mark as read".

{
"from": "channel-uuid",
"to": "5511993986082",
"content": {
"markSeen": true,
"context": { "messageId": "a16c0971-1887-4612-a0b2-d9489d6ca04f" }
}
}

Instagram and Messenger forward the channel's seen action and persist an outbound record with a new Hub ID; their ordinary session/billing effects also apply. Web Chatt marks all unread inbound messages for that visitor read. Display of read indicators remains dependent on provider/client settings.


Is typing (WhatsApp, Instagram, Messenger, Telegram, and Web Chatt)​

Send a standalone control request, without text, media, context, or any other content field:

{
"from": "channel-uuid",
"to": "5511993986082",
"content": { "isTyping": true }
}

Stop it with a separate request:

{
"from": "channel-uuid",
"to": "5511993986082",
"content": { "isTyping": false }
}

Instagram, Messenger, and Web Chatt send a stop action. WhatsApp and Telegram treat false as a successful no-op; the provider indicator expires on its own. Starting typing requires a known recipient in that channel; WhatsApp additionally needs a previous inbound with a provider message ID. An unknown visitor, missing inbound target, disconnected Web Chatt visitor, or failed provider action can return status: "error" with messageId: "". Success also has an empty ID because no message is persisted. SMS and sandboxes do not support typing. See the typing request schema.


Reply​

Replying to a specific message creates a visual thread — the recipient sees the original message quoted above your reply. The Hub forwards replies on WhatsApp, Telegram, Messenger, and Web Chatt; provider/client rendering can vary.

See Reactions and Reply for the context.messageId field reference and examples.


Next steps​