Project and task throughput
GET/api/reports/projects
Delivery throughput over a date range: how many projects were opened, how many tasks were created, and how many tasks reached a done status inside the window. Task completion is read from tasks.status_changed_at, the only completion timestamp RISE keeps, and done is resolved through task_status.key_name so custom statuses are handled correctly.
Projects are counted on their created_date. RISE stores no project completion timestamp, so the status split under projects describes the current status of the projects created in the window rather than transitions that happened during it. open_now and overdue_now under tasks are likewise live snapshots and deliberately ignore the range.
Project state is read from projects.status_id joined to the project_status table, which is what the RISE application writes and filters on. projects.by_status keeps the four named buckets open, completed, hold and canceled that RISE ships with, so an existing dashboard is unaffected; projects.statuses carries the full split, one entry per project status actually in use, with its id, its stable key and its human readable title translated the way the project screens translate it. An installation that added its own status sees it in statuses and in created, but in none of the four named buckets, so read statuses to stay future proof. key_name falls back to project_status.title_language_key because RISE seeds Hold and Canceled with an empty key_name.
by_project ranks the busiest projects in the window by tasks created, with the completions for the same project, which is what a delivery dashboard plots as a leaderboard. It is a paged list: limit and offset select the page, and data.pagination reports limit, offset, returned, truncated and next_offset. truncated true means more projects match, and next_offset is the offset that returns the following page. The figures under projects, tasks and milestones are whole range aggregates and never change with the page.
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. |
| limit | Number | optional Projects per page in by_project.
|
| offset | Number | optional Projects to skip in by_project, for paging.
|
curl -X GET "https://yoursite.com/api/reports/projects" \
-H "authtoken: YOUR_API_TOKEN" Success-Response:
HTTP/1.1 200 OK
{
"status": true,
"data": {
"range": { "from": "2026-06-23", "to": "2026-07-22", "days": 30, "date_field": "projects.created_date" },
"projects": {
"created": 12, "value": 84000,
"by_status": { "open": 5, "completed": 4, "hold": 2, "canceled": 1 },
"statuses": [ { "status_id": 3, "key_name": "hold", "title": "Hold", "count": 2 } ]
},
"tasks": { "created": 240, "completed": 198, "open_now": 173, "overdue_now": 24 },
"milestones": { "due_in_range": 9 },
"by_project": [ { "project_id": 7, "title": "Portal rebuild", "tasks_created": 64, "tasks_completed": 51 } ],
"pagination": { "limit": 25, "offset": 0, "returned": 25, "truncated": true, "next_offset": 25 }
},
"meta": {
"generated_at": "2026-07-22 10:04:11",
"done_status_ids": [3],
"truncated": { "project_statuses": false, "done_statuses": false }
}
} Error-Response:
HTTP/1.1 400 Bad Request
{ "status": false, "messages": { "error": "The \"from\" parameter must be a date in YYYY-MM-DD form, for example 2026-01-31." } }