Headline counts

GET/api/reports/summary

A single snapshot of the CRM as it stands right now: how many clients, leads, contacts and team members exist, how projects and tickets are split by status, how many tasks are open or overdue, and the invoiced, paid and outstanding money totals. This is the endpoint behind a dashboard's top row of tiles - it takes no date range, so the numbers are always "as of now" and never depend on the caller's window.

Soft-deleted records are excluded everywhere. Leads and clients share the clients table and are separated by the is_lead flag. Contacts and team members share the users table and are separated by user_type. Task completion is resolved through task_status.key_name = 'done', so a renamed or extra status is still classified correctly. Invoice money covers documents of type 'invoice' only.

Project state comes from projects.status_id joined to the project_status table, the pair the RISE application itself writes and filters on. The named fields open, completed, hold and canceled are the four statuses RISE ships with and are kept for existing dashboards; because an installation may rename them or add its own, data.projects.statuses carries the complete split with the status id, its stable key and its human readable title. A custom status is counted in data.projects.total and in statuses, but in none of the four named fields, so a client that wants to be future proof should read statuses rather than the named fields. RISE seeds Hold and Canceled with an empty project_status.key_name, so key_name falls back to project_status.title_language_key and is therefore always populated on a stock install. The title is translated exactly as the project screens translate it.

Headers

FieldTypeDescription
authtoken String Authentication token, generated from admin area
curl -X GET "https://yoursite.com/api/reports/summary" \
  -H "authtoken: YOUR_API_TOKEN"

Success-Response:

HTTP/1.1 200 OK
{
  "status": true,
  "data": {
    "clients": { "total": 128 },
    "leads": { "total": 54 },
    "contacts": { "total": 210 },
    "team_members": { "total": 12 },
    "projects": {
      "total": 63, "open": 21, "completed": 35, "hold": 4, "canceled": 3,
      "statuses": [ { "status_id": 1, "key_name": "open", "title": "Open", "count": 21 } ]
    },
    "tasks": {
      "total": 941, "open": 173, "done": 768, "overdue": 24,
      "by_status": [ { "status_id": 1, "key_name": "to_do", "title": "To Do", "count": 90 } ]
    },
    "tickets": {
      "total": 310, "open": 35, "closed": 275,
      "by_status": { "new": 5, "client_replied": 3, "open": 27, "closed": 275 }
    },
    "invoices": {
      "total": 220,
      "by_status": { "draft": 8, "not_paid": 40, "cancelled": 2, "credited": 1 },
      "invoiced": 154200, "paid": 121000, "outstanding": 33200,
      "overdue_count": 12, "overdue_amount": 8700
    }
  },
  "meta": {
    "generated_at": "2026-07-22 10:04:11",
    "paid_status_tolerance": 0.02,
    "truncated": { "project_statuses": false, "task_statuses": false, "done_statuses": false }
  }
}

Error-Response:

HTTP/1.1 500 Internal Server Error
{ "status": false, "messages": { "error": "The report could not be generated. The details were written to the RISE error log." } }
MethodGET
Path/api/reports/summary
GroupReporting
Sincev1.0.0
Defined inRestApi/Controllers/ReportingController.php