Returns calls that match filter_criteria, newest first by default. Every top-level filter must match (AND). Values inside one array filter match any of the values (OR).
Request#
Body#
All fields are optional. An empty body returns the 50 newest calls.
| Field | Type | Required | Description |
|---|---|---|---|
filter_criteria |
object | No | Filters. See filter_criteria. Default {}. |
sort_order |
string | No | ascending or descending by creation time. Default descending. |
limit |
integer | No | 1 to 1000. Default 50. |
pagination_key |
string | No | The call_id of the last call on the previous page. The next page starts after it. |
filter_criteria#
| Field | Type | Description |
|---|---|---|
agent_id |
string[] | Calls handled by any of these agents. |
call_status |
string[] | Any of registered, ongoing, ended, error, not_connected. |
call_type |
string[] | Any of phone_call, web_call. |
direction |
string[] | Any of inbound, outbound. |
user_sentiment |
string[] | Any of Positive, Negative, Neutral, Unknown (from post-call analysis). |
call_successful |
boolean[] | [true], [false] or both. |
disconnection_reason |
string[] | Any of the disconnection reasons. |
batch_call_id |
string[] | Calls placed by any of these batches. |
start_timestamp |
object | Range on the start time: lower_threshold and upper_threshold, epoch ms, both inclusive and optional. Calls that never started are matched on their creation time. |
duration_ms |
object | Range on duration_ms: lower_threshold and upper_threshold, both inclusive and optional. |
fields |
object[] | Up to 20 conditions on analysis data, metadata or dynamic variables. All must match. See fields. |
fields#
Each condition reads one value by key and compares it.
| Field | Type | Required | Description |
|---|---|---|---|
source |
string | Yes | custom_analysis_data (post-call analysis fields), metadata, or dynamic_variable (matches either the request variables or the collected variables). |
key |
string | Yes | 1 to 200 characters. A dotted path reaches into nested objects, for example order.total. |
op |
string | No | Operator, default eq. See the table below. |
value |
string, number, boolean or array | No | Value to compare with. Not used by exists and not_exists. |
op |
Matches when |
|---|---|
eq |
The value equals value (type-sensitive: true and "true" differ). |
neq |
The value differs from value, or the key is missing. |
contains |
The value is a string that contains value. |
gt, gte, lt, lte |
Numeric comparison. A numeric string in value is compared as a number. |
in |
The value equals any element of the value array. |
exists |
The key is present and not null. |
not_exists |
The key is missing or null. |
Example request#
curl -X POST "https://api.tried.com.au/v3/list-calls" \
-H "Authorization: Bearer $TRIED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"filter_criteria": {
"agent_id": [
"agent_3f9a1c0b2d4e5f6a7b8c9d0e"
],
"call_status": [
"ended"
],
"start_timestamp": {
"lower_threshold": 1792022400000
},
"fields": [
{
"source": "custom_analysis_data",
"key": "confirmed",
"op": "eq",
"value": true
},
{
"source": "metadata",
"key": "crm_id",
"op": "exists"
}
]
},
"sort_order": "descending",
"limit": 100
}'const res = await fetch("https://api.tried.com.au/v3/list-calls", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TRIED_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"filter_criteria": {
"agent_id": [
"agent_3f9a1c0b2d4e5f6a7b8c9d0e"
],
"call_status": [
"ended"
],
"start_timestamp": {
"lower_threshold": 1792022400000
},
"fields": [
{
"source": "custom_analysis_data",
"key": "confirmed",
"op": "eq",
"value": true
},
{
"source": "metadata",
"key": "crm_id",
"op": "exists"
}
]
},
"sort_order": "descending",
"limit": 100
}),
});
const data = await res.json();import os, requests
res = requests.post(
"https://api.tried.com.au/v3/list-calls",
headers={"Authorization": f"Bearer {os.environ['TRIED_API_KEY']}"},
json={
"filter_criteria": {
"agent_id": ["agent_3f9a1c0b2d4e5f6a7b8c9d0e"],
"call_status": ["ended"],
"start_timestamp": {
"lower_threshold": 1792022400000,
},
"fields": [
{
"source": "custom_analysis_data",
"key": "confirmed",
"op": "eq",
"value": True,
},
{
"source": "metadata",
"key": "crm_id",
"op": "exists",
},
],
},
"sort_order": "descending",
"limit": 100,
},
)
data = res.json()Response#
200 OK with a JSON array of call objects, each with agent_name.
[
{
"call_id": "call_8d1e0f2a3b4c5d6e7f8a9b0c",
"call_type": "phone_call",
"agent_id": "agent_3f9a1c0b2d4e5f6a7b8c9d0e",
"agent_version": 4,
"agent_name": "Appointment reminders",
"call_status": "ended",
"direction": "outbound",
"start_timestamp": 1792310400000,
"end_timestamp": 1792310465000,
"duration_ms": 65000,
"disconnection_reason": "agent_hangup",
"call_analysis": { "call_summary": "Sam confirmed the appointment.", "in_voicemail": false, "user_sentiment": "Positive", "call_successful": true, "custom_analysis_data": { "confirmed": true } }
}
]The example shows a subset of fields; each item is a full call object.
To get the next page, send the same request with pagination_key set to the last call_id you received. A page shorter than limit is the last one.
Errors#
| Status | When |
|---|---|
400 |
Validation failed, or pagination_key is not a call in this workspace (Invalid pagination_key). |
401 |
Missing or invalid API key. |
403 |
The key's IP allowlist or scopes reject the request. This route needs the calls scope. |
429 |
Rate limit exceeded. See Rate limits. |
See Errors for the body format.
Compatibility notes#
POST /v2/list-calls is an alias. The response is a plain array with no has_more or cursor field; pagination uses the last call_id.