> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pinnacle.sh/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pinnacle.sh/_mcp/server.

# Send RCS Message

POST https://api.pinnacle.sh/messages/send/rcs
Content-Type: application/json

Send a RCS message immediately or schedule it for future delivery.&#x20;

Requires an active RCS agent and recipient devices that support RCS Business Messaging.

Reference: https://docs.pinnacle.sh/api-reference/messages/send-rcs

## Authentication

- `PINNACLE-API-KEY` header (required) — API Key authentication via header

## Request

### Body (application/json)

This endpoint expects a SendRcs.

- `SendRcs`

## Response

### 200

Successfully sent or scheduled the message. Use our [/messages/:id](./get) endpoint to track your message. When you send an RCS message with a fallback configured, the API checks whether the recipient's phone supports RCS **before** sending. If the phone does not support RCS, the fallback SMS or MMS is sent immediately instead, and you receive one of these response types. You will receive message statuses for the fallback message at your configured webhooks and also receive a `FALLBACK_SENT` webhook event for the original RCS message.

- `messages_rcs_send_Response_200`

## Errors

### 400 Bad Request Error

The request was unacceptable, often due to providing an invalid update.&#x20; Errors may originate from invalid payload or from Pinnacle's additional validation checks. For example, providing an URL that cannot be accessed, updating a campaign that is currently being reviewed, updating data that you cannot access, sending a malformed message, and so on.&#x20; For `Pinnacle Validation Error` inspect the `error` payload to determine the source of the failure. These errors are likely due to additional validation and business logic checks. For `Request Validation Error` inspect the `description` and `errors` payload to determine the source of failure. These errors are likely due to invalid payload inside the request.

- `SendRcsMessageRequestBadRequestError`

### 401 Unauthorized Error

The request lacks valid authentication credentials or the provided credentials are invalid.&#x20; 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.

### 402 Payment Required Error

Insufficient credits to complete this request.&#x20; This occurs when your account balance is below the required amount for processing the operation. Please add credits to your account to continue using the service.

