Splashify RCS

Docs

Open panel
Panel

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.

http
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/json on every request with a body. File uploads to POST /rcs/apply/upload are the one exception and use multipart/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, but success is 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 Z suffix: 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.

json
{
  "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:

json
{ "success": false, "message": "human-readable explanation" }

An RCS gateway failure carries more, because there is usually something the caller should do about it:

json
{
  "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:

json
{
  "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