AI agents

A power dialer API that returns call transcripts

Last updated September 10, 2026

The question arrives in support about once a week in the same words: does the calls endpoint return the transcript, and can I filter by date? Yes and yes, and the details decide whether your script works on the first run. This page is the two endpoints a recap or a sync needs, the JSON a call comes back as, the time zone rule, and the limits you will hit.

The three calls you need

EndpointReturnsParameters
GET /api/v1/callsA page of calls, newest first, each with transcript and AI fields, the lead and notes, plus total, page, limit and the resolved window.lead_id · date (today, yesterday, YYYY-MM-DD) · since, until · tz · has_transcript · disposition · include_transcript=false · page, limit ≤ 200
GET /api/v1/calls/:idOne call, full transcript included.none
GET /api/v1/recapThe window grouped by prospect: lead, calls in order, last AI summary and next step, notes that day, open tasks, open deals; totals on top.date · since, until · tz · scope=team (org admins) · include_transcripts=true

All three take Authorization: Bearer ds_… from Settings → API Keys. Errors come back as { error } with a 400 for a bad parameter and a 401 for a bad or lapsed key.

What a call looks like

one element of calls[]
{
  "id": "a175…",
  "lead_id": "fdb4…",
  "status": "completed",
  "direction": "outbound",
  "duration_seconds": 214,
  "started_at": "2026-09-09T20:14:03Z",
  "recording_url": "https://api.twilio.com/…",
  "transcript": "Hi, is this Jane? … ",
  "ai_summary": "Jane runs a six-person accountancy practice …",
  "ai_disposition": "callback",
  "ai_next_steps": "Call back Thursday after 2pm with UK pricing.",
  "compliance_score": 80,
  "coaching_notes": "Skipped the reason-for-call line …",
  "disposition": "callback",
  "is_conversation": true,
  "has_transcript": true,
  "leads": { "id": "fdb4…", "name": "Jane Ellis", "company": "Ellis & Co", "phone": "+44…", "status": "callback" },
  "notes": [ { "outcome": "callback", "content": "Thursday pm", "created_at": "2026-09-09T20:18:40Z" } ]
}

Three fields are derived so you do not have to reconstruct them. disposition is the rep's own outcome if they logged one, else the AI's, else voicemail detection, else Twilio's status. is_conversation is true when there is a transcript, a human outcome, or a completed call over thirty seconds. has_transcript lets a list without transcripts (include_transcript=false, to keep a fifty-call page small) tell you which calls to fetch one by one.

Filtering by day, and the time zone rule

Every timestamp in the database is UTC, and every rep thinks in local days. date=today&tz=America/Denver resolves to the Denver day, daylight saving included, and the response echoes the window it used so you can check. Leave tz out and the day is the UTC day, which for a rep in Denver means the calls after 6 pm belong to tomorrow. That single omission is the cause of most “the recap is missing my evening calls” messages we get.

  • since=2026-09-01&until=2026-09-07&tz=Europe/London is the first through the seventh, inclusive of the seventh, in London time. A date given as YYYY-MM-DD means the start of that local day for since and the end of it for until.
  • since=2026-09-09T20:00:00Z is an instant and is used as written. Mixing an instant with a date is fine.
  • has_transcript=true is the cheapest way to skip voicemails and no-answers; on a typical cold-calling day it drops the list from a hundred rows to the eight that matter.
  • Pages are up to 200. A day rarely needs a second page; a month does, so walk page until the list comes back shorter than limit.

What Twilio alone gives you

If you already run on Twilio, its API will hand you every recording, and for $0.05/min of audio a transcription of it. What it will not tell you is who the call was to, what the rep marked it as, whether a task was promised, or what the point of the conversation was; a Twilio call is a SID, two numbers and a duration. DialSheet's transcript is produced inside Pro from the same recording, then joined to the lead and summarised, and the endpoint above is where the join comes out. The recording stays in your Twilio account and recording_url points at it, so nothing here locks the audio in.

The limits, stated

  • A key sees one person’s data. Team-wide reading is the recap endpoint with scope=team, for organisation admins, and nothing else.
  • No webhook on call completion yet. Poll with since; ai_status says whether the summary has run.
  • AI fields exist only for recorded, answered calls, and they fill in a few minutes after the call ends.
  • Pro only. A key created on Pro stops working the day the plan lapses, on the next request.
  • No published rate limit; be reasonable, and page rather than asking for the whole year in one call.

Common questions

Does the DialSheet API return call transcripts?

Yes. GET /api/v1/calls returns each call with transcript, ai_summary, ai_disposition, ai_next_steps, compliance_score, coaching_notes, the recording URL, the lead it was to and the rep’s notes. GET /api/v1/calls/:id returns one call the same way. Calls that were never answered have no recording, so those fields are null and has_transcript is false.

Can I filter calls by date?

Yes. date=today, date=yesterday or date=2026-09-09 selects one local day; since and until (an ISO instant or a YYYY-MM-DD) select a range with until exclusive; tz names the IANA zone the day boundaries are read in and defaults to UTC. has_transcript=true keeps only real conversations, disposition filters on the AI’s verdict, and page and limit (up to 200) walk the rest.

What does the recap endpoint add?

GET /api/v1/recap does the grouping for you: one request returns the day’s calls by prospect, each with the calls in order, the last AI summary and next step, notes logged that day, open tasks and open deals, plus totals. It exists so an agent or a script can write a daily recap from one payload instead of six joins.

How is this different from pulling recordings from Twilio directly?

Twilio’s API gives you the recording, and for $0.05/min of audio its own transcription, with no summary and no idea who the call was to. DialSheet joins the transcript to the lead, the rep’s outcome and notes, the AI summary and next step, and the follow-up tasks, and it is included in Pro rather than metered. The recording itself stays in your Twilio account either way; the recording_url on each call points at it.

Is there a webhook when a call ends?

Not yet. Poll GET /api/v1/calls with since set to the last time you looked; a call’s AI fields fill in a few minutes after it ends, once transcription and summary have run, and ai_status tells you whether that has happened. If you need a push, tell support what would consume it.

Who can use the API, and does it cost extra?

Any Pro account ($29/month, then $19 per seat) can create keys under Settings → API Keys; there is no separate API charge. A key belongs to a person and sees that person’s data, the same as their login. An organisation admin can get every rep’s day from the recap endpoint with scope=team. Free-tier accounts do not have API access.

Endpoints and parameters as of September 10, 2026; the reference at /docs/api is updated with the code. Twilio's transcription price is its US list price as read on 7 September 2026.