Receiving RCS Messages
Receiving your first RCS message with Pinnacle's Ruby SDK
Prerequisites
Before proceeding, ensure you have obtained an RCS sandbox agent and API key as described in the prerequisites.
Installation
Create a Gemfile in your project directory:
source "https://rubygems.org"
gem "sinatra", "4.2.1"
gem "rackup"
gem "puma"
gem "json"
gem "dotenv"
gem "rcs", "2.0.21"Install the dependencies:
bundle installThis guide uses version rcs 2.0.21. Requires Ruby version >= 3.3.0
Version rcs 2.0.21 does not serialize top-level RCS quick replies correctly. These examples use card buttons instead. To send quickReplies, use the REST API until a corrected SDK version is published.
Configuration
Create an .env file in your project root and add your Pinnacle API key:
PINNACLE_API_KEY="your_api_key" # pnclk_
AGENT_ID="your_agent_id" # agent_
PINNACLE_SIGNING_SECRET="your_signing_secret" # pss_Setting Up a Webhook
To receive inbound RCS messages, you need to configure a webhook in the Pinnacle dashboard:
- Navigate to Development > Webhooks in the Pinnacle dashboard
- Click Create new webhook
- Give your webhook a descriptive name
- Enter your webhook endpoint URL
- For local development, use an ngrok tunnel pointing to
localhost:4567/inbound-rcs - For production, use your deployed server URL
- For local development, use an ngrok tunnel pointing to
- Add your RCS sandbox agent to your webhook for it to receive messages. You must also whitelist the devices you want to test with by navigating to your sandbox agent and adding test device phone numbers.
Optionally, you can configure custom HTTP headers (e.g. X-API-KEY) to be
sent on every webhook delivery. Add them in the dashboard or via the
headers field on POST /webhooks/attach.
The PINNACLE-SIGNING-SECRET header is reserved.
Creating Your Webhook Endpoint
Create a new Ruby file (e.g., main.rb) and use the complete example.
The complete example creates a Sinatra endpoint that:
- Receives webhook POST requests at
/inbound-rcs - Verifies the webhook signature using your signing secret
- Handles inbound text messages, button clicks, media, and location shares
- Echoes text messages back and responds to button presses
Running Your Server
Start the Sinatra server:
ruby main.rbYour server will start on http://localhost:4567. If you're using ngrok for local development, start it in a separate terminal:
ngrok http 4567Use the ngrok URL (e.g., https://abc123.ngrok.io/inbound-rcs) as your webhook endpoint in the Pinnacle dashboard.
Testing Your Webhook
Send a POST request using your whitelisted test number. This unauthenticated demo endpoint is for local testing only.
curl -X POST "http://localhost:4567/send-rcs/+14155550123"If there are no errors, you should see something like
{
"success": true,
"response": {
"messageId": "msg_7401",
"segments": 1,
"totalCost": 0.03,
"recipient": "+18708977103",
"sender": "agent_pinnacleNbjn",
"status": "queued"
}
}and receive a message on your whitelisted device like this:

If you're not receiving any messages, make sure you have
- Your RCS sandbox agent associated with your webhook
- Your test device is whitelisted
If you tap "Hello!", your whitelisted device should receive a text saying "Hello! Button clicked successfully." If you reply with a text message, the server will echo it back.
With that, your webhook should now be successfully receiving inbound RCS messages as well as message status updates for outbound messages! You can monitor delivery statuses by filtering events by direction:
if message_event.type == 'MESSAGE.STATUS' && message_event.direction == 'OUTBOUND'
puts "Outbound message status: #{message_event.status}"
endFor more detail about processing the message payload received, please view the process method.