curl --request GET \
--url https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}"
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/{endpoint_id}/deliveries/{delivery_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}/deliveries/{delivery_id}",
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/{endpoint_id}/deliveries/{delivery_id}"
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/{endpoint_id}/deliveries/{delivery_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}")
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{
"attempts": 1,
"call_id": "9d2f7a3c-8e4b-4f1d-a6c7-2b3c4d5e6f70",
"created_at": "2026-09-10T14:04:36Z",
"delivered_at": "2026-09-10T14:04:36Z",
"endpoint_id": "b7e1c2d3-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"event": "call.ended",
"history": [
{
"attempt_number": 1,
"duration_ms": 142,
"id": "0f1e2d3c-4b5a-4968-8776-655443322110",
"response_excerpt": "ok",
"started_at": "2026-09-10T14:04:36Z",
"status_code": 200
}
],
"id": "6a0d5e4f-3c2b-4a19-8e7d-6c5b4a392817",
"last_status_code": 200,
"max_attempts": 8,
"payload": {
"call": {
"agent_id": "3f1c1b2e-6d1a-4c0e-9b2f-1a2b3c4d5e6f",
"call_id": "9d2f7a3c-8e4b-4f1d-a6c7-2b3c4d5e6f70",
"direction": "outbound",
"disconnection_reason": "agent_hangup",
"disposition": "answered",
"duration_ms": 84000,
"ended_at": "2026-09-10T14:04:35+00:00",
"from_number": "+15555550199",
"metadata": {
"your_order_id": "ORD-8812"
},
"recording_url": "https://storage.googleapis.com/.../recording.mp3?X-Goog-Signature=...",
"source": "api",
"started_at": "2026-09-10T14:03:11+00:00",
"status": "ended",
"to_number": "+15555550100",
"variables": {
"patient_name": "Jane Doe"
}
},
"created_at": "2026-09-10T14:04:36+00:00",
"event": "call.ended",
"id": "6a0d5e4f-3c2b-4a19-8e7d-6c5b4a392817"
},
"status": "succeeded"
}{
"detail": "Invalid or expired API key"
}{
"detail": "Delivery not found."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"ctx": {},
"input": "<unknown>"
}
]
}Get a delivery
One delivery with the exact payload sent and every attempt made.
curl --request GET \
--url https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}"
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/{endpoint_id}/deliveries/{delivery_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}/deliveries/{delivery_id}",
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/{endpoint_id}/deliveries/{delivery_id}"
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/{endpoint_id}/deliveries/{delivery_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.contourvoice.com/v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}")
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{
"attempts": 1,
"call_id": "9d2f7a3c-8e4b-4f1d-a6c7-2b3c4d5e6f70",
"created_at": "2026-09-10T14:04:36Z",
"delivered_at": "2026-09-10T14:04:36Z",
"endpoint_id": "b7e1c2d3-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"event": "call.ended",
"history": [
{
"attempt_number": 1,
"duration_ms": 142,
"id": "0f1e2d3c-4b5a-4968-8776-655443322110",
"response_excerpt": "ok",
"started_at": "2026-09-10T14:04:36Z",
"status_code": 200
}
],
"id": "6a0d5e4f-3c2b-4a19-8e7d-6c5b4a392817",
"last_status_code": 200,
"max_attempts": 8,
"payload": {
"call": {
"agent_id": "3f1c1b2e-6d1a-4c0e-9b2f-1a2b3c4d5e6f",
"call_id": "9d2f7a3c-8e4b-4f1d-a6c7-2b3c4d5e6f70",
"direction": "outbound",
"disconnection_reason": "agent_hangup",
"disposition": "answered",
"duration_ms": 84000,
"ended_at": "2026-09-10T14:04:35+00:00",
"from_number": "+15555550199",
"metadata": {
"your_order_id": "ORD-8812"
},
"recording_url": "https://storage.googleapis.com/.../recording.mp3?X-Goog-Signature=...",
"source": "api",
"started_at": "2026-09-10T14:03:11+00:00",
"status": "ended",
"to_number": "+15555550100",
"variables": {
"patient_name": "Jane Doe"
}
},
"created_at": "2026-09-10T14:04:36+00:00",
"event": "call.ended",
"id": "6a0d5e4f-3c2b-4a19-8e7d-6c5b4a392817"
},
"status": "succeeded"
}{
"detail": "Invalid or expired API key"
}{
"detail": "Delivery not found."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"ctx": {},
"input": "<unknown>"
}
]
}Authorizations
Your organization's API key (sk_cont_...), sent as Authorization: Bearer sk_cont_.... Keep it server-side.
Response
Successful Response
Attempts made so far.
The call this event is about.
One of call.started, call.ended, call.analyzed, or test for sample events.
Every attempt, oldest first.
Show child attributes
Show child attributes
Delivery id. Sent as X-Contour-Delivery-Id and as id in the body on every attempt; deduplicate on it.
Attempts allowed before the delivery is marked failed.
The exact JSON body that was (or will be) POSTed to you.
One of pending, in_flight, succeeded, failed, cancelled. pending means a retry is scheduled; failed means every attempt was used.
When your server first answered 2xx.
Error from the most recent attempt.
HTTP status from the most recent attempt.
When the next retry is due, while status is pending.