Searchable recording and transcript library (QA)
Finding the call a QA review needs used to mean scrubbing audio by hand. The recording library gives reviewers one unified surface across every recordable channel — SIP/SBC calls, AI agents, browser softphone, conferences, video rooms, chat, email, social, and messaging — and folds three facts into every row so the hit list is the QA worklist:- The recording itself — classification, duration, and link back to the call, conference, video room, or conversation.
- The finalised, diarised transcript — per-turn speaker segments, searched by case-insensitive substring match on
q. Only the finalised segments are indexed, so partial or still-processing transcription rows never produce phantom hits. - The linked QA verdict — the latest evaluation’s total score and provenance (AI auto-scored or human-reviewed) plus the recording QC verdict (
passed/failed/pending/skipped) and its failed-check count.
GET /api/v1/quality/recording-library
Authentication: API key (X-API-Key) or session JWT; inbox:read scope.
Roles: owner, admin, or supervisor. Agents are deliberately excluded: the library surfaces transcript content and QA scores across all agents, which makes it a reviewer surface rather than a self-service one — the same boundary the evaluation-scorecard API enforces.
Filters
All filters are optional and AND-combined.
An out-of-range filter value returns
422 (API key) or 400 (session). A malformed cursor returns 400 INVALID_CURSOR.
Response shape
Each item is one recording: its identifiers (call_sid, conference_id, video_room_session_id, conversation_id as applicable), classification, mime_type, duration_seconds, file_size_bytes, started_at, ended_at, transcription_status, qc_status, qc_failed_count, the latest linked evaluation (qa_evaluation_id, qa_form_id, qa_total_score, qa_status, qa_auto_scored, qa_flagged_for_review, qa_agent_id, qa_evaluated_at), and matches — the top transcript fragments when q was passed, each with start_ms, channel, and text. matches is an empty array by contract when no q was supplied.
Keyset pagination
List responses order newest-first and use an opaque cursor: readnext_cursor from the response and pass it back as cursor until the response returns null (no more rows). Keyset pagination keeps page depth constant — equivalent pages take the same time at row 10,000 as at row 10, unlike offset pagination, and it never duplicates rows when a new recording lands between requests. The cursor encodes the sort key only (no filter state), so it’s safe to persist; it will not survive being edited by hand.
Sibling surfaces — which search to use
End-to-end examples
Search transcripts for “refund”, QC-failed, scored below 70:Empty and edge behaviour
A tenant with no recordings gets a200 with items: [] and next_cursor: null — an empty page, never a 404. A recording whose transcript pipeline failed or is still queued simply carries its transcription_status; it stays listable (with matches: []) and filterable by status. QC verdicts ride the tenant’s own post-finalize recording QC pipeline — tenant-configured, always scoped to the calling tenant.