---
title: "Validate RCS Message"
method: POST
path: "/messages/validate/rcs"
tags: ["Messages > rcs"]
---

# Validate RCS Message

`POST /messages/validate/rcs`

## Request

- Base URL: `https://api.pinnacle.sh`
- URL: `https://api.pinnacle.sh/messages/validate/rcs`
- Auth: API key in header `PINNACLE-API-KEY`

Validate RCS message content without sending it.

## Request body

- union
  - RcsTextContent: Message containing longer text content with optional quick reply buttons.
    - `quickReplies` RichButton[]: List of interactive quick reply buttons in the message. <br><br> **Limit:** 10 max
      - union
        - object: Button that opens a URL when tapped by the recipient.
          - `type` 'openUrl', required: Discriminator value: openUrl
          - `webviewMode` 'HALF' | 'TALL' | 'FULL': Controls how the URL is displayed when the button is tapped. **Default behavior:** If not specified, the URL opens in the device's default browser. If you're sending deeplinks, you should use this mode as it will open the deeplink in the native app if it is installed. **Available modes in order of size:** - `HALF` — Half-screen webview overlay - `TALL` — Tall webview overlay - `FULL` — Full-screen webview
          - `payload` string, uri, required: The URL to open when the button is tapped. Must be a valid HTTP or HTTPS URL.
          - `title` string, required: Display text for the button.
          - `metadata` string: Optional additional data to attach to this button.
        - object: Button that initiates a phone call when tapped by the recipient.
          - `type` 'call', required: Discriminator value: call
          - `metadata` string: Optional additional data to attach to this button.
          - `payload` string, required: Phone number to call in E.164 format
          - `title` string, required: Display text for the button.
        - object: Button that sends custom data back to your application when tapped by the recipient.
          - `type` 'trigger', required: Discriminator value: trigger
          - `metadata` string: Optional additional data to attach to this button.
          - `payload` string, required: Custom data sent to your webhook when the button is tapped. Use this to identify the user's choice.
          - `title` string, required: Display text for the button.
        - object: Button that prompts the recipient to share their current location.
          - `type` 'requestUserLocation', required: Discriminator value: requestUserLocation
          - `metadata` string: Optional additional data to attach to this button.
          - `title` string, required: Display text for the button.
        - object: Button that prompts the recipient to add an event to their calendar.
          - `type` 'scheduleEvent', required: Discriminator value: scheduleEvent
          - `eventDescription` string: Detailed description for the calendar event.
          - `eventEndTime` string, required: End time in ISO 8601 format.
          - `eventStartTime` string, required: Starting time in ISO 8601 format.
          - `eventTitle` string, required: Title of the event.
          - `metadata` string: Optional additional data to attach to this button.
          - `title` string, required: Display text for the button.
        - object: Button that shares a specific location with the recipient when tapped.
          - `type` 'sendLocation', required: Discriminator value: sendLocation
          - `name` string: Optional name or label for the location that will be displayed in the map app (e.g., "Central Park", "Home Office"). If not provided, the button title will be used as the location name.
          - `latLong` RichButtonDiscriminatorMappingSendLocationLatLong, required: Geographic coordinates of the location to share.
            - `lat` number, double, required: Latitude coordinate in decimal degrees.
            - `lng` number, double, required: Longitude coordinate in decimal degrees.
          - `title` string, required: Display text for the button.
          - `metadata` string: Optional additional data to attach to this button.
    - `text` string, required: Text content of the RCS message.
  - RcsValidateContent1: Message containing a media file and/or text with optional quick reply buttons.<br> See [supported media types](https://app.pinnacle.sh/supported-file-types?type=RCS-MEDIA).
    - `media` string, url, required: Media file URLs to send.
    - `quickReplies` RichButton[]
      - union
        - object: Button that opens a URL when tapped by the recipient.
          - `type` 'openUrl', required: Discriminator value: openUrl
          - `webviewMode` 'HALF' | 'TALL' | 'FULL': Controls how the URL is displayed when the button is tapped. **Default behavior:** If not specified, the URL opens in the device's default browser. If you're sending deeplinks, you should use this mode as it will open the deeplink in the native app if it is installed. **Available modes in order of size:** - `HALF` — Half-screen webview overlay - `TALL` — Tall webview overlay - `FULL` — Full-screen webview
          - `payload` string, uri, required: The URL to open when the button is tapped. Must be a valid HTTP or HTTPS URL.
          - `title` string, required: Display text for the button.
          - `metadata` string: Optional additional data to attach to this button.
        - object: Button that initiates a phone call when tapped by the recipient.
          - `type` 'call', required: Discriminator value: call
          - `metadata` string: Optional additional data to attach to this button.
          - `payload` string, required: Phone number to call in E.164 format
          - `title` string, required: Display text for the button.
        - object: Button that sends custom data back to your application when tapped by the recipient.
          - `type` 'trigger', required: Discriminator value: trigger
          - `metadata` string: Optional additional data to attach to this button.
          - `payload` string, required: Custom data sent to your webhook when the button is tapped. Use this to identify the user's choice.
          - `title` string, required: Display text for the button.
        - object: Button that prompts the recipient to share their current location.
          - `type` 'requestUserLocation', required: Discriminator value: requestUserLocation
          - `metadata` string: Optional additional data to attach to this button.
          - `title` string, required: Display text for the button.
        - object: Button that prompts the recipient to add an event to their calendar.
          - `type` 'scheduleEvent', required: Discriminator value: scheduleEvent
          - `eventDescription` string: Detailed description for the calendar event.
          - `eventEndTime` string, required: End time in ISO 8601 format.
          - `eventStartTime` string, required: Starting time in ISO 8601 format.
          - `eventTitle` string, required: Title of the event.
          - `metadata` string: Optional additional data to attach to this button.
          - `title` string, required: Display text for the button.
        - object: Button that shares a specific location with the recipient when tapped.
          - `type` 'sendLocation', required: Discriminator value: sendLocation
          - `name` string: Optional name or label for the location that will be displayed in the map app (e.g., "Central Park", "Home Office"). If not provided, the button title will be used as the location name.
          - `latLong` RichButtonDiscriminatorMappingSendLocationLatLong, required: Geographic coordinates of the location to share.
            - `lat` number, double, required: Latitude coordinate in decimal degrees.
            - `lng` number, double, required: Longitude coordinate in decimal degrees.
          - `title` string, required: Display text for the button.
          - `metadata` string: Optional additional data to attach to this button.
  - RcsCards: Message containing cards, each with its own title, subtitle, and/or buttons. Quick replies can also be added. <br> See (supported file types)[https://app.pinnacle.sh/supported-file-types?type=RCS-CARD].
    - `cards` RcsCardsCardsItems[], required: Collection of cards attached to the message. <br><br> **Limit:** 1 to 10
      - `buttons` RichButton[]: While buttons resemble quick replies, they remain on screen after being clicked and are card-specific. <br><br> **Limit:** 4 max
        - union
          - object: Button that opens a URL when tapped by the recipient.
            - `type` 'openUrl', required: Discriminator value: openUrl
            - `webviewMode` 'HALF' | 'TALL' | 'FULL': Controls how the URL is displayed when the button is tapped. **Default behavior:** If not specified, the URL opens in the device's default browser. If you're sending deeplinks, you should use this mode as it will open the deeplink in the native app if it is installed. **Available modes in order of size:** - `HALF` — Half-screen webview overlay - `TALL` — Tall webview overlay - `FULL` — Full-screen webview
            - `payload` string, uri, required: The URL to open when the button is tapped. Must be a valid HTTP or HTTPS URL.
            - `title` string, required: Display text for the button.
            - `metadata` string: Optional additional data to attach to this button.
          - object: Button that initiates a phone call when tapped by the recipient.
            - `type` 'call', required: Discriminator value: call
            - `metadata` string: Optional additional data to attach to this button.
            - `payload` string, required: Phone number to call in E.164 format
            - `title` string, required: Display text for the button.
          - object: Button that sends custom data back to your application when tapped by the recipient.
            - `type` 'trigger', required: Discriminator value: trigger
            - `metadata` string: Optional additional data to attach to this button.
            - `payload` string, required: Custom data sent to your webhook when the button is tapped. Use this to identify the user's choice.
            - `title` string, required: Display text for the button.
          - object: Button that prompts the recipient to share their current location.
            - `type` 'requestUserLocation', required: Discriminator value: requestUserLocation
            - `metadata` string: Optional additional data to attach to this button.
            - `title` string, required: Display text for the button.
          - object: Button that prompts the recipient to add an event to their calendar.
            - `type` 'scheduleEvent', required: Discriminator value: scheduleEvent
            - `eventDescription` string: Detailed description for the calendar event.
            - `eventEndTime` string, required: End time in ISO 8601 format.
            - `eventStartTime` string, required: Starting time in ISO 8601 format.
            - `eventTitle` string, required: Title of the event.
            - `metadata` string: Optional additional data to attach to this button.
            - `title` string, required: Display text for the button.
          - object: Button that shares a specific location with the recipient when tapped.
            - `type` 'sendLocation', required: Discriminator value: sendLocation
            - `name` string: Optional name or label for the location that will be displayed in the map app (e.g., "Central Park", "Home Office"). If not provided, the button title will be used as the location name.
            - `latLong` RichButtonDiscriminatorMappingSendLocationLatLong, required: Geographic coordinates of the location to share.
              - …
            - `title` string, required: Display text for the button.
            - `metadata` string: Optional additional data to attach to this button.
      - `media` string, url: Media file URLs to send.
      - `mediaHeight` 'SHORT' | 'MEDIUM' | 'TALL': Height of the card media. <br><br> **Default:** `MEDIUM` <br> **Valid for:** Carousel cards and vertical standalone cards. <br> **Not valid for:** Horizontal standalone cards. <br> **Requires:** The card must include a `media` field. <br> **Platform:** Media height selection applies only on Android. For iOS, assume `MEDIUM`.
      - `subtitle` string: Secondary text displayed below the title for additional context.
      - `title` string, required: Title displayed on the card.
    - `quickReplies` RichButton[]: List of interactive quick reply buttons in the message. <br><br> **Limit:** 10 max
      - union
        - object: Button that opens a URL when tapped by the recipient.
          - `type` 'openUrl', required: Discriminator value: openUrl
          - `webviewMode` 'HALF' | 'TALL' | 'FULL': Controls how the URL is displayed when the button is tapped. **Default behavior:** If not specified, the URL opens in the device's default browser. If you're sending deeplinks, you should use this mode as it will open the deeplink in the native app if it is installed. **Available modes in order of size:** - `HALF` — Half-screen webview overlay - `TALL` — Tall webview overlay - `FULL` — Full-screen webview
          - `payload` string, uri, required: The URL to open when the button is tapped. Must be a valid HTTP or HTTPS URL.
          - `title` string, required: Display text for the button.
          - `metadata` string: Optional additional data to attach to this button.
        - object: Button that initiates a phone call when tapped by the recipient.
          - `type` 'call', required: Discriminator value: call
          - `metadata` string: Optional additional data to attach to this button.
          - `payload` string, required: Phone number to call in E.164 format
          - `title` string, required: Display text for the button.
        - object: Button that sends custom data back to your application when tapped by the recipient.
          - `type` 'trigger', required: Discriminator value: trigger
          - `metadata` string: Optional additional data to attach to this button.
          - `payload` string, required: Custom data sent to your webhook when the button is tapped. Use this to identify the user's choice.
          - `title` string, required: Display text for the button.
        - object: Button that prompts the recipient to share their current location.
          - `type` 'requestUserLocation', required: Discriminator value: requestUserLocation
          - `metadata` string: Optional additional data to attach to this button.
          - `title` string, required: Display text for the button.
        - object: Button that prompts the recipient to add an event to their calendar.
          - `type` 'scheduleEvent', required: Discriminator value: scheduleEvent
          - `eventDescription` string: Detailed description for the calendar event.
          - `eventEndTime` string, required: End time in ISO 8601 format.
          - `eventStartTime` string, required: Starting time in ISO 8601 format.
          - `eventTitle` string, required: Title of the event.
          - `metadata` string: Optional additional data to attach to this button.
          - `title` string, required: Display text for the button.
        - object: Button that shares a specific location with the recipient when tapped.
          - `type` 'sendLocation', required: Discriminator value: sendLocation
          - `name` string: Optional name or label for the location that will be displayed in the map app (e.g., "Central Park", "Home Office"). If not provided, the button title will be used as the location name.
          - `latLong` RichButtonDiscriminatorMappingSendLocationLatLong, required: Geographic coordinates of the location to share.
            - `lat` number, double, required: Latitude coordinate in decimal degrees.
            - `lng` number, double, required: Longitude coordinate in decimal degrees.
          - `title` string, required: Display text for the button.
          - `metadata` string: Optional additional data to attach to this button.

## Response `200`

Returns validation results.

- RCSValidationResponse
  - `total` number, double, required: Total price of this message. Calculated by multiplying the number of messages by the unit cost.
  - `unit` number, double, required: Cost per message.
  - `segments` integer, required: Total number of segments used across the message.
  - `unsupportedFiles` string[], required: List of unsupported media file names or URLs.

## Other responses

- `400`: Validation failed. The payload has missing required fields and/or invalid types. <br> See https://zod.dev/error-formatting for more information.
- `401`: The request lacks valid authentication credentials or the provided credentials are invalid. <br> Ensure you're including a valid API key in the request headers and that your account has the necessary permissions to access this endpoint.
- `403`: Your subscription does not include access to this feature. <br> This occurs when attempting to use functionality that requires a higher subscription tier. Please upgrade your subscription to access this feature.
- `500`: An unexpected error occurred on Pinnacle's servers while processing your request. <br> If this error persists, please contact support with the request details.

---

[API](https://skmtc.dev/pinnacle/apis/pinnacle-2.md) - [All operations](https://skmtc.dev/pinnacle/apis/pinnacle-2/llms.txt) - [OpenAPI document](https://skmtc.dev/pinnacle/apis/pinnacle-2/revisions/45416dadab79?raw)
