# Everything the workspace placed, first 50
curl "https://api.60db.ai/dialer/click2call?mine=0&limit=50" \
-H "Authorization: Bearer your-api-key"
# One integration's calls only
curl "https://api.60db.ai/dialer/click2call?api_key_id=17" \
-H "Authorization: Bearer your-api-key"
const params = new URLSearchParams({ mine: '0', limit: '50', offset: '0' });
const res = await fetch(`https://api.60db.ai/dialer/click2call?${params}`, {
headers: { Authorization: `Bearer ${process.env.SIXTYDB_API_KEY}` },
});
const { data } = await res.json();
const spend = data.calls.reduce((sum, c) => sum + (c.cost_usd || 0), 0);
console.log(`${data.total} calls, $${spend.toFixed(4)} on this page`);
res = requests.get(
"https://api.60db.ai/dialer/click2call",
params={"mine": 0, "limit": 50},
headers={"Authorization": f"Bearer {os.environ['SIXTYDB_API_KEY']}"},
)
page = res.json()["data"]
print(page["total"], page["has_more"])
{
"success": true,
"data": {
"calls": [
{
"call_id": "7d004ba2-565f-4ee2-9aa2-19523d8db7ae",
"reference_id": "crm-task-91823",
"did": "+917900000000",
"agent_number": "+919812345678",
"customer_number": "+919876543210",
"state": "completed",
"call_done": true,
"terminal_event": "call.completed",
"hangup_cause": "NORMAL_CLEARING",
"talk_seconds": 66,
"total_seconds": 92,
"cost_usd": 0.0033,
"billing_status": "billed",
"placed_via": "api_key",
"api_key_id": 17,
"api_key_name": "crm-integration",
"created_at": "2026-09-23T14:11:27.134Z"
},
{
"call_id": "1c93f0aa-2d8e-4f61-b0c2-7f5a1e9d4402",
"reference_id": "qc2c-8f1c1e2a-4b77-4a51-9f3e-2c1d6f0a77b1",
"state": "failed",
"call_done": true,
"terminal_event": "call.not_answered",
"hangup_cause": "NO_ANSWER",
"leg": "agent",
"talk_seconds": 0,
"total_seconds": 31,
"cost_usd": null,
"billing_status": null,
"placed_via": "session",
"created_at": "2026-09-23T13:48:02.771Z"
}
],
"total": 248,
"limit": 50,
"offset": 0,
"has_more": true
}
}
Click-to-Call
List Click-to-Calls
This workspace’s click-to-call history, newest first
GET
/
dialer
/
click2call
# Everything the workspace placed, first 50
curl "https://api.60db.ai/dialer/click2call?mine=0&limit=50" \
-H "Authorization: Bearer your-api-key"
# One integration's calls only
curl "https://api.60db.ai/dialer/click2call?api_key_id=17" \
-H "Authorization: Bearer your-api-key"
const params = new URLSearchParams({ mine: '0', limit: '50', offset: '0' });
const res = await fetch(`https://api.60db.ai/dialer/click2call?${params}`, {
headers: { Authorization: `Bearer ${process.env.SIXTYDB_API_KEY}` },
});
const { data } = await res.json();
const spend = data.calls.reduce((sum, c) => sum + (c.cost_usd || 0), 0);
console.log(`${data.total} calls, $${spend.toFixed(4)} on this page`);
res = requests.get(
"https://api.60db.ai/dialer/click2call",
params={"mine": 0, "limit": 50},
headers={"Authorization": f"Bearer {os.environ['SIXTYDB_API_KEY']}"},
)
page = res.json()["data"]
print(page["total"], page["has_more"])
{
"success": true,
"data": {
"calls": [
{
"call_id": "7d004ba2-565f-4ee2-9aa2-19523d8db7ae",
"reference_id": "crm-task-91823",
"did": "+917900000000",
"agent_number": "+919812345678",
"customer_number": "+919876543210",
"state": "completed",
"call_done": true,
"terminal_event": "call.completed",
"hangup_cause": "NORMAL_CLEARING",
"talk_seconds": 66,
"total_seconds": 92,
"cost_usd": 0.0033,
"billing_status": "billed",
"placed_via": "api_key",
"api_key_id": 17,
"api_key_name": "crm-integration",
"created_at": "2026-09-23T14:11:27.134Z"
},
{
"call_id": "1c93f0aa-2d8e-4f61-b0c2-7f5a1e9d4402",
"reference_id": "qc2c-8f1c1e2a-4b77-4a51-9f3e-2c1d6f0a77b1",
"state": "failed",
"call_done": true,
"terminal_event": "call.not_answered",
"hangup_cause": "NO_ANSWER",
"leg": "agent",
"talk_seconds": 0,
"total_seconds": 31,
"cost_usd": null,
"billing_status": null,
"placed_via": "session",
"created_at": "2026-09-23T13:48:02.771Z"
}
],
"total": 248,
"limit": 50,
"offset": 0,
"has_more": true
}
}
Paginated click-to-call history for your workspace, newest first. Each entry is the same call object Place Click-to-Call returns, so cost and outcome are on the row — no join against a separate ledger.
Request
Headers
string
required
Bearer token with your API key
Query
integer
default:"25"
Rows per page,
1–200integer
default:"0"
Rows to skip
string
default:"1"
By default you see the calls you placed plus the workspace’s unattributed ones. Pass
mine=0 for everything the workspace placed.integer
Narrow to one API key — the per-integration statement a reseller bills from. Scoped to your workspace, so another workspace’s key id returns nothing rather than their calls.
Response
array
Call objects, newest first. See Place Click-to-Call for every field
integer
Total rows matching the filter, ignoring pagination
integer
The page size actually applied (clamped to 1–200)
integer
The offset applied
boolean
true when another page followsErrors
| Status | Code | Meaning |
|---|---|---|
| 409 | DIALER_NOT_PROVISIONED | Trunk not set up (Gate T) |
Example
# Everything the workspace placed, first 50
curl "https://api.60db.ai/dialer/click2call?mine=0&limit=50" \
-H "Authorization: Bearer your-api-key"
# One integration's calls only
curl "https://api.60db.ai/dialer/click2call?api_key_id=17" \
-H "Authorization: Bearer your-api-key"
const params = new URLSearchParams({ mine: '0', limit: '50', offset: '0' });
const res = await fetch(`https://api.60db.ai/dialer/click2call?${params}`, {
headers: { Authorization: `Bearer ${process.env.SIXTYDB_API_KEY}` },
});
const { data } = await res.json();
const spend = data.calls.reduce((sum, c) => sum + (c.cost_usd || 0), 0);
console.log(`${data.total} calls, $${spend.toFixed(4)} on this page`);
res = requests.get(
"https://api.60db.ai/dialer/click2call",
params={"mine": 0, "limit": 50},
headers={"Authorization": f"Bearer {os.environ['SIXTYDB_API_KEY']}"},
)
page = res.json()["data"]
print(page["total"], page["has_more"])
{
"success": true,
"data": {
"calls": [
{
"call_id": "7d004ba2-565f-4ee2-9aa2-19523d8db7ae",
"reference_id": "crm-task-91823",
"did": "+917900000000",
"agent_number": "+919812345678",
"customer_number": "+919876543210",
"state": "completed",
"call_done": true,
"terminal_event": "call.completed",
"hangup_cause": "NORMAL_CLEARING",
"talk_seconds": 66,
"total_seconds": 92,
"cost_usd": 0.0033,
"billing_status": "billed",
"placed_via": "api_key",
"api_key_id": 17,
"api_key_name": "crm-integration",
"created_at": "2026-09-23T14:11:27.134Z"
},
{
"call_id": "1c93f0aa-2d8e-4f61-b0c2-7f5a1e9d4402",
"reference_id": "qc2c-8f1c1e2a-4b77-4a51-9f3e-2c1d6f0a77b1",
"state": "failed",
"call_done": true,
"terminal_event": "call.not_answered",
"hangup_cause": "NO_ANSWER",
"leg": "agent",
"talk_seconds": 0,
"total_seconds": 31,
"cost_usd": null,
"billing_status": null,
"placed_via": "session",
"created_at": "2026-09-23T13:48:02.771Z"
}
],
"total": 248,
"limit": 50,
"offset": 0,
"has_more": true
}
}