curl --request PATCH \
--url https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agent_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"description": "<string>",
"enabled": true,
"events": [
"<string>"
],
"url": "<string>"
}
'import requests
url = "https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}"
payload = {
"agent_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"description": "<string>",
"enabled": True,
"events": ["<string>"],
"url": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
agent_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
description: '<string>',
enabled: true,
events: ['<string>'],
url: '<string>'
})
};
fetch('https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'agent_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'description' => '<string>',
'enabled' => true,
'events' => [
'<string>'
],
'url' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}"
payload := strings.NewReader("{\n \"agent_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"description\": \"<string>\",\n \"enabled\": true,\n \"events\": [\n \"<string>\"\n ],\n \"url\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"agent_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"description\": \"<string>\",\n \"enabled\": true,\n \"events\": [\n \"<string>\"\n ],\n \"url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agent_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"description\": \"<string>\",\n \"enabled\": true,\n \"events\": [\n \"<string>\"\n ],\n \"url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"agent_ids": [
"3f1c1b2e-6d1a-4c0e-9b2f-1a2b3c4d5e6f"
],
"created_at": "2026-09-10T14:00:00Z",
"description": "Production",
"enabled": true,
"events": [
"call.started",
"call.ended",
"call.analyzed"
],
"id": "b7e1c2d3-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"secret_hint": "k9Qz",
"updated_at": "2026-09-10T14:00:00Z",
"url": "https://example.com/webhooks/contour"
}{
"detail": "Invalid or expired API key"
}{
"detail": "Webhook endpoint not found."
}{
"detail": "url must use https."
}Update a webhook endpoint
Change url, events, agent_ids, description, or enabled.
Only the fields you send are changed. Set enabled to false to pause
deliveries without losing the endpoint’s configuration or history.
curl --request PATCH \
--url https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agent_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"description": "<string>",
"enabled": true,
"events": [
"<string>"
],
"url": "<string>"
}
'import requests
url = "https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}"
payload = {
"agent_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"description": "<string>",
"enabled": True,
"events": ["<string>"],
"url": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
agent_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
description: '<string>',
enabled: true,
events: ['<string>'],
url: '<string>'
})
};
fetch('https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'agent_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'description' => '<string>',
'enabled' => true,
'events' => [
'<string>'
],
'url' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}"
payload := strings.NewReader("{\n \"agent_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"description\": \"<string>\",\n \"enabled\": true,\n \"events\": [\n \"<string>\"\n ],\n \"url\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"agent_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"description\": \"<string>\",\n \"enabled\": true,\n \"events\": [\n \"<string>\"\n ],\n \"url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agent_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"description\": \"<string>\",\n \"enabled\": true,\n \"events\": [\n \"<string>\"\n ],\n \"url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"agent_ids": [
"3f1c1b2e-6d1a-4c0e-9b2f-1a2b3c4d5e6f"
],
"created_at": "2026-09-10T14:00:00Z",
"description": "Production",
"enabled": true,
"events": [
"call.started",
"call.ended",
"call.analyzed"
],
"id": "b7e1c2d3-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"secret_hint": "k9Qz",
"updated_at": "2026-09-10T14:00:00Z",
"url": "https://example.com/webhooks/contour"
}{
"detail": "Invalid or expired API key"
}{
"detail": "Webhook endpoint not found."
}{
"detail": "url must use https."
}Authorizations
Your organization's API key (sk_cont_...), sent as Authorization: Bearer sk_cont_.... Keep it server-side.
Path Parameters
Body
Only the fields you send are changed.
Replace the agent filter. Send null to receive events for every call in your organization.
A label for your own reference.
500Set false to pause deliveries without deleting the endpoint. Events that occur while paused are not queued.
Replace the subscribed events. Any subset of call.started, call.ended, call.analyzed.
New HTTPS URL to deliver to.
Response
Successful Response
False while deliveries are paused.
Subscribed events.
Endpoint id; use it in every other endpoint call.
The last four characters of the signing secret, so you can tell which secret an endpoint is using without exposing it.
Where events are delivered.
Agent filter, or null for all calls in the organization.
Your label.