Calls
List calls
Page through your workspace’s call history, newest first, filtered by type, assistant, campaign, number, date, duration, cost or how the call ended.
POST
/
v2
/
call
/
list
List calls
curl --request POST \
--url https://api.verbeo.ai/v2/call/list \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"page": 123,
"size": 123,
"call_types": [
"<string>"
],
"agent_ids": [
"<string>"
],
"campaign_ids": [
"<string>"
],
"from_numbers": [
"<string>"
],
"to_number": "<string>",
"call_id": "<string>",
"created_after": "<string>",
"created_before": "<string>",
"duration_min": 123,
"cost_min": 123,
"disconnection_reasons": [
"<string>"
]
}
'import requests
url = "https://api.verbeo.ai/v2/call/list"
payload = {
"page": 123,
"size": 123,
"call_types": ["<string>"],
"agent_ids": ["<string>"],
"campaign_ids": ["<string>"],
"from_numbers": ["<string>"],
"to_number": "<string>",
"call_id": "<string>",
"created_after": "<string>",
"created_before": "<string>",
"duration_min": 123,
"cost_min": 123,
"disconnection_reasons": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
page: 123,
size: 123,
call_types: ['<string>'],
agent_ids: ['<string>'],
campaign_ids: ['<string>'],
from_numbers: ['<string>'],
to_number: '<string>',
call_id: '<string>',
created_after: '<string>',
created_before: '<string>',
duration_min: 123,
cost_min: 123,
disconnection_reasons: ['<string>']
})
};
fetch('https://api.verbeo.ai/v2/call/list', 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.verbeo.ai/v2/call/list",
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([
'page' => 123,
'size' => 123,
'call_types' => [
'<string>'
],
'agent_ids' => [
'<string>'
],
'campaign_ids' => [
'<string>'
],
'from_numbers' => [
'<string>'
],
'to_number' => '<string>',
'call_id' => '<string>',
'created_after' => '<string>',
'created_before' => '<string>',
'duration_min' => 123,
'cost_min' => 123,
'disconnection_reasons' => [
'<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.verbeo.ai/v2/call/list"
payload := strings.NewReader("{\n \"page\": 123,\n \"size\": 123,\n \"call_types\": [\n \"<string>\"\n ],\n \"agent_ids\": [\n \"<string>\"\n ],\n \"campaign_ids\": [\n \"<string>\"\n ],\n \"from_numbers\": [\n \"<string>\"\n ],\n \"to_number\": \"<string>\",\n \"call_id\": \"<string>\",\n \"created_after\": \"<string>\",\n \"created_before\": \"<string>\",\n \"duration_min\": 123,\n \"cost_min\": 123,\n \"disconnection_reasons\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.verbeo.ai/v2/call/list")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"page\": 123,\n \"size\": 123,\n \"call_types\": [\n \"<string>\"\n ],\n \"agent_ids\": [\n \"<string>\"\n ],\n \"campaign_ids\": [\n \"<string>\"\n ],\n \"from_numbers\": [\n \"<string>\"\n ],\n \"to_number\": \"<string>\",\n \"call_id\": \"<string>\",\n \"created_after\": \"<string>\",\n \"created_before\": \"<string>\",\n \"duration_min\": 123,\n \"cost_min\": 123,\n \"disconnection_reasons\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.verbeo.ai/v2/call/list")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"page\": 123,\n \"size\": 123,\n \"call_types\": [\n \"<string>\"\n ],\n \"agent_ids\": [\n \"<string>\"\n ],\n \"campaign_ids\": [\n \"<string>\"\n ],\n \"from_numbers\": [\n \"<string>\"\n ],\n \"to_number\": \"<string>\",\n \"call_id\": \"<string>\",\n \"created_after\": \"<string>\",\n \"created_before\": \"<string>\",\n \"duration_min\": 123,\n \"cost_min\": 123,\n \"disconnection_reasons\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"duration": {},
"cost": {},
"agent_name": {}
}Returns the calls of the workspace your API key belongs to, newest first. Each item carries the call’s light fields; read one call with Get call for its transcript, recording, summary and analysis.
Each array holds at most 100 values.
This read is a
POST because a list query is a document: arrays and numbers arrive typed as themselves. It changes nothing.Body
Every filter is optional, and together they all apply. An empty array is the same as leaving the filter out.number
default:"1"
1-based page number. Pass back
pagination.next_cursor from the previous response.number
default:"50"
Page size, between
1 and 1000.string[]
Any of
inbound, outbound, web.string[]
Assistant UUIDs.
string[]
Campaign UUIDs: calls placed to those campaigns’ contacts.
string[]
Numbers the calls came from, exactly as stored.
string
Part of the number called, e.g.
5550123.string
One call’s UUID.
string
ISO 8601 date-time with an offset, e.g.
2026-10-01T00:00:00Z. Inclusive.string
ISO 8601 date-time with an offset. Inclusive.
number
Seconds, inclusive.
duration_max is the upper bound.number
Cents, inclusive.
cost_max is the upper bound.string[]
How the calls ended, e.g.
user_hangup, agent_hangup, dial_no_answer.Request
curl -X POST "https://api.verbeo.ai/v2/call/list" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "size": 20, "call_types": ["outbound"], "created_after": "2026-10-01T00:00:00Z" }'
const res = await fetch("https://api.verbeo.ai/v2/call/list", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VERBEO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ size: 20, call_types: ["outbound"] }),
});
const { data, pagination } = await res.json();
import os, requests
res = requests.post(
"https://api.verbeo.ai/v2/call/list",
headers={"Authorization": f"Bearer {os.environ['VERBEO_API_KEY']}"},
json={"size": 20, "call_types": ["outbound"]},
)
body = res.json()
calls, pagination = body["data"], body["pagination"]
Response
200 OK. Standard envelope plus pagination — see Responses. next_cursor is the next page number, or null on the last page. Stop there: a page past the last one answers 500 INTERNAL_ERROR, and sending it again does not help.
{
"success": true,
"data": [
{
"id": "b7a3c1e4-94f2-4c9d-a8e0-5d9f6c2a1b34",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"agent_id": "550e8400-e29b-41d4-a716-446655440000",
"agent_name": "Customer Support",
"call_type": "outbound",
"from_number": "+14155550100",
"to_number": "+14155550123",
"status": "completed",
"duration": 94,
"cost": 21,
"started_at": "2026-10-01T10:30:00.123+00:00",
"answered_at": "2026-10-01T10:30:06.410+00:00",
"ended_at": "2026-10-01T10:31:40.002+00:00",
"disconnection_reason": "user_hangup",
"created_at": "2026-10-01T10:30:00.101+00:00",
"updated_at": "2026-10-01T10:31:41.500+00:00"
}
],
"pagination": { "total": 1, "count": 1, "next_cursor": null }
}
number | null
Talk time in seconds.
number | null
What the call cost, in cents.
string | null
null when the assistant has since been deleted.Errors
| Code | Status | When |
|---|---|---|
VALIDATION_FAILED | 422 | A malformed filter — the message names it, e.g. created_after: must be an ISO 8601 date-time. |
UNAUTHORIZED | 401 | Invalid, inactive or expired key. A request with no Authorization: Bearer vbr_… header is a 401 too, but outside the envelope. |
FORBIDDEN | 403 | A public (vbr_pub_…) key. |
INTERNAL_ERROR | 500 | A page past the last one (do not retry it), or an unexpected failure. |
Was this page helpful?
⌘I
List calls
curl --request POST \
--url https://api.verbeo.ai/v2/call/list \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"page": 123,
"size": 123,
"call_types": [
"<string>"
],
"agent_ids": [
"<string>"
],
"campaign_ids": [
"<string>"
],
"from_numbers": [
"<string>"
],
"to_number": "<string>",
"call_id": "<string>",
"created_after": "<string>",
"created_before": "<string>",
"duration_min": 123,
"cost_min": 123,
"disconnection_reasons": [
"<string>"
]
}
'import requests
url = "https://api.verbeo.ai/v2/call/list"
payload = {
"page": 123,
"size": 123,
"call_types": ["<string>"],
"agent_ids": ["<string>"],
"campaign_ids": ["<string>"],
"from_numbers": ["<string>"],
"to_number": "<string>",
"call_id": "<string>",
"created_after": "<string>",
"created_before": "<string>",
"duration_min": 123,
"cost_min": 123,
"disconnection_reasons": ["<string>"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
page: 123,
size: 123,
call_types: ['<string>'],
agent_ids: ['<string>'],
campaign_ids: ['<string>'],
from_numbers: ['<string>'],
to_number: '<string>',
call_id: '<string>',
created_after: '<string>',
created_before: '<string>',
duration_min: 123,
cost_min: 123,
disconnection_reasons: ['<string>']
})
};
fetch('https://api.verbeo.ai/v2/call/list', 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.verbeo.ai/v2/call/list",
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([
'page' => 123,
'size' => 123,
'call_types' => [
'<string>'
],
'agent_ids' => [
'<string>'
],
'campaign_ids' => [
'<string>'
],
'from_numbers' => [
'<string>'
],
'to_number' => '<string>',
'call_id' => '<string>',
'created_after' => '<string>',
'created_before' => '<string>',
'duration_min' => 123,
'cost_min' => 123,
'disconnection_reasons' => [
'<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.verbeo.ai/v2/call/list"
payload := strings.NewReader("{\n \"page\": 123,\n \"size\": 123,\n \"call_types\": [\n \"<string>\"\n ],\n \"agent_ids\": [\n \"<string>\"\n ],\n \"campaign_ids\": [\n \"<string>\"\n ],\n \"from_numbers\": [\n \"<string>\"\n ],\n \"to_number\": \"<string>\",\n \"call_id\": \"<string>\",\n \"created_after\": \"<string>\",\n \"created_before\": \"<string>\",\n \"duration_min\": 123,\n \"cost_min\": 123,\n \"disconnection_reasons\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.verbeo.ai/v2/call/list")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"page\": 123,\n \"size\": 123,\n \"call_types\": [\n \"<string>\"\n ],\n \"agent_ids\": [\n \"<string>\"\n ],\n \"campaign_ids\": [\n \"<string>\"\n ],\n \"from_numbers\": [\n \"<string>\"\n ],\n \"to_number\": \"<string>\",\n \"call_id\": \"<string>\",\n \"created_after\": \"<string>\",\n \"created_before\": \"<string>\",\n \"duration_min\": 123,\n \"cost_min\": 123,\n \"disconnection_reasons\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.verbeo.ai/v2/call/list")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"page\": 123,\n \"size\": 123,\n \"call_types\": [\n \"<string>\"\n ],\n \"agent_ids\": [\n \"<string>\"\n ],\n \"campaign_ids\": [\n \"<string>\"\n ],\n \"from_numbers\": [\n \"<string>\"\n ],\n \"to_number\": \"<string>\",\n \"call_id\": \"<string>\",\n \"created_after\": \"<string>\",\n \"created_before\": \"<string>\",\n \"duration_min\": 123,\n \"cost_min\": 123,\n \"disconnection_reasons\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"duration": {},
"cost": {},
"agent_name": {}
}