> This page is for version v2 (default).
> For other versions, use one of these documentation indexes:
> - v2 (default): https://docs.pinnacle.sh/v-2/llms.txt
> - v1: https://docs.pinnacle.sh/v1/llms.txt

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

# Get Message by ID

GET https://api.pinnacle.sh/messages/{id}

Retrieve a previously sent message.

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

## Authentication

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

## Request

### Path parameters

- `id` (string, required) — Unique identifier of the message. This identifier is a string that always begins with the prefix `msg_`, for example: `msg_1234567890`.

## Response

### 200

Successfully retrieved the message.

- `content` (MessageContentType, required) — Content type of the message.
- `cost` (double, required, nullable) — Total cost charged for sending the message.&#x20; Null means the message incurred no cost or has not been charged yet.
- `deliveredAt` (string, required, nullable) — Timestamp indicating when the message was successfully delivered to the recipient.&#x20; Null indicates the message has not yet been delivered.
- `error` (string, required, nullable) — Detailed explanation of any errors that occurred while delivering the message.&#x20; Null indicates no errors.
- `id` (string, required) — Unique identifier of the message. This identifier is a string that always begins with the prefix `msg_`, for example: `msg_1234567890`.
- `method` (enum, required) — Method used to send the message.
  - Allowed values: `API`, `SDK`, `OTHER`
- `numSegments` (integer, required) — Number of segments the message was split into for delivery.
- `receiver` (string, required) — Phone number that received the message in E.164 format.
- `sender` (string, required) — Phone number or agent that sent the message.
- `sentAt` (string, required, nullable) — Timestamp indicating when the message was submitted for delivery.&#x20; Null indicates the message is still in the queue.
- `status` (enum, required) — Current status of the message.
  - Allowed values: `QUEUED`, `PENDING`, `SENT`, `SEND_FAILED`, `DELIVERED`, `DELIVERY_FAILED`, `RECEIVED`, `READ`, `FALLBACK_SENT`
- `type` (enum, required) — Delivery protocol used for sending this message.
  - Allowed values: `SMS`, `MMS`, `RCS`

## Errors

### 400 Bad Request Error

Validation failed. The payload has missing required fields and/or invalid types.&#x20; 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.&#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.

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

## Types

### MessageContentType

Content type of the message.

- SMS Message: SMSContent
- MMS Message: MMSContent
- RCS Message: RCSContent
- Button Clicked: ButtonClicked

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

### SMSContent

SMS message containing plain text only.

- `text` (string, required) — Message content.

### MMSContent

Message with text and/or media files from a phone number.

- `mediaUrls` (list of string, required) — URLs of media files in this message.&#x20; See [supported media types](https://app.pinnacle.sh/supported-file-types?type=MMS).
- `text` (string, optional) — Text content that accompanies the media files.

### RCSContent

Message with richer content (longer text, media files, cards, and buttons) from interacting with an RCS agent.

- Rich Text: RcsTextContent
- Rich Media: RcsMediaContent
- Rich Cards: RcsCardsContent

### ButtonClicked

- Button Clicked Data: ButtonClickedData
- Location Shared: LocationShareAction

### RcsTextContent

Message containing longer text content with optional quick reply buttons.

- `text` (string, required) — Text content of the RCS message.
- `quickReplies` (list of RichButton, optional) — List of interactive quick reply buttons in the message.&#x20; **Limit:** 10 max

### RcsMediaContent

Message containing a media file and/or text with optional quick reply buttons.&#x20; See (supported file types)\[[https://app.pinnacle.sh/supported-file-types?type=RCS-MEDIA](https://app.pinnacle.sh/supported-file-types?type=RCS-MEDIA)].

- `media` (RcsMediaDetailsContent, required) — Metadata about the media file in the message.
- `quickReplies` (list of RichButton, optional) — List of interactive quick reply buttons in the message.&#x20; **Limit:** 10 max

### RcsCardsContent

Message containing cards, each with its own title, subtitle, and/or buttons. Quick replies can also be added.&#x20; See (supported file types)\[[https://app.pinnacle.sh/supported-file-types?type=RCS-CARD](https://app.pinnacle.sh/supported-file-types?type=RCS-CARD)].

