---
title: "Get Call Analytics"
method: GET
path: "/analytics/calls"
tags: ["Analytics"]
---

# Get Call Analytics

`GET /analytics/calls`

## Request

- Base URL: `https://api.openintake.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.openintake.ai/analytics/calls`
- Auth: none declared

## Query parameters

- `direction` 'inbound' | 'outbound': Direction of the call.
- `period` 'today' | '7d' | '30d' | '90d' | 'custom'
- `start_date` string, date, nullable: First local day (period=custom only)
- `end_date` string, date, nullable: Last local day, inclusive (period=custom only)
- `bucket` 'day' | 'week' | 'month', nullable: Override the default bucket size
- `customer_id` string, uuid, nullable: Developers only: the customer to view

## Response `200`

Successful Response

- CallAnalyticsResponse
  - `direction` string, required
  - `period` string, required
  - `bucket` string, required
  - `timezone` string, required
  - `start_date` string, date, required
  - `end_date` string, date, required: Inclusive last local day of the window
  - `available` AnalyticsAvailability, required: Which directions have any calls in the window or the prior one.
    - `inbound` boolean, required
    - `outbound` boolean, required
  - `qualification_enabled` boolean, required: Whether the firm has qualification criteria on any case; without them a qualified rate means nothing
  - `summary` AnalyticsSummary, required
    - `calls` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `leads` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `qualified_rate` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `meetings_booked` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `median_duration_seconds` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `connect_rate` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `leads_dialed` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `transfer_answer_rate` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `leads_reached` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `reach_rate` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `voicemails_left` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
    - `callback_leads` AnalyticsKpi, required: A headline number for the window plus its change vs the prior window. For counts ``delta`` is the raw difference; for rates (``value`` is a percentage) it is the change in percentage points. Rates are null when the denominator is 0, so the UI can show "—" instead of a fake 0%.
      - `value` number, nullable
      - `prior` number, nullable
      - `delta` number, nullable
  - `timeseries` AnalyticsBucket[], required
    - `bucket_start` string, date-time, required: Bucket start as a naive datetime in the customer's timezone
    - `calls` integer, required
    - `connected` integer, required
    - `callbacks` integer, required: Outbound: inbound calls from leads we had dialed
    - `leads` integer, required
    - `connect_rate` number, nullable
  - `inbound` AnalyticsInbound
    - `outcomes` AnalyticsCount[], required: meeting_booked | lead_created | inquiry_created | voicemail | none
      - `key` string, required
      - `count` integer, required
    - `handling` AnalyticsCount[], required: ai_only | answered | bounced | no_answer | voicemail | transferred (unresolved)
      - `key` string, required
      - `count` integer, required
    - `caller_status` AnalyticsCount[], required: new_client | existing_client | unknown
      - `key` string, required
      - `count` integer, required
    - `hung_up_before_connect` integer, required
    - `heatmap` AnalyticsHeatCell[], required
      - `weekday` integer, required: ISO weekday, 1=Monday .. 7=Sunday, in the customer's timezone
      - `hour` integer, required: Hour of day 0-23 in the customer's timezone
      - `count` integer, required
  - `outbound` AnalyticsOutbound
    - `lead_standing` AnalyticsCount[], required: Each lead dialed, by its best result: spoke | called_back | voicemail | not_reached
      - `key` string, required
      - `count` integer, required
    - `dial_outcomes` AnalyticsCount[], required: Each dial: answered | voicemail_left | no_answer | not_connected
      - `key` string, required
      - `count` integer, required
    - `callbacks` AnalyticsCallbacks, required: Inbound calls from leads we had dialed before they called.
      - `calls` integer, required
      - `leads` integer, required
      - `leads_after_voicemail` integer, required: Leads who called back after we left them a voicemail
      - `voicemail_leads` integer, required: Leads we left a voicemail for in the window
      - `callback_rate_after_voicemail` number, nullable: % of voicemail leads who called back
  - `leads` AnalyticsLeads, required
    - `by_score` AnalyticsCount[], required: high | medium | low | unscored
      - `key` string, required
      - `count` integer, required
    - `by_case` AnalyticsCount[], required: Top case types by lead count
      - `key` string, required
      - `count` integer, required

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-09** `d61063451a04`: 1 breaking
  - removed the required property `recent_leads` from the response with the `200` status
- **2026-10-08** `376869b909f7`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/openintake/apis/openintake-api/changes/analytics/calls/get.md)

---

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