Skip to Content
API ReferenceCustomersSend RCS message

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/send

Behind 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_id must 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

FieldTypeRequiredNotes
typestringyesOne of text, card, multiple_cards, media
phone_nostringyesE.164 (e.g. +919876543210). We auto-prefix + if you send the bare digits
extrastringnoFree-form passthrough metadata; surfaces on the status callback
suggestionsarraynoInteractive 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 fieldLimit
title≤ 200 chars
description≤ 2000 chars
urlPublic HTTPS image / media URL
card.suggestionsSame shape as top-level suggestions
{ "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/png
  • video/mp4
  • application/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

StatusExample
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 extra and 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.