> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.pinnacle.sh/v-2/api-reference/messages/blast-rcs/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pinnacle.sh/_mcp/server. # Blast RCS to Audience POST https://api.pinnacle.sh/messages/blast/rcs Content-Type: application/json Send an RCS message to all contacts in an audience. Messages are distributed evenly across the provided RCS agents for load balancing. Requires active RCS agents and recipient devices that support RCS Business Messaging. Use the optional `schedule` parameter in `options` to schedule the blast for future delivery. When scheduled, the response will contain a `scheduleId` instead of blast details. Reference: https://docs.pinnacle.sh/api-reference/messages/blast-rcs ## Authentication - `PINNACLE-API-KEY` header (required) — API Key authentication via header ## Request ### Body (application/json) This endpoint expects a BlastRcsRequest. - `audienceId` (string, required) — The audience ID to send the blast to. This identifier is a string that always begins with the prefix `aud_`, for example: `aud_abc123`. You can create an audience via [the dashboard](https://app.pinnacle.sh/dashboard/audiences) or [API](/api-reference/audiences/create). - `senders` (list of string, required) — Array of RCS agent IDs to send from. Each must be prefixed with `agent_`. Messages will be evenly distributed across these agents. **Limit:** 1 min - `message` (RCSValidateContent, required) - `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` (BlastRcsOptions, optional) — Configure how your RCS blast is sent and tracked. ## Response ### 200 Successfully queued or scheduled the RCS blast. * **Immediate blast**: Returns blast details including total recipients, messages, segments, and cost. * **Scheduled blast**: Returns a `scheduleId` and the schedule configuration. - `messages_blast_rcs_Response_200` ## Errors ### 400 Bad Request Error The request was unacceptable, often due to providing an invalid update. 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. 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. - `BlastRcsToAudienceRequestBadRequestError` ### 401 Unauthorized Error The request lacks valid authentication credentials or the provided credentials are invalid. Ensure you're including a valid API key in the request headers and that your account has the necessary permissions to access this endpoint. - `error` (string, required) — Human-readable description of the error that occurred, corresponding to the HTTP status code. ### 402 Payment Required Error Insufficient credits to complete this request. 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. 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. ### 500 Internal Server Error An unexpected error occurred on Pinnacle's servers while processing your request. If this error persists, please contact support with the request details. - `error` (string, required) — Human-readable description of the error that occurred, corresponding to the HTTP status code. ## Types ### RCSValidateContent ### 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. ### BlastRcsOptions Configure how your RCS blast is sent and tracked. - `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. If failed, errors will be thrown and the blast will not be sent. - `standalone_card` (BlastRcsRequestOptionsStandaloneCard, optional) — Configure standalone card layout options for enhanced visual presentation. > **⚠️ Important Restriction** > > This option is **only valid for single card messages**. Using it with multiple cards will cause the request to fail with a validation error. - `cardWidth` (enum, optional) — Width of each card in a carousel. **Default:** `MEDIUM` **Valid for:** Multi-card messages (2 to 10 cards). **Not valid for:** Single-card messages. Setting it with one card fails validation. **Platform:** Card width selection applies only on Android. For iOS, assume `MEDIUM`. - Allowed values: `SMALL`, `MEDIUM` - `schedule` (ScheduleSchema, optional) — Define when and how your message should be sent. ### BlastResponse Response containing details about the scheduled blast. - `blastId` (string, required) — Unique identifier for the blast. This identifier is a string that always begins with the prefix `blast_`, for example: `blast_1234567890`. - `audienceId` (string, required) — The audience ID the blast was sent to. This identifier is a string that always begins with the prefix `aud_`, for example: `aud_abc123`. - `totalRecipients` (integer, required) — Total number of recipients in the audience. - `totalMessages` (integer, required) — Total number of messages to be sent. - `totalSegments` (integer, required) — Total number of message segments across all messages. - `totalCost` (double, required) — Total cost of the blast. For RCS blasts with a fallback configured, this reflects the actual mix of RCS and SMS/MMS pricing based on each recipient's RCS capability. For more details check the [Transactions page](https://app.pinnacle.sh/dashboard/settings/billing/transactions) and the [Audiences page](https://app.pinnacle.sh/dashboard/audiences) to see blasts. ### ScheduledBlastResponse Response returned when a blast is scheduled for future delivery. - `scheduleId` (string, required) — Unique identifier for the scheduled blast. This identifier is a string that always begins with the prefix `msg_sched_`, for example: `msg_sched_xxxxx`. - `config` (ScheduledBlastResponseConfig, required) — The schedule configuration for the blast. ### 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. ### 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. **Limit:** 10 max ### Rich Media Message containing a media file and/or text with optional quick reply buttons. See [supported media types](https://app.pinnacle.sh/supported-file-types?type=RCS-MEDIA). - `media` (string, required) — Media file URLs to send. - `quickReplies` (list of RichButton, optional) ### RcsCards Message containing cards, each with its own title, subtitle, and/or buttons. Quick replies can also be added. 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 RcsCardsCardsItems, required) — Collection of cards attached to the message. **Limit:** 1 to 10 - `quickReplies` (list of RichButton, optional) — List of interactive quick reply buttons in the message. **Limit:** 10 max ### BlastRcsRequestOptionsStandaloneCard Configure standalone card layout options for enhanced visual presentation. > **⚠️ Important Restriction** > > This option is **only valid for single card messages**. Using it with multiple cards will cause the request to fail with a validation error. - `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` ### 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). [Learn more about cron expressions](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html). **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`). Defaults to `UTC` if not specified. - `endDate` (string, optional) — Date and time when recurring messages should stop. Format: `YYYY-MM-DDThh:mm`. Required if `recurrence` is set. ### ScheduledBlastResponseConfig The schedule configuration for the blast. - `sendAt` (string, optional) — When the first message will be sent. - `recurrence` (string, optional) — AWS cron expression for recurring schedules. - `timezone` (string, optional) — IANA timezone identifier. - `endDate` (string, optional) — When recurring schedules will stop. ### 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 ### 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. **Limit:** 4 max - `media` (string, optional) — Media file URLs to send. - `mediaHeight` (enum, optional, default: MEDIUM) — Height of the card media. **Default:** `MEDIUM` **Valid for:** Carousel cards and vertical standalone cards. **Not valid for:** Horizontal standalone cards. **Requires:** The card must include a `media` field. **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. ### RichButtonDiscriminatorMappingSendLocationLatLong Geographic coordinates of the location to share. - `lat` (double, required) — Latitude coordinate in decimal degrees. - `lng` (double, required) — Longitude coordinate in decimal degrees. ## Examples ### Immediate Blast Response **Request** ```json { "audienceId": "aud_abc123", "senders": [ "agent_pinnacle", "agent_pinnacle2" ], "message": { "quickReplies": [ { "payload": "learn_more", "title": "Learn More", "type": "trigger" } ], "text": "Hello from Pinnacle RCS!" }, "fallback": { "from": "+14155164736", "text": "Hello from Pinnacle! Reply LEARN to learn more." }, "options": { "transcode": true, "validate": true } } ``` **Response** ```json { "blastId": "blast_1234567890", "audienceId": "aud_abc123", "totalRecipients": 250, "totalMessages": 250, "totalSegments": 250, "totalCost": 8.75 } ``` **SDK Code** ```python Immediate Blast Response import requests url = "https://api.pinnacle.sh/messages/blast/rcs" payload = { "audienceId": "aud_abc123", "senders": ["agent_pinnacle", "agent_pinnacle2"], "message": { "quickReplies": [ { "payload": "learn_more", "title": "Learn More", "type": "trigger" } ], "text": "Hello from Pinnacle RCS!" }, "fallback": { "from": "+14155164736", "text": "Hello from Pinnacle! Reply LEARN to learn more." }, "options": { "transcode": True, "validate": True } } headers = { "PINNACLE-API-KEY": "", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript Immediate Blast Response const url = 'https://api.pinnacle.sh/messages/blast/rcs'; const options = { method: 'POST', headers: {'PINNACLE-API-KEY': '', 'Content-Type': 'application/json'}, body: '{"audienceId":"aud_abc123","senders":["agent_pinnacle","agent_pinnacle2"],"message":{"quickReplies":[{"payload":"learn_more","title":"Learn More","type":"trigger"}],"text":"Hello from Pinnacle RCS!"},"fallback":{"from":"+14155164736","text":"Hello from Pinnacle! Reply LEARN to learn more."},"options":{"transcode":true,"validate":true}}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go Immediate Blast Response package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.pinnacle.sh/messages/blast/rcs" payload := strings.NewReader("{\n \"audienceId\": \"aud_abc123\",\n \"senders\": [\n \"agent_pinnacle\",\n \"agent_pinnacle2\"\n ],\n \"message\": {\n \"quickReplies\": [\n {\n \"payload\": \"learn_more\",\n \"title\": \"Learn More\",\n \"type\": \"trigger\"\n }\n ],\n \"text\": \"Hello from Pinnacle RCS!\"\n },\n \"fallback\": {\n \"from\": \"+14155164736\",\n \"text\": \"Hello from Pinnacle! Reply LEARN to learn more.\"\n },\n \"options\": {\n \"transcode\": true,\n \"validate\": true\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("PINNACLE-API-KEY", "") 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 Immediate Blast Response require 'uri' require 'net/http' url = URI("https://api.pinnacle.sh/messages/blast/rcs") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["PINNACLE-API-KEY"] = '' request["Content-Type"] = 'application/json' request.body = "{\n \"audienceId\": \"aud_abc123\",\n \"senders\": [\n \"agent_pinnacle\",\n \"agent_pinnacle2\"\n ],\n \"message\": {\n \"quickReplies\": [\n {\n \"payload\": \"learn_more\",\n \"title\": \"Learn More\",\n \"type\": \"trigger\"\n }\n ],\n \"text\": \"Hello from Pinnacle RCS!\"\n },\n \"fallback\": {\n \"from\": \"+14155164736\",\n \"text\": \"Hello from Pinnacle! Reply LEARN to learn more.\"\n },\n \"options\": {\n \"transcode\": true,\n \"validate\": true\n }\n}" response = http.request(request) puts response.read_body ``` ```java Immediate Blast Response import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.pinnacle.sh/messages/blast/rcs") .header("PINNACLE-API-KEY", "") .header("Content-Type", "application/json") .body("{\n \"audienceId\": \"aud_abc123\",\n \"senders\": [\n \"agent_pinnacle\",\n \"agent_pinnacle2\"\n ],\n \"message\": {\n \"quickReplies\": [\n {\n \"payload\": \"learn_more\",\n \"title\": \"Learn More\",\n \"type\": \"trigger\"\n }\n ],\n \"text\": \"Hello from Pinnacle RCS!\"\n },\n \"fallback\": {\n \"from\": \"+14155164736\",\n \"text\": \"Hello from Pinnacle! Reply LEARN to learn more.\"\n },\n \"options\": {\n \"transcode\": true,\n \"validate\": true\n }\n}") .asString(); ``` ```php Immediate Blast Response request('POST', 'https://api.pinnacle.sh/messages/blast/rcs', [ 'body' => '{ "audienceId": "aud_abc123", "senders": [ "agent_pinnacle", "agent_pinnacle2" ], "message": { "quickReplies": [ { "payload": "learn_more", "title": "Learn More", "type": "trigger" } ], "text": "Hello from Pinnacle RCS!" }, "fallback": { "from": "+14155164736", "text": "Hello from Pinnacle! Reply LEARN to learn more." }, "options": { "transcode": true, "validate": true } }', 'headers' => [ 'Content-Type' => 'application/json', 'PINNACLE-API-KEY' => '', ], ]); echo $response->getBody(); ``` ```csharp Immediate Blast Response using RestSharp; var client = new RestClient("https://api.pinnacle.sh/messages/blast/rcs"); var request = new RestRequest(Method.POST); request.AddHeader("PINNACLE-API-KEY", ""); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"audienceId\": \"aud_abc123\",\n \"senders\": [\n \"agent_pinnacle\",\n \"agent_pinnacle2\"\n ],\n \"message\": {\n \"quickReplies\": [\n {\n \"payload\": \"learn_more\",\n \"title\": \"Learn More\",\n \"type\": \"trigger\"\n }\n ],\n \"text\": \"Hello from Pinnacle RCS!\"\n },\n \"fallback\": {\n \"from\": \"+14155164736\",\n \"text\": \"Hello from Pinnacle! Reply LEARN to learn more.\"\n },\n \"options\": {\n \"transcode\": true,\n \"validate\": true\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Immediate Blast Response import Foundation let headers = [ "PINNACLE-API-KEY": "", "Content-Type": "application/json" ] let parameters = [ "audienceId": "aud_abc123", "senders": ["agent_pinnacle", "agent_pinnacle2"], "message": [ "quickReplies": [ [ "payload": "learn_more", "title": "Learn More", "type": "trigger" ] ], "text": "Hello from Pinnacle RCS!" ], "fallback": [ "from": "+14155164736", "text": "Hello from Pinnacle! Reply LEARN to learn more." ], "options": [ "transcode": true, "validate": true ] ] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/blast/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 Blast Response **Request** ```json { "audienceId": "aud_abc123", "senders": [ "agent_pinnacle", "agent_pinnacle2" ], "message": { "quickReplies": [ { "payload": "learn_more", "title": "Learn More", "type": "trigger" } ], "text": "Hello from Pinnacle RCS!" }, "fallback": { "from": "+14155164736", "text": "Hello from Pinnacle! Reply LEARN to learn more." }, "options": { "transcode": true, "validate": true } } ``` **Response** ```json { "scheduleId": "msg_sched_xxxxx", "config": { "sendAt": "2024-12-25T10:00", "recurrence": "0/30 * * * ? *", "timezone": "UTC", "endDate": "2024-12-25T18:00" } } ``` **SDK Code** ```python Scheduled Blast Response import requests url = "https://api.pinnacle.sh/messages/blast/rcs" payload = { "audienceId": "aud_abc123", "senders": ["agent_pinnacle", "agent_pinnacle2"], "message": { "quickReplies": [ { "payload": "learn_more", "title": "Learn More", "type": "trigger" } ], "text": "Hello from Pinnacle RCS!" }, "fallback": { "from": "+14155164736", "text": "Hello from Pinnacle! Reply LEARN to learn more." }, "options": { "transcode": True, "validate": True } } headers = { "PINNACLE-API-KEY": "", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript Scheduled Blast Response const url = 'https://api.pinnacle.sh/messages/blast/rcs'; const options = { method: 'POST', headers: {'PINNACLE-API-KEY': '', 'Content-Type': 'application/json'}, body: '{"audienceId":"aud_abc123","senders":["agent_pinnacle","agent_pinnacle2"],"message":{"quickReplies":[{"payload":"learn_more","title":"Learn More","type":"trigger"}],"text":"Hello from Pinnacle RCS!"},"fallback":{"from":"+14155164736","text":"Hello from Pinnacle! Reply LEARN to learn more."},"options":{"transcode":true,"validate":true}}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go Scheduled Blast Response package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.pinnacle.sh/messages/blast/rcs" payload := strings.NewReader("{\n \"audienceId\": \"aud_abc123\",\n \"senders\": [\n \"agent_pinnacle\",\n \"agent_pinnacle2\"\n ],\n \"message\": {\n \"quickReplies\": [\n {\n \"payload\": \"learn_more\",\n \"title\": \"Learn More\",\n \"type\": \"trigger\"\n }\n ],\n \"text\": \"Hello from Pinnacle RCS!\"\n },\n \"fallback\": {\n \"from\": \"+14155164736\",\n \"text\": \"Hello from Pinnacle! Reply LEARN to learn more.\"\n },\n \"options\": {\n \"transcode\": true,\n \"validate\": true\n }\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("PINNACLE-API-KEY", "") 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 Blast Response require 'uri' require 'net/http' url = URI("https://api.pinnacle.sh/messages/blast/rcs") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["PINNACLE-API-KEY"] = '' request["Content-Type"] = 'application/json' request.body = "{\n \"audienceId\": \"aud_abc123\",\n \"senders\": [\n \"agent_pinnacle\",\n \"agent_pinnacle2\"\n ],\n \"message\": {\n \"quickReplies\": [\n {\n \"payload\": \"learn_more\",\n \"title\": \"Learn More\",\n \"type\": \"trigger\"\n }\n ],\n \"text\": \"Hello from Pinnacle RCS!\"\n },\n \"fallback\": {\n \"from\": \"+14155164736\",\n \"text\": \"Hello from Pinnacle! Reply LEARN to learn more.\"\n },\n \"options\": {\n \"transcode\": true,\n \"validate\": true\n }\n}" response = http.request(request) puts response.read_body ``` ```java Scheduled Blast Response import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.pinnacle.sh/messages/blast/rcs") .header("PINNACLE-API-KEY", "") .header("Content-Type", "application/json") .body("{\n \"audienceId\": \"aud_abc123\",\n \"senders\": [\n \"agent_pinnacle\",\n \"agent_pinnacle2\"\n ],\n \"message\": {\n \"quickReplies\": [\n {\n \"payload\": \"learn_more\",\n \"title\": \"Learn More\",\n \"type\": \"trigger\"\n }\n ],\n \"text\": \"Hello from Pinnacle RCS!\"\n },\n \"fallback\": {\n \"from\": \"+14155164736\",\n \"text\": \"Hello from Pinnacle! Reply LEARN to learn more.\"\n },\n \"options\": {\n \"transcode\": true,\n \"validate\": true\n }\n}") .asString(); ``` ```php Scheduled Blast Response request('POST', 'https://api.pinnacle.sh/messages/blast/rcs', [ 'body' => '{ "audienceId": "aud_abc123", "senders": [ "agent_pinnacle", "agent_pinnacle2" ], "message": { "quickReplies": [ { "payload": "learn_more", "title": "Learn More", "type": "trigger" } ], "text": "Hello from Pinnacle RCS!" }, "fallback": { "from": "+14155164736", "text": "Hello from Pinnacle! Reply LEARN to learn more." }, "options": { "transcode": true, "validate": true } }', 'headers' => [ 'Content-Type' => 'application/json', 'PINNACLE-API-KEY' => '', ], ]); echo $response->getBody(); ``` ```csharp Scheduled Blast Response using RestSharp; var client = new RestClient("https://api.pinnacle.sh/messages/blast/rcs"); var request = new RestRequest(Method.POST); request.AddHeader("PINNACLE-API-KEY", ""); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"audienceId\": \"aud_abc123\",\n \"senders\": [\n \"agent_pinnacle\",\n \"agent_pinnacle2\"\n ],\n \"message\": {\n \"quickReplies\": [\n {\n \"payload\": \"learn_more\",\n \"title\": \"Learn More\",\n \"type\": \"trigger\"\n }\n ],\n \"text\": \"Hello from Pinnacle RCS!\"\n },\n \"fallback\": {\n \"from\": \"+14155164736\",\n \"text\": \"Hello from Pinnacle! Reply LEARN to learn more.\"\n },\n \"options\": {\n \"transcode\": true,\n \"validate\": true\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Scheduled Blast Response import Foundation let headers = [ "PINNACLE-API-KEY": "", "Content-Type": "application/json" ] let parameters = [ "audienceId": "aud_abc123", "senders": ["agent_pinnacle", "agent_pinnacle2"], "message": [ "quickReplies": [ [ "payload": "learn_more", "title": "Learn More", "type": "trigger" ] ], "text": "Hello from Pinnacle RCS!" ], "fallback": [ "from": "+14155164736", "text": "Hello from Pinnacle! Reply LEARN to learn more." ], "options": [ "transcode": true, "validate": true ] ] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/messages/blast/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() ``` > One API for RCS, iMessage, MMS, and SMS. Build, test, and scale every channel — send your first message in minutes, not weeks.