List calls
curl --request GET \
--url https://api.nixflex.com/v1/callsimport requests
url = "https://api.nixflex.com/v1/calls"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.nixflex.com/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://api.nixflex.com/v1/calls",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.nixflex.com/v1/calls"
req, _ := http.NewRequest("GET", url, nil)
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.nixflex.com/v1/calls")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nixflex.com/v1/calls")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyCalls
List calls
GET /v1/calls
GET
/
v1
/
calls
List calls
curl --request GET \
--url https://api.nixflex.com/v1/callsimport requests
url = "https://api.nixflex.com/v1/calls"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.nixflex.com/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://api.nixflex.com/v1/calls",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.nixflex.com/v1/calls"
req, _ := http.NewRequest("GET", url, nil)
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.nixflex.com/v1/calls")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nixflex.com/v1/calls")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyReturns your calls, newest first. 50 per page by default - page through the rest with
Fetch one call by ID with Get call.
limit and offset.
Request
curl https://api.nixflex.com/v1/calls \
-H "Authorization: Bearer KEY_ID:KEY_SECRET"
Query parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
limit | int | 50 | How many calls to return. Hard-capped at 200 per request - a higher value is reduced to 200 rather than rejected. |
offset | int | 0 | How many calls to skip. Combine with limit to page back through older calls. |
# the 50 most recent
curl https://api.nixflex.com/v1/calls \
-H "Authorization: Bearer KEY_ID:KEY_SECRET"
# calls 101-200, newest first
curl "https://api.nixflex.com/v1/calls?limit=100&offset=100" \
-H "Authorization: Bearer KEY_ID:KEY_SECRET"
The response is a bare array, not an object with a
total or has_more. Page
until you get fewer rows back than you asked for.Response
200 OK returns a JSON array:
[
{
"call_id": "CA1234567890",
"agent_id": "agent_125207e452f8714a",
"call_direction": "inbound",
"from_number": "+447386172392",
"to_number": "+447446466847",
"call_status": "completed",
"start_timestamp": 1784987006751,
"end_timestamp": 1784987048847,
"answered_at": 1784987011051,
"duration_ms": 146000,
"ended_reason": "agent_hangup",
"transcript": "AI: Good morning...",
"call_summary": "Caller booked a check-up",
"caller_sentiment": "happy",
"call_successful": true,
"extracted_data": {},
"bookings": [],
"recording_url": "https://storage.nixflex.com/recordings/CA1234567890.mp3",
"voicemail_detected": false,
"created_at": "2026-05-17T03:45:12Z"
}
]
Response fields
| Field | Type | Notes |
|---|---|---|
call_id | string | Unique ID for the call |
agent_id | string | The agent that handled the call |
call_direction | string | inbound or outbound |
from_number | string | Caller’s number, E.164 |
to_number | string | Number that was called, E.164 |
call_status | string | Final status of the call |
start_timestamp | int | When the call was created, epoch milliseconds. On an outbound call this is when the carrier was asked to dial, BEFORE the phone rang. |
end_timestamp | int | When the call ended, epoch milliseconds. |
answered_at | int or null | When the call was ANSWERED, epoch milliseconds. null on inbound calls and on calls that predate this field - see the note under duration_ms. |
duration_ms | int | Time connected, in milliseconds - measured from answer to hangup, and the number you are billed on. Ring time is NOT included, so this will not equal end_timestamp minus start_timestamp on an outbound call. |
call_type | string | inbound or outbound. Same meaning as call_direction; both are returned. |
voicemail_detection_method | string or null | Which detector found the voicemail: twilio_amd, telnyx_amd or llm_transcript. |
amd_result | string or null | What the carrier’s machine detection reported, e.g. human or machine_start. Only present when machine detection is enabled. |
call_reason | string or null | Reason extracted from the conversation, when the agent captures one. |
caller_name | string or null | Caller’s name, when known. |
ended_reason | string | Why the call ended |
transcript | string | Full transcript. Included in this response |
call_summary | string | AI-written summary |
caller_sentiment | string | happy, neutral, or frustrated |
call_successful | boolean | Whether the call met its goal |
extracted_data | object | Fields pulled from the call, per your agent’s extraction settings |
bookings | array | Appointments booked during the call |
recording_url | string | Link to the MP3, or null if recording is off |
recording_duration_s | int | Recording length in seconds |
voicemail_detected | boolean | Whether the call reached a voicemail |
campaign_id | string | Outbound campaign this call belongs to, or null |
avg_latency_ms | int | Average response latency during the call |
created_at | string | ISO 8601 |
duration_ms is time CONNECTED, not dial-to-hangup. Ring time is excluded, so
it matches what your carrier bills you and it matches the recording length. On an
outbound call start_timestamp is when dialling began, so
end_timestamp - start_timestamp will be LARGER than duration_ms by however long
the phone rang. Use answered_at if you want the ring time:
answered_at - start_timestamp.The response includes internal fields that are not part of this contract. You
will see
id, api_key_id and system_prompt_used in the JSON. They are yours,
but they are engine plumbing rather than API surface - do not build against them, as
they may change or be removed without a version bump.Older calls stay reachable with
offset, but call data is deleted after 90 days -
see Data retention. To keep full history, subscribe to
the call.completed webhook and store each call in your own
backend as it arrives.