---
title: "Get Performance Summary"
method: GET
path: "/performance/summary"
tags: ["performance"]
---

# Get Performance Summary

`GET /performance/summary`

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

Return aggregated performance metrics for the leader dashboard.

## Query parameters

- `date_from` string, date-time, nullable: Start date (inclusive)
- `date_to` string, date-time, nullable: End date (inclusive)
- `scenario` string, nullable: Scenario filter
- `agent_id` string, nullable: Agent filter
- `status` string[], nullable: Filter by call status (multiple allowed)
- `call_direction` string[], nullable: Filter by call direction (multiple allowed)
- `call_mode` string, nullable: Filter by call mode (training, production, or ai_agent)
- `filter_user_id` string[], nullable: Filter by agent user IDs (multiple allowed)
- `qa_score_bucket` string[], nullable: Filter by QA score bucket: low (<60), medium (60-80), high (>80)
- `telephony_result` string[], nullable: Filter by telephony result (multiple allowed)
- `answered_by` string[], nullable: Filter by answered by (human, voicemail, unclear)
- `conversation_outcome` string[], nullable: Filter by conversation outcome (engaged, refused, wrong_person, other)
- `workflow_disposition` string[], nullable: Filter by autonomous workflow action (multiple allowed)
- `agent_end_reason` string[], nullable: Filter by normalized autonomous ending reason (multiple allowed)
- `call_source` string[], nullable: Filter by call source (multiple allowed)
- `tag_key` string[], nullable: Filter by detected tag key (multiple allowed)
- `client` string[], nullable: Filter by classified client (multiple allowed)
- `team_id` string, uuid, nullable: Team filter; team leads are fixed to their assigned team
- `campaign_id` string[], nullable: Filter to calls this outbound campaign placed (multiple allowed; several campaigns are unioned). Manual dials and callback rows belong to no campaign and are excluded.
- `crm_linked` boolean, nullable: Filter by CRM account-link state
- `min_score` number, nullable: Minimum QA score (inclusive)
- `max_score` number, nullable: Maximum QA score (inclusive)
- `range_days` integer: Fallback range (days) when dates not provided
- `timezone` string, nullable: IANA timezone for day bucketing, e.g. 'Australia/Sydney'. Defaults to UTC.

## Response `200`

Successful Response

