RCS API

RCS via REST API

Integrate interactive RCS messages into your applications. Rich Cards, carousels, buttons and SMS fallback - all via a simple REST API. Test any message in the free sandbox before you create an account.

Message Types

9 message formats for every use case

From simple text messages to interactive carousels - the API supports all RCS formats.

textBasic

Max. 160 characters, SMS-like with verified sender

text

Up to 3,072 characters + 11 suggestion chips

richCard

Image/video + title + description + 4 buttons

carousel

Up to 10 cards, horizontally scrollable

image

JPEG, PNG, GIF - directly in the messaging app

video

MP4, 3GP for dynamic content

audio

MP3 for voice messages and podcasts

file

PDFs, documents for invoices & tickets

media

Generic media type + suggestion chips

"suggestions": [
  {
    "reply": {
      "text": "Book appointment",
      "postbackData": "book_apt",
      "webhookUrl": "https://..."
    }
  },
  {
    "action": {
      "text": "Call",
      "type": "dial",
      "dialAction": {
        "phoneNumber": "+44..."
      }
    }
  }
]
Interactive

7 button types for every interaction

Create interactive messages with up to 11 suggestion chips and 4 card actions per card.

  • postback - Webhook callback with custom data
  • openUrl - Open external links in browser
  • openUrlInWebview - Display links within the messaging app
  • dial - Initiate a direct call
  • createCalendarEvent - Add event to calendar
  • viewLocation - Show location in Google Maps
  • shareLocation - Request recipient's location
Batch Sending

Up to 10,000 recipients per request

Send the same message to thousands of recipients with a single API call. Ideal for campaigns and mass communication.

  • Automatic filtering of deactivated contacts
  • Test numbers are not charged
  • Progress-Tracking via Job-ID
  • Configurable batch size and delay
  • Campaign names for tracking and reporting
10,000
Recipients per request
POST /send-batch
{
  "messageType": "text",
  "content": {
    "text": "Hi {{contact_first_name}}, your order from {{company_name}} ships today. Opt out: {{unsubscribe_link}}"
  },
  "smsFallback": {
    "message": "Hi {{contact_first_name}}, your order ships today. Opt out: {{unsubscribe_link}}"
  }
}
Merge Fields

Personalise every message

Placeholders are replaced per recipient at send time, in RCS messages, standalone SMS and the SMS fallback text.

  • Contact fields {{contact_first_name}}, {{contact_last_name}}, {{contact_phone}}, {{contact_email}}
  • Company fields {{company_name}}, {{company_phone}}, {{company_website}}
  • Custom fields any {{your_tag}} you define, plus {{today}}
  • {{unsubscribe_link}} a unique per-recipient opt-out URL with a fresh token on every send
  • Works everywhere in text, card titles, descriptions and button URLs
RCS
Not available?
SMS
SMS Fallback

Automatic SMS fallback

When RCS is not available, an SMS is sent automatically. Define an SMS fallback text for each message.

  • Automatic detection of RCS capability
  • Separate SMS sender configurable
  • Up to 1,530 characters SMS text
  • Fallback reason in API response
Scheduling

Timezone-aware scheduling

Schedule messages for a specific time in the future. With IANA timezone support, you always reach your recipients at the right moment.

  • IANA timezone support (Europe/London, etc.)
  • Validation before sending via /validate-schedule-time
  • Schedulable batch messages
  • Cancellable jobs via DELETE /batch/{jobId}
{
  "scheduleAt": "2026-10-15T09:00:00",
  "timeZone": "Europe/London"
}
{
  "event": "rcs_button_clicked",
  "timestamp": "2026-09-30T10:30:00Z",
  "interaction": {
    "type": "button_click",
    "buttonText": "Buy now",
    "postbackData": "product_123",
    ...
  },
  "message": {
    "id": "...",
    "campaignName": "Summer Sale",
    ...
  },
  "contact": {
    "phone": "+4412345678",
    "name": "John Smith",
    ...
  }
}
Webhooks

Webhooks for every event

Receive instant notifications when recipients click, reply, or receive your messages. Connect your backend systems for automated workflows.

  • Button clicks with your custom postbackData, webhook URL per button
  • Delivery status delivered, read or failed
  • Incoming RCS messages text, images, videos, files and locations
  • Incoming SMS to your virtual numbers
  • Form submissions and confirmed double opt-ins
  • Contact information and message ID in every payload
Code Examples

Simple integration

Send your first RCS message with just a few lines of code.

Request

# Send a Rich Card with button
curl -X POST https://api.sendrcs.eu/api/rcs/send \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "+4412345678",
    "messageType": "richCard",
    "sendernameId": "your-sender-id",
    "content": {
      "title": "Welcome!",
      "description": "Discover our offers",
      "media": {
        "height": "MEDIUM",
        "contentInfo": {
          "fileUrl": "https://example.com/image.jpg"
        }
      },
      "cardActions": [{
        "text": "Learn more",
        "type": "openUrl",
        "openUrlAction": {
          "url": "https://example.com"
        }
      }]
    }
  }'

