AgentDesk API
A JSON HTTP API over everything the dashboard shows: calls and transcripts, scored acquisition opportunities, leads and contacts, the agent draft, team access and webhook endpoints.
Base URL
Every endpoint lives under a single versioned prefix. Replace the host with the API address issued for your account.
https://<your-api-host>/api/v1The version is part of the path. Breaking changes ship as /api/v2; additive fields can appear in v1 at any time, so ignore fields you do not recognise.
Requests and responses
Requests and responses are application/json, UTF-8. Timestamps are RFC 3339 in UTC (2026-09-09T08:42:00Z). Money is an integer in the smallest currency unit unless a field name says otherwise. Identifiers are opaque, prefixed strings — call_9f21, opp_31a — never assume a format or an order.
Send a unique X-Request-Id on every request. It comes back on the response and appears in our logs, which makes support conversations short.
Your first request
Server-to-server integrations use a scoped key. Create one in the dashboard under Settings → API keys, then read the last 25 calls:
curl https://<your-api-host>/api/v1/calls?limit=25 \
-H "Authorization: Bearer cak_live_..." \
-H "X-Request-Id: $(uuidgen)"{
"data": [
{
"id": "call_9f21",
"started_at": "2026-09-09T08:42:00Z",
"duration_seconds": 214,
"caller": { "name": "Denise Okafor", "phone": "+447700900123" },
"intent": "Selling a probate property",
"outcome": "hot",
"recording_available": true
}
],
"next_cursor": null
}Two ways in
Browser clients use a session cookie with a CSRF token. Servers use a scoped bearer key. Both are covered in Authentication.
404 rather than 403, so IDs cannot be probed.Rate limits
Reads are limited per key and per workspace; writes are stricter. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. On 429, back off using the Retry-After header rather than retrying immediately.