RCS Panel API
Everything the panel at rcs.splashifypro.com can do, as a REST API. Register bots, design templates, upload audiences, run broadcasts, recharge the wallet, and pull stats.
The RCS Panel API is the programmatic surface for RCS-only customers, the accounts created at rcs.splashifypro.com. It is separate from Splashify's partner API and app-panel API: different credentials, different routes, different data. A token issued here works only here.
Base URL: https://api.splashifypro.com
Routes: /api/v1/rcs/*
Auth: Authorization: Bearer <jwt-or-rcs_pk_live_key>Looking for the panel instead?
If you are here to use the product rather than integrate it, the user manual walks the same capabilities screen by screen, with no code.
Conventions
The API is JSON over HTTPS. There are no XML, form-encoded or GraphQL surfaces.
- Content type
Send
Content-Type: application/jsonon every request with a body. File uploads toPOST /rcs/apply/uploadare the one exception and usemultipart/form-data.- Success flag
Every response, success or failure, carries a boolean
success. Branch on that rather than on the HTTP status alone; the two always agree, butsuccessis the one that is present in every payload.- Identifiers
All ids (
bot_id,template_id,broadcast_id,list_id,member_id,key_id) are UUID strings. Treat them as opaque, do not parse or sort by them.- Timestamps
ISO-8601, always UTC, always with the
Zsuffix:2026-07-16T18:07:52Z. The one place local time appears is recurring-broadcast scheduling, which runs in IST and says so explicitly.- Phone numbers
E.164 with the country code and a leading
+,+919876543210. A number without the+, or with spaces or dashes, is rejected by the validator rather than normalised.- Money
Rupees, as a decimal number (
0.35), not paise and not a string. Wallet balances and per-message prices use the same representation.
Multiple bots per account
One account can operate several bots. Each a separately-verified RCS sender with its own KYC, its own carrier-side identity and its own send-rate budget. The wallet is shared: every bot debits the same balance.
Most write endpoints therefore take a bot_id. For clients written before
multi-bot support, GET /rcs/me returns default_bot_id and omitting bot_id
falls back to it, but new integrations should always pass the id explicitly.
Bots reference
Applying for a bot, listing them, and what each status means.
Roles
Every account has an owner, the email that signed up. The owner can invite other emails as operators (send and edit) or viewers (read-only), each scoped to a subset of the account's bots.
Three distinct 403s tell you which gate you hit:
A valid token is not the same as a permitted one
The most common integration surprise on this API is a perfectly valid operator JWT getting a 403
from /rcs/wallet or /rcs/invoices. Authentication and authorisation are separate gates, check
the code field before assuming the credential is broken.
Read paths do not 403 on scope. Listing broadcasts as an operator returns the broadcasts for that operator's bots, filtered server-side, rather than an error.
Team reference
Invites, the accept flow, role changes, and the multi-account login switcher.
Account status gates
Some endpoints stay closed until the account is provisioned, or reopen only when a suspension is lifted.
A suspension is deliberately narrow. Only broadcast creation and one-off sends are blocked, templates, contact lists, invoices and past broadcasts all stay accessible, so you can keep reconciling while it is resolved.
{
"success": false,
"code": "account_suspended",
"message": "Account suspended. <reason>. Reply to your suspension email to discuss."
}GET /rcs/me returns the live status and suspend_reason, so a dashboard can
render the banner without waiting for a send to fail.
Sending additionally requires the wallet to cover the first message, a
prepaid account at zero balance is active but cannot start a broadcast.
Response shapes
A simple error is two fields:
{ "success": false, "message": "human-readable explanation" }An RCS gateway failure carries more, because there is usually something the caller should do about it:
{
"success": false,
"message": "Recipient has opted out of RCS",
"detail": "Remove them from the list, don't retry.",
"category": "recipient",
"retryable": false
}category is one of content, media, recipient, config, quota or
gateway. retryable: true means the platform will retry on its own, do not
build a second retry loop on top of it.
Validator failures on template creation return every problem at once, so a UI can highlight them all in one pass rather than making the user resubmit six times:
{
"success": false,
"message": "Template violates RCS limits. Fix the issues below and resubmit",
"errors": ["Carousel card 3: title is 217 characters, max 200"],
"warnings": ["Rich card: 3 buttons. We recommend ≤ 2"]
}errors block the request; warnings do not.
HTTP status codes
Errors reference
Every gateway error code mapped to a title, a cause and a fix.
Where to next
Authentication
JWT versus API key, scopes, rate limits, and how to rotate without downtime.
Templates
Create messages, poll the review verdict, and the full validator rule set.
Broadcasts
Schedule, start, cancel, and read per-recipient delivery.
Webhooks
Receive delivery, read, click and reply events at your own URL.