GET /api/v1/voice/calls/{id} zwraca status połączenia, czas trwania, pobrane kredyty, podsumowanie, analizę i transkrypcję. Połączenia wylistujesz przez GET /api/v1/voice/calls?agent_id=&status=&channel=&user_id=&page= (user_id: Twój własny identyfikator osoby z tokenu połączenia webowego). Jego turns to dziennik diagnostyczny połączenia, tura po turze: na co poszedł czas od zakończenia wypowiedzi rozmówcy do usłyszenia odpowiedzi, w milisekundach — waitMs (koniec mowy), sttMs (rozpoznawanie), llmMs (pierwsze słowo modelu, plus jedno na każdą rundę funkcji), ttsMs (pierwszy dźwięk głosu), firstAudioMs (odpowiedź usłyszana) — wraz z wywołanymi funkcjami, przerwaniami i błędami. Pokazuje go także strona połączenia.
Przy recording_enabled każde połączenie jest nagrywane jako dwukanałowy WAV: rozmówca po lewej, agent po prawej, z częstotliwością próbkowania połączenia. Przy recording_consent: "announce" agent najpierw mówi, że rozmowa jest nagrywana; przy "ask" pyta, a nagranie jest zachowywane tylko, jeśli rozmówca się zgodzi (brak odpowiedzi liczy się jako „nie”); przy "none" nic nie jest mówione. Sprawdź, czego wymaga prawo tam, gdzie jesteście Ty i Twoi rozmówcy.
Nagrania są przechowywane w magazynie EvaSay albo we własnym buckecie zgodnym z S3 (AWS S3, Cloudflare R2, Google Cloud Storage, Supabase, MinIO) ustawionym w Integracje → Webhooki i powiadomienia → Przechowywanie nagrań. Worker obsługujący połączenie wysyła plik bezpośrednio do bucketu. GET /api/v1/voice/calls/{id} zwraca recordingUrl ważny przez godzinę po zapisaniu nagrania oraz recording.status (recording, stored, declined lub failed).
DELETE /api/v1/voice/calls/{id} usuwa zakończone połączenie wraz z transkrypcją, nagraniem (w magazynie EvaSay lub we własnym buckecie), analizą i wysyłkami webhooków. Wykorzystane Credits zostają w historii kredytów. Połączenie, którego nie można jeszcze usunąć, zwraca 409 z code call_not_deletable_yet: trwa lub dopiero się zakończyło, jest jeszcze rozliczane, nagranie może być jeszcze przesyłane albo ma zaległe Credits, których saldo nie pokryło (najpierw doładuj Credits).
Gdy ktoś prosi o usunięcie swoich danych, POST /api/v1/voice/calls/delete-by-caller z { "phone_number": "+14155550123" } usuwa wszystkie połączenia z tym numerem (numer dzwoniącego w przychodzących, numer wybrany w wychodzących), a z { "user_id": "..." } wszystkie połączenia internetowe z tym user_id w tokenie. Odpowiedź to { "deleted": 12, "kept_back": { "settling": 1 }, "more": false }: najwyżej 200 połączeń na żądanie, więc ponawiaj, dopóki more ma wartość true, a później jeszcze raz dla połączeń z kept_back. Jeśli numer jest na liście „Nie dzwonić”, pozostaje na niej. W panelu to samo robi Połączenia → Usuń dane rozmówcy.