Send RCS message
Send an RCS message to one of your customer’s contacts. Authenticate
with your Splashify partner API key (Authorization: Bearer pk_live_…,
the same key as the rest of the partner API). The request body
mirrors the standard RCS message shape — text, rich card, carousel,
or media, with optional interactive suggestions.
POST /api/v1/partner/customers/{customer_id}/rcs/sendBehind the scenes we pick the right RCS sender for the customer and
auto-prefix phone_no with + if you forgot the country-code prefix.
The upstream RCS provider’s response (status code + body) is returned
to you unchanged.
Prerequisites
customer_idmust belong to your partner account.- The customer must be RCS-Active. This is set up once by your admin team after KYC approval; if it’s not done yet the endpoint returns 400.
Common fields
| Field | Type | Required | Notes |
|---|---|---|---|
type | string | yes | One of text, card, multiple_cards, media |
phone_no | string | yes | E.164 (e.g. +919876543210). We auto-prefix + if you send the bare digits |
extra | string | no | Free-form passthrough metadata; surfaces on the status callback |
suggestions | array | no | Interactive buttons (see below) |
The sender identity is bound to the customer_id in the URL — you do
not need to (and cannot) override it in the body.
1. Plain text
{
"type": "text",
"phone_no": "+919876543210",
"text": "Your order #12345 has shipped."
}text supports up to 2500 chars.
2. Text with suggestions
{
"type": "text",
"phone_no": "+919876543210",
"text": "Handy suggestions",
"suggestions": [
{
"type": "view_location",
"text": "Our store",
"latitude": 19.076090,
"longitude": 72.877426,
"postback": "store-mumbai"
},
{
"type": "dial",
"text": "Call us",
"call_to": "+917718963553",
"postback": "support-line"
},
{
"type": "url",
"text": "Track order",
"url": "https://acme.com/orders/12345",
"postback": "track"
},
{
"type": "message",
"text": "Yes",
"postback": "confirm-yes"
}
]
}Up to 11 suggestions per message (RM platform limit).
3. Rich card (standalone)
{
"type": "card",
"phone_no": "+919876543210",
"extra": "order-12345",
"card": {
"title": "Your order has shipped",
"description": "Tracking number RTML123. Expected delivery 24 May.",
"url": "https://cdn.acme.com/orders/12345/banner.jpg",
"suggestions": [
{
"type": "url",
"text": "Track",
"url": "https://acme.com/track/12345",
"postback": "track"
}
]
}
}| Card field | Limit |
|---|---|
title | ≤ 200 chars |
description | ≤ 2000 chars |
url | Public HTTPS image / media URL |
card.suggestions | Same shape as top-level suggestions |
4. Rich card carousel
{
"type": "multiple_cards",
"phone_no": "+919876543210",
"cards": [
{
"card": {
"title": "Card 1",
"description": "First card body",
"url": "https://cdn.acme.com/c1.jpg"
},
"suggestions": [
{ "type": "message", "text": "Hello", "postback": "greet" }
]
},
{
"card": {
"title": "Card 2",
"description": "Second card body",
"url": "https://cdn.acme.com/c2.jpg"
},
"suggestions": [
{ "type": "dial", "text": "Call", "call_to": "+917718963553", "postback": "call" }
]
}
]
}Up to 10 cards in a single carousel.
5. Media (PDF / image / video)
{
"type": "media",
"phone_no": "+919876543210",
"url": "https://cdn.acme.com/invoice-12345.pdf"
}Media types Route Mobile accepts:
image/jpeg,image/pngvideo/mp4application/pdf
Media with URL suggestion
{
"type": "media",
"phone_no": "+919876543210",
"url": "https://cdn.acme.com/preview.jpg",
"extra": "campaign-summer",
"fallback_text": "Open https://acme.com/summer for the full deal",
"suggestions": [
{ "type": "url", "text": "Shop now", "url": "https://acme.com/summer", "postback": "summer-cta" }
]
}Response
On success the upstream provider returns:
{
"message": "Message request has been created",
"id": "9f8d32c0-1f60-11f0-8d0c-0a58a9fedgrc02"
}Pin the id — it appears on every subsequent status callback
(rcs.status.sent / delivered / read / failed). See
RCS Incoming Events for the webhook shape.
Errors
| Status | Example |
|---|---|
400 | { "success": false, "message": "RCS not active for this customer." } — ask your admin to complete RCS activation |
400 | { "status": "error", "description": "Missing phone number" } — payload validation from the upstream provider |
401 | { "success": false, "message": "unauthorized" } — your partner API key is missing or invalid |
401 / 403 | { "success": false, "code": "rcs_sender_unavailable", "message": "RCS sender temporarily unavailable for this customer. Try again in a few minutes; if it persists, contact support." } |
404 | { "success": false, "message": "customer not found" } |
500 | { "status": "error", "description": "Internal server error" } |
502 | { "success": false, "message": "Upstream RCS provider request failed: <error>" } (network / DNS / timeout) |
503 | { "success": false, "message": "RCS sender not yet configured for this customer." } |
cURL
curl -X POST \
"https://api.splashifypro.com/api/v1/partner/customers/$CUSTOMER_ID/rcs/send" \
-H "Authorization: Bearer $SPLASHIFY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "text",
"phone_no": "+919876543210",
"text": "Your order has shipped."
}'Notes
- Authentication. Use your Splashify partner API key —
Authorization: Bearer pk_live_…, the same key you use for the rest of the partner API. - Idempotency. Every POST is treated as a new send. If you retry
on a network error you may get duplicate messages. Put your own
idempotency key in
extraand dedupe on the status callbacks. - Suggestion limit. A maximum of 11 suggestions per message envelope; carousels share that budget across all cards.
- Phone normalisation. We trim and prepend
+if missing. We do not guess the country code — a number without one is rejected.