Calls

Your calls, as they were scored. The data is yours on every plan: lengths, numbers, scores and reasons. Never words, because we never hold any.

List calls

GET/v1/callsany key

Newest first, up to 200 at a time. To page, send the last row's started_at as before and its call_id as before_id; the pair is needed because imported calls often share a start second.

Query parameters

numberstring
Only calls on this protected number.
callerstring
Only calls with this other party.
prefixstring
Only callers starting with this, e.g. +1512555. Ignored when caller is set.
direction"inbound" | "outbound"
sincestring
Calls started at or after this time.
beforestring
Calls started before this time. The paging cursor.
before_idstring
With before: the call_id of the last row seen, to break ties.
limitintegerdefault 50
At most 200.

Response

callsobject[]
One object per call; the fields are below.

A call

FieldTypeMeaning
call_idstringYour id for the call.
numberstringYour protected number.
callerstringThe other party. On an outbound call, who was dialled.
direction"inbound" | "outbound"
sourcestringWhere it came from: api, twilio, vapi, retell:import…
started_at / ended_atstring | nullISO 8601. ended_at is null while the call is open.
end_reasonstring | nullAs reported at the end, or expired when no end ever arrived.
duration_sinteger | null
scorenumber | nullThe ring-time score, 0 to 1.
actionstring | nullallow, review or reject.
reasonsstring[]Ring-time reasons and any live_* flags.
spam_scoreinteger | null0 to 100, once the call has ended or turns have arrived.
costnumber | nullUSD.
attestationstring | nullSTIR/SHAKEN, when the carrier said.

Export as CSV

GET/v1/calls.csvany key

The same calls as a spreadsheet, streamed, so a long history never has to fit in memory. Takes the filters of the list, without paging; until closes the window. The ring-time score is written as a percentage so it reads beside the spam score.

Query parameters

numberstring
callerstring
direction"inbound" | "outbound"
sincestring
Inclusive.
untilstring
Exclusive.

The response carries Content-Disposition: attachment; filename="murusai-calls-2026-09-21.csv", so a browser saves it. RFC 4180: cells with commas or quotes are quoted, quotes doubled.

One call, live

GET/v1/calls/{call_id}/liveany key

Everything known about one call: the record, the live monitor's counters and flags, and the turn timeline: each turn's role, when it started and ended, how long it ran, how much was said, and whether it was cut off. This is what the dashboard draws.

Path parameters

call_idstringrequired
Your id for the call, URL-encoded.

Response

callobject
The call, as in the list, plus cost_breakdown, attrs, caller_region, caller_zip, provider_call_id.
liveobject | null
Counters and flags: user_turns, agent_turns, interruptions, user_ms, agent_ms, user_chars, agent_chars, longest_user_ms, longest_user_chars, flags, score. null when no turns ever arrived.
turnsobject[]
In order. Each: role, idx, started_at, ended_at, duration_ms, chars, words, interrupted.

Errors

unknown_call404
No call with that id on your account.
Nothing on this page holds a transcript, and there is no endpoint that does. What is stored about a turn is its length in time, its length in characters and words, and a short hash used only to notice the same thing said again. See what we never see.