Documentation Index
Fetch the complete documentation index at: https://docs.coval.dev/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Most telephony stacks finalize the recording URL after the call has ended — typically 30 to 90 seconds later, well past the point where many agent containers have been recycled or scaled in. That makes it unreliable to submit transcript and audio together in a single, atomic post-call call. The solution is a two-call pattern. At call end, youPOST /v1/conversations:submit with the transcript and metadata. You receive a conversation_id back synchronously. Once your telephony platform tells you the recording URL is finalized, you PATCH /v1/conversations/{conversation_id} to attach it.
The benefit is that text-only metrics — anything derived from the transcript — start running the moment the conversation is submitted. Audio-derived metrics run as a second wave, once the recording is attached.
The two-call flow
Submit transcript at call end
POST /v1/conversations:submit accepts the transcript and returns a conversation_id synchronously. Text-only metrics begin running immediately. The conversation enters IN_PROGRESS status.conversation_id. You will need it for the PATCH call.Attach the recording URL when ready
Once the recording URL finalizes (your telephony stack will deliver this via a webhook or callback), Response:See the full PATCH conversation API reference for all supported fields. You can also attach inline base64 audio via the
PATCH /v1/conversations/{conversation_id} with audio_url. Audio-derived metrics now run as a second wave.audio field rather than a remote URL.Show full submit request body
Show full submit request body
Webhook timing — two waves
Configure your webhook consumer to expect two waves.
- Wave 1 (text-only metrics) — fires within seconds of the
POST /v1/conversations:submitreturning. Carries everything derived from the transcript. - Wave 2 (audio-derived metrics) — fires only after the
PATCH /v1/conversations/{conversation_id}lands and the recording is processed. Carries metrics like STT WER, audio sentiment, and diarization-dependent scores.
external_conversation_id if you store webhook payloads downstream — the same conversation will be referenced by both waves.Idempotency
Audio can be attached once per conversation. The PATCH call is single-shot.- A second PATCH to the same
conversation_idreturns409 ALREADY_EXISTS. - A conversation submitted with audio inline via
POST /v1/conversations:submit(passingaudio_urloraudioin the initial body) already has audio attached and cannot be PATCHed. - To re-run with a corrected recording, submit a new conversation with a new
external_conversation_id.
When you don’t need this
See also
- Conversations overview — the parent concept page
- Submit a conversation for evaluation — the
POST /v1/conversations:submitAPI reference - Attach audio to a conversation — the
PATCH /v1/conversations/{conversation_id}API reference - Observability guide — broader walkthrough of production-call evaluation
- Trace Search — search across traced conversations once they are submitted