- `cards` (list of RcsCardsContentCardsItems, required) — Collection of cards attached to the message.&#x20; **Limit:** 1 to 10
- `quickReplies` (list of RichButton, optional) — List of interactive quick reply buttons in the message.&#x20; **Limit:** 10 max

### ButtonClickedData

Unified data structure for button click events.

- `button` (ButtonClickedDataButton, required) — Information about the button that was clicked.
- `messageId` (string, required, nullable) — ID of the message this button was sent in, or null if not available. To get the message details, use the [GET /messages/\{id}](/api-reference/messages/get) endpoint.

### LocationShareAction

- `data` (LocationShareActionData, required) — Location data shared by the user.

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

### RcsMediaDetailsContent

Metadata about the media file in the message.

- `mimeType` (string, required) — Detected MIME type of the media file.
- `url` (string, required) — Direct URL to the media file.
- `fullPath` (string, optional) — Path to the file in Pinnacle's storage.

### RcsCardsContentCardsItems

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` (RcsMediaDetailsContent, optional) — Metadata about the media file in the message.
- `subtitle` (string, optional) — Secondary text displayed below the title for additional context.

### ButtonClickedDataButton

Information about the button that was clicked.

- `raw` (ButtonClickedDataButtonRaw, required) — Raw button data. Contains the entire button that was clicked by the user. In rare cases where we cannot determine the exact button, this will return only the button title.
- `clicks` (integer, required) — Number of times the button has been clicked.
- `type` (enum, optional, nullable) — Type of button clicked. - `CARD` for card buttons, - `QUICK_REPLY` for quick replies. - `null` if we cannot determine the button type. This is a rare edge case and is mainly here for backward compatibility.
  - Allowed values: `CARD`, `QUICK_REPLY`
- `payload` (string, optional, nullable) — Extracted payload from the button's `payload` field, if provided. Provides quick access to any payload that was attached to the button.
- `metadata` (string, optional, nullable) — Additional metadata attached to the button's `metadata` field, if provided.

### LocationShareActionData

Location data shared by the user.

- `address` (string, required) — Address corresponding to the shared location.
- `latitude` (double, required) — Latitude of the shared location.
- `longitude` (double, required) — Longitude of the shared location.
- `text` (string, optional) — Text message sent with the location.

### RichButtonDiscriminatorMappingSendLocationLatLong

Geographic coordinates of the location to share.

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

### ButtonClickedDataButtonRaw

Raw button data. Contains the entire button that was clicked by the user. In rare cases where we cannot determine the exact button, this will return only the button title.

- RichButton: RichButton
- string

## Examples

### SMS Response

**Response**

```json
{
  "content": {
    "text": "Hello from Pinnacle"
  },
  "cost": 10,
  "deliveredAt": null,
  "error": "{\"message\": \"Error: Timeout occurred\"}",
  "id": "msg_1234567890",
  "method": "API",
  "numSegments": 1,
  "receiver": "+1415654321",
  "sender": "+1415567890",
  "sentAt": "2025-06-18T21:27:13.809",
  "status": "PENDING",
  "type": "SMS"
}
```

**SDK Code**

```python SMS Response
import requests

url = "https://api.pinnacle.sh/messages/msg_1234567890"

