Tone docs
API referenceCalls

Export the filtered call log as CSV (newest first, max 10,000 rows)

Takes the same filters as the list endpoint and streams a CSV rather than JSON. The column order is deliberately frozen — new fields are appended, never inserted — so a positional parser keeps working.

Requires the read scope. A key with less gets 403 insufficient_scope.

GET
/v1/calls/export.csv
AuthorizationBearer <token>

Authorization: Bearer tone_live_… or tone_test_…. The prefix IS the environment: a test key reaches only the sandbox, and no request field bridges the two.

In: header

Query Parameters

agent_id?string

Only calls run by this agent, across every one of its versions.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
number_id?string

Only calls placed from, or received on, this number.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
campaign_id?string

Every call this campaign placed, retries included — which is what the recipient list cannot give you, since a recipient row names only its LAST attempt.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
direction?string

Which way the call went. Open set — handle an unrecognised value rather than throwing. Today: inbound, outbound.

Value in

  • "inbound"
  • "outbound"
channel?string

How the call was carried. browser is the in-dashboard microphone test only; every dial the API places is pstn. Open set — handle an unrecognised value rather than throwing. Today: browser, pstn.

Value in

  • "browser"
  • "pstn"
status?string

Where the call is in its lifecycle. Open set — handle an unrecognised value rather than throwing. Today: queued, in_progress, ended.

Value in

  • "queued"
  • "in_progress"
  • "ended"
disposition?string

How the call finished. Only set once status is ended. Open set — handle an unrecognised value rather than throwing. Today: answered, no_answer, busy, failed, voicemail, unknown.

Value in

  • "answered"
  • "no_answer"
  • "busy"
  • "failed"
  • "voicemail"
  • "unknown"
environment?string

Ignored when you authenticate with an API key: the key's own prefix pins the environment, so a tone_test_ key structurally cannot read live calls.

Value in

  • "live"
  • "test"
from?string

Inclusive lower bound on createdAt. A bare date (2026-08-01) is accepted and read as midnight UTC.

to?string

Exclusive upper bound on createdAt. Must be later than from.

include_unstarted?string

Include rows for calls that never started — an abandoned browser test dialog mints one, so they are hidden by default.

Value in

  • "0"
  • "1"
  • "true"
  • "false"

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v1/calls/export.csv"
Empty
Was this page helpful?