RCS API
RCS Business Messaging is the modern carrier-grade replacement for SMS on Android — rich cards, suggested replies, verified sender, read receipts. This surface registers your brand, creates verified agents, manages templates, and invites testers. Sending RCS messages themselves goes through the Messaging API atPOST /api/v1/messages/rcs.
Base path: /api/v1/rcs
Authentication: API key (X-API-Key) or session JWT.
Using the SDKs
client.request() escape hatch above. See the Python SDK.
Returns the typed ApiResponse envelope. See the SDK index at SDK quickstart.
Brands
A brand is the customer-facing entity that owns one or more RCS agents. Brand verification with the carrier is required before launch.
These endpoints manage the brand and agent registry — they never deliver content to end users. Message sends go through the Messaging API.
Create a brand
The brand carries the identity and KYC details carriers ask for before a bot can message their subscribers. Creating a brand does not start the review: patch it until it is complete, then submit it.data.id is the brand id you pass to the read, update, submit and delete endpoints. A blank or off-contract field is rejected with 422 listing the fields that failed validation.
List brands
Cursor-paginated. The list projection is deliberately lean — name, website, industry, country, status and the contact’s display name; the full KYC record comes back onGET /rcs/brands/{id}.
meta.pagination.cursor as ?cursor= to fetch the next page, 1–200 per page (50 by default). has_more: true tells you another page exists.
Submit a brand for carrier verification
Hand the complete brand to verification. Submissions are the carrier’s review gate, so call this only after the record is complete — a refusal lands asrejected with a rejection_reason, and you can PATCH /rcs/brands/{id} and submit again.
status moves to pending_review; poll GET /rcs/brands/{id} for the approved (or rejected with rejection_reason) outcome.
Agents (bots)
An RCS agent (sometimes called a “bot”) is the actual sending identity — logo, color, contact info, and behavior. Agents must be verified before they can send to consumers.
The agent endpoints manage the verified sender registry — sending to consumers goes through the Messaging API.
Create an agent
Register the agent subscribers see in their messaging app against one of your brands.brand_id points at a brand you created above (rejected or suspended brands are refused with 409; every other state is submittable). Pass a display_name, a description of 100 characters or fewer, HTTPS tos_url and privacy_policy_url, at least one of contact_phone / contact_email, and a non-empty carrier_mccmnc list of the 5–6-digit carrier codes it targets — the directory rejects a submission missing any of them. Optional bot_type (OTP, Transactional, Promotional, Multi-Use — case-sensitive), region, platform, billing_category, and a creation_data free-form object for agent styling like logo and colors.
data.localId is the agent id you pass to the read, update, verification, template, device and quality endpoints. A missing or off-contract field is rejected with 422 before the directory is ever called.
Get an agent
404. templateCount is the number of templates this agent carries (see the Templates section below).
Update agent basics
PUT /rcs/bots re-submits the creation payload in place — it accepts the same structured fields as creation, plus creation_data for the public directory record. Send the fields you want to change; the remainder keep their values.
Test devices
Add specific phone numbers that can receive messages from an unverified agent — used during integration and QA.Add a test device
Enrolls a handset’s E.164 number as an approved tester for an agent while the agent is still unverified, so QA and integration traffic can reach it. Once the agent launches, real recipients no longer need enrollment.POST /rcs/bots/{id}/tester-invite with the same { "phone" } body sends that invite; the device shows up under GET /rcs/bots/{id}/devices once it accepts. To remove a tester, call DELETE /rcs/bots/{id}/devices with the same body — it answers 204 with an empty body.
Templates
Pre-approved message templates with rich card components, suggested replies, and quick actions.
Templates are submitted for approval on the agent-management plane — a template does not send a message. Send approved templates through the Messaging API at render time.
Create a template
Body accepts a singlerich_template_data object holding the rich-card or carousel definition, including the name that identifies the template on later reads, updates, and sends. type is rich_card for a single card and carousel when the payload wraps several cards; any deep-link action inside needs a valid deepLink and fallbackUrl (https://), rejected with 422 before the template reaches the platform. Approval starts as pending.
"type": "carousel" and a cards array of rich cards inside rich_template_data.
Read, update, and delete a template
Templates are keyed by{name} inside the agent. Read one:
PUT onto /templates/{name}):
204 with an empty body:
Commerce (catalog carousel)
Turn your product catalog into a shoppable RCS carousel. List the products available to send, then render a selection into a rich-card carousel where every card carries an Add to cart chip and the message carries a single Checkout chip. Sends go through the standard messaging pipeline, so billing, delivery receipts, and scheduling apply exactly as they do for any other RCS message. Products come from the same Meta Commerce Manager catalog you connect for WhatsApp — one catalog serves both channels, so you do not configure a separate feed for RCS.List catalog products
Returns every product in your connected catalog. If no Commerce Manager catalog is connected yet,data.products is an empty array and data.count is 0 — an empty catalog is not an error, so your UI can render a “connect your catalog” empty state.
retailer_id is its SKU — that is the value you pass in product_ids when sending. Fields other than id are populated from Commerce Manager and may be absent for a given product.
Send a catalog carousel
Renders the selected products into a carousel and sends it to one recipient. Each product becomes one card — name, price, description, and image — with an Add to cart chip; products that carry a link also get a View chip. A single message-level Checkout chip closes the flow.
A carousel needs at least 2 products and shows at most 10. If your selection resolves to fewer than 2 products — for example a
product_ids list that matches nothing in the catalog — the request is rejected with 422. A selection larger than 10 is truncated to the first 10 (the RCS carousel limit).
202 Accepted with the queued message:
Capability check
Before sending RCS to a number, check whether the device + carrier supports it.Quality & analytics
Track how an agent is performing after launch: check its verification and per-carrier launch state, pull per-template and per-day engagement, and estimate how much of a segment can actually receive RCS before you spend on a campaign. Per-template and per-day numbers are aggregated from your own delivery receipts, so they reflect the samesent/delivered/read timestamps you see on individual messages. Windows are measured in whole days ending now.
Agent quality
Returns the verification and launch health of a single agent. Pass the agent’s id as{id}. Responds 404 if no agent with that id exists in your account.
launched is true once the agent reaches a launched state overall or on at least one carrier. carrier_statuses echoes each carrier’s raw status; carriers_launched and carriers_total summarise it so you can show “live on 1 of 2 carriers” without parsing the map.
Template analytics
Returns one row per template sent over the RCS channel in the window, ordered by volume. Messages sent without a template name collapse into a single(no template) row.
delivery_rate is delivered / sent, while read_rate and click_rate are over delivered (a handset cannot read or tap a card it never received).
Daily analytics
Returns one row per day in the window, oldest first, with the day’s RCS volume.Reach scan
Estimates what fraction of a saved contact segment can receive RCS through a given agent, so you can decide between RCS, a mixed RCS-with-SMS-fallback send, or plain SMS before you commit spend. It draws a bounded random sample from the segment and runs a live capability check for each sampled contact. Requires the owner, admin, or developer role — it reads contact phone numbers and runs billable capability lookups.sampled is how many contacts were actually probed (contacts without a phone number, and probes that error out, are excluded, so it can be lower than sample_size). reach_percent is capable / sampled. recommended_channel is a suggestion derived from that reach: rcs at 70% or above, mixed from 30–69%, and sms below 30%. An unknown bot_id or segment_id responds 404; a segment that resolves to no reachable contacts returns a zeroed summary rather than an error.
Test account
A sandbox flow for first-time testers — verify your own phone via OTP, then receive sample messages from an unverified agent.Send the OTP
Start verification on your handset: the number’s RCS capability is probed, it is registered as a tester device on the shared demo bot, and the carrier tester invite is delivered. Pass any common formatting; the number must resolve to E.164, and a handset with no RCS support is rejected instead of being registered. Owner / admin / developer roles only, a handful of attempts per 10-minute window per organization.Verify the OTP
Acceptance happens on the handset — when the carrier tester invite is accepted, verification completes. This endpoint re-checks that state; call it with theverification_id from send-otp. While the invite is still pending it answers 425 PENDING_ACCEPTANCE (retry every few seconds — the dashboard polls for up to ten minutes); a declined invite answers 422 INVITE_DECLINED; an unknown or expired session answers 422 — start again at send-otp in either case. The deprecated code field is accepted for older clients and ignored.
425
See also
- Channels → RCS guide — concepts, regional availability, fallback strategy
- Messaging API → Send RCS