# Get RCS Campaign by ID

`GET /campaigns/rcs/{campaignId}`

Retrieve RCS campaign.

## Authentication

Send your API key in the `PINNACLE-API-KEY` header.

## Parameters

- `campaignId` — path, string. Unique identifier of the RCS campaign. Must begin with the prefix `rcs_`.

## Responses

### 200

Successfully retrieved.

Content type: `application/json`. Schema: `ExtendedRcsCampaign`.

- `agent` — `object`. Agent configured to the campaign.
- `agent.color` — `string`, optional. Color of the agent's buttons.
- `agent.description` — `string`, optional. Description of the agent.
- `agent.emails` — `object[]`. List of emails.
- `agent.emails[].email` — `string`, optional. Email attached to the agent.
- `agent.emails[].label` — `string`, optional. Label for the email.
- `agent.heroUrl` — `string`, optional. Link to the agent's hero. Hero must be an image file with dimensions 1440x448px.
- `agent.iconUrl` — `string`, optional. Link to the agent's icon. Icon must be an image file with dimensions 224x224px.
- `agent.name` — `string`, optional. Name of the agent.
- `agent.phones` — `object[]`. List of phone numbers.
- `agent.phones[].label` — `string`, optional. Label for the phone number.
- `agent.phones[].phone` — `string`, optional. Phone number attached to the agent in E.164 format.
- `agent.websites` — `object[]`. List of urls.
- `agent.websites[].label` — `string`, optional. Label for the url.
- `agent.websites[].url` — `string`, optional. Url attached to the agent.
- `agentId` — `string`. Agent's unique identifier.
- `brand` — `object`. Brand associated with this campaign.
- `brand.createdAt` — `string`. ISO 8601 formatted timestamp of when this brand was added to our system.
- `brand.id` — `string`. The brand's ID. This identifier is a string that always begins with the prefix `b_`, for example: `b_1234567890`.
- `brand.isArchived` — `boolean`. Indicates if this brand is archived.
- `brand.status` — `BrandStatusEnum`, values: `PENDING`, `UNVERIFIED`, `VERIFIED`, `VETTED`, `FAILED`, `INCOMPLETE`. 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.
- `brand.updatedAt` — `string`. ISO 8601 formatted timestamp of when this brand was last updated.
- `brand.address` — `string`, optional. Primary brand address where this brand is located.
- `brand.contact` — `OptionalContacts`, optional. Contact information for the primary brand representative.
- `brand.contact.email` — `string`, optional. Email address of the contact person.
- `brand.contact.name` — `string`, optional. Full name of the contact person.
- `brand.contact.phone` — `string`, optional. Phone number of the contact person in E.164 format.
- `brand.contact.title` — `string`, optional. Job title or position oft he contact person.
- `brand.dba` — `string`, optional. "Doing Business As" name - the public name this brand operates under.
- `brand.description` — `string`, optional. Brief description of what this brand does.
- `brand.ein` — `string`, optional. Employer Identification Number (EIN) assigned by the IRS.
- `brand.email` — `string`, optional. Main contact email address for this brand.
- `brand.name` — `string`, optional. Legal name of the brand as registered.
- `brand.sector` — `CompanySectorEnum`, optional, values: `AGRICULTURE`, `COMMUNICATION`, `CONSTRUCTION`, `EDUCATION`, `ENERGY`, `ENTERTAINMENT`, `FINANCIAL`, `GAMBLING`, `GOVERNMENT`, `HEALTHCARE`, `HOSPITALITY`, `INSURANCE`, `MANUFACTURING`, `NGO`, `REAL_ESTATE`, `RETAIL`, `TECHNOLOGY`. Industry the Brand operates in.
- `brand.type` — `CompanyTypeEnum`, optional, values: `GOVERNMENT`, `NON_PROFIT`, `PRIVATE_PROFIT`, `PUBLIC_PROFIT`, `SOLE_PROPRIETOR`. Legal structure of the brand.
- `brand.entityType` — `CompanyEntityTypeEnum`, optional, values: `LLC`, `SOLE_PROPRIETORSHIP`, `PARTNERSHIP`, `CORP`, `S_CORP`. Legal entity type of the brand.
- `brand.website` — `string`, optional. Brand website URL.
- `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` — `string[]`, optional. List of what the agent might say to users. See the Expected Agent Responses section for requirements.
- `links` — `object`, optional. Legal documentation links.
- `links.privacyPolicy` — `string`, optional, format: url. Privacy policy URL.
- `links.termsOfService` — `string`, optional, format: url. Terms of service URL.
- `status` — `ProfileStatusEnum`, values: `INCOMPLETE`, `IN REVIEW`, `VERIFIED`, `FAILED`. 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.
- `useCaseDescription` — `string`, optional. Detailed summary of what the brand is and how this agent will be used. See the Use Case Behavior section for requirements.
- `messagingType` — `RcsMessagingTypeEnum`, optional, values: `OTP`, `TRANSACTIONAL`, `PROMOTIONAL`, `MULTI_USE`. 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.
- `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 section for requirements.
- `keywords` — `object`, optional
- `keywords.HELP` — `object`, optional
- `keywords.HELP.message` — `string`, optional, minimum length: 20; maximum length: 320. Message sent when a user sends HELP. Must include at least one support contact method (phone, email, or website). See the Keyword Response Messages section for requirements.
- `keywords.HELP.keywords` — `string[]`, optional. Keywords that trigger help response.
- `keywords.OPT_IN` — `object`, optional
- `keywords.OPT_IN.message` — `string`, optional, minimum length: 20; maximum length: 320. 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 section for requirements.
- `keywords.OPT_IN.keywords` — `string[]`, optional. Keywords that trigger opt-in response.
- `keywords.OPT_OUT` — `object`, optional
- `keywords.OPT_OUT.message` — `string`, optional, minimum length: 20; maximum length: 320. 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 section for requirements.
- `keywords.OPT_OUT.keywords` — `string[]`, optional. Keywords that trigger opt-out response.
- `traffic` — `object`, optional
- `traffic.monthlyWebsite` — `integer`, optional. Estimated monthly website visitors.
- `traffic.monthlyRcsEstimate` — `integer`, optional. Estimated monthly RCS messages sent.
- `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 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 section for requirements.

