Phone Call Records
Every phone conversation your voice agent has is kept: the calls it places for you, and — once the agent has its own phone number — the calls people place to it. Each record holds who was on the line, when the call happened, how long it lasted, a short summary, and the full transcript.Inbound calls used to be answered but not kept. If someone called your agent’s
number, the conversation happened and then vanished. It is now recorded the same
way an outbound call is, so a call that comes in at 9pm is still there in the
morning.
What a record contains
Ask in chat
The simplest way in. Ask for the calls themselves, or for one call’s transcript:“Has anyone called my Sofia number this week?”
“What did the caller say on that last call?”Erdo lists the calls — newest first, with direction, both numbers, duration and a summary — and reads back the full transcript of whichever one you pick. You can narrow to one agent or to inbound calls only just by saying so.
Your agent asks callers who they are
On an inbound call the person on the line is a stranger — Erdo has no other way to reach them. So the agent asks, naturally and at most twice, for their name and the best email or phone to follow up on, spells an email back to confirm it, and accepts a “no thanks” gracefully. What they share lands in the transcript and the summary. On an outbound call it does the opposite: you already told Erdo who to call, so the agent never asks the recipient for their own contact details.An inbound caller becomes a lead
Someone who dials your number is a stranger who wants something, which is what a lead is — so every inbound call that arrives with a caller ID is saved as one, whether or not the caller gave a name or an email. The number itself is enough to follow up on, and the carrier verified it, so it is the lead’s phone. A name and an email join the row when the caller gave them; the call’s summary rides along, so the row says why they rang. The only call that produces no lead is one from a withheld number where the caller stated no way to reach them. Outbound calls are not leads — you already knew who you were calling. The lead carriessource = phone_incoming_call, which is how you tell callers
apart from the leads your landing pages and website widget capture in the same
table. Where the row lands is a setting on the phone deployment (Agents →
Deployments → the phone runtime → Save leads), resolved the same way a
widget’s is: a dataset you pick, else your organization’s leads dataset when you
have exactly one, else a “Widget leads” dataset Erdo creates for you (the name
is historical — it is the catch-all for leads with nowhere else to go). Untick the
setting and calls are still recorded — they just stop producing leads.
Someone who calls a second time from the same number is recognised: the call
merges into the lead their first call created rather than starting a second row,
and anything new they said — an email they didn’t give last time — fills in what
was blank. Identity is the email address where there is one and the phone number
otherwise, so a caller who leaves an email on one call and not on the next can
still land as two rows — the same limit a landing page has.
Each call record says what happened to its lead, so you never have to guess:
the contact Erdo read out of the call, and the outcome — created (a new
lead), existing (merged into a lead already in the table), disabled
(lead saving is off for this deployment), or test (a preview or automated
check, never written).
A lead is not instant. The contact details are read out of the call after it
ends, so the row appears within roughly 15 to 30 minutes of hang-up — the same
pass that fills in the summary.
Read them programmatically
The same list-and-read surface is available over the REST API, the CLI, and to MCP clients, so a scheduled automation or an external dashboard can pull calls without going through chat. All of them are scoped to your organization by your credentials.- List —
GET /v1/voice/calls(or aPOSTwith a JSON body) returns each call’s id, direction, both numbers, status, timing, duration, summary, and the lead it produced, newest first and paginated. Narrow withagent(a voice agent’s slug) anddirection(inboundoroutbound). When a response includesnext_cursor, pass it back ascursorto read the next stable page — this avoids skips when a call comes in during a multi-page scan. MCP tool:erdo_voice_call_list. - Read one —
GET /v1/voice/calls/{call_id}, using acall_idfrom the list, returns the rendered transcript, the raw transcript, a structuredturnsarray with per-turn model latency and token usage, and the same three lead fields the list carries. MCP tool:erdo_voice_call_get.
contact is the
{first_name, last_name, email, phone} Erdo read out of the call, lead_status
is created | existing | disabled | test, and lead_saved_at is when that
outcome was recorded. Two absences mean different things and are worth keeping
apart if you are counting: contact is null while the call has not been read
yet and an object with blank fields once it has been read and nobody was
reachable, and lead_status is an empty string while the lead writer has not
reached the call rather than meaning no lead.
From the CLI:
Website chat widget conversations are a separate surface — they belong to a
widget rather than to a phone number. See Website
Concierge for those.
Good to know
- Summaries fill in on their own. A call is summarized shortly after it ends, so a record read moments after hang-up may show a transcript before its summary.
- Records follow the agent, not the person. An inbound caller is not an Erdo user, so the record belongs to your organization and the agent that answered.
- Retention matches your other conversation data. Transcripts are visible to your workspace members through Erdo — treat them like any other customer communication.

