GET /api/v1/voice/calls/{id} restituisce lo stato della chiamata, la durata, i crediti addebitati, il riepilogo, l'analisi e la trascrizione. Elenca le chiamate con GET /api/v1/voice/calls?agent_id=&status=&channel=&user_id=&page= (user_id: il tuo id della persona, preso da un token di chiamata web). I suoi turns sono il registro di debug della chiamata, turno per turno: dove è andato il tempo da quando chi chiama ha finito di parlare a quando ha sentito la risposta, in millisecondi — waitMs (fine del parlato), sttMs (riconoscimento), llmMs (prima parola del modello, una in più per ogni giro di funzioni), ttsMs (primo audio della voce), firstAudioMs (risposta sentita) — con le funzioni chiamate, le interruzioni e gli errori. Lo mostra anche la pagina della chiamata.
Con recording_enabled, ogni chiamata viene registrata come WAV a due canali: chi chiama a sinistra, l'agente a destra, alla frequenza di campionamento della chiamata. Con recording_consent: "announce" l'agente dice prima che la chiamata è registrata; con "ask" lo chiede, e la registrazione viene conservata solo se chi chiama accetta (nessuna risposta vale come no); con "none" non viene detto nulla. Verifica che cosa richiede la legge dove ti trovi tu e dove si trovano le persone che ti chiamano.
Le registrazioni sono conservate nell'archiviazione di EvaSay, oppure nel tuo bucket compatibile con S3 (AWS S3, Cloudflare R2, Google Cloud Storage, Supabase, MinIO) impostato in Integrazioni → Webhook e notifiche → Archiviazione delle registrazioni. Il worker che esegue la chiamata carica il file direttamente nel bucket. GET /api/v1/voice/calls/{id} restituisce un recordingUrl valido per un'ora una volta archiviata la registrazione, e recording.status (recording, stored, declined o failed).
DELETE /api/v1/voice/calls/{id} elimina una chiamata terminata con trascrizione, registrazione (nello storage di EvaSay o nel tuo bucket), analisi e invii webhook. I Credits usati restano nella cronologia dei crediti. Una chiamata che non si può ancora eliminare risponde 409 con code call_not_deletable_yet: è ancora in corso o appena terminata, è ancora in fatturazione, la registrazione potrebbe essere ancora in caricamento, oppure deve Credits che il saldo non ha coperto (aggiungi prima dei Credits).
Quando una persona chiede di cancellare i propri dati, POST /api/v1/voice/calls/delete-by-caller con { "phone_number": "+14155550123" } elimina tutte le chiamate con quel numero (quello del chiamante nelle chiamate in entrata, quello chiamato nelle chiamate in uscita), oppure con { "user_id": "..." } tutte le chiamate web fatte con quel user_id nel token. Risponde { "deleted": 12, "kept_back": { "settling": 1 }, "more": false }: al massimo 200 chiamate per richiesta, quindi ripeti finché more è true, e più tardi per le chiamate in kept_back. Se il numero è nell’elenco da non chiamare, ci resta. La dashboard fa lo stesso in Chiamate → Elimina i dati di un chiamante.