---
title: "Admin KPI dashboard — operator KPIs for observability (BRIEF-ADMIN-001)"
method: GET
path: "/api/v1/admin/kpis"
tags: ["admin"]
---

# Admin KPI dashboard — operator KPIs for observability (BRIEF-ADMIN-001)

`GET /api/v1/admin/kpis`

## Request

- Base URL: `https://api.badgeia.com`
- URL: `https://api.badgeia.com/api/v1/admin/kpis`
- Auth: none declared

Return the operator KPI payload.

Args:
    force_refresh: When ``true``, bypass the 5-minute in-process
        cache and recompute every tile against live data. Used
        sparingly — repeated force_refresh hits hurt warm-cache
        latency for everyone.

Authorization:
    - Anonymous → 401 (handled by the auth dep)
    - Authenticated non-admin → 403 (handled by `require_admin`)
    - Admin → 200

Privacy (CV §10 / AC-ADMIN-07):
    Aggregates and counts ONLY. No customer email, agent name,
    user-id, or per-user drill-down. The Sentry tile is a count
    with a link-out; no rendered issue titles or stack traces.
    Per-user filter parameters are NOT accepted and the route
    does NOT expose them in OpenAPI.

Flag gate (rule #4):
    When ``ADMIN_DASHBOARD_ENABLED`` is false (prod default), the
    endpoint returns 404. Independent of `ADMIN_EMAILS` — the
    flag controls *existence*, the email list controls *access*.

Response shape:
    {
      "computed_at": "<ISO8601 UTC>",
      "ttl_seconds": 300,
      "cached": bool,
      "kpis": [
        {"id": "total_users", "label": "Total users",
         "available": true, "value": 42, "unit": "count"},
        ...
      ]
    }

## Query parameters

- `force_refresh` boolean

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/badgeia/apis/badge.md) · [All operations](https://skmtc.dev/badgeia/apis/badge/llms.txt) · [OpenAPI document](https://skmtc.dev/badgeia/apis/badge/revisions/7e7f7fee8b77?raw)
