Three read-only endpoints surface the numbers management cares about: an adaptive dashboard, a staffing forecast, and mission-budget health. All are GET requests that return 200 OK.
Dashboard
GET /kpi/dashboard takes no parameters and adapts to the caller’s role. A manager sees the whole team; a consultant sees only their own slice.
GET /kpi/dashboard HTTP/1.1
Authorization: Bearer <access_token>
The response (DashboardSnapshot) mixes team-level and personal blocks. Blocks that do not apply to your role come back as null rather than being omitted:
- Team blocks (not for consultant-role callers):
team,active_mission_count,allocation,ending_soon. - Review block (admins and managers):
review_queue. - Personal blocks (holders of a linked consultant profile):
my_assignments,my_time_off,current_sheet. is_emptyis true when there is nothing to show yet.
Because the shape adapts, check each block for null before reading it.
Staffing
GET /kpi/staffing returns a per-consultant, per-period staffing grid. It is restricted to admin and executive roles (403 otherwise).
GET /kpi/staffing?granularity=month&from=2026-01-01&to=2026-06-30 HTTP/1.1
Authorization: Bearer <access_token>
| Param | Meaning | Default |
|---|---|---|
from | start date | six months back |
to | end date | six months ahead |
granularity | week, month, or quarter | month |
consultant_id | narrow to one consultant | all consultants |
The report has three parallel arrays: periods, consultants, and totals. Each consultant row carries a cells array aligned to periods; each cell reports capacity_days, actual_days, projected_days, and staffing_percent. Periods are tagged past, current, or forecast, so you can render history and projection from the same grid.
Mission budgets
GET /kpi/mission-budgets compares budget, forecast, and variance for a set of missions at once. It is open to business-viewer roles (admin, operations, executive).
GET /kpi/mission-budgets?ids=0190a1c2-...,0190a1c3-... HTTP/1.1
Authorization: Bearer <access_token>
ids is a comma-separated list of mission ids (required). Each row reports name, status, sale_mode, health (unknown, on_track, at_risk, over), progress_percent, budget_revenue, budget_cost, forecast_margin, and variance_margin. Cost and margin fields are null for consultant-role callers. For the full breakdown of a single mission, use GET /missions/{id}/budget (see Run a mission).
Endpoints at a glance
| Action | Method | Path | Roles |
|---|---|---|---|
| Dashboard | GET | /kpi/dashboard | all (adapts to role) |
| Staffing | GET | /kpi/staffing | admin, executive |
| Mission budgets | GET | /kpi/mission-budgets | admin, operations, executive |