curl --request POST \
--url https://your_webhook_host/_reference/webhooks/voice-agent-call-completed \
--header 'Content-Type: application/json' \
--data '
{
"id": "thread-uuid",
"status": "did-succeed",
"summary": "Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.",
"score": 87,
"agent": {
"id": "agent-uuid",
"name": "Dental Receptionist",
"phone_number": "+61412345678"
},
"direction": "outbound",
"duration": 142,
"contact": {
"id": "contact-uuid",
"name": "John Smith",
"email": "john@example.com",
"phone_number": "+61498765432",
"external_id": "ghl-contact-123"
},
"transcript": "Full conversation transcript here..."
}
'import requests
url = "https://your_webhook_host/_reference/webhooks/voice-agent-call-completed"
payload = {
"id": "thread-uuid",
"status": "did-succeed",
"summary": "Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.",
"score": 87,
"agent": {
"id": "agent-uuid",
"name": "Dental Receptionist",
"phone_number": "+61412345678"
},
"direction": "outbound",
"duration": 142,
"contact": {
"id": "contact-uuid",
"name": "John Smith",
"email": "john@example.com",
"phone_number": "+61498765432",
"external_id": "ghl-contact-123"
},
"transcript": "Full conversation transcript here..."
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
id: 'thread-uuid',
status: 'did-succeed',
summary: 'Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.',
score: 87,
agent: {id: 'agent-uuid', name: 'Dental Receptionist', phone_number: '+61412345678'},
direction: 'outbound',
duration: 142,
contact: {
id: 'contact-uuid',
name: 'John Smith',
email: 'john@example.com',
phone_number: '+61498765432',
external_id: 'ghl-contact-123'
},
transcript: 'Full conversation transcript here...'
})
};
fetch('https://your_webhook_host/_reference/webhooks/voice-agent-call-completed', 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://your_webhook_host/_reference/webhooks/voice-agent-call-completed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => 'thread-uuid',
'status' => 'did-succeed',
'summary' => 'Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.',
'score' => 87,
'agent' => [
'id' => 'agent-uuid',
'name' => 'Dental Receptionist',
'phone_number' => '+61412345678'
],
'direction' => 'outbound',
'duration' => 142,
'contact' => [
'id' => 'contact-uuid',
'name' => 'John Smith',
'email' => 'john@example.com',
'phone_number' => '+61498765432',
'external_id' => 'ghl-contact-123'
],
'transcript' => 'Full conversation transcript here...'
]),
CURLOPT_HTTPHEADER => [
"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://your_webhook_host/_reference/webhooks/voice-agent-call-completed"
payload := strings.NewReader("{\n \"id\": \"thread-uuid\",\n \"status\": \"did-succeed\",\n \"summary\": \"Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.\",\n \"score\": 87,\n \"agent\": {\n \"id\": \"agent-uuid\",\n \"name\": \"Dental Receptionist\",\n \"phone_number\": \"+61412345678\"\n },\n \"direction\": \"outbound\",\n \"duration\": 142,\n \"contact\": {\n \"id\": \"contact-uuid\",\n \"name\": \"John Smith\",\n \"email\": \"john@example.com\",\n \"phone_number\": \"+61498765432\",\n \"external_id\": \"ghl-contact-123\"\n },\n \"transcript\": \"Full conversation transcript here...\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.post("https://your_webhook_host/_reference/webhooks/voice-agent-call-completed")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"thread-uuid\",\n \"status\": \"did-succeed\",\n \"summary\": \"Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.\",\n \"score\": 87,\n \"agent\": {\n \"id\": \"agent-uuid\",\n \"name\": \"Dental Receptionist\",\n \"phone_number\": \"+61412345678\"\n },\n \"direction\": \"outbound\",\n \"duration\": 142,\n \"contact\": {\n \"id\": \"contact-uuid\",\n \"name\": \"John Smith\",\n \"email\": \"john@example.com\",\n \"phone_number\": \"+61498765432\",\n \"external_id\": \"ghl-contact-123\"\n },\n \"transcript\": \"Full conversation transcript here...\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your_webhook_host/_reference/webhooks/voice-agent-call-completed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"id\": \"thread-uuid\",\n \"status\": \"did-succeed\",\n \"summary\": \"Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.\",\n \"score\": 87,\n \"agent\": {\n \"id\": \"agent-uuid\",\n \"name\": \"Dental Receptionist\",\n \"phone_number\": \"+61412345678\"\n },\n \"direction\": \"outbound\",\n \"duration\": 142,\n \"contact\": {\n \"id\": \"contact-uuid\",\n \"name\": \"John Smith\",\n \"email\": \"john@example.com\",\n \"phone_number\": \"+61498765432\",\n \"external_id\": \"ghl-contact-123\"\n },\n \"transcript\": \"Full conversation transcript here...\"\n}"
response = http.request(request)
puts response.read_bodyWebhook — voice call completed
Not an endpoint on api.callaidan.com. When a voice call ends, Aidan sends an HTTP POST with Content-Type: application/json to the Webhook URL you configure on the agent (Voice Agents page in the dashboard, or webhook_url on the agent). This path appears in the API reference only so the request body schema renders in the docs — do not call https://api.callaidan.com/_reference/....
Respond with any 2xx status to acknowledge delivery.
curl --request POST \
--url https://your_webhook_host/_reference/webhooks/voice-agent-call-completed \
--header 'Content-Type: application/json' \
--data '
{
"id": "thread-uuid",
"status": "did-succeed",
"summary": "Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.",
"score": 87,
"agent": {
"id": "agent-uuid",
"name": "Dental Receptionist",
"phone_number": "+61412345678"
},
"direction": "outbound",
"duration": 142,
"contact": {
"id": "contact-uuid",
"name": "John Smith",
"email": "john@example.com",
"phone_number": "+61498765432",
"external_id": "ghl-contact-123"
},
"transcript": "Full conversation transcript here..."
}
'import requests
url = "https://your_webhook_host/_reference/webhooks/voice-agent-call-completed"
payload = {
"id": "thread-uuid",
"status": "did-succeed",
"summary": "Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.",
"score": 87,
"agent": {
"id": "agent-uuid",
"name": "Dental Receptionist",
"phone_number": "+61412345678"
},
"direction": "outbound",
"duration": 142,
"contact": {
"id": "contact-uuid",
"name": "John Smith",
"email": "john@example.com",
"phone_number": "+61498765432",
"external_id": "ghl-contact-123"
},
"transcript": "Full conversation transcript here..."
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
id: 'thread-uuid',
status: 'did-succeed',
summary: 'Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.',
score: 87,
agent: {id: 'agent-uuid', name: 'Dental Receptionist', phone_number: '+61412345678'},
direction: 'outbound',
duration: 142,
contact: {
id: 'contact-uuid',
name: 'John Smith',
email: 'john@example.com',
phone_number: '+61498765432',
external_id: 'ghl-contact-123'
},
transcript: 'Full conversation transcript here...'
})
};
fetch('https://your_webhook_host/_reference/webhooks/voice-agent-call-completed', 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://your_webhook_host/_reference/webhooks/voice-agent-call-completed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'id' => 'thread-uuid',
'status' => 'did-succeed',
'summary' => 'Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.',
'score' => 87,
'agent' => [
'id' => 'agent-uuid',
'name' => 'Dental Receptionist',
'phone_number' => '+61412345678'
],
'direction' => 'outbound',
'duration' => 142,
'contact' => [
'id' => 'contact-uuid',
'name' => 'John Smith',
'email' => 'john@example.com',
'phone_number' => '+61498765432',
'external_id' => 'ghl-contact-123'
],
'transcript' => 'Full conversation transcript here...'
]),
CURLOPT_HTTPHEADER => [
"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://your_webhook_host/_reference/webhooks/voice-agent-call-completed"
payload := strings.NewReader("{\n \"id\": \"thread-uuid\",\n \"status\": \"did-succeed\",\n \"summary\": \"Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.\",\n \"score\": 87,\n \"agent\": {\n \"id\": \"agent-uuid\",\n \"name\": \"Dental Receptionist\",\n \"phone_number\": \"+61412345678\"\n },\n \"direction\": \"outbound\",\n \"duration\": 142,\n \"contact\": {\n \"id\": \"contact-uuid\",\n \"name\": \"John Smith\",\n \"email\": \"john@example.com\",\n \"phone_number\": \"+61498765432\",\n \"external_id\": \"ghl-contact-123\"\n },\n \"transcript\": \"Full conversation transcript here...\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.post("https://your_webhook_host/_reference/webhooks/voice-agent-call-completed")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"thread-uuid\",\n \"status\": \"did-succeed\",\n \"summary\": \"Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.\",\n \"score\": 87,\n \"agent\": {\n \"id\": \"agent-uuid\",\n \"name\": \"Dental Receptionist\",\n \"phone_number\": \"+61412345678\"\n },\n \"direction\": \"outbound\",\n \"duration\": 142,\n \"contact\": {\n \"id\": \"contact-uuid\",\n \"name\": \"John Smith\",\n \"email\": \"john@example.com\",\n \"phone_number\": \"+61498765432\",\n \"external_id\": \"ghl-contact-123\"\n },\n \"transcript\": \"Full conversation transcript here...\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://your_webhook_host/_reference/webhooks/voice-agent-call-completed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"id\": \"thread-uuid\",\n \"status\": \"did-succeed\",\n \"summary\": \"Caller wanted to book an appointment for teeth cleaning. Successfully scheduled for Tuesday at 3pm. Caller was friendly and confirmed contact details.\",\n \"score\": 87,\n \"agent\": {\n \"id\": \"agent-uuid\",\n \"name\": \"Dental Receptionist\",\n \"phone_number\": \"+61412345678\"\n },\n \"direction\": \"outbound\",\n \"duration\": 142,\n \"contact\": {\n \"id\": \"contact-uuid\",\n \"name\": \"John Smith\",\n \"email\": \"john@example.com\",\n \"phone_number\": \"+61498765432\",\n \"external_id\": \"ghl-contact-123\"\n },\n \"transcript\": \"Full conversation transcript here...\"\n}"
response = http.request(request)
puts response.read_bodyBody
JSON payload delivered to your Webhook URL.
JSON body POSTed to the voice agent Webhook URL after each call completes. Field presence may vary with agent settings (e.g. transcript when call recording/transcripts are enabled).
Unique thread identifier for the call
Call outcome (e.g. did-succeed, did-not-answer, error)
AI-generated summary of the call
Call quality score (0–100)
0 <= x <= 100Show child attributes
Show child attributes
Call direction
inbound, outbound Call length in seconds
x >= 0Show child attributes
Show child attributes
Full conversation transcript when transcripts are enabled for this agent
Response
Your server acknowledged the webhook (any 2xx response is acceptable).