- `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.&#x20; 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.&#x20; 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.&#x20; 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.

### 501 Not Implemented Error

The requested functionality is not implemented on the server.&#x20; This typically indicates that the feature or endpoint you attempted to access is unavailable or not yet supported.

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

## Types

### SendRcsText

- `from` (string, required) — Your RCS agent ID which must be prefixed with 'agent_'.
- `text` (string, required) — Text content of the RCS message.
- `to` (string, required) — Recipient's phone number in E.164 format.
- `fallback` (FallbackMessage, optional) — SMS/MMS fallback message to send if the RCS message fails to deliver. When a recipient's device doesn't support RCS, this fallback message will be sent as SMS or MMS instead. The fallback is sent from the specified phone number. > **Note:** At least one of `text` or `mediaUrls` must be provided. Fallback messages require a verified `from` phone number with SMS/MMS sending capabilities. > **Billing:** You will be charged the standard SMS or MMS rate for the fallback message. The original RCS message will not be charged if the fallback is sent instead.
- `options` (SendRichMessageOptions, optional) — Configure how your RCS message is sent and tracked.
- `quickReplies` (list of RichButton, optional) — List of interactive quick reply buttons in the message.&#x20; **Limit:** 10 max

### SendRcsMedia

- `from` (string, required) — Your RCS agent ID which must be prefixed with 'agent_'.
- `media` (string, required) — Media file URLs to send.&#x20; See [supported media types](https://app.pinnacle.sh/supported-file-types?type=RCS-MEDIA).
- `to` (string, required) — Recipient's phone number in E.164 format.
- `fallback` (FallbackMessage, optional) — SMS/MMS fallback message to send if the RCS message fails to deliver. When a recipient's device doesn't support RCS, this fallback message will be sent as SMS or MMS instead. The fallback is sent from the specified phone number. > **Note:** At least one of `text` or `mediaUrls` must be provided. Fallback messages require a verified `from` phone number with SMS/MMS sending capabilities. > **Billing:** You will be charged the standard SMS or MMS rate for the fallback message. The original RCS message will not be charged if the fallback is sent instead.
- `options` (SendRichMessageOptions, optional) — Configure how your RCS message is sent and tracked.
- `quickReplies` (list of RichButton, optional) — List of interactive quick reply buttons in the message.&#x20; `≤10`

### SendRcsCard

- `cards` (list of RcsCardsCardsItems, required) — Collection of cards attached to the message.&#x20; **Limit:** 1 to 10
- `from` (string, required) — Your RCS agent ID which must be prefixed with 'agent_'.
- `to` (string, required) — Recipient's phone number in E.164 format.
- `fallback` (FallbackMessage, optional) — SMS/MMS fallback message to send if the RCS message fails to deliver. When a recipient's device doesn't support RCS, this fallback message will be sent as SMS or MMS instead. The fallback is sent from the specified phone number. > **Note:** At least one of `text` or `mediaUrls` must be provided. Fallback messages require a verified `from` phone number with SMS/MMS sending capabilities. > **Billing:** You will be charged the standard SMS or MMS rate for the fallback message. The original RCS message will not be charged if the fallback is sent instead.
- `options` (SendRichCardsOptions, optional) — Configure how your RCS message is sent and tracked.
- `quickReplies` (list of RichButton, optional) — List of interactive quick reply buttons in the message.&#x20; **Limit:** 10 max

### SendRcsResponse

- `messageId` (string, required) — Unique identifier for the sent RCS message. This identifier is a string that always begins with the prefix `msg_`, for example: `msg_1234567890`.
- `segments` (integer, required) — Total number of segments used across the message.
- `totalCost` (double, required) — Total cost of sending the message.
- `sender` (string, required) — Sender's phone number in E.164 format.
- `recipient` (string, required) — Recipient's phone number in E.164 format.
- `status` ("queued", required) — Current status of the message.

### ScheduledSendResponse

- `scheduleId` (string, required) — Unique identifier for the scheduled send. This identifier is a string that always begins with the prefix `msg_sched_`, for example: `msg_sched_1234567890`.
- `config` (ScheduledSendResponseConfig, required) — Configuration for the scheduled message.

### SendRcsFallbackSmsResponse

Returned when a fallback is configured and the recipient does not support RCS. The API checks RCS capabilities at send time. If the recipient's device doesn't support RCS, the fallback SMS is sent instead. You will also receive a `FALLBACK_SENT` webhook event for the original RCS message.

- `fallbackSent` (true, required) — Indicates that the fallback SMS was sent because the recipient does not support RCS.
- `messageId` (string, required) — Unique identifier for the sent message. This identifier is a string that always begins with the prefix `msg_`, for example: `msg_1234567890`.
- `originalMessageId` (string, required) — Unique identifier of the original RCS message that triggered this fallback. Always begins with the prefix `msg_`. This is the RCS message that could not be delivered — the `messageId` field on this response refers to the actual SMS that was sent as the fallback.
- `recipient` (string, required) — Recipient's phone number in E.164 format.
- `segments` (SendSmsResponseSegments, required) — Details about how the message was segmented for sending.
- `sender` (string, required) — Sender's phone number in E.164 format.
- `status` ("queued", required) — Message is queued for delivery.
- `totalCost` (double, required) — Total cost of sending the message.

### SendRcsFallbackMmsResponse

Returned when a fallback is configured and the recipient does not support RCS. The API checks RCS capabilities at send time. If the recipient's device doesn't support RCS, the fallback MMS is sent instead. You will also receive a `FALLBACK_SENT` webhook event for the original RCS message.

- `fallbackSent` (true, required) — Indicates that the fallback MMS was sent because the recipient does not support RCS.
- `messageIds` (list of string, required) — Array of unique message identifiers for an individual MMS send. Each identifier is a string that always begins with the prefix `msg_`, for example: `msg_1234567890`.&#x20; When media assets are too large to fit in a single MMS and `options.multiple_messages` is set to true, the content is automatically split across multiple messages. Each split message gets its own ID, and all IDs are returned in this array.&#x20; Note: When sending to audiences, you'll receive multiple response objects (one per recipient), each containing its own messageIds array.
- `originalMessageId` (string, required) — Unique identifier of the original RCS message that triggered this fallback. Always begins with the prefix `msg_`. This is the RCS message that could not be delivered — the `messageIds` field on this response refers to the actual MMS message(s) that were sent as the fallback.
- `recipient` (string, required) — Recipient's phone number in E.164 format.
- `segments` (double, required) — Total number of segments used across the message.
- `sender` (string, required) — Sender's phone number in E.164 format.
- `status` ("queued", required) — Message is queued for delivery.
- `totalCost` (double, required) — Total cost of sending the message.

### ZodError

- `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

