Invoiced vs paid vs outstanding
GET/api/reports/invoices
Billing performance over a date range. The range is applied to the invoice bill_date, so "invoiced" is what was billed in the window. Two payment figures are returned because they answer different questions: paid_against_invoices is what has been collected against the invoices billed in the window whenever the money arrived, while received_in_range is what actually landed in the window whatever it was billed against. A cash flow chart wants the second; an aged debt figure wants the first.
Outstanding is the unpaid remainder of the not_paid invoices in the window. Draft, cancelled and credited invoices are counted and reported but contribute nothing to outstanding, exactly as in the RISE invoice screens. Overdue applies the same tolerance the CRM uses, so a rounding cent does not keep an invoice on the overdue list.
The timeline array carries one entry per calendar month touched by the range, with both what was billed and what was received in that month, ready to plot without further aggregation. It is capped at 24 months, which the 366 day range limit already keeps out of reach, and the cap reports itself through meta.truncated.timeline so a shortened timeline can never pass for a complete one.
Headers
| Field | Type | Description |
|---|---|---|
| authtoken | String | Authentication token, generated from admin area |
Parameters
| Field | Type | Description |
|---|---|---|
| from | String | optional Start of the range, inclusive, YYYY-MM-DD. Defaults to 29 days before to. |
| to | String | optional End of the range, inclusive, YYYY-MM-DD. Defaults to the RISE server date. |
| client_id | Number | optional Restrict every figure to one client. |
curl -X GET "https://yoursite.com/api/reports/invoices" \
-H "authtoken: YOUR_API_TOKEN" Success-Response:
HTTP/1.1 200 OK
{
"status": true,
"data": {
"range": { "from": "2026-04-01", "to": "2026-06-30", "days": 91, "date_field": "invoices.bill_date" },
"invoices": {
"count": 42,
"invoiced": 154200, "subtotal": 141000, "discount_total": 2800, "tax_total": 16000,
"outstanding": 29000, "overdue_count": 6, "overdue_amount": 8700,
"by_status": {
"draft": { "count": 3, "total": 4100 },
"not_paid": { "count": 30, "total": 121000 },
"cancelled": { "count": 1, "total": 900 },
"credited": { "count": 8, "total": 28200 }
}
},
"payments": { "paid_against_invoices": 121000, "received_in_range": 130500, "received_count": 88 },
"credit_notes": { "count": 2, "total": 1400 },
"timeline": [ { "month": "2026-04", "invoice_count": 14, "invoiced": 51000, "payment_count": 29, "received": 44100 } ]
},
"meta": {
"generated_at": "2026-07-22 10:04:11",
"paid_status_tolerance": 0.02,
"truncated": { "timeline": false }
}
} Error-Response:
HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "The date range cannot be wider than 366 days. Ask for a shorter window." } }