Response

{
  "success": true,
  "messageId": "3f9c2a1e-7b4d-4c8e-9a21-5d6e7f8a9b0c",
  "messageRecordId": "66fa1c2b9d3e4f5a6b7c8d9e",
  "method": "rcs",
  "fallbackUsed": false,
  "creditsUsed": 1,
  "hasInteractiveButtons": true,
  "conversation": {
    "conversationId": "66fa1c2b9d3e4f5a6b7c8d9f",
    "status": "ACTIVE",
    "remainingTime": "23:59:00",
    "chargedMessage": true,
    "messageCount": {
      "total": 1,
      "outbound": 1,
      "inbound": 0
    }
  }
}
Sandbox

Try it without an account

Post the exact body you would send to /send to the public sandbox. You get the same validation result as the real endpoint plus a link that renders the message on an Android and iOS phone mockup.

  • No API key, nothing sent, no credits used
  • Same validator and error shape as POST /send
  • Phone-mockup preview link, valid for 24 hours
  • Sample images, a video and a PDF via GET /sandbox/samples
  • Rate limit 20 requests per minute, 100 per day per IP
Sandbox reference in the API docs
# No API key needed
curl -X POST https://api.sendrcs.eu/api/rcs/sandbox/preview \
  -H "Content-Type: application/json" \
  -d '{
    "messageType": "richCard",
    "content": {
      "title": "Your order is on its way",
      "description": "Track the parcel or talk to us.",
      "media": {
        "height": "TALL",
        "contentInfo": {
          "fileUrl": "https://sendrcs.eu/images/rcsexamples/shoes-1.jpg"
        }
      },
      "cardActions": [{
        "text": "Track order",
        "type": "openUrl",
        "openUrlAction": { "url": "https://example.com/track" }
      }]
    }
  }'

# Response (abbreviated)
{
  "success": true,
  "valid": true,
  "errors": [],
  "preview": {
    "share_url": "https://app.sendrcs.eu/sandbox/X2zmNjdwawJYrPnAL7BQiBhm",
    "expires_at": "2026-09-30T22:05:14.159Z",
    "sendable": false
  },
  "sandbox": { "nothing_sent": true }
}

API Endpoints

Every endpoint, grouped by area. Full request and response schemas are in the API reference.

