---
title: "Get Overview"
method: GET
path: "/qa-insights/overview"
tags: ["qa-insights"]
---

# Get Overview

`GET /qa-insights/overview`

## 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/overview`
- Auth: one of:
  - OAuth 2
    - Password
    - Token URL: `auth/bearer/login`
  - API key in cookie `access_token`

Team view: tiles, portfolio signals, grounded narrative, flagged calls,
agents grid — daily register is event-led, weekly is rate-led.

## Query parameters

- `period_type` string: day | wtd | week | month
- `anchor` string, date, nullable: Local date to anchor the period (URL-addressable)
- `regenerate` boolean: Force narrative regeneration
- `team_id` string, uuid, nullable: Team filter; team leads are fixed to their assigned team

## Response `200`

Successful Response

- OverviewResponse
  - `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
  - `volume` VolumeLine, required: Funnel context — one line, not a dialer dashboard (that's /performance).
    - `dials` integer, required
    - `human_answered` integer, required
    - `engaged` integer, required
  - `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
  - `portfolio` PortfolioRow[], required
    - `client` string, required
    - `engaged_calls` integer, required
    - `dispute_rate` number, required
    - `dispute_delta` number, nullable
    - `hardship_rate` number, required
    - `commitment_rate` number, nullable
  - `tag_rates` TagRate[], required
    - `key` string, required
    - `label` string, required
    - `count` integer, required
    - `rate` number, 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
  - `queue` QueueItem[], required
    - `call_id` string, required
    - `severity` integer, required
    - `kind` 'low_qa', required
    - `extra_kinds` string[]
    - `title` string, required
    - `detail` string, required
    - `agent_name` string, required
    - `agent_user_id` string, required
    - `occurred_at` string, date-time, required
    - `qa_score` integer, nullable
  - `agents` AgentRow[], required
    - `user_id` string, required
    - `name` string, required
    - `engaged_calls` integer, required
    - `avg_qa` number, nullable
    - `idv_rate` number, nullable
    - `empathy` number, nullable
    - `empathy_status` 'good' | 'warn' | 'crit' | 'neutral'
    - `commitment_rate` number, nullable
    - `dollars_committed` number, nullable
    - `idv_status` 'good' | 'warn' | 'crit' | 'neutral'
    - `commitment_status` 'good' | 'warn' | 'crit' | 'neutral'
    - `qa_status` 'good' | 'warn' | 'crit' | 'neutral'
    - `sufficient` boolean
    - `flags` string[]

## 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)
