SautiDesk
SautiDesk API
Reports (Pro)

Sales pipeline, follow-up, won and source reports

GET
/v1/desk/reports/sales/{report}

Returns one sales report for a date range: pipeline (leads and value by stage), follow-up (follow-ups due, done and overdue), won (deals won and lost, and the win rate) or sources (leads and wins by source). Narrow it to a queue, tag, source or owner, and group follow-up or won by owner, queue, tag or source. Answers 403 desk.sales_off while Sales is switched off.

Requires: desk.supervise scope, Supervisor licence, Pro plan.

Authorization

bearerAuth
AuthorizationBearer <token>

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

Path Parameters

report*string

The sale's id (a UUID).

Query Parameters

queue?string

Only leads in this queue: its id (a UUID).

tag?string

Only leads carrying this tag: its id (a UUID).

source?string

Only leads from this source: its id (a UUID).

owner?string

Only leads owned by this person: their id (a UUID).

from*string

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.

to*string

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.

group?string

How follow-up and won rows are grouped: owner (default), queue, tag or source. Pipeline and sources ignore it.

format?string

csv to download the report as a CSV file instead of JSON.

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": {},  "data": [    {      "key": "example-value",      "label": "Amina Wanjiru",      "kind": "billing",      "currency": "KES",      "leads": 1,      "value_minor": 1,      "won": 1,      "lost": 1,      "win_rate": 1,      "won_value_minor": 1,      "due": 1,      "on_time": 1,      "late": 1,      "missed": 1,      "open": 1,      "no_next_step": 1    }  ],  "total": 3,  "next_cursor": "eyJvIjoyNX0",  "has_more": false,  "row_cap": 1}
FieldTypeDescription
reportrequiredstringThe report to send, for example service or calls.
rangerequiredobject
fromrequiredstring (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.
timezonerequiredstring
generated_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.
valuerequiredany
typerequiredstring
noterequiredstringA note.
tonerequiredstring
betterstringWhich 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.
valuerequirednumber
typerequiredstring
tonestring
kpisrequiredobject
datarequiredobject[]
keyrequiredstring
labelrequiredstringA short name to recognise it by.
kindstringWhat kind it is.
currencystringThe currency code of the money in this report, for example KES. Write money figures with it. Left out when the report has no money.
leadsrequiredinteger
value_minorrequiredinteger
woninteger | null
lostinteger | null
win_ratenumber | null
won_value_minorinteger | null
dueinteger | null
on_timeinteger | null
lateinteger | null
missedinteger | null
openinteger | null
no_next_stepinteger | null
totalrequiredinteger
next_cursorrequiredstring | null
has_morerequiredboolean
row_caprequiredinteger
curl -X GET "https://api.sautidesk.com/v1/desk/reports/sales/string?from=string&to=string"