> 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/webhooks/detach-webhook/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pinnacle.sh/_mcp/server. # Detach Webhook POST https://api.pinnacle.sh/webhooks/detach Content-Type: application/json Detach a webhook from one or more senders (phone numbers or RCS agent IDs) to stop receiving event notifications. The webhook itself is not deleted and remains available for use with other senders. Works regardless of webhook status. Supports bulk operations with up to 50 senders per request. Reference: https://docs.pinnacle.sh/api-reference/webhooks/detach-webhook ## Authentication - `PINNACLE-API-KEY` header (required) — API Key authentication via header ## Request ### Body (application/json) This endpoint expects a DetachWebhookRequest. - `webhookId` (string, required) — Webhook ID to detach (starts with `wh_`). Must be a webhook owned by your team. - `senders` (list of string, required) — Array of senders to detach the webhook from. Can be phone numbers in E.164 format or RCS agent IDs. ## Response ### 200 Successfully detached webhook from the specified senders. Senders that could not be found are returned in the `failed` array with error details. - `webhookId` (string, required) — The webhook that was detached from the senders. - `senders` (list of string, required) — Senders that were successfully detached (phone numbers in E.164 format or RCS agent IDs). - `failed` (list of FailedSender, required) — Senders that could not be detached, with error details. ## 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. ### 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. ## Types ### FailedSender - `sender` (string, required) — The sender that failed. - `error` (string, required) — Reason for the failure. ### 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 **Request** ```json { "webhookId": "string", "senders": [ "+14155551234", "agent_abc123" ] } ``` **Response** ```json { "webhookId": "wh_1234567890", "senders": [ "+14155551234" ], "failed": [] } ``` **SDK Code** ```python Detached Webhook import requests url = "https://api.pinnacle.sh/webhooks/detach" payload = { "webhookId": "string", "senders": ["+14155551234", "agent_abc123"] } headers = { "PINNACLE-API-KEY": "", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript Detached Webhook const url = 'https://api.pinnacle.sh/webhooks/detach'; const options = { method: 'POST', headers: {'PINNACLE-API-KEY': '', 'Content-Type': 'application/json'}, body: '{"webhookId":"string","senders":["+14155551234","agent_abc123"]}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go Detached Webhook package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://api.pinnacle.sh/webhooks/detach" payload := strings.NewReader("{\n \"webhookId\": \"string\",\n \"senders\": [\n \"+14155551234\",\n \"agent_abc123\"\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 Detached Webhook require 'uri' require 'net/http' url = URI("https://api.pinnacle.sh/webhooks/detach") 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 \"webhookId\": \"string\",\n \"senders\": [\n \"+14155551234\",\n \"agent_abc123\"\n ]\n}" response = http.request(request) puts response.read_body ``` ```java Detached Webhook import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.pinnacle.sh/webhooks/detach") .header("PINNACLE-API-KEY", "") .header("Content-Type", "application/json") .body("{\n \"webhookId\": \"string\",\n \"senders\": [\n \"+14155551234\",\n \"agent_abc123\"\n ]\n}") .asString(); ``` ```php Detached Webhook request('POST', 'https://api.pinnacle.sh/webhooks/detach', [ 'body' => '{ "webhookId": "string", "senders": [ "+14155551234", "agent_abc123" ] }', 'headers' => [ 'Content-Type' => 'application/json', 'PINNACLE-API-KEY' => '', ], ]); echo $response->getBody(); ``` ```csharp Detached Webhook using RestSharp; var client = new RestClient("https://api.pinnacle.sh/webhooks/detach"); var request = new RestRequest(Method.POST); request.AddHeader("PINNACLE-API-KEY", ""); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"webhookId\": \"string\",\n \"senders\": [\n \"+14155551234\",\n \"agent_abc123\"\n ]\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift Detached Webhook import Foundation let headers = [ "PINNACLE-API-KEY": "", "Content-Type": "application/json" ] let parameters = [ "webhookId": "string", "senders": ["+14155551234", "agent_abc123"] ] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://api.pinnacle.sh/webhooks/detach")! 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.