headers = {"PINNACLE-API-KEY": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript SMS Response
const url = 'https://api.pinnacle.sh/messages/msg_1234567890';
const options = {method: 'GET', headers: {'PINNACLE-API-KEY': '<apiKey>'}};

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

```go SMS Response
package main

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

func main() {

	url := "https://api.pinnacle.sh/messages/msg_1234567890"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")

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

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

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

}
```

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

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

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

request = Net::HTTP::Get.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'

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

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

HttpResponse<String> response = Unirest.get("https://api.pinnacle.sh/messages/msg_1234567890")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.pinnacle.sh/messages/msg_1234567890', [
  'headers' => [
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

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

```csharp SMS Response
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/msg_1234567890");
var request = new RestRequest(Method.GET);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift SMS Response
import Foundation

let headers = ["PINNACLE-API-KEY": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/msg_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()
```

### MMS Response

**Response**

```json
{
  "content": {
    "mediaUrls": [
      "https://agent-logos.storage.googleapis.com/_/m0bk9gvlDunZEw1krfruZmw3"
    ],
    "text": "Check out our website for more information!"
  },
  "cost": 30,
  "deliveredAt": null,
  "error": "{\"message\": \"Error: Timeout occurred\"}",
  "id": "msg_1234567890",
  "method": "SDK",
  "numSegments": 1,
  "receiver": "+1415654321",
  "sender": "+1415567890",
  "sentAt": "2025-08-08T22:05:23.291",
  "status": "PENDING",
  "type": "MMS"
}
```

**SDK Code**

```python MMS Response
import requests

url = "https://api.pinnacle.sh/messages/msg_1234567890"

headers = {"PINNACLE-API-KEY": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript MMS Response
const url = 'https://api.pinnacle.sh/messages/msg_1234567890';
const options = {method: 'GET', headers: {'PINNACLE-API-KEY': '<apiKey>'}};

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

```go MMS Response
package main

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

func main() {

	url := "https://api.pinnacle.sh/messages/msg_1234567890"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")

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

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

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

}
```

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

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

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

request = Net::HTTP::Get.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'

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

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

HttpResponse<String> response = Unirest.get("https://api.pinnacle.sh/messages/msg_1234567890")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.pinnacle.sh/messages/msg_1234567890', [
  'headers' => [
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

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

```csharp MMS Response
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/msg_1234567890");
var request = new RestRequest(Method.GET);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift MMS Response
import Foundation

let headers = ["PINNACLE-API-KEY": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/msg_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()
```

### RCS Response

**Response**

```json
{
  "content": {
    "cards": [
      {
        "buttons": [
          {
            "type": "openUrl",
            "payload": "https://www.pinnacle.sh/",
            "title": "Visit US"
          },
          {
            "payload": "+14150578591",
            "title": "Call Us",
            "type": "call"
          },
          {
            "eventEndTime": "2025-12-12T11:00:00Z",
            "eventStartTime": "2025-12-12T10:00:00Z",
            "eventTitle": "RCS Exploration",
            "title": "Pinnacle Workshop",
            "type": "scheduleEvent"
          }
        ],
        "media": {
          "fullPath": "vault/sample-image.webp",
          "mimeType": "image/webp",
          "url": "https://example.com/media/sample-image.webp"
        },
        "subtitle": "OpenUrl",
        "title": "See Website"
      }
    ],
    "quickReplies": [
      {
        "type": "openUrl",
        "payload": "https://www.pinnacle.sh/",
        "title": "Visit US"
      },
      {
        "payload": "+14150578591",
        "title": "Quick Call",
        "type": "call"
      },
      {
        "eventEndTime": "2025-12-12T13:00:00Z",
        "eventStartTime": "2025-12-12T12:00:00Z",
        "eventTitle": "Pinnacle Workshop",
        "title": "Add Event",
        "type": "scheduleEvent"
      }
    ]
  },
  "cost": 30,
  "deliveredAt": "2025-08-05T18:51:00.591",
  "error": "{\"message\": \"Error: Timeout occurred\"}",
  "id": "msg_1234567890",
  "method": "OTHER",
  "numSegments": 1,
  "receiver": "+1415654321",
  "sender": "+1415567890",
  "sentAt": "2025-08-05T18:50:55.912",
  "status": "DELIVERED",
  "type": "RCS"
}
```

**SDK Code**

```python RCS Response
import requests

url = "https://api.pinnacle.sh/messages/msg_1234567890"

headers = {"PINNACLE-API-KEY": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript RCS Response
const url = 'https://api.pinnacle.sh/messages/msg_1234567890';
const options = {method: 'GET', headers: {'PINNACLE-API-KEY': '<apiKey>'}};

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

```go RCS Response
package main

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

func main() {

	url := "https://api.pinnacle.sh/messages/msg_1234567890"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")

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

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

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

}
```

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

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

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

request = Net::HTTP::Get.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'

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

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

HttpResponse<String> response = Unirest.get("https://api.pinnacle.sh/messages/msg_1234567890")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.pinnacle.sh/messages/msg_1234567890', [
  'headers' => [
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

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

```csharp RCS Response
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/msg_1234567890");
var request = new RestRequest(Method.GET);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift RCS Response
import Foundation

let headers = ["PINNACLE-API-KEY": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/msg_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()
```

### Inbound Response

**Response**

```json
{
  "content": {
    "text": "string"
  },
  "cost": 30,
  "deliveredAt": "2025-08-05T18:51:00.591",
  "error": "{\"value\":[]}",
  "id": "msg_1234567890",
  "method": "OTHER",
  "numSegments": 1,
  "receiver": "+1415654321",
  "sender": "+1415567890",
  "sentAt": "2025-08-05T18:50:55.912",
  "status": "DELIVERED",
  "type": "RCS"
}
```

**SDK Code**

```python Inbound Response
import requests

url = "https://api.pinnacle.sh/messages/msg_1234567890"

headers = {"PINNACLE-API-KEY": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Inbound Response
const url = 'https://api.pinnacle.sh/messages/msg_1234567890';
const options = {method: 'GET', headers: {'PINNACLE-API-KEY': '<apiKey>'}};

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

```go Inbound Response
package main

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

func main() {

	url := "https://api.pinnacle.sh/messages/msg_1234567890"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")

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

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

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

}
```

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

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

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

request = Net::HTTP::Get.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'

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

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

HttpResponse<String> response = Unirest.get("https://api.pinnacle.sh/messages/msg_1234567890")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.pinnacle.sh/messages/msg_1234567890', [
  'headers' => [
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

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

```csharp Inbound Response
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/msg_1234567890");
var request = new RestRequest(Method.GET);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Inbound Response
import Foundation

let headers = ["PINNACLE-API-KEY": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/msg_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()
```

### RCS with Fallback Sent

**Response**

```json
{
  "content": {
    "quickReplies": [],
    "text": "Check out our latest offers!"
  },
  "cost": 0,
  "deliveredAt": null,
  "error": null,
  "id": "msg_rcs123456",
  "method": "API",
  "numSegments": 0,
  "receiver": "+1415654321",
  "sender": "agent_pinnacle",
  "sentAt": "2025-08-05T18:50:55.912",
  "status": "FALLBACK_SENT",
  "type": "RCS"
}
```

**SDK Code**

```python RCS with Fallback Sent
import requests

url = "https://api.pinnacle.sh/messages/msg_1234567890"

headers = {"PINNACLE-API-KEY": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript RCS with Fallback Sent
const url = 'https://api.pinnacle.sh/messages/msg_1234567890';
const options = {method: 'GET', headers: {'PINNACLE-API-KEY': '<apiKey>'}};

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

```go RCS with Fallback Sent
package main

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

func main() {

	url := "https://api.pinnacle.sh/messages/msg_1234567890"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("PINNACLE-API-KEY", "<apiKey>")

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

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

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

}
```

```ruby RCS with Fallback Sent
require 'uri'
require 'net/http'

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

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

request = Net::HTTP::Get.new(url)
request["PINNACLE-API-KEY"] = '<apiKey>'

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

```java RCS with Fallback Sent
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.pinnacle.sh/messages/msg_1234567890")
  .header("PINNACLE-API-KEY", "<apiKey>")
  .asString();
```

```php RCS with Fallback Sent
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.pinnacle.sh/messages/msg_1234567890', [
  'headers' => [
    'PINNACLE-API-KEY' => '<apiKey>',
  ],
]);

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

```csharp RCS with Fallback Sent
using RestSharp;

var client = new RestClient("https://api.pinnacle.sh/messages/msg_1234567890");
var request = new RestRequest(Method.GET);
request.AddHeader("PINNACLE-API-KEY", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift RCS with Fallback Sent
import Foundation

let headers = ["PINNACLE-API-KEY": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/msg_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()
```