RCS Business Messaging API
Send verified, branded rich messages over RCS — text, rich cards, carousels, and suggested actions — with automatic SMS fallback when RCS is unavailable. Designed for high-trust notifications and interactive journeys in Ghana and across Africa.
Verified Brand Agent
Messages appear under your approved RCS agent with logo, brand name, and verification badge in the default SMS app.
Rich Cards & Carousels
Standalone cards and multi-card carousels with images, titles, descriptions, and tappable suggestions.
Suggested Actions
In-thread reply chips, openUrl, and dial actions — no app install required for the end user.
SMS Fallback
When a handset is not RCS-capable, automatically degrade to SMS so every customer still gets the message.
Read Receipts
Track queued → sent → delivered → read with webhooks and the status API — similar to WhatsApp, over the native messaging app.
Native Messaging App
Delivers in Google Messages / carrier RCS clients. Ideal for banks, fintechs, telcos, and retail across Ghana and Africa.
~180ms
p95 accept time
4
text · richCard · carousel · actions
80/s
per API key (burst)
5
delivery + engagement
Authentication
Authorization: Basic <token>. Auth guide →Preview status
Send a branded RCS text message to a Ghana MSISDN. Local formats like 024XXXXXXX / 055XXXXXXX are normalised to 233… automatically.
curl -X POST 'https://api.sendexa.co/v1/rcs/send' \-H 'Content-Type: application/json' \-H 'Authorization: Basic YOUR_DASHBOARD_BASE64_TOKEN' \-d '{"to": "0244123456","agentId": "AGT-SENDXA-GH","type": "text","text": {"body": "Hi Ama — your GHS 250.00 payment to Accra Mart was successful. Ref: TXN-78421."},"fallback": {"enabled": true,"channel": "sms","from": "Sendexa","message": "Hi Ama — payment of GHS 250.00 to Accra Mart succeeded. Ref: TXN-78421."}}'
Success response
{"success": true,"code": "RCS_ACCEPTED","message": "RCS message accepted for delivery.","requestId": "REQ-1782001100451","timestamp": "2026-07-12T09:15:10.451Z","data": {"messageId": "MSG-RCS-7c2a91f0-4e1b-4d88-9c3a-1f8e0b2d4a11","channel": "rcs","agentId": "AGT-SENDXA-GH","message": {"to": {"address": "233244123456","country": { "code": "GH", "name": "Ghana" },"network": "MTN"},"type": "text"},"delivery": {"status": "QUEUED","rcsCapable": null,"fallback": {"enabled": true,"channel": "sms","triggered": false},"submittedAt": "2026-07-12T09:15:10.451Z"},"billing": {"units": 1,"pricing": {"unitCost": 0.04,"totalCost": 0.04,"currency": "USD","note": "RCS charged; SMS fallback billed only if triggered"}}}}
API Endpoints & Guides
/v1/rcs/sendSend text, richCard, carousel, or suggestedActions to a single MSISDN.
/v1/rcs/status/:messageIdPoll lifecycle status, fallback channel, read timestamps, and error details.
Rich Cards & MediaLayouts, media heights (SHORT | MEDIUM | TALL), carousels, and suggestion types.
Webhooksrcs.delivered, rcs.read, rcs.failed, rcs.user_reply, rcs.suggestion_click.
Plain RCS text up to 3,072 characters with optional suggested replies/actions. Best for OTPs, alerts, and confirmations.
Single card with media (SHORT | MEDIUM | TALL), title, description, and up to 4 suggestions. Ideal for product offers and receipts.
2–10 horizontally scrollable cards. Great for catalogues, loan options, or multi-product promos.
Attach reply, openUrl, or dial chips to any text or card so users can act without leaving the thread.
An RCS agent is your brand identity on the RCS network — similar to a WhatsApp Business profile or an SMS sender ID, but with a logo, description, contact details, and verification state. You send with an agentId returned after registration.
| Concept | Description |
|---|---|
| Agent ID | Unique identifier (e.g. AGT-SENDXA-GH) used in every send request. |
| Display name | Brand name shown above the conversation (e.g. “Sendexa”, “GCB Bank”). |
| Logo & brand colour | Shown in the messaging app contact header once the agent is verified. |
| Verification | Carrier / Google RBM review. Only approved agents may send production traffic. |
| Use cases | Transactional (OTP, payments), promotional (offers), conversational (support). |
| Coverage | Depends on handset RCS capability and carrier support (MTN, Telecel, AirtelTigo, etc.). |
Onboarding
Not every handset is RCS-capable. When fallback is enabled, Sendexa attempts RCS first. If the device or network cannot accept RCS, the message is automatically delivered as SMS using your approved sender ID — so banks, fintechs, and e-commerce brands never drop a critical notification.
- Fallback only bills the SMS unit when it is actually triggered.
- Status responses and webhooks indicate
channel: "rcs"orchannel: "sms". - Provide a concise SMS body — rich card media cannot be reproduced over SMS.
- SMS sender ID rules still apply (3–11 alphanumeric, pre-approved).
| Status | Meaning | Typical next step |
|---|---|---|
| queued | Accepted by Sendexa, waiting for RCS route | Normal — wait for webhook |
| sent | Submitted to RCS / carrier path | Await delivered / fallback |
| delivered | Reached the handset messaging app | Optional: track read |
| read | User opened the conversation (when available) | Engagement success |
| failed | Undeliverable; see error code | Inspect error; consider SMS-only retry |
| HTTP | Code | Cause |
|---|---|---|
| 400 | INVALID_PHONE | MSISDN format not recognised |
| 400 | INVALID_MESSAGE_TYPE | type must be text | richCard | carousel | suggestedActions |
| 400 | INVALID_RICH_CARD | Missing title/media or too many suggestions |
| 400 | INVALID_CAROUSEL | Carousel must contain 2–10 cards |
| 401 | UNAUTHORIZED | Missing or invalid Basic Auth token |
| 403 | AGENT_NOT_APPROVED | RCS agent pending, suspended, or not linked to business |
| 403 | RCS_NOT_ENABLED | Product not enabled for this account |
| 403 | INSUFFICIENT_CREDITS | Balance too low for RCS (and fallback if required) |
| 404 | MESSAGE_NOT_FOUND | Unknown messageId on status lookup |
| 429 | RATE_LIMIT_EXCEEDED | Exceeded 80 req/s — use exponential backoff |
Best Practices
- Always store
messageIdfor status polling and webhook correlation. - Prefer webhooks (
rcs.delivered,rcs.read, …) over aggressive polling. - Enable SMS fallback for OTPs, payment alerts, and any must-deliver traffic.
- Keep card titles short (≤ 200 chars) and descriptions scannable on mobile.
- Use HTTPS media URLs with public or signed access; avoid localhost and expired CDN links.
- Localise content for Ghana (GHS, city names, local language where appropriate) to lift engagement.