- PerformanceSummaryResponse: Full payload consumed by the frontend performance dashboard.
  - `metrics` PerformanceMetric[], required
    - `key` 'qa_score'
    - `label` string
    - `value` number, nullable: Average QA score for the period
    - `target` number, nullable: Target benchmark for the metric
    - `delta` number, nullable: Difference vs previous period (points)
    - `trend_positive` boolean, nullable: Whether the change vs previous period is positive
  - `trends` TrendPoint[], required
    - `date` string, date, required
    - `qa_score` number, nullable
  - `call_time_trends` CallTimeTrendPoint[]
    - `date` string, date, required
    - `total_seconds` integer, required
    - `call_count` integer, required
    - `avg_seconds` number, nullable
    - `dashboard_open_percentage` number, nullable: Dashboard-open rate (0-100) for this day, each call's percentage weighted by its duration. Calls with no subscriber count as 0%; denominator is every call with line-open time.
    - `summaries_copied_percentage` number, nullable: Share of human-answered calls whose summary was copied at least once (0-100) for this day. None when there were no human-answered calls.
  - `connected_duration` ConnectedDurationMetrics, required: Duration-based retention, independent of answer/outcome classifiers. Carries the curve at every threshold, overall and per day, so the client selects a threshold without another request.
    - `connected_calls` integer, required
    - `measured_connected_calls` integer, required: Connected calls with a recorded non-negative duration.
    - `curve` ConnectedDurationCurvePoint[], required
      - `threshold_seconds` integer, required
      - `calls_at_or_above_threshold` integer, required
      - `rate` number, nullable, required: Share of connected calls with a recorded duration that lasted at least this many seconds (0-100).
    - `trend` ConnectedDurationTrendPoint[], required
      - `date` string, date, required
      - `measured_connected_calls` integer, required
      - `curve` ConnectedDurationCurvePoint[], required
        - `threshold_seconds` integer, required
        - `calls_at_or_above_threshold` integer, required
        - `rate` number, nullable, required: Share of connected calls with a recorded duration that lasted at least this many seconds (0-100).
  - `autonomous_voice_latency` AutonomousVoiceLatencyAggregate: Raw-sample aggregate for calls matching the Performance filters.
    - `calls_with_samples` integer, required
    - `response_total` LatencyPercentiles, required: Distribution summary for one latency anchor.
      - `p50_ms` integer, nullable, required
      - `p95_ms` integer, nullable, required
      - `worst_ms` integer, nullable, required
      - `n` integer, required: Number of non-null measurements in the distribution
    - `by_kind` SrcPerformanceSchemasAutonomousVoiceLatencyByKind, required: End-to-end response time split by what answered the caller.
      - `plain` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
      - `tool` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
      - `runtime` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
    - `target_ms` integer, required: Response time a reply is expected to beat
    - `over_target_rate` number, nullable, required: Percentage of timed replies slower than target_ms
    - `legs` SrcPerformanceSchemasAutonomousVoiceLatencyLegs, required: Autonomous response waterfall stages, in the order a reply passes them. On a single turn the stages sum to its end-to-end time. The tool stage only exists on turns that called one.
      - `endpointing` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
      - `turn_release` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
      - `llm_ttft` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
      - `tool` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
      - `speech_release` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
      - `tts_ttfb` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
      - `transport` LatencyPercentiles, required: Distribution summary for one latency anchor.
        - `p50_ms` integer, nullable, required
        - `p95_ms` integer, nullable, required
        - `worst_ms` integer, nullable, required
        - `n` integer, required: Number of non-null measurements in the distribution
    - `first_speech` LatencyPercentiles, required: Distribution summary for one latency anchor.
      - `p50_ms` integer, nullable, required
      - `p95_ms` integer, nullable, required
      - `worst_ms` integer, nullable, required
      - `n` integer, required: Number of non-null measurements in the distribution
    - `tool_handler` LatencyPercentiles, required: Distribution summary for one latency anchor.
      - `p50_ms` integer, nullable, required
      - `p95_ms` integer, nullable, required
      - `worst_ms` integer, nullable, required
      - `n` integer, required: Number of non-null measurements in the distribution
    - `llm_thinking` LatencyPercentiles, required: Distribution summary for one latency anchor.
      - `p50_ms` integer, nullable, required
      - `p95_ms` integer, nullable, required
      - `worst_ms` integer, nullable, required
      - `n` integer, required: Number of non-null measurements in the distribution
    - `llm_tokens_per_second` number, nullable, required: Completion tokens over the time spent writing them
    - `unanswered_wait` LatencyPercentiles, required: Distribution summary for one latency anchor.
      - `p50_ms` integer, nullable, required
      - `p95_ms` integer, nullable, required
      - `worst_ms` integer, nullable, required
      - `n` integer, required: Number of non-null measurements in the distribution
    - `barge_in_stop` LatencyPercentiles, required: Distribution summary for one latency anchor.
      - `p50_ms` integer, nullable, required
      - `p95_ms` integer, nullable, required
      - `worst_ms` integer, nullable, required
      - `n` integer, required: Number of non-null measurements in the distribution
    - `turns` AutonomousVoiceCompletion, required: How many transcribed caller turns were answered. ``status_counts`` also lists the pauses that produced no transcript, which the totals leave out.
      - `total` integer, required
      - `complete` integer, required
      - `incomplete` integer, required
      - `completion_rate` number, nullable, required: Percentage of sampled turns whose status is complete
      - `status_counts` object, required: Counts by persisted completion status, including unknown
    - `trend` AutonomousVoiceLatencyTrendPoint[], required
      - `date` string, date, required
      - `p50_ms` integer, nullable, required
      - `p95_ms` integer, nullable, required
      - `worst_ms` integer, nullable, required
      - `n` integer, required
      - `completion_rate` number, nullable, required
      - `over_target_rate` number, nullable, required
  - `leaderboard` AgentPerformance[], required
    - `agent` string, required
    - `agent_user_id` string, nullable
    - `call_count` integer, required
    - `qa_score` number, nullable
    - `qa_score_trend` number, nullable
    - `alert` boolean
    - `total_call_seconds` integer
    - `avg_call_duration_seconds` number, nullable
    - `avg_calls_per_day` number, nullable
    - `dashboard_open_percentage` number, nullable: This agent's dashboard-open rate (0-100), each call's percentage weighted by its duration. Calls with no subscriber count as 0%; denominator is every call with line-open time.
    - `idv_verified_count` integer: This agent's engaged IDV-required calls verified via IDV.
    - `idv_required_count` integer: This agent's engaged IDV-required calls. Denominator for idv_verified_rate.
    - `idv_verified_rate` number, nullable: Share of this agent's engaged IDV-required calls that were verified (0-100). None when the agent had no engaged IDV-required calls.
    - `engaged_call_count` integer: This agent's human-answered engaged calls. Denominator for commitment_rate.
    - `commitment_classified_count` integer: Engaged calls for this agent that have a structured commitment outcome. Used to distinguish unavailable classification from zero commitments.
    - `commitment_count` integer: This agent's new-money commitments: new arrangements, immediate payments, and settlements.
    - `commitment_rate` number, nullable: New-money commitments divided by all human-answered engaged calls for this agent (0-100). None when there are no engaged calls or no commitment classifications in the window.
    - `dollars_committed` number, nullable: Total recorded commitment amount for this agent's new-money commitments. This is promised money, not confirmed collections. None when commitment classification is unavailable.
  - `alerts` ComplianceAlert, required: Agents currently below the QA score threshold.
    - `threshold` number, required
    - `affected_agents` string[], required
  - `total_calls` integer, required
  - `call_statistics` CallStatistics, required: Scenario-agnostic call statistics for the overview cards.
    - `total_calls` integer, required
    - `calls_connected` integer, required
    - `calls_busy` integer, required
    - `calls_no_answer` integer, required
    - `calls_rejected` integer, required
    - `calls_failed` integer, required
    - `calls_answered_human` integer, required
    - `calls_answered_voicemail` integer, required
    - `calls_answered_unclear` integer, required
    - `outcome_engaged` integer, required
    - `outcome_refused` integer, required
    - `outcome_wrong_person` integer, required
    - `outcome_other` integer, required
    - `summaries_copied` integer: Number of human-answered calls whose summary was copied to the clipboard at least once (counted once per call). Restricted to human-answered calls so it divides cleanly by calls_answered_human for the dashboard 'Summary Copied' rate.
    - `crm_linked_calls` integer: Number of calls with an actual CRM account link (crm_call_links.decision='linked'). None-of-these decisions are excluded.
    - `total_call_seconds` integer
    - `avg_call_duration_seconds` number, nullable
    - `avg_calls_per_day` number, nullable
    - `avg_dashboard_open_percentage` number, nullable: Team-wide dashboard-open rate (0-100), each call's percentage weighted by its duration. Calls with no subscriber count as 0%; denominator is every call with line-open time.
    - `idv_verified_count` integer: Engaged IDV-required calls where the live tracker recorded verification completed (idv_outcome=verified).
    - `idv_required_count` integer: Engaged calls with a RECORDED idv_outcome (verified, skipped or incomplete). Non-engaged calls (wrong-person, refused, voicemail) are excluded, as are calls with a NULL outcome — usually no IDV step in the scenario, but also calls the tracker never judged. Denominator for idv_verified_rate.
    - `idv_verified_rate` number, nullable: Share of engaged IDV-required calls that were verified (0-100). None when no engaged IDV-required calls fall in the window.
    - `inbound_callback_calls` integer: Inbound calls in the window attributed to a campaign dial (campaign_callback_links, last-touch by phone number; see outbound.inbound_callbacks). Scoped by the campaign filter when one is active; independent of the per-user call scoping above.
    - `inbound_callback_numbers` integer: Unique caller numbers among inbound_callback_calls — the numerator for a future callback rate (per unique number attempted, not per dial, so retries don't distort it).
  - `filters` PerformanceFilters, required: Echo back applied filters to the client.
    - `date_from` string, date-time, required
    - `date_to` string, date-time, required
    - `scenario` string, nullable
    - `agent_id` string, nullable
    - `status` string[], nullable
    - `call_direction` string[], nullable
    - `call_mode` string, nullable
    - `filter_user_id` string[], nullable
    - `qa_score_bucket` string[], nullable
    - `tag_key` string[], nullable
    - `client` string[], nullable
    - `campaign_id` string[], nullable
    - `crm_linked` boolean, nullable
    - `range_days` integer, 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)
