> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pinnacle.sh/v-2/api-reference/campaigns/rcs/get/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pinnacle.sh/_mcp/server.
# Get RCS Campaign by ID
GET https://api.pinnacle.sh/campaigns/rcs/{campaignId}
Retrieve RCS campaign.
Reference: https://docs.pinnacle.sh/api-reference/campaigns/rcs/get
## Authentication
- `PINNACLE-API-KEY` header (required) — API Key authentication via header
## Request
### Path parameters
- `campaignId` (string, required) — Unique identifier of the RCS campaign. Must begin with the prefix `rcs_`.
## Response
### 200
Successfully retrieved.
- `agent` (RcsCampaignSchemaExtraAgent, required) — Agent configured to the campaign.
- `agentId` (string, required) — Agent's unique identifier.
- `brand` (ExtendedBrand, required) — Brand associated with this campaign.
- `status` (enum, required) — Current review status of the campaign. `INCOMPLETE`: Not submitted. `IN REVIEW`: Being reviewed by carriers. `VERIFIED`: Approved and ready to send messages. `FAILED`: Issues and errors related to the campaign's details.
- Allowed values: `INCOMPLETE`, `IN REVIEW`, `VERIFIED`, `FAILED`
- `campaignId` (string, optional) — Unique identifier for the campaign. This identifier is a string that always begins with the prefix `rcs_`, for example: `rcs_1234567890`.
- `expectedAgentResponses` (list of string, optional) — List of what the agent might say to users. See the [Expected Agent Responses](/guides/campaigns/rcs-compliance#expected-agent-responses) section for requirements.
- `links` (RcsCampaignSchemaExtraLinks, optional) — Legal documentation links.
- `useCaseDescription` (string, optional) — Detailed summary of what the brand is and how this agent will be used. See the [Use Case Behavior](/guides/campaigns/rcs-compliance#use-case-behavior) section for requirements.
- `messagingType` (enum, optional) — Type of message the agent sends. `OTP`: One time passwords or verification codes. `TRANSACTIONAL`: Account updates, alerts, or notifications. `PROMOTIONAL`: Marketing, sales, or offers. `MULTI_USE`: Mixed message types.
- Allowed values: `OTP`, `TRANSACTIONAL`, `PROMOTIONAL`, `MULTI_USE`
- `ctaMedia` (string, optional) — URL to the opt-in form or a URL to a screenshot of the opt-in CTA.
- `optInMethod` (string, optional) — Details on how opt-in is acquired. If it is done through a website or app, provide the link. See the [Opt-In Method](/guides/campaigns/rcs-compliance#opt-in-method) section for requirements.
- `keywords` (RcsCampaignSchemaExtraKeywords, optional)
- `traffic` (RcsCampaignSchemaExtraTraffic, optional)
- `ctaLanguage` (string, optional) — Required text that appears next to the opt-in checkbox for your opt-in form. This checkbox has to be unchecked by default. See the [CTA Language](/guides/campaigns/rcs-compliance#cta-language-opt-in-disclosure) section for requirements.
- `demoTrigger` (string, optional) — Instructions on how an external reviewer can trigger messages and an example flow from the agent. This is usually an inbound text message to the agent that will start a flow of messages between the agent and the user. See the [Demo Trigger](/guides/campaigns/rcs-compliance#demo-trigger) section for requirements.
## Errors
### 400 Bad Request Error
Validation failed. The payload has missing required fields and/or invalid types. See [https://zod.dev/error-formatting](https://zod.dev/error-formatting) for more information.
- `description` (string, required) — Human-readable summary of validation failures.
- `errors` (ZodErrorErrors, required) — Structured dictionary of issues containing two main sections: - `errors`: Array of global validation errors not tied to specific fields - `properties`: Object mapping field names to their specific validation errors, where each field contains an `errors` array
### 401 Unauthorized Error
The request lacks valid authentication credentials or the provided credentials are invalid. Ensure you're including a valid API key in the request headers and that your account has the necessary permissions to access this endpoint.
- `error` (string, required) — Human-readable description of the error that occurred, corresponding to the HTTP status code.
### 403 Forbidden Error
Your subscription does not include access to this feature. This occurs when attempting to use functionality that requires a higher subscription tier. Please upgrade your subscription to access this feature.
- `error` (string, required) — Human-readable description of the error that occurred, corresponding to the HTTP status code.
### 404 Not Found Error
The requested resource could not be found. This may occur if the identifier is incorrect, the resource has been deleted, or you don't have permission to access it.
- `error` (string, required) — Human-readable description of the error that occurred, corresponding to the HTTP status code.
### 500 Internal Server Error
An unexpected error occurred on Pinnacle's servers while processing your request. If this error persists, please contact support with the request details.
- `error` (string, required) — Human-readable description of the error that occurred, corresponding to the HTTP status code.
## Types
### RcsCampaignSchemaExtraAgent
Agent configured to the campaign.
- `emails` (list of RcsCampaignSchemaExtraAgentEmailsItems, required) — List of emails.
- `phones` (list of RcsCampaignSchemaExtraAgentPhonesItems, required) — List of phone numbers.
- `websites` (list of RcsCampaignSchemaExtraAgentWebsitesItems, required) — List of urls.
- `color` (string, optional) — Color of the agent's buttons.
- `description` (string, optional) — Description of the agent.
- `heroUrl` (string, optional) — Link to the agent's hero. Hero must be an image file with dimensions 1440x448px.
- `iconUrl` (string, optional) — Link to the agent's icon. Icon must be an image file with dimensions 224x224px.
- `name` (string, optional) — Name of the agent.
### ExtendedBrand
- `createdAt` (string, required) — ISO 8601 formatted timestamp of when this brand was added to our system.
- `id` (string, required) — The brand's ID. This identifier is a string that always begins with the prefix `b_`, for example: `b_1234567890`.
- `isArchived` (boolean, required) — Indicates if this brand is archived.
- `status` (enum, required) — Current review status of the brand. `INCOMPLETE`: Not submitted. `IN REVIEW`: Being reviewed by carriers. `VERIFIED`: Approved and ready to send messages. `FAILED`: Issues and errors related to the campaign's details. `VETTED`: Has undergone additional vetting by a third party service post the brand being verified. Your brand will be assigned a trust score, with higher trust scores having higher message volumes. `UNVERIFIED`: Brand details have been updated, and the brand will need to undergo re-verification.
- Allowed values: `PENDING`, `UNVERIFIED`, `VERIFIED`, `VETTED`, `FAILED`, `INCOMPLETE`
- `updatedAt` (string, required) — ISO 8601 formatted timestamp of when this brand was last updated.
- `address` (string, optional) — Primary brand address where this brand is located.
- `contact` (optionalContactSchema, optional) — Contact information for the primary brand representative.
- `dba` (string, optional, nullable) — "Doing Business As" name - the public name this brand operates under.
- `description` (string, optional) — Brief description of what this brand does.
- `ein` (string, optional) — Employer Identification Number (EIN) assigned by the IRS.
- `email` (string, optional) — Main contact email address for this brand.
- `name` (string, optional) — Legal name of the brand as registered.
- `sector` (enum, optional) — Industry the Brand operates in.
- Allowed values: `AGRICULTURE`, `COMMUNICATION`, `CONSTRUCTION`, `EDUCATION`, `ENERGY`, `ENTERTAINMENT`, `FINANCIAL`, `GAMBLING`, `GOVERNMENT`, `HEALTHCARE`, `HOSPITALITY`, `INSURANCE`, `MANUFACTURING`, `NGO`, `REAL_ESTATE`, `RETAIL`, `TECHNOLOGY`
- `type` (enum, optional) — Legal structure of the brand.
- Allowed values: `GOVERNMENT`, `NON_PROFIT`, `PRIVATE_PROFIT`, `PUBLIC_PROFIT`, `SOLE_PROPRIETOR`
- `entityType` (enum, optional) — Legal entity type of the brand.
- Allowed values: `LLC`, `SOLE_PROPRIETORSHIP`, `PARTNERSHIP`, `CORP`, `S_CORP`
- `website` (string, optional) — Brand website URL.
### RcsCampaignSchemaExtraLinks
Legal documentation links.
- `privacyPolicy` (string, optional) — Privacy policy URL.
- `termsOfService` (string, optional) — Terms of service URL.
### RcsCampaignSchemaExtraKeywords
- `HELP` (RcsCampaignSchemaExtraKeywordsHelp, optional)
- `OPT_IN` (RcsCampaignSchemaExtraKeywordsOptIn, optional)
- `OPT_OUT` (RcsCampaignSchemaExtraKeywordsOptOut, optional)
### RcsCampaignSchemaExtraTraffic
- `monthlyWebsite` (integer, optional) — Estimated monthly website visitors.
- `monthlyRcsEstimate` (integer, optional) — Estimated monthly RCS messages sent.
### ZodErrorErrors
Structured dictionary of issues containing two main sections: - `errors`: Array of global validation errors not tied to specific fields - `properties`: Object mapping field names to their specific validation errors, where each field contains an `errors` array
### RcsCampaignSchemaExtraAgentEmailsItems
- `email` (string, optional) — Email attached to the agent.
- `label` (string, optional) — Label for the email.
### RcsCampaignSchemaExtraAgentPhonesItems
- `label` (string, optional) — Label for the phone number.
- `phone` (string, optional) — Phone number attached to the agent in E.164 format.
### RcsCampaignSchemaExtraAgentWebsitesItems
- `label` (string, optional) — Label for the url.
- `url` (string, optional) — Url attached to the agent.
### optionalContactSchema
Contact information for the primary brand representative.
- `email` (string, optional) — Email address of the contact person.
- `name` (string, optional) — Full name of the contact person.
- `phone` (string, optional) — Phone number of the contact person in E.164 format.
- `title` (string, optional) — Job title or position oft he contact person.
### RcsCampaignSchemaExtraKeywordsHelp
- `message` (string, optional) — Message sent when a user sends HELP. Must include at least one support contact method (phone, email, or website). See the [Keyword Response Messages](/guides/campaigns/rcs-compliance#keyword-response-messages) section for requirements.
- `keywords` (list of string, optional) — Keywords that trigger help response.
### RcsCampaignSchemaExtraKeywordsOptIn
- `message` (string, optional) — Message sent when a user opts in. Must include brand name, confirmation of subscription, and disclosures (STOP and HELP instructions, message and data rates). See the [Keyword Response Messages](/guides/campaigns/rcs-compliance#keyword-response-messages) section for requirements.
- `keywords` (list of string, optional) — Keywords that trigger opt-in response.
### RcsCampaignSchemaExtraKeywordsOptOut
- `message` (string, optional) — Message sent when a user opts out. Must include brand name, acknowledge opt-out request and state user will not receive further messages. No marketing or re-engagement attempts. See the [Keyword Response Messages](/guides/campaigns/rcs-compliance#keyword-response-messages) section for requirements.
- `keywords` (list of string, optional) — Keywords that trigger opt-out response.
## Examples
**Response**
```json
{
"agent": {
"emails": [
{
"email": "founders@trypinnacle.app",
"label": "Email Us"
}
],
"phones": [
{
"label": "Contact us directly",
"phone": "+14154467821"
}
],
"websites": [
{
"label": "Get started with Pinnacle",
"url": "https://www.trypinnacle.app/"
}
],
"color": "#000000",
"description": "Experience the power of RCS messaging with interactive demos. Test rich features like carousels, suggested replies, and media sharing. Get started with our developer-friendly APIs.",
"heroUrl": "https://pncl.to/D6pDSqGxqgfbCfQmw4gXdnlHu4uSB4",
"iconUrl": "https://pncl.to/mq_tdIDenRb5eYpJiM8-3THCaUBrZP",
"name": "Pinnacle - RCS Demo"
},
"agentId": "agent_V1StGXR8_Z5j",
"brand": {
"createdAt": "2024-08-17T08:00:30.632",
"id": "b_1234567890",
"isArchived": false,
"status": "VERIFIED",
"updatedAt": "2024-12-09T10:03:54.934",
"address": "500 Folsom Street, San Francisco, CA 94105",
"contact": {
"email": "janedoe1@pinnacle.example",
"name": "Jane Doe",
"phone": "+14155550123",
"title": "Customer Support Specialist"
},
"dba": "Pinnacle RCS",
"ein": "12-3456789",
"email": "founders@trypinnacle.app",
"name": "Pinnacle",
"sector": "TECHNOLOGY",
"type": "PRIVATE_PROFIT",
"website": "https://www.pinnacle.sh/"
},
"status": "VERIFIED",
"campaignId": "rcs_1234567890",
"expectedAgentResponses": [
"Here are the things I can help you with.",
"I can assist you with booking an appointment, or you may choose to book manually.",
"Here are the available times to connect with a representative tomorrow.",
"Your appointment has been scheduled."
],
"links": {
"privacyPolicy": "https://www.pinnacle.sh/privacy",
"termsOfService": "https://www.pinnacle.sh/terms"
},
"useCaseDescription": "Pinnacle is a developer-focused RCS assistant that helps teams design, test, and optimize rich messaging experiences across SMS, MMS, and RCS. The agent acts as both an \"onboarding guide\" for new customers and a \"best-practices coach\" for existing teams exploring higher-value RCS workflows like rich cards, carousels, and suggested actions.
\n\nThe agent delivers a mix of operational updates and educational content (2–6 messages/month). Content includes important platform notices (e.g., deliverability or throughput changes), implementation tips with sample RCS templates, and personalized recommendations on how to upgrade existing SMS campaigns into richer, higher-converting RCS conversations.\n",
"messagingType": "MULTI_USE",
"ctaMedia": "https://www.pinnacle.sh/send",
"optInMethod": "We ensure consent through an explicit opt-in process that follows 10DLC best practices.Users must agree to receive messages from Pinnacle before the agent sends them any messages.
\n\nUsers agree to these messages by signing an opt-in paper form that they can be found online at https://www.pinnacle.sh/opt-in. We only send messages once users have filled out the form and submitted it to us via email or through the dashboard.\n",
"keywords": {
"HELP": {
"message": "Email founders@trypinnacle.app for support.",
"keywords": [
"HELP",
"SUPPORT"
]
},
"OPT_IN": {
"message": "Welcome back to Pinnacle!
\n🔔 You're now subscribed to Pinnacle - RCS Demo and will continue receiving important updates and news. Feel free to contact this us at any time for help.
\n\nReply STOP to opt out and HELP for support. Message & rates may apply.\n",
"keywords": [
"START",
"SUBSCRIBE"
]
},
"OPT_OUT": {
"message": "You've been unsubscribed from Pinnacle and will no longer receive notifications. If you ever change your mind, reply START or SUBSCRIBE to rejoin anytime.",
"keywords": [
"STOP",
"UNSUBSCRIBE",
"END"
]
}
},
"traffic": {
"monthlyWebsite": 10000,
"monthlyRcsEstimate": 10000
},
"ctaLanguage": "By checking this box and submitting this form, you consent to receive transactional text messages for support, appointment, and reminder messages from Pinnacle Software Development Inc. Reply STOP to opt out. Reply HELP for help. Standard message and data rates may apply. Message frequency may vary. View our Terms and Conditions at https://www.pinnacle.sh/terms. View our Privacy Policy at https://www.pinnacle.sh/privacy.",
"demoTrigger": "Text \"START\" to trigger the flow."
}
```
**SDK Code**
```python RCS Campaign
import requests
url = "https://api.pinnacle.sh/campaigns/rcs/rcs_1234567890"
headers = {"PINNACLE-API-KEY": ""}
response = requests.get(url, headers=headers)
print(response.json())
```
```javascript RCS Campaign
const url = 'https://api.pinnacle.sh/campaigns/rcs/rcs_1234567890';
const options = {method: 'GET', headers: {'PINNACLE-API-KEY': ''}};
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
```
```go RCS Campaign
package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.pinnacle.sh/campaigns/rcs/rcs_1234567890"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("PINNACLE-API-KEY", "")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}
```
```ruby RCS Campaign
require 'uri'
require 'net/http'
url = URI("https://api.pinnacle.sh/campaigns/rcs/rcs_1234567890")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["PINNACLE-API-KEY"] = ''
response = http.request(request)
puts response.read_body
```
```java RCS Campaign
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
HttpResponse response = Unirest.get("https://api.pinnacle.sh/campaigns/rcs/rcs_1234567890")
.header("PINNACLE-API-KEY", "")
.asString();
```
```php RCS Campaign
request('GET', 'https://api.pinnacle.sh/campaigns/rcs/rcs_1234567890', [
'headers' => [
'PINNACLE-API-KEY' => '',
],
]);
echo $response->getBody();
```
```csharp RCS Campaign
using RestSharp;
var client = new RestClient("https://api.pinnacle.sh/campaigns/rcs/rcs_1234567890");
var request = new RestRequest(Method.GET);
request.AddHeader("PINNACLE-API-KEY", "");
IRestResponse response = client.Execute(request);
```
```swift RCS Campaign
import Foundation
let headers = ["PINNACLE-API-KEY": ""]
let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/campaigns/rcs/rcs_1234567890")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
print(error as Any)
} else {
let httpResponse = response as? HTTPURLResponse
print(httpResponse)
}
})
dataTask.resume()
```
> One API for RCS, iMessage, MMS, and SMS. Build, test, and scale every channel — send your first message in minutes, not weeks.