GET /api/v1/voice/calls/{id} returns the call's status, duration, Credits charged, summary, analysis and transcript. List calls with GET /api/v1/voice/calls?agent_id=&status=&channel=&user_id=&page= (user_id: your own id for the person, from a web call token). Its turns are the call's turn-by-turn debug log: where the time went from the caller finishing to hearing the answer, in milliseconds โ waitMs (end of speech), sttMs (recognition), llmMs (model first word, one more per round of functions), ttsMs (voice first audio), firstAudioMs (heard the answer) โ with the functions called, interruptions and errors. The call page shows it too.
With recording_enabled, each call is recorded as a two-channel WAV: the caller on the left, the agent on the right, at the call's sample rate. With recording_consent: "announce" the agent first says the call is recorded; with "ask" it asks, and the recording is kept only if the caller agrees (no answer counts as no); with "none" nothing is said. Check what the law requires where you and your callers are.
Recordings are kept in EvaSay's storage, or in your own S3-compatible bucket (AWS S3, Cloudflare R2, Google Cloud Storage, Supabase, MinIO) set under Integrations โ Webhooks & notifications โ Recording storage. The worker running the call uploads the file straight to the bucket. GET /api/v1/voice/calls/{id} returns a recordingUrl valid for an hour once the recording is stored, and recording.status (recording, stored, declined or failed).
DELETE /api/v1/voice/calls/{id} deletes an ended call with its transcript, recording (in EvaSay's storage or your own bucket), analysis and webhook delivery records. The Credits it used stay in your credit history. A call that cannot be deleted yet answers 409 with code call_not_deletable_yet: it is still under way or ended moments ago, it is still being billed, its recording may still be uploading, or it owes Credits your balance could not pay (add Credits first).
When a person asks you to delete their data, POST /api/v1/voice/calls/delete-by-caller with { "phone_number": "+14155550123" } deletes every call with that number (the caller's number on calls in, the number called on calls out), or with { "user_id": "..." } every web call made with that user_id in its token. It answers { "deleted": 12, "kept_back": { "settling": 1 }, "more": false }: at most 200 calls a request, so ask again while more is true, and again later for the calls in kept_back. The number stays on your do-not-call list if it is there. The dashboard does the same under Calls โ Delete a caller's data.