### Error

Standard error response returned when a request cannot be processed successfully.

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

### FallbackMessage

SMS/MMS fallback message to send if the RCS message fails to deliver. When a recipient's device doesn't support RCS, this fallback message will be sent as SMS or MMS instead. The fallback is sent from the specified phone number. > **Note:** At least one of `text` or `mediaUrls` must be provided. Fallback messages require a verified `from` phone number with SMS/MMS sending capabilities. > **Billing:** You will be charged the standard SMS or MMS rate for the fallback message. The original RCS message will not be charged if the fallback is sent instead.

- `from` (string, required) — Phone number to send the fallback message from in E.164 format. Must be a verified phone number with SMS/MMS sending capabilities. Sandbox numbers cannot be used for fallbacks. The phone number must be connected to an active toll-free or 10DLC campaign.
- `text` (string, optional) — Text content for the fallback message. At least one of `text` or `mediaUrls` must be provided. If `mediaUrls` is empty and the text fits within SMS segment limits, the fallback will be sent as SMS. Otherwise, it will be sent as MMS. You will only be billed for the message sent.
- `mediaUrls` (list of string, optional) — Media file URLs to include in the fallback MMS message. See [supported media types](https://app.pinnacle.sh/supported-file-types?type=MMS). If provided, the fallback will be sent as MMS. Otherwise, it will be sent as SMS (if text fits within segment limits). At least one of `text` or `mediaUrls` must be provided.

### SendRichMessageOptions

Configure how your RCS message is sent and tracked.

- `schedule` (ScheduleSchema, optional) — Define when and how your message should be sent.
- `tracking` (enum, optional) — Enable tracking on sent messages. If not provided, messages are not tracked. You will not be able to react to these messages unless you provide the [options.force](./react#request.body.options.force) field. `ID` - Append an explicit ID at the end of the message for tracking. Users will see this ID.&#x20; `HIDDEN` - Invisible IDs are sent with messages for tracking. Will not be visible to users but will lead to slightly longer message lengths.
  - Allowed values: `ID`, `HIDDEN`
- `transcode` (boolean, optional, default: true) — Media files and card media will be transcoded to a supported RCS format. This adds a small delay to sending the message. Ignored for rich text messages.
- `validate` (boolean, optional, default: false) — Validate your message for any unsupported files.&#x20; If failed, errors will be thrown and the message will not send.

### RichButton

- `type`: `openUrl` (openUrl)
  - `payload` (string, 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) — Optional additional data to attach to this button.
  - `webviewMode` (enum, optional) — 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
    - Allowed values: `HALF`, `TALL`, `FULL`
- `type`: `call` (call)
  - `payload` (string, required) — Phone number to call in E.164 format
  - `title` (string, required) — Display text for the button.
  - `metadata` (string, optional) — Optional additional data to attach to this button.
- `type`: `trigger` (trigger)
  - `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.
  - `metadata` (string, optional) — Optional additional data to attach to this button.
- `type`: `requestUserLocation` (requestUserLocation)
  - `title` (string, required) — Display text for the button.
  - `metadata` (string, optional) — Optional additional data to attach to this button.
- `type`: `scheduleEvent` (scheduleEvent)
  - `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.
  - `title` (string, required) — Display text for the button.
  - `eventDescription` (string, optional) — Detailed description for the calendar event.
  - `metadata` (string, optional) — Optional additional data to attach to this button.
- `type`: `sendLocation` (sendLocation)
  - `latLong` (RichButtonDiscriminatorMappingSendLocationLatLong, required) — Geographic coordinates of the location to share.
  - `title` (string, required) — Display text for the button.
  - `metadata` (string, optional) — Optional additional data to attach to this button.
  - `name` (string, optional) — 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.

### RcsCardsCardsItems

Individual card containing title, optional media, and action buttons.

- `title` (string, required) — Title displayed on the card.
- `buttons` (list of RichButton, optional) — While buttons resemble quick replies, they remain on screen after being clicked and are card-specific.&#x20; **Limit:** 4 max
- `media` (string, optional) — Media file URLs to send.
- `mediaHeight` (enum, optional, default: MEDIUM) — Height of the card media.&#x20; **Default:** `MEDIUM`&#x20; **Valid for:** Carousel cards and vertical standalone cards.&#x20; **Not valid for:** Horizontal standalone cards.&#x20; **Requires:** The card must include a `media` field.&#x20; **Platform:** Media height selection applies only on Android. For iOS, assume `MEDIUM`.
  - Allowed values: `SHORT`, `MEDIUM`, `TALL`
- `subtitle` (string, optional) — Secondary text displayed below the title for additional context.

### SendRichCardsOptions

Configure how your RCS message is sent and tracked.

- `schedule` (ScheduleSchema, optional) — Define when and how your message should be sent.
- `tracking` (enum, optional) — Enable tracking on sent messages. If not provided, messages are not tracked. You will not be able to react to these messages unless you provide the [options.force](./react#request.body.options.force) field. `ID` - Append an explicit ID at the end of the message for tracking. Users will see this ID.&#x20; `HIDDEN` - Invisible IDs are sent with messages for tracking. Will not be visible to users but will lead to slightly longer message lengths.
  - Allowed values: `ID`, `HIDDEN`
- `transcode` (boolean, optional, default: true) — Media files and card media will be transcoded to a supported RCS format. This adds a small delay to sending the message. Ignored for rich text messages.
- `validate` (boolean, optional, default: false) — Validate your message for any unsupported files.&#x20; If failed, errors will be thrown and the message will not send.
- `standalone_card` (RichStandaloneCardOptions, optional) — Configure standalone card layout options for enhanced visual presentation. > **⚠️ Important Restriction** > > This option is **only valid for single card messages** with static media. Using it with multiple cards will cause the request to fail with a validation error. > GIFs and videos are not supported and will be rendered as vertical cards.
- `cardWidth` (enum, optional) — Width of each card in a carousel.&#x20; **Default:** `MEDIUM`&#x20; **Valid for:** Multi-card messages (2 to 10 cards).&#x20; **Not valid for:** Single-card messages. Setting it with one card fails validation.&#x20; **Platform:** Card width selection applies only on Android. For iOS, assume `MEDIUM`.
  - Allowed values: `SMALL`, `MEDIUM`

### ScheduledSendResponseConfig

Configuration for the scheduled message.

- `sendAt` (string, required) — When the message will be sent in ISO 8601 format.
- `timezone` (string, required) — IANA timezone identifier.
- `recurrence` (string, optional) — AWS cron expression used for recurring messages.
- `endDate` (string, optional) — When the recurring messages stops in ISO 8601 format.

### SendSmsResponseSegments

Details about how the message was segmented for sending.

- `count` (double, required) — Number of message segments used to send this message.
- `encoding` (enum, required) — Encoding used for the message segments.
  - Allowed values: `gsm7`, `utf16`

### 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

### ScheduleSchema

Define when and how your message should be sent.

- `sendAt` (string, required) — The date and time you want your message to be sent. - Use [ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601), for example: `2024-12-17T14:30:00Z`. Format: `YYYY-MM-DDThh:mm` (e.g., `2024-12-25T14:30`). - This time must be at least 5 minutes in the future. - The message will be scheduled based on the `timezone` you provide. - If you set a `recurrence` schedule, this is the start date and time for the recurring schedule.
- `recurrence` (string, optional) — AWS cron expression for recurring schedules (6 fields).&#x20; [Learn more about cron expressions](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html).&#x20; **Examples:** * `0 10 * * ? *` - Every day at 10:00 AM * `0/30 * * * ? *` - Every 30 minutes * `0 9 ? * MON-FRI *` - Every weekday at 9:00 AM * `0 12 1 * ? *` - First day of every month at noon
- `timezone` (string, optional, default: UTC) — IANA timezone identifier (e.g., `America/New_York`, `UTC`).&#x20; Defaults to `UTC` if not specified.
- `endDate` (string, optional) — Date and time when recurring messages should stop.&#x20; Format: `YYYY-MM-DDThh:mm`. Required if `recurrence` is set.

### RichButtonDiscriminatorMappingSendLocationLatLong

Geographic coordinates of the location to share.

- `lat` (double, required) — Latitude coordinate in decimal degrees.
- `lng` (double, required) — Longitude coordinate in decimal degrees.

### RichStandaloneCardOptions

Configure standalone card layout options for enhanced visual presentation. > **⚠️ Important Restriction** > > This option is **only valid for single card messages** with static media. Using it with multiple cards will cause the request to fail with a validation error. > GIFs and videos are not supported and will be rendered as vertical cards.

- `orientation` (enum, optional, default: HORIZONTAL) — The orientation of the standalone card.
  - Allowed values: `HORIZONTAL`, `VERTICAL`
- `image_alignment` (enum, optional, default: LEFT) — The alignment of the image in the standalone card. This field is ignored if orientation is VERTICAL.
  - Allowed values: `LEFT`, `RIGHT`

## Examples

### Send RCS Response

**Request**

```json
{
  "from": "agent_pinnacle",
  "fallback": {
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  },
  "options": {
    "validate": false
  },
  "to": "+14154746461",
  "quickReplies": [
    {
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    }
  ],
  "text": "Check out our website for more information!"
}
```

**Response**

```json
{
  "messageId": "msg_1234567890",
  "segments": 1,
  "totalCost": 0.03,
  "sender": "agent_pinnacle",
  "recipient": "+14154746461",
  "status": "queued"
}
```

**SDK Code**

```python Send RCS Response
import requests

url = "https://api.pinnacle.sh/messages/send/rcs"

payload = {
    "from": "agent_pinnacle",
    "fallback": {
        "from": "+14155164736",
        "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
    },
    "options": { "validate": False },
    "to": "+14154746461",
    "quickReplies": [
        {
            "type": "openUrl",
            "payload": "https://www.pinnacle.sh/",
            "title": "Open Url"
        }
    ],
    "text": "Check out our website for more information!"
}
headers = {
    "PINNACLE-API-KEY": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Send RCS Response
const url = 'https://api.pinnacle.sh/messages/send/rcs';
const options = {
  method: 'POST',
  headers: {'PINNACLE-API-KEY': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"from":"agent_pinnacle","fallback":{"from":"+14155164736","text":"Check out our website for more information! Visit: https://www.pinnacle.sh/"},"options":{"validate":false},"to":"+14154746461","quickReplies":[{"type":"openUrl","payload":"https://www.pinnacle.sh/","title":"Open Url"}],"text":"Check out our website for more information!"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Send RCS Response
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.pinnacle.sh/messages/send/rcs"

	payload := strings.NewReader("{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Send RCS Response
require 'uri'
require 'net/http'

url = URI("https://api.pinnacle.sh/messages/send/rcs")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}"

response = http.request(request)
puts response.read_body
```

```java Send RCS Response
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.pinnacle.sh/messages/send/rcs")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}")
  .asString();
```

```php Send RCS Response
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.pinnacle.sh/messages/send/rcs', [
  'body' => '{
  "from": "agent_pinnacle",
  "fallback": {
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  },
  "options": {
    "validate": false
  },
  "to": "+14154746461",
  "quickReplies": [
    {
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    }
  ],
  "text": "Check out our website for more information!"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Send RCS Response
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/send/rcs");
var request = new RestRequest(Method.POST);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Send RCS Response
import Foundation

let headers = [
  "PINNACLE-API-KEY": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "from": "agent_pinnacle",
  "fallback": [
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  ],
  "options": ["validate": false],
  "to": "+14154746461",
  "quickReplies": [
    [
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    ]
  ],
  "text": "Check out our website for more information!"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/send/rcs")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```

### Scheduled Response

**Request**

```json
{
  "from": "agent_pinnacle",
  "fallback": {
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  },
  "options": {
    "validate": false
  },
  "to": "+14154746461",
  "quickReplies": [
    {
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    }
  ],
  "text": "Check out our website for more information!"
}
```

**Response**

```json
{
  "scheduleId": "msg_sched_1234567890",
  "config": {
    "sendAt": "2024-08-01T09:00:00",
    "recurrence": "cron(0 9 * * MON-FRI *)",
    "timezone": "UTC",
    "endTime": "2024-12-31T23:59:59"
  }
}
```

**SDK Code**

```python Scheduled Response
import requests

url = "https://api.pinnacle.sh/messages/send/rcs"

payload = {
    "from": "agent_pinnacle",
    "fallback": {
        "from": "+14155164736",
        "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
    },
    "options": { "validate": False },
    "to": "+14154746461",
    "quickReplies": [
        {
            "type": "openUrl",
            "payload": "https://www.pinnacle.sh/",
            "title": "Open Url"
        }
    ],
    "text": "Check out our website for more information!"
}
headers = {
    "PINNACLE-API-KEY": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Scheduled Response
const url = 'https://api.pinnacle.sh/messages/send/rcs';
const options = {
  method: 'POST',
  headers: {'PINNACLE-API-KEY': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"from":"agent_pinnacle","fallback":{"from":"+14155164736","text":"Check out our website for more information! Visit: https://www.pinnacle.sh/"},"options":{"validate":false},"to":"+14154746461","quickReplies":[{"type":"openUrl","payload":"https://www.pinnacle.sh/","title":"Open Url"}],"text":"Check out our website for more information!"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Scheduled Response
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.pinnacle.sh/messages/send/rcs"

	payload := strings.NewReader("{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Scheduled Response
require 'uri'
require 'net/http'

url = URI("https://api.pinnacle.sh/messages/send/rcs")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}"

response = http.request(request)
puts response.read_body
```

```java Scheduled Response
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.pinnacle.sh/messages/send/rcs")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}")
  .asString();
```

```php Scheduled Response
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.pinnacle.sh/messages/send/rcs', [
  'body' => '{
  "from": "agent_pinnacle",
  "fallback": {
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  },
  "options": {
    "validate": false
  },
  "to": "+14154746461",
  "quickReplies": [
    {
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    }
  ],
  "text": "Check out our website for more information!"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Scheduled Response
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/send/rcs");
var request = new RestRequest(Method.POST);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Scheduled Response
import Foundation

let headers = [
  "PINNACLE-API-KEY": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "from": "agent_pinnacle",
  "fallback": [
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  ],
  "options": ["validate": false],
  "to": "+14154746461",
  "quickReplies": [
    [
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    ]
  ],
  "text": "Check out our website for more information!"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/send/rcs")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```

### Fallback SMS sent when recipient is not RCS-capable

**Request**

```json
{
  "from": "agent_pinnacle",
  "fallback": {
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  },
  "options": {
    "validate": false
  },
  "to": "+14154746461",
  "quickReplies": [
    {
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    }
  ],
  "text": "Check out our website for more information!"
}
```

**Response**

```json
{
  "messageId": "msg_1234567890",
  "segments": 1,
  "totalCost": 0.01,
  "sender": "+16501234567",
  "recipient": "+14154746461",
  "status": "queued",
  "fallbackSent": true
}
```

**SDK Code**

```python Fallback SMS sent when recipient is not RCS-capable
import requests

url = "https://api.pinnacle.sh/messages/send/rcs"

payload = {
    "from": "agent_pinnacle",
    "fallback": {
        "from": "+14155164736",
        "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
    },
    "options": { "validate": False },
    "to": "+14154746461",
    "quickReplies": [
        {
            "type": "openUrl",
            "payload": "https://www.pinnacle.sh/",
            "title": "Open Url"
        }
    ],
    "text": "Check out our website for more information!"
}
headers = {
    "PINNACLE-API-KEY": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Fallback SMS sent when recipient is not RCS-capable
const url = 'https://api.pinnacle.sh/messages/send/rcs';
const options = {
  method: 'POST',
  headers: {'PINNACLE-API-KEY': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"from":"agent_pinnacle","fallback":{"from":"+14155164736","text":"Check out our website for more information! Visit: https://www.pinnacle.sh/"},"options":{"validate":false},"to":"+14154746461","quickReplies":[{"type":"openUrl","payload":"https://www.pinnacle.sh/","title":"Open Url"}],"text":"Check out our website for more information!"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Fallback SMS sent when recipient is not RCS-capable
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.pinnacle.sh/messages/send/rcs"

	payload := strings.NewReader("{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Fallback SMS sent when recipient is not RCS-capable
require 'uri'
require 'net/http'

url = URI("https://api.pinnacle.sh/messages/send/rcs")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}"

response = http.request(request)
puts response.read_body
```

```java Fallback SMS sent when recipient is not RCS-capable
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.pinnacle.sh/messages/send/rcs")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}")
  .asString();
```

```php Fallback SMS sent when recipient is not RCS-capable
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.pinnacle.sh/messages/send/rcs', [
  'body' => '{
  "from": "agent_pinnacle",
  "fallback": {
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  },
  "options": {
    "validate": false
  },
  "to": "+14154746461",
  "quickReplies": [
    {
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    }
  ],
  "text": "Check out our website for more information!"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Fallback SMS sent when recipient is not RCS-capable
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/send/rcs");
var request = new RestRequest(Method.POST);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Fallback SMS sent when recipient is not RCS-capable
import Foundation

let headers = [
  "PINNACLE-API-KEY": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "from": "agent_pinnacle",
  "fallback": [
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  ],
  "options": ["validate": false],
  "to": "+14154746461",
  "quickReplies": [
    [
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    ]
  ],
  "text": "Check out our website for more information!"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/send/rcs")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```

### Fallback MMS sent when recipient is not RCS-capable

**Request**

```json
{
  "from": "agent_pinnacle",
  "fallback": {
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  },
  "options": {
    "validate": false
  },
  "to": "+14154746461",
  "quickReplies": [
    {
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    }
  ],
  "text": "Check out our website for more information!"
}
```

**Response**

```json
{
  "messageId": "msg_1234567890",
  "segments": 1,
  "totalCost": 0.02,
  "sender": "+16501234567",
  "recipient": "+14154746461",
  "status": "queued",
  "fallbackSent": true
}
```

**SDK Code**

```python Fallback MMS sent when recipient is not RCS-capable
import requests

url = "https://api.pinnacle.sh/messages/send/rcs"

payload = {
    "from": "agent_pinnacle",
    "fallback": {
        "from": "+14155164736",
        "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
    },
    "options": { "validate": False },
    "to": "+14154746461",
    "quickReplies": [
        {
            "type": "openUrl",
            "payload": "https://www.pinnacle.sh/",
            "title": "Open Url"
        }
    ],
    "text": "Check out our website for more information!"
}
headers = {
    "PINNACLE-API-KEY": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Fallback MMS sent when recipient is not RCS-capable
const url = 'https://api.pinnacle.sh/messages/send/rcs';
const options = {
  method: 'POST',
  headers: {'PINNACLE-API-KEY': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"from":"agent_pinnacle","fallback":{"from":"+14155164736","text":"Check out our website for more information! Visit: https://www.pinnacle.sh/"},"options":{"validate":false},"to":"+14154746461","quickReplies":[{"type":"openUrl","payload":"https://www.pinnacle.sh/","title":"Open Url"}],"text":"Check out our website for more information!"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Fallback MMS sent when recipient is not RCS-capable
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.pinnacle.sh/messages/send/rcs"

	payload := strings.NewReader("{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Fallback MMS sent when recipient is not RCS-capable
require 'uri'
require 'net/http'

url = URI("https://api.pinnacle.sh/messages/send/rcs")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}"

response = http.request(request)
puts response.read_body
```

```java Fallback MMS sent when recipient is not RCS-capable
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.pinnacle.sh/messages/send/rcs")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}")
  .asString();
```

```php Fallback MMS sent when recipient is not RCS-capable
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.pinnacle.sh/messages/send/rcs', [
  'body' => '{
  "from": "agent_pinnacle",
  "fallback": {
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  },
  "options": {
    "validate": false
  },
  "to": "+14154746461",
  "quickReplies": [
    {
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    }
  ],
  "text": "Check out our website for more information!"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp Fallback MMS sent when recipient is not RCS-capable
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/send/rcs");
var request = new RestRequest(Method.POST);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"from\": \"agent_pinnacle\",\n  \"fallback\": {\n    \"from\": \"+14155164736\",\n    \"text\": \"Check out our website for more information! Visit: https://www.pinnacle.sh/\"\n  },\n  \"options\": {\n    \"validate\": false\n  },\n  \"to\": \"+14154746461\",\n  \"quickReplies\": [\n    {\n      \"type\": \"openUrl\",\n      \"payload\": \"https://www.pinnacle.sh/\",\n      \"title\": \"Open Url\"\n    }\n  ],\n  \"text\": \"Check out our website for more information!\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Fallback MMS sent when recipient is not RCS-capable
import Foundation

let headers = [
  "PINNACLE-API-KEY": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "from": "agent_pinnacle",
  "fallback": [
    "from": "+14155164736",
    "text": "Check out our website for more information! Visit: https://www.pinnacle.sh/"
  ],
  "options": ["validate": false],
  "to": "+14154746461",
  "quickReplies": [
    [
      "type": "openUrl",
      "payload": "https://www.pinnacle.sh/",
      "title": "Open Url"
    ]
  ],
  "text": "Check out our website for more information!"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/send/rcs")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```