List webhook endpoints
curl --request GET \
--url https://api.contourvoice.com/v1/webhook-endpoints \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.contourvoice.com/v1/webhook-endpoints"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.contourvoice.com/v1/webhook-endpoints', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.contourvoice.com/v1/webhook-endpoints"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.contourvoice.com/v1/webhook-endpoints")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.contourvoice.com/v1/webhook-endpoints")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
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"
}Webhook Endpoints
List webhook endpoints
Every endpoint in your organization. Deleted endpoints are not listed.
GET
/
v1
/
webhook-endpoints
List webhook endpoints
curl --request GET \
--url https://api.contourvoice.com/v1/webhook-endpoints \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.contourvoice.com/v1/webhook-endpoints"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.contourvoice.com/v1/webhook-endpoints', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.contourvoice.com/v1/webhook-endpoints"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.contourvoice.com/v1/webhook-endpoints")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.contourvoice.com/v1/webhook-endpoints")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
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"
}Authorizations
Your organization's API key (sk_cont_...), sent as Authorization: Bearer sk_cont_.... Keep it server-side.
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.