Method Endpoint Description
Messaging https://api.sendrcs.eu/api/rcs
POST /send Send a single RCS message with optional SMS fallback and scheduling
POST /send-batch Send the same message to up to 10,000 recipients
POST /send-sms Send a standalone SMS, no RCS involved
POST /validate Validate a message before sending
GET /button-guidelines Button guidelines and limits
Sandbox (no API key) https://api.sendrcs.eu/api/rcs
POST /sandbox/validate Validate a message without an account
POST /sandbox/preview Validate and get a phone-mockup preview link
GET /sandbox/samples Sample images, video and PDF the sandbox renders
GET /sandbox/preview/{slug} Read a sandbox preview as JSON
Scheduling & jobs https://api.sendrcs.eu/api/rcs
GET /timezones Available IANA timezones
POST /validate-schedule-time Validate a scheduled time
GET /batch/{jobId}/status Batch job status and progress
DELETE /batch/{jobId} Cancel a scheduled or running batch job
GET /jobs List your jobs
GET /queue/status Queue status
Status, conversations & log https://api.sendrcs.eu/api/rcs
GET /status RCS service status
GET /health Health check
GET /senders List your RCS and SMS sender names
GET /stats Messaging statistics
GET /conversations List active conversations
GET /conversations/{phoneNumber}/status Conversation status for a recipient
GET /conversations/{phoneNumber}/rate-limit Rate limit for a conversation
POST /conversations/billing-preview Check which recipients have an open window before you send, up to 1,000 numbers
GET /messages/log Message log (base URL https://api.sendrcs.eu/api/messages)
GET /messages/{id}/content Content of a sent message (base URL https://api.sendrcs.eu/api/messages)
DELETE /messages/{id} Cancel a scheduled message before it is sent (base URL https://api.sendrcs.eu/api/messages)
GET /messages/interactions Button clicks and typed replies on your sent messages (base URL https://api.sendrcs.eu/api/messages)
Contacts https://api.sendrcs.eu/api/v1
GET POST /contacts List and create contacts
GET /contacts/count Count contacts
POST /contacts/bulk Bulk create or upsert contacts
PATCH /contacts/bulk/enable Bulk enable contacts
PATCH /contacts/bulk/disable Bulk disable contacts
GET PUT DELETE /contacts/{id} Get, update and delete a contact
GET POST /contacts/fields List and create custom field definitions
GET PUT DELETE /contacts/fields/{fieldId} Get, update and delete a custom field definition
GET PUT /contacts/{id}/fields Get and bulk set a contact's custom field values
PUT DELETE /contacts/{id}/fields/{fieldId} Set and delete one custom field value
Groups https://api.sendrcs.eu/api/v1
GET POST /groups List and create groups
GET PUT DELETE /groups/{id} Get, update and delete a group
POST DELETE /groups/{id}/contacts Add and remove contacts in a group
Templates https://api.sendrcs.eu/api/v1
GET POST /templates List and create message templates
GET PUT DELETE /templates/{id} Get, update and delete a template
GET POST /templates/groups List and create template groups
POST /templates/groups/assign Assign templates to a template group
PUT DELETE /templates/groups/{id} Rename and delete a template group
Authentication

Simple API key authentication

All API requests require an API key in the header, except the public sandbox endpoints. Generate your key in the dashboard.

X-API-Key: your-api-key-here

You can find your API keys under Settings → API Keys in your dashboard. Optionally, restrict a key to specific public IP addresses or CIDR ranges in its settings; requests from any other address are rejected with 403.

Conversation Billing

24-hour conversation window

Within a 24-hour window, send unlimited messages for the price of one conversation. Optimise your costs with high message volumes.

  • 24-hour window opens when one side replies to the other
  • Billing preview before sending via API
  • Analytics endpoint for conversation metrics
  • Cost optimisation for follow-up messages
24h
Conversation window
Unlimited messages at a fixed price
FAQ

RCS API, answered

How do I send an RCS message via the API?

Send a POST request to https://api.sendrcs.eu/api/rcs/send with your API key in the X-API-Key header and a JSON body containing the sender ID, the recipient and the message content - for example a Rich Card with title, description, image and a button. The response returns a message ID and status. Full examples for every format are in the API documentation.

How do I authenticate API requests?

Every request needs an API key in the X-API-Key header. You generate and manage your keys in the SendRCS dashboard under Settings and API Keys.

Which message formats does the API support?

Nine formats: Basic Text (up to 160 characters), Rich Text (up to 3,072 characters and 11 suggestion chips), Rich Card, Carousel (up to 10 cards), image, video, audio, file (PDFs and documents) and generic media with suggestion chips. Seven button types are available: postback, openUrl, openUrlInWebview, dial, createCalendarEvent, viewLocation and shareLocation.

Can I send to many recipients with one request?

Yes. The batch endpoint sends the same message to up to 10,000 recipients in a single API call. Deactivated contacts are filtered automatically, batch size and delay are configurable, and a campaign name lets you track and report on the send.

How does SMS fallback work in the API?

Define an SMS fallback text for each message. The API detects automatically whether the recipient can receive RCS and otherwise sends the SMS instead, with a separately configurable SMS sender and up to 1,530 characters of text. The API response tells you when and why a fallback was used.

Can I schedule messages via the API?

Yes. Pass a scheduleAt time with IANA timezone support, such as Europe/London, and the message is sent at that moment in the recipient's local time. You can validate a time in advance via the validate-schedule-time endpoint and cancel a scheduled job with DELETE /batch/{jobId}.

How do I get notified when a recipient clicks a button?

Via webhooks. SendRCS calls your backend in real time for six events: button clicks with your custom postbackData, delivery status changes (delivered, read, failed), incoming RCS messages, incoming SMS to your virtual numbers, form submissions and confirmed double opt-ins. Button webhook URLs are set per button, the others under Settings and Webhooks in the dashboard.

Can I test the API without an account?

Yes. The public sandbox at https://api.sendrcs.eu/api/rcs/sandbox/preview validates any message body with the same rules as the real send endpoint and returns a share link that renders the message on an Android and iOS phone mockup. No API key is needed, nothing is sent and no credits are used. The link expires after 24 hours, and the rate limit is 20 requests per minute and 100 per day per IP.

Does the API also cover SMS, contacts and templates?

Yes. The same API key gives you a standalone SMS endpoint, the message log and full CRUD endpoints for contacts, custom fields, groups and message templates under https://api.sendrcs.eu/api/v1/. Message text supports merge fields such as {{contact_first_name}} and a unique per-recipient {{unsubscribe_link}}.

Why does validation warn about an email or web address in the message text?

Because iPhones reject text and textBasic messages whose text contains an email address or a web address (URL, www. host or bare domain), while Android delivers them. The message is still accepted; the /validate endpoint and the sandbox return a warning so you can decide. To reach every phone, put links on chips and buttons, or use a rich card: card titles, descriptions and chip labels may contain an address.

Ready to get started with the RCS API?

Create your free account and get your API key in minutes.

  • No subscription
  • No commitment
  • Pay as you go
  • Free trial