DOCS / API / REPORTS
VIEW RAW

GET /v1/reports/*

Every dashboard view is also an endpoint, queryable with the same Bearer token. Plug it into PowerBI, Looker, Excel, or your own dashboard.

The reports endpoints are Pro and above. Free orgs get /v1/reports/usage for their own quota state.

Common parameters

All endpoints below accept these query params:

Param Default Values
period 30d 24h, 7d, 30d, 90d, ytd, all
agent_id (none) Filter to one agent
task_type (none) Filter to one task type
format json json or csv

GET /v1/reports/time-saved

Hours saved + cost saved, grouped by one or more dimensions.

Param Default Values
group_by agent Comma-list of agent, task_type, client, day, week, month
sort hours_saved hours_saved, cost_saved, events
top (none) Limit to top N rows
curl "https://humanhours.dev/v1/reports/time-saved?period=30d&group_by=agent,task_type&sort=hours_saved&top=20" \
  -H "Authorization: Bearer $HUMANHOURS_API_KEY"

GET /v1/reports/cost-saved

Cost saved + agent cost + net saved. Same dimensions as /time-saved; default sort is cost_saved.

curl "https://humanhours.dev/v1/reports/cost-saved?period=30d&group_by=client" \
  -H "Authorization: Bearer $HUMANHOURS_API_KEY"

net_saved = cost_saved - agent_cost. Useful for finance views: "we saved €18k of human time but spent €1.2k on inference, net €16.8k".

GET /v1/reports/leaderboard

Rank agents by a single metric.

Param Default Values
metric hours_saved hours_saved, cost_saved, events
curl "https://humanhours.dev/v1/reports/leaderboard?metric=cost_saved&period=90d" \
  -H "Authorization: Bearer $HUMANHOURS_API_KEY"

GET /v1/reports/export

Same shape as time-saved but always emits CSV with a Content-Disposition: attachment header so a browser downloads instead of rendering. Convenient for "send the CFO the spreadsheet" flows.

GET /v1/reports/usage

Open to all plans. Returns the org's current period state.

{
  "plan": "pro",
  "currency": "EUR",
  "events_this_month": 24310,
  "events_included_in_plan": 100000,
  "overage_events": 0,
  "lifetime_events": 318211,
  "projected_overage_eur": null
}

projected_overage_eur is null when no overage is forecast; otherwise it shows the projected charge at the end of the billing period using the graduated metered tiers.

Response shape

All endpoints (except /usage) return:

{
  "meta": {
    "period": "30d",
    "range": { "from": "2026-04-06T00:00:00Z", "to": "2026-05-06T00:00:00Z" },
    "group_by": ["agent"],
    "sort": "hours_saved",
    "total_groups": 7
  },
  "currency": "EUR",
  "rows": [
    {
      "group": { "agent_id": "support-classifier" },
      "events": 4310,
      "hours_saved": 286.7,
      "cost_saved": 12901.5,
      "agent_cost": 124.3,
      "net_saved": 12777.2
    }
  ]
}

CSV format

When format=csv, the response is a UTF-8 CSV with a header row. Group columns come first, then the metric columns. The Bearer token works the same way in ?format=csv mode.


Found a typo or want to suggest an edit? Email support@triadagency.ai.