Call report
Lists calls in a date range, one row per call, with the agent who took it, its duration and how it ended. Filter by direction, queue, agent, answered, missed, result, outcome or q, page with limit and cursor, or set format to csv.
Requires: desk.supervise scope, Supervisor licence, Pro plan.
Authorization
bearerAuth A SautiDesk API key. An owner or admin makes it under Settings in SautiDesk for a named person and picks the scopes. The key is shown once. Send it as Authorization: Bearer <key>. It acts as that person and as nobody else.
In: header
Query Parameters
Start of the range: a date (2026-09-01) or a time (RFC 3339). A bare date is that day in the workspace's time zone.
End of the range: a date or a time (RFC 3339). A bare date includes that whole day. The range can be at most 366 days long.
inbound or outbound.
Only this queue: its id, or none for calls that reached no queue.
Only this person's calls: their id (a UUID), or none for calls nobody handled. Several ids can be separated by commas.
true for calls that were answered, false for calls that were not.
true for inbound calls nobody answered.
How the call ended: answered, abandoned, no_answer, busy, failed, menu_dropped, voicemail or transferred. Several values can be separated by commas.
Only calls wrapped up with this outcome, by name.
Digits of the customer's number to search for.
next_cursor from the previous page. Leave it out for the first page.
Page size: 100 by default, 100 at most.
csv to download the report as a CSV file instead of JSON.
Set to 0 (or false, off, no) to leave out the comparison with the previous period. By default the report includes a compare block and a change on each headline figure. A CSV download never compares.
Response
OK
Example
{ "report": "service", "range": { "from": "2026-10-14T08:30:00Z", "to": "2026-10-14T08:30:00Z", "timezone": "Africa/Nairobi" }, "generated_at": "2026-10-14T08:30:00Z", "insight": { "headline": "example", "body": "Hi Amina, your order has shipped.", "icon": "example" }, "charts": [ {} ], "compare": { "label": "Amina Wanjiru", "from": "2026-10-14T08:30:00Z", "to": "2026-10-14T08:30:00Z", "own": false }, "headline": [ { "label": "Amina Wanjiru", "value": {}, "type": "billing", "note": "Hi Amina, your order has shipped.", "tone": "example", "better": "example", "delta": 1, "delta_type": "example", "def": "example", "split": [ { "label": null, "value": null, "type": null, "tone": null } ] } ], "kpis": { "calls": 1, "inbound": 1, "outbound": 1, "answered": 1, "answered_percent": 1, "missed": 1, "avg_wait_seconds": 60 }, "data": [ { "id": "3f2b8c1e-5a4d-4e7b-9c10-2d6a8e4f1b37", "call_id": "5f8fdfd7-274f-478d-9141-184cd8996e3f", "time": "2026-10-14T08:30:00Z", "direction": "inbound", "from": "+254712345678", "to": "+254712345678", "contact": { "id": "3f2b8c1e-5a4d-4e7b-9c10-2d6a8e4f1b37", "name": "Amina Wanjiru" }, "agent": { "id": "3f2b8c1e-5a4d-4e7b-9c10-2d6a8e4f1b37", "name": "Amina Wanjiru" }, "queue": "billing", "wait_seconds": 60, "duration_seconds": 60, "result": "example", "answered": false, "missed": false, "after_hours": false, "outcome": { "label": "Amina Wanjiru", "kind": "billing" }, "category": "billing", "recording": { "available": false, "seconds": 60, "url": "https://example.com/file", "no_recording_reason": "Recording is off for this number" }, "ticket": { "id": "3f2b8c1e-5a4d-4e7b-9c10-2d6a8e4f1b37", "ref": "TCK-4471" } } ], "total": 3, "next_cursor": "eyJvIjoyNX0", "has_more": false, "row_cap": 1}reportrequiredstringThe report to send, for example service or calls.rangerequiredobjectfromrequiredstring (date-time)The number or address to send from. It must belong to your workspace.torequiredstring (date-time)Who to send to: a phone number in international format or, for email, an address.timezonerequiredstringgenerated_atrequiredstring (date-time)insightrequiredanyA short written reading of the report, built from its own numbers. Left out when there is nothing to say.headlinerequiredstringThe one-line finding.bodyrequiredstringA sentence or two that explain the finding.iconrequiredstringThe name of the icon to show beside it.chartsrequiredany[]Charts to draw for the report, in order. Each has a kind (for example hbars, columns, scatter, stack, band, heat or timeline), a title and its data. Ignore a kind you do not know. Left out when there is nothing to draw.comparerequiredanyWhat the changes in this report are measured against, for example the same weekday a week earlier. Left out when compare is off or there is nothing to compare with.labelrequiredstringWhat the comparison is against, for example vs last Thursday.fromstring (date-time) | nullStart of the comparison period. Left out when the report uses its own baseline.tostring (date-time) | nullEnd of the comparison period. Left out when the report uses its own baseline.ownbooleanTrue when the report measures against its own baseline, such as the usual week or the forecast, so no second period was run.headlinerequiredobject[]The four headline figures of the report, in the same shape as the kpis of the other reports. Left out when the report has none.labelrequiredstringA short name to recognise it by.valuerequiredanytyperequiredstringnoterequiredstringA note.tonerequiredstringbetterstringWhich way is good for this figure: up or down. Left out when neither is, for example calls offered.deltanumber | nullThis period's figure minus the previous period's, in the unit of delta_type. Left out when there is nothing to compare.delta_typestringHow delta is written: the figure's own type, except that a percentage moves in points.defstringOne sentence that says what the figure means, for a hover under its label. Left out when there is nothing to add.splitobject[]The parts a headline figure is made of, for example conversations by channel, as segments with a label, value, type and tone. Left out when it has none.labelrequiredstringA short name to recognise it by.valuerequirednumbertyperequiredstringtonestringkpisrequiredobjectcallsrequiredintegerinboundrequiredintegeroutboundrequiredintegeransweredrequiredintegeranswered_percentrequiredinteger | nullmissedrequiredintegeravg_wait_secondsrequiredinteger | nulldatarequiredobject[]idrequiredstring (uuid)call_idrequiredstring (uuid) | nullThe id of the call this nudge is about, if any.timerequiredstring (date-time)directionrequiredstringfromrequiredstringThe number or address to send from. It must belong to your workspace.torequiredstringWho to send to: a phone number in international format or, for email, an address.contactrequiredanyidrequiredstring (uuid)namerequiredstringA name for it.agentrequiredanyidrequiredstring (uuid)namerequiredstringA name for it.queuerequiredstring | nullwait_secondsrequiredinteger | nullduration_secondsrequiredinteger | nullresultrequiredstringansweredrequiredbooleanmissedrequiredbooleanafter_hoursrequiredbooleanoutcomerequiredanyHow it ended: the name or id of one of your outcomes.labelrequiredstringA short name to recognise it by.kindrequiredstring | nullWhat kind it is.categoryrequiredstring | nullThe name of the category.recordingrequiredobjectThe recording to play when the greeting mode is recording.availablerequiredbooleansecondsrequiredinteger | nullurlrequiredstring | nullno_recording_reasonrequiredstring | nullticketrequiredanyThe ticket the call belongs to, by id or reference such as TCK-4471.idrequiredstring (uuid)refrequiredstringtotalrequiredintegernext_cursorrequiredstring | nullhas_morerequiredbooleanrow_caprequiredintegercurl -X GET "https://api.sautidesk.com/v1/desk/reports/calls?from=string&to=string"