> 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/rcs-agents/get-link/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pinnacle.sh/_mcp/server. # Generate RCS Link POST https://api.pinnacle.sh/rcs/link Content-Type: application/json Generate a link for initiating an RCS conversation with your agent. Users can click these links to start conversations with your RCS agent directly from websites, emails, or other applications. Reference: https://docs.pinnacle.sh/api-reference/rcs-agents/get-link ## Authentication - `PINNACLE-API-KEY` header (required) — API Key authentication via header ## Request ### Body (application/json) This endpoint expects a RcsLinkRequest. - `agentId` (string, required) — The RCS agent ID (must be prefixed with 'agent_') - `phoneNumber` (string, optional) — Fallback phone number (E.164 format) to use if the phone number does not support RCS. If not provided, no url will be generated. - `body` (string, optional) — Optional message body to pre-fill after the user clicks the link ## Response ### 200 Response containing the generated RCS service id and/or url. You can always create a link with the service id that is returned using the format: ``` sms://{PHONE_NUMBER}?service_id={SERVICE_ID}&body={URL_ENCODED_BODY} ``` - `serviceId` (string, required) — The service ID used for the link - `url` (string, optional) — The generated RCS link URL. If no phone number is provided, no url will be generated. ## Errors ### 400 Bad Request Error Validation failed. The payload has missing required fields and/or invalid types. 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. 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. 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. 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. 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. 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 ### 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 ## Examples ### RCS Agent Link **Response** ```json { "serviceId": "pinnacletest_agent", "url": "sms://+12345678901?service_id=pinnacletest_agent&body=Hello%20from%20RCS!" } ``` **SDK Code** ```python RCS Agent Link import requests url = "https://api.pinnacle.sh/rcs/link" headers = {"PINNACLE-API-KEY": ""} response = requests.post(url, headers=headers) print(response.json()) ``` ```javascript RCS Agent Link const url = 'https://api.pinnacle.sh/rcs/link'; const options = {method: 'POST', headers: {'PINNACLE-API-KEY': ''}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go RCS Agent Link package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.pinnacle.sh/rcs/link" req, _ := http.NewRequest("POST", url, nil) req.Header.Add("PINNACLE-API-KEY", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby RCS Agent Link require 'uri' require 'net/http' url = URI("https://api.pinnacle.sh/rcs/link") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["PINNACLE-API-KEY"] = '' response = http.request(request) puts response.read_body ``` ```java RCS Agent Link import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.pinnacle.sh/rcs/link") .header("PINNACLE-API-KEY", "") .asString(); ``` ```php RCS Agent Link request('POST', 'https://api.pinnacle.sh/rcs/link', [ 'headers' => [ 'PINNACLE-API-KEY' => '', ], ]); echo $response->getBody(); ``` ```csharp RCS Agent Link using RestSharp; var client = new RestClient("https://api.pinnacle.sh/rcs/link"); var request = new RestRequest(Method.POST); request.AddHeader("PINNACLE-API-KEY", ""); IRestResponse response = client.Execute(request); ``` ```swift RCS Agent Link import Foundation let headers = ["PINNACLE-API-KEY": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/rcs/link")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" 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 Link Request **Request** ```json { "agentId": "agent_XXXXXXXXXXXX", "phoneNumber": "+12345678901", "body": "Hello, I need help with my order" } ``` **Response** ```json { "serviceId": "pinnacletest_agent", "url": "sms://+12345678901?service_id=pinnacletest_agent&body=Hello%20from%20RCS!" } ``` **SDK Code** ```python RCS Link Request import requests url = "https://api.pinnacle.sh/rcs/link" payload = { "agentId": "agent_XXXXXXXXXXXX", "phoneNumber": "+12345678901", "body": "Hello, I need help with my order" } headers = { "PINNACLE-API-KEY": "", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript RCS Link Request const url = 'https://api.pinnacle.sh/rcs/link'; const options = { method: 'POST', headers: {'PINNACLE-API-KEY': '', 'Content-Type': 'application/json'}, body: '{"agentId":"agent_XXXXXXXXXXXX","phoneNumber":"+12345678901","body":"Hello, I need help with my order"}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go RCS Link Request package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.pinnacle.sh/rcs/link" payload := strings.NewReader("{\n \"agentId\": \"agent_XXXXXXXXXXXX\",\n \"phoneNumber\": \"+12345678901\",\n \"body\": \"Hello, I need help with my order\"\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 RCS Link Request require 'uri' require 'net/http' url = URI("https://api.pinnacle.sh/rcs/link") 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 \"agentId\": \"agent_XXXXXXXXXXXX\",\n \"phoneNumber\": \"+12345678901\",\n \"body\": \"Hello, I need help with my order\"\n}" response = http.request(request) puts response.read_body ``` ```java RCS Link Request import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.pinnacle.sh/rcs/link") .header("PINNACLE-API-KEY", "") .header("Content-Type", "application/json") .body("{\n \"agentId\": \"agent_XXXXXXXXXXXX\",\n \"phoneNumber\": \"+12345678901\",\n \"body\": \"Hello, I need help with my order\"\n}") .asString(); ``` ```php RCS Link Request request('POST', 'https://api.pinnacle.sh/rcs/link', [ 'body' => '{ "agentId": "agent_XXXXXXXXXXXX", "phoneNumber": "+12345678901", "body": "Hello, I need help with my order" }', 'headers' => [ 'Content-Type' => 'application/json', 'PINNACLE-API-KEY' => '', ], ]); echo $response->getBody(); ``` ```csharp RCS Link Request using RestSharp; var client = new RestClient("https://api.pinnacle.sh/rcs/link"); var request = new RestRequest(Method.POST); request.AddHeader("PINNACLE-API-KEY", ""); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"agentId\": \"agent_XXXXXXXXXXXX\",\n \"phoneNumber\": \"+12345678901\",\n \"body\": \"Hello, I need help with my order\"\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift RCS Link Request import Foundation let headers = [ "PINNACLE-API-KEY": "", "Content-Type": "application/json" ] let parameters = [ "agentId": "agent_XXXXXXXXXXXX", "phoneNumber": "+12345678901", "body": "Hello, I need help with my order" ] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/rcs/link")! 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.