Skip to the content

Reports

Review productivity and quality for a period - lookups, decisions and decision times.

One report: how many lookups were created in a period, how they ended, what reviewers decided and how long decisions took. It needs the reviewer or the admin role and the plan feature feature.reports.

The report object

Field Type Meaning
from, to string The period. The last 30 days by default
total_lookups integer Lookups created in the period
by_status, by_decision object Lookups per status and per decision
review_queue integer Lookups in the review queue
ai_acceptance_rate number or null Decisions with approved, divided by all decisions of the period. null without decisions
users array Per account: lookups, batch rows, decisions of each kind, comments, average decision time
daily array Lookups and decisions per day
kpis, previous object Figures of the period, and of the period before
markets array Figures per market
top_overridden array Up to 10 entries about overridden codes

GET /api/reports/productivity

Needs the reviewer or the admin role.

Query parameters

Name Type Required Description
date_from string or null No -
date_to string or null No -

Returns 200 with a JSON object, as in the example.

Errors: 401 No valid API key was sent; 403 The role of the key, or the plan of the account, does not allow this call; 422 The request is not valid; 500 An unexpected failure.

Try it in the explorer

GET /api/reports/productivity
curl "https://htspilot.com/api/reports/productivity" \
  -H "X-API-Key: hts_EXAMPLE_KEY_REPLACE_ME"
import json
import os
import urllib.request

request = urllib.request.Request(
    "https://htspilot.com/api/reports/productivity",
    headers={"X-API-Key": os.environ["HTS_PILOT_API_KEY"]},
    method="GET",
)
with urllib.request.urlopen(request) as response:
    print(json.load(response))
const response = await fetch("https://htspilot.com/api/reports/productivity", {
  headers: { "X-API-Key": process.env.HTS_PILOT_API_KEY },
});
console.log(await response.json());
Response 200
{
  "from": "2026-09-04",
  "to": "2026-10-03",
  "total_lookups": 8,
  "by_status": {
    "needs_info": 1,
    "proposed": 7
  },
  "by_decision": {
    "approved": 1
  },
  "review_queue": 1,
  "ai_acceptance_rate": 1,
  "users": [
    {
      "user_id": "d10db811d389470a8210b8210c023289",
      "name": "Administrator",
      "role": "Admin",
      "lookups": 3,
      "batch_rows": 4,
      "approved": 1,
      "overridden": 0,
      "rejected": 0,
      "comments": 0,
      "avg_decision_hours": 0,
      "median_decision_hours": 0,
      "decisions": 1
    },
    {
      "user_id": "f31771445d4a4387b624db858593839a",
      "name": "Data Entry Clerk",
      "role": "User",
      "lookups": 1,
      "batch_rows": 0,
      "approved": 0,
      "overridden": 0,
      "rejected": 0,
      "comments": 0,
      "avg_decision_hours": null,
      "median_decision_hours": null,
      "decisions": 0
    }
  ],
  "daily": [
    {
      "day": "2026-10-03",
      "count": 8,
      "auto_proposed": 7,
      "routed_to_review": 1,
      "decisions": 1
    }
  ],
  "kpis": {
    "lookups": 8,
    "auto_proposed": 7,
    "routed_to_review": 1,
    "errors": 0,
    "auto_rate": 0.875,
    "decisions": 1,
    "approved": 1,
    "overridden": 0,
    "rejected": 0,
    "approval_rate": 1,
    "override_rate": 0,
    "reject_rate": 0,
    "median_decision_hours": 0
  },
  "previous": {
    "from": "2026-08-05",
    "to": "2026-09-03",
    "lookups": 0,
    "auto_proposed": 0,
    "routed_to_review": 0,
    "errors": 0,
    "auto_rate": null,
    "decisions": 0,
    "approved": 0,
    "overridden": 0,
    "rejected": 0,
    "approval_rate": null,
    "override_rate": null,
    "reject_rate": null,
    "median_decision_hours": null
  },
  "markets": [
    {
      "market": "US",
      "lookups": 8,
      "auto_proposed": 7,
      "routed_to_review": 1,
      "errors": 0,
      "approved": 1,
      "overridden": 0,
      "rejected": 0,
      "decisions": 1,
      "approval_rate": 1
    }
  ],
  "top_overridden": []
}