---
title: "List Account Calls"
method: GET
path: "/accounts/{account_id}/calls"
tags: ["accounts"]
---

# List Account Calls

`GET /accounts/{account_id}/calls`

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

This account's call activity across every campaign and manual dial,
most-recent-first (admin only).

## Path parameters

- `account_id` string, uuid, required

## Query parameters

- `limit` integer: Max recent calls to return.
- `include_phone_matches` boolean: Also return calls that carry no CRM link at all but whose canonical number is one of this account's, tagged match_source='phone'. Off by default: the campaign surface reads this endpoint as the dials behind an attempts counter, and an unlinked inbound call is not a dial attempt.
- `include_summaries` boolean: Also return each call's written summary (the review screen).

## Response `200`

Successful Response

- AccountCallListItem[]
  - `id` string, uuid, required
  - `match_source` 'linked' | 'phone': 'linked' when someone explicitly attached this call to the account; 'phone' when it carries no CRM decision at all and was matched on customer_number_e164. A phone match is display-only evidence of contact with the number — never account attribution.
  - `started_at` string, date-time, required
  - `ended_at` string, date-time, nullable
  - `duration_seconds` integer, nullable
  - `call_direction` 'incoming' | 'outgoing' | 'internal': Direction of the call. - INCOMING: Customer called agent - OUTGOING: Agent called customer - INTERNAL: Extension-to-extension call
  - `call_mode` 'training' | 'production' | 'ai_agent': Call mode enumeration.
  - `summary_text` string, nullable
  - `scenario` string, nullable
  - `qa_score` integer, nullable: Overall QA scorecard score. Mirrors analyzer_artifacts['qa_scorecard']['overall_score'].
  - `status` 'ongoing' | 'completed' | 'unanswered' | 'error': Call lifecycle state. - ONGOING: Call is currently in progress - COMPLETED: Call finished (regardless of whether it was answered) - ERROR: Technical error/exception during call processing - UNANSWERED: DEPRECATED - Use status=COMPLETED + telephony_result=NO_ANSWER instead. Kept for backwards compatibility with existing database records.
  - `telephony_result` 'connected' | 'busy' | 'no_answer' | 'rejected' | 'failed': Telephony-level call connection result. Represents what happened at the telephony level before any conversation. This is typically provided by the PBX/telephony system, not AI-classified.
  - `answered_by` 'human' | 'voicemail' | 'unclear': Who answered the call (AI-classified from transcript). This is the first stage of call classification - determining whether a human or voicemail answered the call.
  - `conversation_outcome` 'engaged' | 'refused' | 'wrong_person' | 'other': AI-classified judgement of what kind of conversation occurred. Only applicable when answered_by=HUMAN. Runtime actions such as scheduling a callback or transferring the caller are recorded independently in ``WorkflowDisposition`` and must never overwrite this judgement.
  - `workflow_disposition` 'none' | 'callback_scheduled' | 'transferred' | 'human_followup_required' | 'do_not_contact': Deterministic action the autonomous workflow took before finalizing. ``NONE`` is explicit for finalized autonomous calls with no special handoff/follow-up action. NULL means the dimension does not apply (human copilot, uploaded, or legacy calls), rather than overloading NULL with two meanings.
  - `agent_end_reason` 'conversation_complete' | 'existing_arrangement_claimed' | 'customer_requested_human' | 'identity_verification_failed' | 'customer_declined_to_engage' | 'customer_unavailable' | 'wrong_person' | 'do_not_contact' | 'hardship_detected' | 'dispute_raised' | 'escalation' | 'voicemail' | 'no_answer' | 'caller_hung_up' | 'caller_abandoned' | 'answer_failed' | 'answer_timeout' | 'dial_failed' | 'transfer_failed' | 'screening_timeout' | 'idle_timeout' | 'max_duration' | 'api_hangup' | 'error' | 'other': Normalized reason an autonomous call ended. The raw runtime string remains in ``analyzer_artifacts`` for diagnostics. This enum is the stable operational projection: semantic reasons exposed to the voice model plus bounded technical termination categories. Novel runtime endings degrade to ``OTHER`` instead of failing finalization.
  - `commitment_shape` 'new_arrangement' | 'immediate_payment' | 'settlement' | 'arrangement_repair' | 'promise_reset' | 'deferral' | 'refused' | 'other': Taxonomy of commitment outcomes extracted from a collections call.
  - `counted_as` CallCountedAs: A call's classification and the stored fact it rests on.
    - `classification` 'contact' | 'contact_unknown' | 'attempt' | 'in_progress' | 'not_counted', required: What a call counts as for the frequency caps.
    - `basis` string, required: The stored fact behind the classification, in a few words.

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