---
title: "Get Agent Detail"
method: GET
path: "/qa-insights/agents/{user_id}"
tags: ["qa-insights"]
---

# Get Agent Detail

`GET /qa-insights/agents/{user_id}`

## Request

- Base URL: `https://dev.whispa.net` (the document declares no server; this is the origin it was published from)
- URL: `https://dev.whispa.net/qa-insights/agents/{user_id}`
- Auth: one of:
  - OAuth 2
    - Password
    - Token URL: `auth/bearer/login`
  - API key in cookie `access_token`

Agent drill: recent form, aggregate scorecard vs team, tag strengths,
recent calls, and the coaching narrative.

## Path parameters

- `user_id` string, uuid, required

## Query parameters

- `period_type` string
- `anchor` string, date, nullable
- `regenerate` boolean
- `team_id` string, uuid, nullable: Team filter; team leads are fixed to their assigned team

## Response `200`

Successful Response

- AgentDetailResponse
  - `user_id` string, required
  - `name` string, required
  - `period` PeriodInfo, required
    - `type` 'day' | 'wtd' | 'week' | 'month', required
    - `start` string, date-time, required
    - `end` string, date-time, required
    - `label` string, required
    - `prior_label` string, required
    - `baseline_hint` string
    - `prev` PeriodNavTarget: One pager arrow: the (period_type, anchor) the frontend navigates to. Computed server-side (periods.period_nav) so business-day and month arithmetic never gets re-derived in the browser. `anchor=None` is the family's canonical current view (anchor-less URL).
      - `period_type` 'day' | 'wtd' | 'week' | 'month', required
      - `anchor` string, date, nullable
    - `next` PeriodNavTarget: One pager arrow: the (period_type, anchor) the frontend navigates to. Computed server-side (periods.period_nav) so business-day and month arithmetic never gets re-derived in the browser. `anchor=None` is the family's canonical current view (anchor-less URL).
      - `period_type` 'day' | 'wtd' | 'week' | 'month', required
      - `anchor` string, date, nullable
  - `view` 'daily' | 'weekly', required
  - `engaged_calls` integer, required
  - `total_calls` integer, required
  - `sufficient` boolean, required
  - `narrative` NarrativeOut, required: Briefing in a fixed skeleton (state of play → working → actions → watch) so the card reads as a huddle brief, not a verdict. The legacy headline/body/callouts fields carry pre-skeleton stored rows while they are served stale during regeneration; new rows never populate them.
    - `status` 'pending' | 'generating' | 'ready' | 'fallback' | 'failed', required
    - `state_of_play` string, nullable
    - `working` string[]
    - `actions` NarrativeActionOut[]
      - `title` string, required
      - `text` string, required
      - `drill_type` 'agent' | 'calls' | 'call' | 'none'
      - `drill_params` object
    - `watch` string[]
    - `quiet` boolean
    - `headline` string, nullable
    - `body` string[]
    - `callouts` NarrativeCalloutOut[]
      - `kind` 'risk' | 'strength' | 'watch' | 'portfolio', required
      - `title` string, required
      - `text` string, required
      - `drill_type` 'agent' | 'calls' | 'call' | 'none'
      - `drill_params` object
    - `generated_at` string, date-time, nullable
    - `model` string, nullable
    - `stale` boolean
  - `tiles` Tile[], required
    - `key` string, required
    - `label` string, required
    - `unit` 'percent' | 'count' | 'currency', required
    - `value` number, nullable
    - `prior` number, nullable
    - `delta` number, nullable
    - `target` number, nullable
    - `sample` integer
    - `status` 'good' | 'warn' | 'crit' | 'neutral'
    - `good_direction` 'up' | 'down'
    - `available` boolean
    - `definition` string, nullable
    - `secondary` string, nullable
    - `caption` string, nullable
  - `scorecard_coverage` ScorecardCoverage, required: Which template the aggregation is scoped to, and how many of the agent's engaged calls it actually scored (review B6).
    - `template_key` string, nullable
    - `scored` integer
    - `eligible` integer
  - `scorecard_overall` ScorecardSectionAgg
    - `key` string, required
    - `title` string, required
    - `agent_pct` number, nullable
    - `team_pct` number, nullable
    - `delta` number, nullable
    - `status` 'good' | 'warn' | 'crit' | 'neutral'
  - `scorecard` ScorecardSectionAgg[], required
    - `key` string, required
    - `title` string, required
    - `agent_pct` number, nullable
    - `team_pct` number, nullable
    - `delta` number, nullable
    - `status` 'good' | 'warn' | 'crit' | 'neutral'
  - `tag_strengths` TagStrength[], required
    - `key` string, required
    - `label` string, required
    - `agent_qa` number, nullable
    - `team_qa` number, nullable
    - `delta` number, nullable
    - `sample` integer
  - `recent_calls` RecentCall[], required
    - `id` string, required
    - `started_at` string, date-time, required
    - `qa_score` integer, nullable
    - `empathy` integer, nullable
    - `commitment_shape` string, nullable
    - `tags` string[]
    - `headline` string, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/whispa/apis/whispa-api.md) - [All operations](https://skmtc.dev/whispa/apis/whispa-api/llms.txt) - [OpenAPI document](https://skmtc.dev/whispa/apis/whispa-api/revisions/12c2e4aca43c?raw)
