curl --request GET \
--url https://apiv2.vodex.ai/v1/calls \
--header 'Authorization: Bearer <token>'import requests
url = "https://apiv2.vodex.ai/v1/calls"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://apiv2.vodex.ai/v1/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://apiv2.vodex.ai/v1/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://apiv2.vodex.ai/v1/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://apiv2.vodex.ai/v1/calls")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://apiv2.vodex.ai/v1/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{
"calls": [
{
"id": "<string>",
"payment": {
"status": "reserved",
"amountMinor": 123,
"currency": "<string>",
"attempts": 123,
"result": "<string>"
},
"mtime": 123,
"startedAt": 123,
"direction": "inbound",
"number": "<string>",
"fromNumber": "<string>",
"toNumber": "<string>",
"error": "<string>",
"costUsd": 123,
"turns": 123,
"engine": "cascade",
"hasRecording": true,
"status": "<string>",
"durationMs": 123,
"assistantName": "<string>",
"slowestReplyMs": 123,
"billedSeconds": 123,
"endReason": "<string>",
"callStatus": "queued",
"endedBy": "caller",
"outcome": {
"key": "<string>",
"name": "<string>",
"rationale": "<string>"
},
"contactName": "<string>",
"doNotContact": true,
"attempt": 123,
"batch": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
},
"campaign": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
}
],
"total": 123,
"statusCounts": {},
"limit": 123,
"offset": 123
}{
"error": "not found"
}List calls
Newest first. In DB mode the calls table is the index — one query, no
trace parsing — and trace ingest happens off the request path, except
for rows on this page that are still missing a trace, which are
fetched inline so a call that just ended shows its turns now rather than
on whichever refresh lands after the next tick.
number is always the counterparty (for callers predating the
from/to split). durationMs is answer-to-hangup. error carries
the carrier’s own words — “503 Payment Required” is the difference
between a fixable problem and a silent one.
Every filter narrows the list and they combine. List filters take a
comma-separated value (status=no_answer,busy) or a repeated key
(status=no_answer&status=busy). A value the route does
not recognise is dropped rather than refused, so a stale link shows a
wider list instead of an error. Without a database the list is read
from trace files, and only q, from, to and direction apply.
curl --request GET \
--url https://apiv2.vodex.ai/v1/calls \
--header 'Authorization: Bearer <token>'import requests
url = "https://apiv2.vodex.ai/v1/calls"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://apiv2.vodex.ai/v1/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://apiv2.vodex.ai/v1/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://apiv2.vodex.ai/v1/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://apiv2.vodex.ai/v1/calls")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://apiv2.vodex.ai/v1/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{
"calls": [
{
"id": "<string>",
"payment": {
"status": "reserved",
"amountMinor": 123,
"currency": "<string>",
"attempts": 123,
"result": "<string>"
},
"mtime": 123,
"startedAt": 123,
"direction": "inbound",
"number": "<string>",
"fromNumber": "<string>",
"toNumber": "<string>",
"error": "<string>",
"costUsd": 123,
"turns": 123,
"engine": "cascade",
"hasRecording": true,
"status": "<string>",
"durationMs": 123,
"assistantName": "<string>",
"slowestReplyMs": 123,
"billedSeconds": 123,
"endReason": "<string>",
"callStatus": "queued",
"endedBy": "caller",
"outcome": {
"key": "<string>",
"name": "<string>",
"rationale": "<string>"
},
"contactName": "<string>",
"doNotContact": true,
"attempt": 123,
"batch": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
},
"campaign": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
}
],
"total": 123,
"statusCounts": {},
"limit": 123,
"offset": 123
}{
"error": "not found"
}Authorizations
Tenant API key (vdx_live_…) as Authorization: Bearer.
Query Parameters
1 <= x <= 100x >= 0Free text over either number, the agent's name, the contact's name and the call id.
Calls that started at or after this instant (ISO 8601).
Calls that started before this instant (ISO 8601). Exclusive.
Comma-separated inbound, outbound, web, unknown.
"inbound,outbound"
1 for only the calls that were a second or later attempt at the same batch row.
1 Comma-separated callStatus values (see CallListItem).
"no_answer,busy"
Comma-separated assistant uuids.
Comma-separated batch uuids. none matches calls no batch placed.
Comma-separated campaign uuids — every batch the campaign has dialled, all blocks included.
Comma-separated outcome keys (the assistant's outcomes[].key). none matches calls with no outcome.
"renewed,callback-requested"
Calls billed for at least this many seconds.
x >= 0Calls billed for fewer than this many seconds.
x >= 0