Skip to content

RCS

RCS is what SMS became on Android. You send from a verified brand instead of a short string, and you can send things SMS has no way to express: images, cards, carousels, and buttons the user can tap.

Terminal window
curl -X POST https://api.9bits.net/ng/v1/rcs/messages \
-H "Authorization: Bearer 9bk_xxx" \
-H "Content-Type: application/json" \
-d '{
"senderId": "FirstDigits",
"destination": "2348020000000",
"content": "Your code is 481920. It expires in 5 minutes.",
"ttl": "300s"
}'

There is one send endpoint, and you never pick a transport. It follows from what you asked to send.

How the split works

  • Send content on its own and it goes out as plain text.
  • Send a richCard, a carousel or suggestions and it goes out over the rich path instead, because there is no way to put a card, an image or a button on the plain-text one.

Supply both and you get the rich form. Dropping your card silently would deliver something you did not ask for.

This matters for one reason: rich messages need an RBM agent mapped to your sender, and plain text does not. A sender with no agent is refused with 400 before anything is billed. See Sender IDs.

Two gates, both checked before you are charged:

  1. The senderId has to be registered to your account and approved. Not registered, or registered and still pending, is a 400.
  2. The recipient must not have opted out of that brand. Someone who replied STOP is suppressed, and the send is refused rather than billed for a message the platform would have blocked anyway.

Opt-out is per (number, brand). Unsubscribing from one brand does not unsubscribe them from every brand you send.

RCS reaches Google Messages on Android. Some handsets, some networks and some users do not have it. Plan for a recipient who simply cannot receive an RCS message — check the delivery report and fall back to SMS when it comes back Undelivered.

RCS uses the same scoped 9bk_ API keys as Email and WhatsApp:

Authorization: Bearer 9bk_xxx

The key needs an RCS scope — rcs:send to send, rcs:read to read. A key scoped to another product comes back 403 naming the scope it lacks.