List Agent Calls
List the calls one AI voice agent made or answered, newest first, filterable by day range, direction, status and outcome.
curl --request GET \
--url https://api.zeeg.me/v2/agents/{agentUuid}/calls \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zeeg.me/v2/agents/{agentUuid}/calls"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.zeeg.me/v2/agents/{agentUuid}/calls', 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.zeeg.me/v2/agents/{agentUuid}/calls",
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.zeeg.me/v2/agents/{agentUuid}/calls"
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.zeeg.me/v2/agents/{agentUuid}/calls")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zeeg.me/v2/agents/{agentUuid}/calls")
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{
"success": true,
"status": 200,
"data": {
"pagination": {
"totalItems": 1,
"perPage": 20,
"currentPage": 1,
"lastPage": 1,
"hasPreviousPage": false,
"hasNextPage": false
},
"calls": [
{
"id": "7fK2pQx9Lm",
"agentId": "9a39bf60-a6c3-45e7-80cd-2cd36e520861",
"direction": "inbound",
"status": "done",
"callOutcome": "answered",
"isCall": true,
"startedAt": "2026-06-01T10:00:00+00:00",
"durationSeconds": 90,
"contactPhoneNumber": "+4917612345678",
"crmPersonId": "3f2b6c1e-8a4d-4f7e-9b20-6d1c5a8e7f30",
"callSummaryTitle": "Pricing question",
"createdAt": "2026-06-01T10:00:05+00:00"
}
]
}
}{
"message": "Unauthenticated."
}{
"success": false,
"message": "You are not a user of this organization.",
"data": null,
"status": 403
}{
"success": false,
"message": "Agent not found",
"data": null,
"status": 404
}{
"message": "The given data was invalid.",
"errors": {
"field_name": [
"The field_name field is required."
]
}
}Authorizations
Path Parameters
The UUID of the AI agent.
Query Parameters
Return only the calls recorded on or after this day.
Return only the calls recorded on or before this day. It must not precede from.
Return only inbound or only outbound calls.
inbound, outbound Return only the calls in this status.
initiated, done Return only the calls with this outcome.
answered, voicemail, not_answered, busy, unknown Page number.
x >= 1Number of calls per page.
1 <= x <= 100Response
OK
true
200
Hide child attributes
Hide child attributes
The page counters that a paginated list response carries.
Hide child attributes
Hide child attributes
Number of items that match the request across every page.
42
Number of items on one page.
20
Number of the page in this response.
1
Number of the last page.
3
True when a page comes before this one.
false
True when a page comes after this one.
true
Hide child attributes
Hide child attributes
The call id. Pass it to GET /agent-calls/{callId}. It is the conversationId of the ai_agent.call_completed webhook.
"7fK2pQx9Lm"
"9a39bf60-a6c3-45e7-80cd-2cd36e520861"
inbound, outbound done once the call has ended and its analysis is stored; initiated while it runs or when it never completed.
initiated, done Terminal outcome of the call attempt. null until the call has ended.
answered, voicemail, not_answered, busy, unknown true for a phone call; false for a test in the dashboard widget.
When the call started, in UTC. null when the voice provider reported no start time.
Call duration in seconds.
The other party's phone number in E.164 format, whichever direction the call took. null for widget tests and blocked caller ID.
The CRM person linked to this call. Read it with GET /crm/people/{id}.
A short AI-written title for the call.
When Zeeg first recorded the call.
curl --request GET \
--url https://api.zeeg.me/v2/agents/{agentUuid}/calls \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zeeg.me/v2/agents/{agentUuid}/calls"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.zeeg.me/v2/agents/{agentUuid}/calls', 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.zeeg.me/v2/agents/{agentUuid}/calls",
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.zeeg.me/v2/agents/{agentUuid}/calls"
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.zeeg.me/v2/agents/{agentUuid}/calls")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zeeg.me/v2/agents/{agentUuid}/calls")
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{
"success": true,
"status": 200,
"data": {
"pagination": {
"totalItems": 1,
"perPage": 20,
"currentPage": 1,
"lastPage": 1,
"hasPreviousPage": false,
"hasNextPage": false
},
"calls": [
{
"id": "7fK2pQx9Lm",
"agentId": "9a39bf60-a6c3-45e7-80cd-2cd36e520861",
"direction": "inbound",
"status": "done",
"callOutcome": "answered",
"isCall": true,
"startedAt": "2026-06-01T10:00:00+00:00",
"durationSeconds": 90,
"contactPhoneNumber": "+4917612345678",
"crmPersonId": "3f2b6c1e-8a4d-4f7e-9b20-6d1c5a8e7f30",
"callSummaryTitle": "Pricing question",
"createdAt": "2026-06-01T10:00:05+00:00"
}
]
}
}{
"message": "Unauthenticated."
}{
"success": false,
"message": "You are not a user of this organization.",
"data": null,
"status": 403
}{
"success": false,
"message": "Agent not found",
"data": null,
"status": 404
}{
"message": "The given data was invalid.",
"errors": {
"field_name": [
"The field_name field is required."
]
}
}