Skip to main content

RCS API

RCS (Rich Communication Services) is the evolution of smartphone messaging. Unlike SMS, it enables multimedia content, Call to Action buttons (CTA), and bidirectional conversations with a verified sender called an RCS Agent.

Why use RCS

  • Visible brand: RCS Agent name and icons
  • Rich content: text, images, cards, and carousels
  • Interactive buttons: links, calls, guided replies
  • Two-way conversation: manage and respond to user interactions

Use cases

  • Rich notifications with images and buttons
  • Promotions, offers, and shopping carts (cards/carousels)
  • Conversational customer support
  • Campaigns with high engagement
User requirements

Compatible smartphone and messaging app with RCS support; active internet connection.

Core concepts

Message types

  • TEXT: text message with optional buttons
  • CARD: single rich card with image, title, description, and actions
  • CAROUSEL: scrollable list of 2-10 cards for catalogs or menus

Suggestions (CTA)

Action buttons users can select:

  • reply: guided text response
  • url: link opening
  • dial: phone call initiation
  • coordinates: coordinate sharing
  • location: location search
  • calendar: calendar event creation

Media

Cards support images. Provide public, valid URLs for the entire send duration. Always set an appropriate height value.

Placeholders

Use variables in text (e.g., \{name\}). If you don't provide values during send, the variable appears unsubstituted.

SMS Fallback

Optional. If a contact isn't reachable via RCS, send a fallback SMS instead (sender must be authorized).

Authentication and security

  • Protocol: HTTPS required
  • Authentication: API Key in header (e.g., X-Api-Key)

Quickstart

Get up and running in three steps:

  1. List RCS agents to find your agent ID
  2. Send a message using a template or free-form content
  3. Receive outcomes via webhook for Delivery/Read events and handle Inbound responses
Template guide

For the complete JSON body structure of templates (TEXT, CARD, CAROUSEL), Suggestions, Media, Placeholders, and SMS Fallback, see RCS Templates.

RCS Agents

List agents

Retrieve all RCS agents configured for your account. You'll need an agentId to send any message.

curl -X GET https://lora-api.agiletelecom.com/api/message-server/rcs/agents \
-H "X-Api-Key: YOUR_API_KEY"

Response: An array of agent objects with the agentId field. Copy the agentId you want to use for sending messages.

RCS Templates (CRUD)

Templates let you reuse message designs across campaigns. Store them once, send thousands of times. See RCS Templates for the complete JSON structure.

List templates

Retrieve all templates for your account in paginated format. Useful for building a template picker in your UI.

curl -X GET "https://lora-api.agiletelecom.com/api/message-server/rcs/templates?limit=10&page=1" \
-H "X-Api-Key: YOUR_API_KEY"

Parameters:

  • limit: number of records per page (e.g., 10)
  • page: page number (starts at 1)

Get template details

Fetch a single template by ID to see its complete structure before sending. Helpful for previewing template content or validating placeholders.

curl -X GET https://lora-api.agiletelecom.com/api/message-server/rcs/templates/tpl_123 \
-H "X-Api-Key: YOUR_API_KEY"

Create template

Store a reusable template for sending the same message to many recipients. See RCS Templates for body structure details.

curl -X POST https://lora-api.agiletelecom.com/api/message-server/rcs/templates \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Welcome Template",
"type": "TEXT",
"body": { "text": "Welcome to our service!" }
}'

Update template

Modify an existing template. All subsequent sends using this template will use the updated content.

curl -X PUT https://lora-api.agiletelecom.com/api/message-server/rcs/templates/tpl_123 \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Welcome Template",
"type": "TEXT",
"body": { "text": "Welcome back!" }
}'

Delete template

Remove a template from your account. Messages already sent won't be affected, but you won't be able to send new messages using this template.

curl -X DELETE https://lora-api.agiletelecom.com/api/message-server/rcs/templates/tpl_123 \
-H "X-Api-Key: YOUR_API_KEY"

Sending messages

Send from template

Send a message using a previously saved template. Use messageId to track delivery reports and read events. Optionally schedule the send for a future date.

curl -X POST https://lora-api.agiletelecom.com/api/message-server/rcs/send \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateId": "tpl_123",
"destination": "+391234567890",
"agentId": "agent_abc",
"messageId": "ext-unique-id-001",
"placeholders": {"name": "Anna"},
"simulation": false,
"scheduledDate": "2026-04-15T10:30:00Z"
}'
FieldTypeRequiredDescription
templateIdstringYesTemplate ID to use
destinationstringYesRecipient phone number
agentIdstringYesRCS Agent ID
messageIdstringYesUnique identifier for idempotency
placeholdersobjectNoVariables to replace in template
simulationbooleanNoTest mode (default: false)
scheduledDatestring (ISO-8601)NoScheduled send date/time

Send without template (free-form)

Send a message on-the-fly without storing it as a template. Useful for dynamic or one-off messages.

curl -X POST https://lora-api.agiletelecom.com/api/message-server/rcs/send \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "agent_abc",
"destination": "+391234567890",
"messageId": "ext-unique-id-002",
"body": {
"type": "TEXT",
"text": "Your order #12345 is ready for pickup!"
}
}'

For the full body structure including CARD, CAROUSEL, Suggestions, Media, Placeholders, and SMS Fallback, see RCS Templates.

Scheduling and simulation

  • scheduledDate: ISO-8601 format; timezone handling is the client's responsibility
  • simulation: Test mode; responses indicate platform acceptance but no actual send occurs
SMS Fallback

Requires an authorized SMS sender. Authorization can be requested free of charge in the platform.

Asynchronous events: Delivery and Read