Example:

```json
{
  "brand": {
    "id": "b_1234567890",
    "createdAt": "2024-08-17T08:00:30.632",
    "updatedAt": "2024-12-09T10:03:54.934",
    "isArchived": false,
    "status": "VERIFIED",
    "name": "Pinnacle",
    "dba": "Pinnacle RCS",
    "address": "500 Folsom Street, San Francisco, CA 94105",
    "email": "founders@trypinnacle.app",
    "website": "https://www.pinnacle.sh/",
    "type": "PRIVATE_PROFIT",
    "sector": "TECHNOLOGY",
    "ein": "12-3456789",
    "contact": {
      "name": "Jane Doe",
      "title": "Customer Support Specialist",
      "email": "janedoe1@pinnacle.example",
      "phone": "+14155550123"
    }
  },
  "campaignId": "rcs_1234567890",
  "agent": {
    "name": "Pinnacle - RCS Demo",
    "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.",
    "color": "#000000",
    "emails": [
      {
        "email": "founders@trypinnacle.app",
        "label": "Email Us"
      }
    ],
    "phones": [
      {
        "phone": "+14154467821",
        "label": "Contact us directly"
      }
    ],
    "websites": [
      {
        "url": "https://www.trypinnacle.app/",
        "label": "Get started with Pinnacle"
      }
    ],
    "heroUrl": "https://pncl.to/D6pDSqGxqgfbCfQmw4gXdnlHu4uSB4",
    "iconUrl": "https://pncl.to/mq_tdIDenRb5eYpJiM8-3THCaUBrZP"
  },
  "agentId": "agent_V1StGXR8_Z5j",
  "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."
  ],
  "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.<br>\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.<br>\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!<br>\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.<br>\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.",
  "links": {
    "privacyPolicy": "https://www.pinnacle.sh/privacy",
    "termsOfService": "https://www.pinnacle.sh/terms"
  },
  "status": "VERIFIED"
}
```

### 400

Validation failed. The payload has missing required fields and/or invalid types.

See https://zod.dev/error-formatting for more information.

Content type: `application/json`. Schema: `object`.

- `description` — `string`. Human-readable summary of validation failures.
- `errors` — `object`. 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

Example:

```json
{
  "description": "✖ Invalid input: expected string, received number\n  → at example_field",
  "errors": {
    "errors": [
      "Unrecognized key: 'extraKey'"
    ],
    "properties": {
      "example_field": {
        "errors": [
          "Invalid input: expected string, received NaN"
        ]
      }
    }
  }
}
```

### 401

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.

Content type: `application/json`. Schema: `object`.

- `error` — `string`. Human-readable description of the error that occurred, corresponding to the HTTP status code.

Example:

```json
{
  "error": "Invalid API key."
}
```

### 403

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.

Content type: `application/json`. Schema: `object`.

- `error` — `string`. Human-readable description of the error that occurred, corresponding to the HTTP status code.

Example:

```json
{
  "error": "Your subscription does not include access to this feature."
}
```

### 404

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.

Content type: `application/json`. Schema: `object`.

- `error` — `string`. Human-readable description of the error that occurred, corresponding to the HTTP status code.

Example:

```json
{
  "error": "The requested resource could not be found."
}
```

### 500

An unexpected error occurred on Pinnacle's servers while processing your request.

If this error persists, please contact support with the request details.

Content type: `application/json`. Schema: `object`.

- `error` — `string`. Human-readable description of the error that occurred, corresponding to the HTTP status code.

Example:

```json
{
  "error": "An unexpected error occurred while processing your request."
}
```

## SDK examples

### TypeScript

```typescript
import { PinnacleClient } from "rcs-js";

const client = new PinnacleClient({
  apiKey: process.env.PINNACLE_API_KEY!,
});

await client.campaigns.rcs.get("rcs_1234567890");
```

### Python

```python
import os
from rcs import Pinnacle

client = Pinnacle(
    api_key=os.environ["PINNACLE_API_KEY"],
)

client.campaigns.rcs.get(
    campaign_id="rcs_1234567890",
)
```

### Ruby

```ruby
require "rcs"

client = Pinnacle::Client.new(
  api_key: ENV.fetch("PINNACLE_API_KEY")
)

client.campaigns.rcs.get(campaign_id: "rcs_1234567890")
```

## Machine-readable schema

[OpenAPI 3.1 JSON](https://docs.pinnacle.sh/openapi.json)
