RCS API and webhooks for your CRM and apps
Send rich cards, carousels and suggested replies from your own software. Get delivered, read, tapped and reply events back in real time, and let MsgClub handle SMS fallback for phones without RCS.
- REST API with JSON
- Read, click and reply webhooks
- SMS fallback in the same request
- Test phones before launch

What is an RCS API?
An RCS API lets your software send RCS business messages, such as text, rich cards, carousels and suggested replies, with one HTTP request per message or batch. Webhooks then send events back to your system when a message is delivered, read or tapped, when the customer replies, or when it falls back to SMS.
Updated
RCS API at a glance
- Sends
- Text, rich cards, carousels, suggested replies and actions
- Webhooks
message.sent,delivered,read,clicked,received,failed- Fallback
- DLT-approved SMS per number when RCS is not available
- Sender
- Your verified RCS brand agent with logo and name
- Auth
- API key sent as a Bearer token
- Billing
- Per RCS message by type; fallback billed as SMS
How does the RCS API connect to your CRM?
Your system sends the message. MsgClub picks RCS or SMS for each number. Events come back to your system as they happen.
What does an RCS API request look like?
One request carries the rich card, its buttons and the SMS fallback.
- A rich card can have a title, description, image or video and up to 4 buttons
- Suggested replies return the text the customer tapped
- Suggested actions open a URL, dial a number or show a location
- The fallback block names your DLT-approved SMS template
POST {API_BASE_URL}/rcs/messages
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"to": "+9198XXXXXX21",
"rich_card": {
"title": "Your EMI of ₹4,250 is due",
"description": "Due on 10 Dec. Pay in 2 taps.",
"media_url": "https://example.com/emi.png",
"suggestions": [
{ "type": "open_url", "text": "Pay now", "url": "https://example.com/pay/8KQ2" },
{ "type": "reply", "text": "Already paid" },
{ "type": "dial", "text": "Call us", "phone": "+9198XXXXXXXX" }
]
},
"fallback_sms": {
"sender_id": "MSGCLB",
"template_id": "1107XXXXXXXXXXXXX",
"text": "Dear Rahul, EMI of Rs 4250 is due on 10 Dec. Pay: msgc.in/p/8KQ2 -MsgClub"
},
"fallback_after_sec": 300,
"webhook_url": "https://your-crm.example.com/msgclub/rcs"
}POST {API_BASE_URL}/rcs/messages
Authorization: Bearer YOUR_API_KEY
{
"to": "+9198XXXXXX21",
"carousel": {
"card_width": "medium",
"cards": [
{ "title": "Festive tote bag", "description": "₹1,399",
"media_url": "https://example.com/tote.png",
"suggestions": [{ "type": "open_url", "text": "Buy now", "url": "https://example.com/p/1" }] },
{ "title": "Brass diya set", "description": "₹899",
"media_url": "https://example.com/diya.png",
"suggestions": [{ "type": "open_url", "text": "Buy now", "url": "https://example.com/p/2" }] }
]
},
"chips": ["Show more", "Track my order"],
"fallback_sms": { "template_id": "1107XXXXXXXXXXXXX" }
}Illustrative example. Exact endpoints and field names are in the API docs, shared when you get API access.
Which webhooks does RCS send?
Each event is a JSON POST to your webhook URL, with the message ID you can match in your database.
| Event | When it is sent |
|---|---|
message.sent | The message left MsgClub as RCS or SMS |
message.delivered | The phone received it; includes the channel used |
message.read | The customer opened the RCS message |
message.clicked | A button or suggested action was tapped |
message.received | The customer typed a reply or tapped a suggested reply |
message.failed | Neither RCS nor the SMS fallback could be delivered |
POST https://your-crm.example.com/msgclub/rcs
{
"event": "message.read",
"message_id": "rcs_4f8a21",
"to": "+9198XXXXXX21",
"channel": "rcs",
"read_at": "2026-11-15T11:06:12+05:30"
}POST https://your-crm.example.com/msgclub/rcs
{
"event": "message.received",
"in_reply_to": "rcs_4f8a21",
"from": "+9198XXXXXX21",
"type": "suggested_reply",
"text": "Already paid",
"received_at": "2026-11-15T11:07:40+05:30"
}POST https://your-crm.example.com/msgclub/rcs
{
"event": "message.delivered",
"message_id": "rcs_4f8a22",
"to": "+9194XXXXXX87",
"channel": "sms",
"fallback_reason": "rcs_not_supported"
}Illustrative example. Exact endpoints and field names are in the API docs, shared when you get API access.
How does SMS fallback decide what to send?
Fallback runs per number, so one campaign can reach every customer on the best channel their phone supports.
- Capability checkBefore sending, MsgClub checks whether the number can receive RCS from your agent.
- RCS if possibleCapable phones get the rich card. The delivered event shows
"channel": "rcs". - SMS if notOther phones get your DLT-approved SMS template at once, with your header and short link.
- Timeout fallbackIf an RCS message is not delivered within the time you set, for example because the phone is offline, the SMS is sent instead.
The SMS part follows TRAI DLT rules like any other SMS: a registered header, an approved template and, for promotions, the permitted sending hours. Read more in the SMS API guide.
What can you build with the RCS API?
Order and cart flows
Your store sends an order card with Track order. A tap on "Change slot" creates a ticket in your helpdesk through the reply webhook.
Payment reminders
Your loan system sends a Pay now card. "Already paid" replies mark the account for checking; unread reminders can trigger a reminder call from AI Voice.
Lead nurturing
Your CRM sends a carousel of projects or courses. Read and click events update the lead score so sales calls the warmest leads first.
The RCS API works with any CRM that can call an API or receive a webhook, including systems such as Zoho, HubSpot, Salesforce and LeadSquared through their own API features or Zapier. Compare channels in RCS vs SMS vs WhatsApp, go back to the RCS overview, see pricing, or browse the developer docs.
Frequently asked questions
Can I test the RCS API before my agent is launched?
Yes. Until your RCS agent is approved for launch, messages reach only the phones you register as testers. Use these phones to test rich cards, buttons, replies and your webhook handling, then switch to live sending after approval.
How does SMS fallback work in the API?
Add a DLT-approved SMS template to the request. If the number cannot receive RCS, or the RCS message is not delivered within the time you set, MsgClub sends the SMS instead and reports the message as fallen back, so your system knows which channel reached the customer.
Which webhook events does the RCS API send?
MsgClub sends message.sent, message.delivered, message.read, message.clicked and message.failed for each message, and message.received when the customer replies or taps a suggested reply. Exact field names are in the API docs shared when you get API access.
Can I use the RCS API with Zoho, HubSpot or Salesforce?
Yes, through their API or webhook features, or through Zapier. Any CRM that can call an API or receive a webhook can send RCS messages and record events. MsgClub does not claim a native one-click connector for these CRMs.
Is there an SMS API with a public endpoint as well?
Yes. The SMS API has a published send endpoint and returns response code 3001 when a request is accepted. You can use it alongside the RCS API, for example to send OTPs by SMS and alerts by RCS from the same account.
Do I need to handle duplicate webhook events?
It is good practice. Use the message ID in each event to update a record once, and return a 200 response quickly. If your server is down, events may be retried, so your handler should ignore an event it has already processed.
Related products
Use them together from the same MsgClub account, with one API and shared reports.
Start sending in minutes
Create a free account to test the panel and API, or talk to our team about volumes, DLT setup and CRM integration.