Supported RCS message types
Naxai RCS API supported message types and examples.
Supported RCS message types
Naxai RCS supports four message types: text, file, rich card and carousel. This page explains what each one can contain, its limits, and which media formats to use so your content displays well on both Android and iOS.
Sending any of the message types below requires an Agent. See RCS Agents.
Overview
| Message type | API type | What it contains | Key limits |
|---|---|---|---|
| Text | text | Text, optional suggestions | 2,000 characters |
| File | file | A single image, video or PDF | 100 MB per file |
| Rich card | standaloneRichCard | Media, title, description, suggestions | Title 200 / description 2,000 characters, 4 suggestions |
| Carousel | carouselRichCard | 2 to 10 rich cards the recipient swipes through | Same limits as a rich card, per card |
Every message type can be combined with suggestions: tappable replies and actions displayed with the message.
Text
A plain text message, the RCS equivalent of an SMS but without the 160-character segment limit.
| Property | Limit |
|---|---|
| Text | Up to 2,000 characters, UTF-8 encoded |
| Suggestions | Optional, see Suggestions |
{
"to": "32478123456",
"message": {
"type": "text",
"text": "Hello world with suggestions!"
},
"suggestions": [
{
"type": "reply",
"text": "Want more info?",
"postbackData": "more"
},
{
"type": "action",
"text": "Call us",
"postbackData": "call",
"action": {
"type": "dialAction",
"phoneNumber": "3223342323"
}
}
]
}
Keep it shortShort messages are easier to read. If you need more than a few lines, or want to add an image, use a rich card instead.
File
Sends a single image, video or document. The recipient's device displays it inline (images and videos) or as a downloadable file (PDF).
| Property | Limit |
|---|---|
| Image formats | JPEG, JPG, PNG, GIF |
| Video formats | MP4, M4V, MPEG, MPEG-4, WEBM, H263 |
| Document formats | |
| File size | Up to 100 MB |
| Thumbnail | Optional, JPEG, PNG or GIF, up to 100 kB |
{
"to": "32478123456",
"message": {
"type": "file",
"file": {
"fileUrl": "https://www.example.com/image.png",
"thumbnailUrl": "https://www.example.com/image-thumbnail.png",
"forceRefresh": false
}
}
}
Always add a thumbnailWithout a thumbnail, the recipient sees a blank placeholder until the file is downloaded. Depending on their settings, the download may not start automatically.
Rich card
A rich card groups media, a title, a description and up to 4 suggestions in a single message bubble. It is the best format for promotions, order updates, or any message that benefits from an image and a clear call to action.
| Property | Limit |
|---|---|
| Title | Up to 200 characters |
| Description | Up to 2,000 characters |
| Media | Image or video, see Media specifications |
| Suggestions | Up to 4 per card |
A rich card can have two layouts, set with cardOrientation:
| Orientation | Layout | Media height |
|---|---|---|
VERTICAL | Media on top, text and suggestions below | Set with height: SHORT, MEDIUM or TALL |
HORIZONTAL | Media on the left or right (thumbnailImageAlignment: LEFT or RIGHT), text beside it | Not customisable, height is ignored |
{
"to": "32478123456",
"message": {
"type": "standaloneRichCard",
"cardOrientation": "VERTICAL",
"cardContent": {
"title": "Rich Card",
"description": "This is a standalone rich card content",
"media": {
"height": "TALL",
"contentInfo": {
"fileUrl": "https://www.example.com/image.png",
"thumbnailUrl": "https://www.example.com/image-thumbnail.png",
"forceRefresh": false
}
},
"suggestions": [
{
"type": "action",
"text": "Shop now",
"postbackData": "shop_now",
"action": {
"type": "openUrlAction",
"url": "https://www.example.com"
}
},
{
"type": "reply",
"text": "I like RCS",
"postbackData": "like1"
}
]
}
}
}
Carousel
A carousel is a row of rich cards the recipient swipes horizontally. Use it to present several products, offers or options in a single message.
| Property | Limit |
|---|---|
| Number of cards | 2 to 10 |
| Card width | SMALL or MEDIUM (cardWidth), same for all cards |
| Title, description, suggestions | Same as a rich card, per card |
| Media | Image or video, see Media specifications |
{
"to": "32478123456",
"message": {
"type": "carouselRichCard",
"cardWidth": "MEDIUM",
"cardContents": [
{
"title": "Title 1",
"description": "Description card 1",
"media": {
"height": "MEDIUM",
"contentInfo": {
"fileUrl": "https://www.example.com/video.mp4",
"thumbnailUrl": "https://www.example.com/image.png",
"forceRefresh": false
}
},
"suggestions": [
{ "type": "reply", "text": "Like", "postbackData": "like_1" }
]
},
{
"title": "Title 2",
"description": "Description card 2",
"media": {
"height": "MEDIUM",
"contentInfo": {
"fileUrl": "https://www.example.com/image.png",
"thumbnailUrl": "https://www.example.com/image.png",
"forceRefresh": false
}
},
"suggestions": [
{ "type": "reply", "text": "Like", "postbackData": "like_2" }
]
}
]
}
}
Keep cards consistentUse the same media ratio, similar text lengths and the same number of suggestions on every card. On iOS, card height adapts to its content, so uneven cards make the carousel look irregular.
Suggestions
Suggestions are tappable buttons that guide the recipient through the conversation, using features already available on their device. There are two kinds:
- Suggested replies send a predefined answer back to your Agent.
- Suggested actions trigger something on the recipient's device: open a website, call a number, show or share a location, or create a calendar event.
When the recipient taps a suggestion, your Agent receives an event with the suggestion text and its postbackData. See Receiving RCS Messages.
Where suggestions appear
| Placement | Where to set it | Maximum |
|---|---|---|
| Message suggestions (chips below the message) | suggestions at the root of the request | 11 |
| Card suggestions (buttons inside a rich card or carousel card) | suggestions inside cardContent | 4 per card |
Common fields
All suggestions share these fields:
| Field | Required | Description |
|---|---|---|
type | Yes | reply or action |
text | Yes | Text displayed on the button. Max 25 characters |
postbackData | Yes | Data returned to your Agent when the suggestion is tapped. Max 2,048 characters |
action | Actions only | The action to perform, see the action types below |
Available suggestions
| Suggestion | type / action.type | What happens on tap |
|---|---|---|
| Suggested reply | reply | Sends the reply text back to your Agent |
| Open URL | openUrlAction | Opens a web page or deep link in the browser |
| Open URL in a webview | openUrlAction with application: WEBVIEW | Opens a web page inside the messaging app |
| Dial phone | dialAction | Opens the dialer with a number pre-filled |
| View location | viewLocationAction | Opens the map app at a given location |
| Share location | shareLocationAction | Asks the recipient to send their location |
| Create calendar event | createCalendarEventAction | Opens the calendar with an event pre-filled |
Suggested reply
A pre-written answer the recipient can send with one tap, instead of typing. Use it to steer the conversation ("Yes" / "No", "Track my order", "Talk to an agent").
| Field | Required | Limit |
|---|---|---|
text | Yes | Max 25 characters |
postbackData | Yes | Max 2,048 characters |
{
"type": "reply",
"text": "Track my order",
"postbackData": "track_order"
}Open URL
Opens the recipient's default browser at the given URL. If the URL is a deep link to an installed app, that app opens instead.
| Field | Required | Limit |
|---|---|---|
action.type | Yes | openUrlAction |
action.url | Yes | Valid URL, max 2,048 characters. Use the full https:// prefix |
action.application | No | BROWSER (default) or WEBVIEW, see Open URL in a webview |
{
"type": "action",
"text": "Shop now",
"postbackData": "shop_now",
"action": {
"type": "openUrlAction",
"url": "https://www.example.com/offers"
}
}Open URL in a webview
Opens the web page inside the messaging app, on top of the conversation, instead of switching to the browser. The recipient stays in the conversation, which works well for forms, checkouts or booking pages. If the device doesn't support webviews, the URL opens in the default browser.
| Field | Required | Limit |
|---|---|---|
action.type | Yes | openUrlAction |
action.url | Yes | Valid URL, max 2,048 characters. Only http:// and https:// links are supported |
action.application | Yes | WEBVIEW |
action.webviewViewMode | No | Height of the webview: FULL (default), TALL or HALF, see below |
action.description | No | Accessibility description of the webview, read by screen readers. Max 1,024 characters |
webviewViewMode | Display |
|---|---|
FULL | Covers the whole screen |
TALL | Covers about three quarters of the screen, the conversation stays visible at the top |
HALF | Covers half of the screen |
{
"type": "action",
"text": "Book a slot",
"postbackData": "book_slot",
"action": {
"type": "openUrlAction",
"url": "https://www.example.com/booking",
"application": "WEBVIEW",
"webviewViewMode": "TALL",
"description": "Booking form for your appointment"
}
}Dial phone
Opens the recipient's dialer with your number pre-filled. The recipient still confirms the call.
| Field | Required | Limit |
|---|---|---|
action.type | Yes | dialAction |
action.phoneNumber | Yes | E.164 format without leading +, 7 to 20 characters (for example 3223342323) |
{
"type": "action",
"text": "Call us",
"postbackData": "call",
"action": {
"type": "dialAction",
"phoneNumber": "3223342323"
}
}View location
Opens the recipient's default map app with a pin on the location you specify, for example your shop or a pick-up point.
| Field | Required | Limit |
|---|---|---|
action.type | Yes | viewLocationAction |
action.latitude | Yes | Number between -90.0 and +90.0 |
action.longitude | Yes | Number between -180.0 and +180.0 |
action.label | No | Name of the pin, max 1,024 characters |
{
"type": "action",
"text": "Find our store",
"postbackData": "view_store",
"action": {
"type": "viewLocationAction",
"latitude": 50.8466,
"longitude": 4.3528,
"label": "Naxai Store Brussels"
}
}Share location
Opens the location picker on the recipient's device so they can send you their location, for example to find the nearest store or organise a delivery. The location is sent to your Agent as an inbound message.
| Field | Required | Limit |
|---|---|---|
action.type | Yes | shareLocationAction |
{
"type": "action",
"text": "Share my location",
"postbackData": "share_location",
"action": {
"type": "shareLocationAction"
}
}Create calendar event
Opens the recipient's calendar app with a new event pre-filled. Use it for appointments, deliveries or events.
| Field | Required | Limit |
|---|---|---|
action.type | Yes | createCalendarEventAction |
action.startTime | Yes | RFC 3339 UTC timestamp, for example 2026-10-15T09:00:00Z |
action.endTime | Yes | RFC 3339 UTC timestamp, after startTime |
action.title | Yes | Max 100 characters |
action.description | Yes | Max 500 characters |
{
"type": "action",
"text": "Add to calendar",
"postbackData": "add_calendar",
"action": {
"type": "createCalendarEventAction",
"startTime": "2026-10-15T09:00:00Z",
"endTime": "2026-10-15T09:30:00Z",
"title": "Appointment at Naxai Store",
"description": "Your appointment is confirmed. See you soon!"
}
}Best practices
- One main action, then replies: use one suggested action as your main call to action, placed first, followed by up to 3 suggested replies. This renders consistently on Android and iOS.
- Don't mix card and message suggestions: after a rich card or carousel, avoid adding message-level suggestions. iOS merges them into the card, while Android keeps them separate.
- Keep labels short and explicit: "Book now" works better than "Click here". Labels longer than 25 characters are rejected.
- Icons are automatic: the device adds an icon to each action (phone, map, calendar...). You can't customise it.
Media specifications
General requirements
Supported Content-typesOnly the following content-types are supported :
image/jpeg, image/jpg, image/gif, image/png, video/h263, video/m4v, video/mp4, video/mpeg, video/mpeg4, video/webm
These apply to every media file you send, in file messages, rich cards and carousels:
- Public URL:
fileUrlandthumbnailUrlmust be publicly reachable over HTTPS, without authentication. - Correct content type: the file type is detected from the
Content-Typeheader returned by your server, so it must be present and accurate. - File size: up to 100 MB per file. Smaller files load faster, so aim for a few hundred kB for images.
- Thumbnail: up to 100 kB, JPEG, PNG or GIF. Recommended for videos and large images.
- Caching: files are cached after the first fetch. If you replace a file at the same URL, set
forceRefreshtotrue, or use a new URL. - Animated GIFs: supported on Android, but displayed as a still image on iOS.
Recommended formats (Android and iOS)
Android and iOS display card media differently: Android crops media to a fixed height, while iOS generally keeps the original ratio. The formats below give the most consistent result on both platforms. Use them by default.
| Use | cardOrientation / cardWidth | height | Aspect ratio | Recommended size | Safe zone (keep key content inside) |
|---|---|---|---|---|---|
| Vertical rich card | VERTICAL | TALL | 3:2 | 1620 × 1080 px | 1458 × 972 px, centred |
| Horizontal rich card | HORIZONTAL | n/a | 9:16 | 1080 × 1920 px | 972 × 972 px square, centred |
| Carousel card | MEDIUM | MEDIUM | 16:9 | 1920 × 1080 px | 1728 × 972 px, centred |
What is a safe zone?Depending on the device, screen size, text size setting or orientation, the edges of your media may be cropped. Keep logos, text, faces and products inside the safe zone (roughly the central 90% of the image) so they always remain visible.
For horizontal rich cards, iOS always displays the media as a square. Place your key content in the centred 1:1 area of the 9:16 image.
All media heights (Android reference)
If you target other card sizes, use the ratios below. They show the media in full on Android, without cropping. On iOS, media keeps its original ratio, so results may differ: always test on real devices.
Vertical rich card
height | Aspect ratio | Recommended size |
|---|---|---|
SHORT | 7:2 | 3780 × 1080 px |
MEDIUM | 21:9 | 2520 × 1080 px |
TALL | 3:2 | 1620 × 1080 px |
Carousel, cardWidth: SMALL
height | Aspect ratio | Recommended size |
|---|---|---|
SHORT | 16:10 | 1728 × 1080 px |
MEDIUM | 1:1 | 1080 × 1080 px |
TALL | 2:3 | 720 × 1080 px |
Carousel, cardWidth: MEDIUM
height | Aspect ratio | Recommended size |
|---|---|---|
SHORT | 8:3 | 2880 × 1080 px |
MEDIUM | 16:9 | 1920 × 1080 px |
TALL | 9:8 | 1215 × 1080 px |
Sizes are based on Full HD (1080p) screens. You can divide them by 3 (for example 540 × 360 px instead of 1620 × 1080 px) to reduce file size, keeping the same ratio.
If your media doesn't match the ratio of the selected height, Android crops it from the centre.
Tips for reliable rendering
- Keep text short: on Android, a long title and description reduce the space left for media in horizontal cards. On iOS, a card whose text exceeds 6 lines becomes tappable to open the full text, and the media is not shown in that view. Aim for 3 lines of title and description.
- Don't put critical text in the image only: font size settings and screen rotation can crop media. Repeat important information in the title or description.
- Test before launch: rendering depends on the device, OS version and user settings. Send your messages to test devices first, see Testing RCS Messages.
Not supported
Google Wallet actions (adding a pass, loyalty card or ticket to the recipient's wallet) are not currently available with Naxai.
What's next
- Sending RCS Messages via API — suggestions, message traffic types, and revoking a message
- RCS Broadcasts — send these message types in bulk
- Testing RCS Messages — preview messages on real devices before launch
- Send RCS message API reference — full request and response details
Updated 5 days ago

