---
title: "List calls"
method: GET
path: "/calls"
tags: ["calls"]
---

# List calls

`GET /calls`

List your own calls, most recent first. Each entry omits transcript_full/supervisor_decisions - fetch a single call for those.

## Query parameters

- `limit` integer

## Headers

- `X-API-Key` string, nullable

## Response `200`

Successful Response

- CallDTO[]
  - `call_id` string, required
  - `customer_id` string, required
  - `task_id` string, required
  - `target_phone` string, required
  - `language` 'en' | 'es' | 'fr' | 'de' | 'hi' | 'ru' | 'pt' | 'ja' | 'it' | 'nl' | 'sr' | 'tr' | 'pl' | 'auto', required
  - `status` 'queued' | 'dialing' | 'in_progress' | 'completed' | 'failed' | 'cancelled', required
  - `call_sid` string, nullable — The Twilio Call SID. `null` until dialing starts.
  - `started_at` string, date-time, nullable
  - `ended_at` string, date-time, nullable
  - `duration_sec` integer, nullable
  - `outcome_type` 'success_booked' | 'success_refused' | 'success_no_booking' | 'failed_no_answer' | 'failed_voicemail' | 'failed_busy' | 'failed_short_hangup' | 'failed_technical' | 'failed_no_agent_available', nullable — Set once the call is terminal. success_* outcomes are billed 10 credits; failed_* are billed 0. failed_no_agent_available = the venue kept the agent in a hold queue past the hold budget and no human ever picked up.
  - `outcome_summary` string, nullable
  - `outcome_charge_cents` integer — Despite the name, this is in the same credit unit as credits_reserved. A successful call settles at 10 (the charge), unsuccessful at 0 - not the 30 held.
  - `created_at` string, date-time, required
  - `has_recording` boolean
  - `recording_url` string, nullable — A RELATIVE path to this service's recording proxy endpoint (/calls/{call_id}/recording) when a recording exists - never the raw Twilio mp3 URL. `null` when has_recording is false. Retrieval isn't documented here.
  - `reservation_signals` string[], nullable — Short free-text signals (<10 short strings) about the reservation outcome. Always included (not detail-gated like transcript_full).
  - `transcript_full` TranscriptTurn[], nullable — Only populated on GET /calls/{call_id}, not on the GET /calls list.
    - `ts` string, date-time, required
    - `role` 'operator' | 'bot' | 'supervisor_stt' | 'system', required — operator = the callee, bot = the agent, supervisor_stt = a parallel transcription of the operator's side, system = lifecycle markers.
    - `text` string, required
  - `supervisor_decisions` object[], nullable — Only populated on GET /calls/{call_id}, not on the GET /calls list (same heavy-field gating as transcript_full).

## Other responses

- `400` — limit outside 1..1000.
- `401` — Missing or invalid X-API-Key.

---

[API](https://skmtc.dev/voygr/apis/voygr-calls-api.md) · [All operations](https://skmtc.dev/voygr/apis/voygr-calls-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/voygr/voygr-calls-api/revisions/a505c0ec5698/schema)