Final outcomes don't arrive in the immediate response but via webhook to your configured endpoint. The send response only indicates acceptance.

Delivery

Message delivery notification.

{
"channel": "RCS",
"eventType": "DELIVERY",
"messageId": "ext-unique-id-001",
"destination": "+391234567890",
"statusCode": "DELIVERED",
"description": "Message delivered",
"timestamp": "2025-11-12T10:30:10Z"
}

Read

Message read notification.

{
"channel": "RCS",
"eventType": "READ",
"messageId": "ext-unique-id-001",
"destination": "+391234567890",
"timestamp": "2025-11-12T10:32:45Z"
}
Webhook retries

The platform performs up to five retries spaced several minutes apart. If you don't respond correctly, retries stop after the fifth attempt.

Inbound messages and Media

User responses and multimedia content arrive at your configured Inbound endpoint.

Inbound text

Contains text and any emojis inserted by the user.

{
"channel": "RCS",
"messageType": "TEXT",
"source": "+391234567890",
"destination": "agent_abc",
"receivedDate": "2025-11-12T10:35:20Z",
"text": "Yes, I'm interested"
}

Inbound with media

Contains a key (mediaKey) to retrieve an image or file sent by the user.

{
"channel": "RCS",
"messageType": "IMAGE",
"source": "+391234567890",
"destination": "agent_abc",
"receivedDate": "2025-11-12T10:36:05Z",
"mediaKey": "rcs-media-001"
}

Download media

Fetch the media file using the key from an inbound message. The temporary download URL expires after the specified minutes.

curl -X GET "https://lora-api.agiletelecom.com/api/files/rcs-media-001?expireMinutes=15" \
-H "X-Api-Key: YOUR_API_KEY"

Response: A public and temporary URL for downloading the media file.

Best practices

  • Placeholders: Always provide required values; otherwise substitution won't occur
  • Media: Use public and stable URLs for the entire campaign duration; always set an appropriate height value
  • Suggestions: Respect the required fields for each action type
  • Idempotency: Always use unique messageIds
  • Error handling: Handle 4xx (input errors) and 5xx (temporary errors) with exponential backoff

Postman Collection

Import the official collection to quickly test all endpoints in an interactive environment.

Step 1: Import the collection

  1. Open Postman → Import
  2. Select the file: AgileTelecom RCS API.postman_collection.json
  3. Confirm with Import

The collection includes requests for Agents, Template CRUD, Sending, example webhooks, and media download.

Step 2: Configure collection variables

  1. Click the AgileTelecom RCS API collection
  2. Open the Variables tab and fill in:
VariableValueUse
BASE_URLhttps://lora-api.agiletelecom.comBase URL for all requests
API_KEYYour API keyAuthentication
DESTINATION+391234567890Recipient number
AGENT_IDAgent ID (from GET /rcs/agents)Message sending
TEMPLATE_ID_TEXTTEXT template IDTest sending
TEMPLATE_ID_CARDCARD template IDTest sending
SCHEDULED_DATE2026-04-30T18:50:00ZScheduled sends
MESSAGE_IDuuid-1Unique message ID
MEDIA_KEYMedia keyInbound media download
Important note

If after import you find BASE_URL with a different value, replace it with https://lora-api.agiletelecom.com in the collection Variables tab. Remember the X-Api-Key: \{\{API_KEY\}\} header in requests that require it.

Step 3: Execute requests

  • Agents: GET \{\{BASE_URL\}\}/api/message-server/rcs/agents
  • Templates (CRUD):
    • List: GET \{\{BASE_URL\}\}/api/message-server/rcs/templates?limit=10&page=1
    • Details: GET \{\{BASE_URL\}\}/api/message-server/rcs/templates/:id
    • Create: POST \{\{BASE_URL\}\}/api/message-server/rcs/templates
    • Update: PUT \{\{BASE_URL\}\}/api/message-server/rcs/templates/:id
    • Delete: DELETE \{\{BASE_URL\}\}/api/message-server/rcs/templates/:id
  • Sending:
    • From template: POST \{\{BASE_URL\}\}/api/message-server/rcs/send
    • Free-form: POST \{\{BASE_URL\}\}/api/message-server/rcs/send with complete body
  • Media: GET \{\{BASE_URL\}\}/api/files/:mediaKey?expireMinutes=180

Example template-based send:

POST {{BASE_URL}}/api/message-server/rcs/send
X-Api-Key: {{API_KEY}}
Content-Type: application/json

{
"templateId": "{{TEMPLATE_ID_TEXT}}",
"destination": "{{DESTINATION}}",
"agentId": "{{AGENT_ID}}",
"messageId": "{{MESSAGE_ID}}",
"placeholders": {"name": "Anna"}
}

Troubleshooting

Q: I see {name} in the received message. Why?

A: The placeholder value is missing from the send request. Always provide values for all placeholders used in your template, or remove the variable from the template.

Q: The image won't load in my message.

A: Verify the image URL is publicly accessible and that you've set the height property correctly in your template.

Q: The send response says "accepted". Did the send succeed?

A: "Accepted" means the platform queued your message. Final delivery status arrives later via the DELIVERY webhook event.

Q: SMS fallback isn't sending.

A: Ensure the SMS sender is authorized in the platform. You can request authorization through your admin dashboard at no charge.

Q: How do I check if a recipient supports RCS?

A: Use the SMS fallback feature to handle RCS-unreachable contacts. Observe DELIVERY status codes to identify which contacts received the message via RCS versus SMS.

What's next?

  • See RCS Templates for the complete template structure and field reference
  • Configure webhooks to receive Delivery/Read events and Inbound responses
  • Test your integration with the Postman Collection