---
title: "Get Transfer Metrics"
method: GET
path: "/developer/transfer-metrics"
tags: ["Developer", "Developer - Transfer Metrics"]
---

# Get Transfer Metrics

`GET /developer/transfer-metrics`

Team-level transfer metrics, bucketed in the customer's local timezone.

Teams are TransferDestination rows matched by the number the call was
transferred to; teams sort by missed rate (worst first). Pickup/missed
rates are FIRST-QUEUE rates from transfer_outcome plus the transfer_flow
snapshot: a call answered only after rolling to a downstream queue counts
as missed by the team it was sent to. Hand-off counts, queue waits, and
per-extension answer counts come from the flow snapshot (coverage
reported, since older calls may lack one). Trends compare against the
immediately preceding period of equal length.

## Query parameters

- `customer_id` string, uuid, nullable — Customer whose transfers to analyze (developers only; admins always get their own)
- `period` string
- `bucket` string, nullable — Override bucket granularity (ignored for period=today)

## Response `200`

Successful Response

- TransferMetricsResponse
  - `period` string, required
  - `bucket` string, required
  - `customer_id` string, uuid, required
  - `timezone` string, required
  - `summary` TransferMetricsSummary, required — Whole-window aggregates with prior-period comparison. Pickup/missed are first-queue rates (downstream answers count as missed).
    - `total_transferred` integer, required
    - `answered` integer, required
    - `assumed_answered` integer, required
    - `bounced` integer, required
    - `outcome_unknown` integer, required
    - `downstream_answered` integer — Answered only after rolling past the entry queue — counted as missed by the first queue
    - `pickup_rate_pct` number, nullable
    - `missed_rate_pct` number, nullable
    - `transfer_hops` integer — Total onward hand-offs (queue rolls + staff transfers) across flow-snapshot calls
    - `avg_transfer_hops` number, nullable
    - `max_transfer_hops` integer
    - `total_duration_seconds` integer — Sum of call durations (calls with a recorded duration)
    - `avg_duration_seconds` number, nullable
    - `avg_queue_wait_seconds` number, nullable — Mean landing-to-answer wait, answered flow-snapshot calls only
    - `avg_staff_talk_seconds` number, nullable — Mean staff talk time on the answering leg, answered flow-snapshot calls only
    - `flow_calls` integer, required — Calls with a transfer_flow snapshot (hop/wait metrics denominator)
    - `flow_coverage_pct` number, nullable
    - `prior_total_transferred` integer
    - `prior_pickup_rate_pct` number, nullable
    - `prior_missed_rate_pct` number, nullable
    - `prior_avg_transfer_hops` number, nullable
    - `pickup_rate_delta` number, nullable — Percentage-point change vs prior period
    - `missed_rate_delta` number, nullable
    - `avg_transfer_hops_delta` number, nullable
  - `teams` TransferTeamMetrics[] — Sorted by missed rate, worst first
    - `transfer_destination_id` string, uuid, nullable — Null for numbers with no matching TransferDestination
    - `name` string, required
    - `phone_number` string, nullable
    - `total` integer, required
    - `answered` integer, required
    - `assumed_answered` integer, required
    - `bounced` integer, required
    - `outcome_unknown` integer, required — Transferred before outcome gating existed; excluded from rate denominators
    - `downstream_answered` integer — Answered, but only after rolling past the entry queue (missed by the first queue)
    - `pickup_rate_pct` number, nullable — Answered by the FIRST destination queue / resolved
    - `missed_rate_pct` number, nullable — Bounced or answered downstream / resolved
    - `transfer_hops` integer — Total onward hand-offs (queue rolls + staff transfers) across this team's flow-snapshot calls
    - `avg_transfer_hops` number, nullable — Onward hand-offs per call with a flow snapshot
    - `avg_duration_seconds` number, nullable — Mean total call duration (calls with a recorded duration)
    - `avg_queue_wait_seconds` number, nullable — Mean landing-to-answer wait, answered flow-snapshot calls only
    - `extensions` TransferExtensionAnswers[]
      - `agent_extension` string, required
      - `agent_name` string, nullable
      - `answered_count` integer, required
      - `via_queue` string, nullable — Set when this extension answered in a DOWNSTREAM queue (not the team's own) — e.g. a receptionist catching a rolled call. Queue name, or extension if unnamed.
  - `answerers` OverallAnswerer[] — Individual answerers across all teams, most answers first; AI bounce-backs included
    - `agent_extension` string, nullable — Null for the AI receptionist row
    - `agent_name` string, nullable
    - `answered_count` integer, required
    - `is_ai` boolean
    - `breakdown` AnswererBreakdownItem[] — Per-queue (staff) or per-intended-team (AI) counts, largest first
      - `label` string, required
      - `count` integer, required
  - `buckets` TransferMetricsBucket[]
    - `bucket_start` string, date-time, required — Naive customer-local bucket start
    - `total` integer, required
    - `answered` integer, required
    - `assumed_answered` integer, required
    - `bounced` integer, required
    - `downstream_answered` integer
    - `pickup_rate_pct` number, nullable
    - `missed_rate_pct` number, nullable
    - `avg_duration_seconds` number, nullable
    - `avg_transfer_hops` number, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/openintake/apis/fastapi.md) · [All operations](https://skmtc.dev/openintake/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/openintake/fastapi/revisions/4a81645b59f6/schema)
