Attach audio, add metadata, or assign an agent to a conversation
Attach an audio recording, add metadata keys, or assign an agent to a
conversation previously submitted via POST /v1/conversations/uploaded:submit.
When to attach audio
Use this endpoint when your recording URL is not available at the moment
the call ends (for example, Twilio Programmable Voice recordings that are
only fetchable after an asynchronous job completes ~60 seconds later).
Submit the transcript immediately at call end to get a conversation_id
for trace correlation, then PATCH the audio when the recording URL is
ready. Attaching audio triggers audio-dependent metrics as a second wave.
When to add metadata
Use this endpoint when a value you want to filter or segment on is only
known after the call was submitted (for example, an outcome produced by
post-call analysis). Once added, the key is immediately available as a
filter on the Uploaded Conversations page and in the filter parameter of
GET /v1/conversations/uploaded.
Two-wave metric timing
Text-only metrics fire immediately after POST /v1/conversations/uploaded:submit
and deliver their results via your configured webhook.
Audio-dependent metrics fire after an audio PATCH and deliver a separate,
later webhook. Configure your consumer to expect both waves.
Adding metadata does not run or re-run any metric. If a metric depends
on a key you added, rerun it with POST /v1/conversations/simulated:rerunMetrics.
When to assign an agent
Use agent_id when a conversation was submitted without one and you later
know which agent handled it. The conversation then appears under that agent
on the Uploaded Conversations page, in agent filters, and in agent-scoped
metric aggregates. Assigning an agent does not run or re-run any metric.
One-shot
Every patch target is write-once. Audio can be attached only once per
conversation; a second PATCH on a conversation that already has audio
returns 409 ALREADY_EXISTS. Metadata is additive only; patching a key
that already has a value returns 409 ALREADY_EXISTS. An agent can be
assigned only to a conversation that has none; repeating the current agent
succeeds without change, and a different agent returns 409 ALREADY_EXISTS.
Body
Exactly one of audio, audio_url, metadata or agent_id is required.
Request to attach audio to, add metadata to, or assign an agent to an
already-submitted conversation.
Exactly one of audio_url, audio, metadata or agent_id must be
provided. Submitting more than one, or none, returns 400 INVALID_ARGUMENT.
Each target is patched in a separate call so a rejected value can never
leave another target half-applied.
Idempotency: Audio can be attached only once per conversation. A
second PATCH on a conversation that already has audio returns
409 ALREADY_EXISTS. Conversations that were submitted with audio via
POST /v1/conversations/uploaded:submit already have audio attached and cannot
be PATCHed. Metadata follows the same rule per key: adding a new key
succeeds, overwriting an existing one returns 409 ALREADY_EXISTS. An agent
can be assigned once; a different agent returns 409 ALREADY_EXISTS.
Channel containing the agent in the input stereo recording: 0 is
left, 1 is right. With channel selection enabled for the organization,
omitted or null uses the organization default. Otherwise the legacy
mapping applies and explicit overrides are rejected.
Requires an audio input. No effect on mono recordings or supplied
transcript roles. The effective choice is captured for this audio.
Presigned URL to the audio recording. Same validation rules as
audio_url on POST /v1/conversations/uploaded:submit (WAV or MP3, 5 s to
60 min, 200 MB max). Supports AWS S3, GCP Cloud Storage, Azure Blob
Storage, or any public/presigned HTTP/HTTPS URL. Raw s3://bucket/key
URLs are limited to Coval-issued uploads in the shared or
organization-specific audio bucket under audio/<authenticated_organization_id>/.
For other storage locations, supply a presigned HTTPS URL.
HTTP/HTTPS URLs must resolve entirely to publicly routable addresses; redirects are rejected.
Metadata keys to add to the conversation, merged into any metadata sent
at submit. Values may be strings, numbers, booleans, arrays or objects.
Additive only. A key that already holds a value returns
409 ALREADY_EXISTS, and keys that identify the conversation
(conversation_id, external_conversation_id, call_id, trace_id,
langfuse_trace_id, observation_id, langfuse_observation_id,
project_id, environment, occurred_at) return
400 INVALID_ARGUMENT.
At most 100 keys per request; key names are limited to 200 characters.
Agent to assign to a conversation that was submitted without one. The
agent must exist and be active in your organization for a new assignment, otherwise
404 NOT_FOUND. Supply a 22-character agent resource ID (letters, digits, or hyphens);
malformed IDs return 400 INVALID_ARGUMENT.
Set-once. Repeating the conversation's current agent succeeds without
change; a different agent returns 409 ALREADY_EXISTS. Does not run or
re-run any metric.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Coval Documentation","colors":{"primary":"#000000","light":"#D9D9D9","dark":"#333333"},"logo":{"light":"https://mintcdn.com/coval-2e18a559/Notp6opJUCHArykW/logo/coval-logo-vector.svg?fit=max\u0026auto=format\u0026n=Notp6opJUCHArykW\u0026q=85\u0026s=f08474458e9c5bbff1e1d7119fdc8012","dark":"https://mintcdn.com/coval-2e18a559/Notp6opJUCHArykW/logo/coval-logo-vector-white.svg?fit=max\u0026auto=format\u0026n=Notp6opJUCHArykW\u0026q=85\u0026s=ed477a66f2ca12c3c7a0289aa7c5bfb4"},"favicon":"https://mintcdn.com/coval-2e18a559/h96r_q_HmNOhXnSr/favicon.png?fit=max\u0026auto=format\u0026n=h96r_q_HmNOhXnSr\u0026q=85\u0026s=3451522324a1d00b3ad7c50ef0b825b3","api":{"mdx":{"auth":{"method":"key","name":"x-api-key"},"server":"https://api.coval.dev"}},"appearance":{"default":"light"},"background":{"image":"https://mintlify.s3.us-west-1.amazonaws.com/coval-2e18a559/images/background/frame_16opblack.svg","color":{"light":"#F2F1EE","dark":"#000000"}},"navbar":{"links":[{"href":"/changelog","label":"Changelog"},{"href":"mailto:support@coval.dev","label":"Support"},{"href":"https://www.coval.dev","label":"Website"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.coval.dev"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/covaldev","twitter":"https://x.com/covaldev"}},"contextual":{"options":["copy","view"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"coval-2e18a559","hasAudioNarration":false,"actualSubdomain":"coval-2e18a559","customDomains":["docs.coval.ai"],"gitSource":{"type":"github","owner":"coval-ai","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae1219cf97dfbc380eed228","collectionId":"86021a97-d063-4b70-8aee-5d501aea7ac0","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae1219cf97dfbc380eed228"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae26d317e251c6245b0c09e","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"API","count":193},{"language":"default","tag":"Home","count":76},{"language":"default","tag":"Resources","count":43},{"language":"default","tag":"Simulated Conversations","count":41},{"language":"default","tag":"Metrics","count":34},{"language":"default","tag":"Agents","count":29},{"language":"default","tag":"CLI","count":21},{"language":"default","tag":"Test Sets","count":17},{"language":"default","tag":"Reviews","count":17},{"language":"default","tag":"Uploaded Conversations","count":16}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".cl,.cl-entry{position:relative}.cl{max-width:880px}.cl-entry{display:grid;grid-template-columns:96px 1fr;column-gap:2.5rem;padding-bottom:2.5rem}.cl-entry::before{content:\"\";position:absolute;left:96px;top:8px;bottom:-8px;width:2px;background:#dcdad5}.cl-entry:last-child::before{display:none}.cl-entry::after{content:\"\";position:absolute;left:91px;top:7px;width:12px;height:12px;border-radius:50%;background:#11161f;box-shadow:0 0 0 4px #f2f1ee}.cl-rail{text-align:center}.cl-rail__date{font-size:1.4rem;font-weight:700;color:#1a1a1a;line-height:1.1}.cl-rail__year{font-size:1.05rem;color:#9a958c;font-weight:500}.cl-rail__count{margin-top:.35rem;font-size:.8rem;color:#a8a399}.cl-content{min-width:0}.cl-highlights{background:#0f1320;border-radius:16px;padding:1.4rem 1.75rem;margin-bottom:1.25rem}.cl-highlights__label{font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;font-weight:600;color:#8b94a5}.cl-highlights__list{margin:.65rem 0 0;padding:0;list-style:none}.cl-highlights__list li{position:relative;padding-left:1.1rem;margin:.3rem 0;font-size:1rem;line-height:1.45;color:#f5f6f8}.cl-highlights__list li::before{content:\"\";position:absolute;left:0;top:.6em;width:5px;height:5px;border-radius:50%;background:#8b94a5}.cl-card{position:relative;background:#fff;border:1px solid #ececec;border-radius:16px;padding:1.5rem 1.75rem;margin-bottom:1rem}.cl-card__title{font-size:1.25rem;font-weight:700;color:#1a1a1a;margin-bottom:.5rem}.cl-card__desc{color:#5b5b5b;line-height:1.55;margin:0}.cl-card__extra{display:none}.cl-card__divider{border:0;border-top:1px solid #ededed;margin:1.1rem 0}.cl-card__extra p{color:#5b5b5b;line-height:1.55}.cl-card__extra a,.cl-doc-link{color:#15803d;font-weight:600;text-decoration:none}.cl-card__extra a:hover{text-decoration:none;opacity:.8}.cl-card__footer{display:flex;align-items:center;gap:.75rem;margin-top:1.1rem}.cl-pill{font-size:.8rem;font-weight:600;padding:.25rem .7rem;border-radius:999px}.cl-pill--new{background:#d9f0e1;color:#1a7f4b}.cl-pill--improved{background:#dde9fb;color:#1d4ed8}.cl-pill--fixed{background:#fdeccf;color:#b45309}.cl-cat{font-size:.85rem;color:#9aa0a6}.cl-cb{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cl-toggle{margin-left:auto;cursor:pointer;user-select:none;font-size:.85rem;font-weight:500;color:#1f2433;border:1px solid #cdd5e3;border-radius:9px;padding:.45rem .85rem;white-space:nowrap}.cl-toggle:hover{background:#f6f8fc}.cl-cb:focus-visible~.cl-card__footer .cl-toggle{outline:2px solid #4f6bed;outline-offset:2px}.cl-toggle .less{display:none}.cl-cb:checked~.cl-card__extra{display:block}.cl-cb:checked~.cl-card__footer .cl-toggle .more{display:none}.cl-cb:checked~.cl-card__footer .cl-toggle .less{display:inline}.dark .cl-entry::before{background:#2a2f3a}.dark .cl-entry::after{background:#e5e7eb;box-shadow:0 0 0 4px #000}.dark .cl-rail__date{color:#f5f6f8}.dark .cl-rail__year{color:#9aa0ad}.dark .cl-rail__count{color:#7e8493}.dark .cl-card{background:#11161f;border-color:#242a36}.dark .cl-card__title{color:#f5f6f8}.dark .cl-card__desc,.dark .cl-card__extra p{color:#aab1bd}.dark .cl-card__divider{border-top-color:#262b36}.dark .cl-card__extra a,.dark .cl-doc-link{color:#4ade80}.dark .cl-pill--new{background:#10301d;color:#5cd98c}.dark .cl-pill--improved{background:#13233f;color:#7aa6f5}.dark .cl-pill--fixed{background:#3a2a10;color:#e0a955}.dark .cl-cat{color:#8b909a}.dark .cl-toggle{color:#cbd2de;border-color:#333a47}.dark .cl-toggle:hover{background:#1a2030}@media (max-width:640px){.cl-entry{grid-template-columns:1fr;row-gap:1rem}.cl-entry::after,.cl-entry::before{display:none}.cl-rail{display:flex;align-items:baseline;gap:.5rem;text-align:left}}"}],"page":{"pagePath":"api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation","slug":"/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation","pageMetadata":{"title":"Attach audio, add metadata, or assign an agent to a conversation","description":"Attach an audio recording, add metadata keys, or assign an agent to a\nconversation previously submitted via `POST /v1/conversations/uploaded:submit`.\n\n**When to attach audio**\n\nUse this endpoint when your recording URL is not available at the moment\nthe call ends (for example, Twilio Programmable Voice recordings that are\nonly fetchable after an asynchronous job completes ~60 seconds later).\nSubmit the transcript immediately at call end to get a `conversation_id`\nfor trace correlation, then PATCH the audio when the recording URL is\nready. Attaching audio triggers audio-dependent metrics as a second wave.\n\n**When to add metadata**\n\nUse this endpoint when a value you want to filter or segment on is only\nknown after the call was submitted (for example, an outcome produced by\npost-call analysis). Once added, the key is immediately available as a\nfilter on the Uploaded Conversations page and in the `filter` parameter of\n`GET /v1/conversations/uploaded`.\n\n**Two-wave metric timing**\n\n- Text-only metrics fire immediately after `POST /v1/conversations/uploaded:submit`\n and deliver their results via your configured webhook.\n- Audio-dependent metrics fire after an audio PATCH and deliver a separate,\n later webhook. Configure your consumer to expect both waves.\n\nAdding metadata does **not** run or re-run any metric. If a metric depends\non a key you added, rerun it with `POST /v1/conversations/simulated:rerunMetrics`.\n\n**When to assign an agent**\n\nUse `agent_id` when a conversation was submitted without one and you later\nknow which agent handled it. The conversation then appears under that agent\non the Uploaded Conversations page, in agent filters, and in agent-scoped\nmetric aggregates. Assigning an agent does **not** run or re-run any metric.\n\n**One-shot**\n\nEvery patch target is write-once. Audio can be attached only once per\nconversation; a second PATCH on a conversation that already has audio\nreturns `409 ALREADY_EXISTS`. Metadata is additive only; patching a key\nthat already has a value returns `409 ALREADY_EXISTS`. An agent can be\nassigned only to a conversation that has none; repeating the current agent\nsucceeds without change, and a different agent returns `409 ALREADY_EXISTS`.\n\n**Body**\n\nExactly one of `audio`, `audio_url`, `metadata` or `agent_id` is required.\n","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml patch /conversations/uploaded/{conversation_id}","href":"/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Attach an audio recording, add metadata keys, or assign an agent to a\\nconversation previously submitted via \", _jsx(_components.code, {\n children: \"POST /v1/conversations/uploaded:submit\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"When to attach audio\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Use this endpoint when your recording URL is not available at the moment\\nthe call ends (for example, Twilio Programmable Voice recordings that are\\nonly fetchable after an asynchronous job completes ~60 seconds later).\\nSubmit the transcript immediately at call end to get a \", _jsx(_components.code, {\n children: \"conversation_id\"\n }), \"\\nfor trace correlation, then PATCH the audio when the recording URL is\\nready. Attaching audio triggers audio-dependent metrics as a second wave.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"When to add metadata\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Use this endpoint when a value you want to filter or segment on is only\\nknown after the call was submitted (for example, an outcome produced by\\npost-call analysis). Once added, the key is immediately available as a\\nfilter on the Uploaded Conversations page and in the \", _jsx(_components.code, {\n children: \"filter\"\n }), \" parameter of\\n\", _jsx(_components.code, {\n children: \"GET /v1/conversations/uploaded\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Two-wave metric timing\"\n })\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [\"Text-only metrics fire immediately after \", _jsx(_components.code, {\n children: \"POST /v1/conversations/uploaded:submit\"\n }), \"\\nand deliver their results via your configured webhook.\"]\n }), \"\\n\", _jsx(_components.li, {\n children: \"Audio-dependent metrics fire after an audio PATCH and deliver a separate,\\nlater webhook. Configure your consumer to expect both waves.\"\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Adding metadata does \", _jsx(_components.strong, {\n children: \"not\"\n }), \" run or re-run any metric. If a metric depends\\non a key you added, rerun it with \", _jsx(_components.code, {\n children: \"POST /v1/conversations/simulated:rerunMetrics\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"When to assign an agent\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Use \", _jsx(_components.code, {\n children: \"agent_id\"\n }), \" when a conversation was submitted without one and you later\\nknow which agent handled it. The conversation then appears under that agent\\non the Uploaded Conversations page, in agent filters, and in agent-scoped\\nmetric aggregates. Assigning an agent does \", _jsx(_components.strong, {\n children: \"not\"\n }), \" run or re-run any metric.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"One-shot\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Every patch target is write-once. Audio can be attached only once per\\nconversation; a second PATCH on a conversation that already has audio\\nreturns \", _jsx(_components.code, {\n children: \"409 ALREADY_EXISTS\"\n }), \". Metadata is additive only; patching a key\\nthat already has a value returns \", _jsx(_components.code, {\n children: \"409 ALREADY_EXISTS\"\n }), \". An agent can be\\nassigned only to a conversation that has none; repeating the current agent\\nsucceeds without change, and a different agent returns \", _jsx(_components.code, {\n children: \"409 ALREADY_EXISTS\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Body\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Exactly one of \", _jsx(_components.code, {\n children: \"audio\"\n }), \", \", _jsx(_components.code, {\n children: \"audio_url\"\n }), \", \", _jsx(_components.code, {\n children: \"metadata\"\n }), \" or \", _jsx(_components.code, {\n children: \"agent_id\"\n }), \" is required.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Attach audio, add metadata, or assign an agent to a conversation","description":"Attach an audio recording, add metadata keys, or assign an agent to a\nconversation previously submitted via `POST /v1/conversations/uploaded:submit`.\n\n**When to attach audio**\n\nUse this endpoint when your recording URL is not available at the moment\nthe call ends (for example, Twilio Programmable Voice recordings that are\nonly fetchable after an asynchronous job completes ~60 seconds later).\nSubmit the transcript immediately at call end to get a `conversation_id`\nfor trace correlation, then PATCH the audio when the recording URL is\nready. Attaching audio triggers audio-dependent metrics as a second wave.\n\n**When to add metadata**\n\nUse this endpoint when a value you want to filter or segment on is only\nknown after the call was submitted (for example, an outcome produced by\npost-call analysis). Once added, the key is immediately available as a\nfilter on the Uploaded Conversations page and in the `filter` parameter of\n`GET /v1/conversations/uploaded`.\n\n**Two-wave metric timing**\n\n- Text-only metrics fire immediately after `POST /v1/conversations/uploaded:submit`\n and deliver their results via your configured webhook.\n- Audio-dependent metrics fire after an audio PATCH and deliver a separate,\n later webhook. Configure your consumer to expect both waves.\n\nAdding metadata does **not** run or re-run any metric. If a metric depends\non a key you added, rerun it with `POST /v1/conversations/simulated:rerunMetrics`.\n\n**When to assign an agent**\n\nUse `agent_id` when a conversation was submitted without one and you later\nknow which agent handled it. The conversation then appears under that agent\non the Uploaded Conversations page, in agent filters, and in agent-scoped\nmetric aggregates. Assigning an agent does **not** run or re-run any metric.\n\n**One-shot**\n\nEvery patch target is write-once. Audio can be attached only once per\nconversation; a second PATCH on a conversation that already has audio\nreturns `409 ALREADY_EXISTS`. Metadata is additive only; patching a key\nthat already has a value returns `409 ALREADY_EXISTS`. An agent can be\nassigned only to a conversation that has none; repeating the current agent\nsucceeds without change, and a different agent returns `409 ALREADY_EXISTS`.\n\n**Body**\n\nExactly one of `audio`, `audio_url`, `metadata` or `agent_id` is required.\n","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml patch /conversations/uploaded/{conversation_id}","href":"/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/coval-2e18a559/96d9833460dc4be2/analytics.js"],"openApiReferenceData":{"operation":{"tags":["Uploaded Conversations"],"summary":"Attach audio, add metadata, or assign an agent to a conversation","description":"Attach an audio recording, add metadata keys, or assign an agent to a\nconversation previously submitted via `POST /v1/conversations/uploaded:submit`.\n\n**When to attach audio**\n\nUse this endpoint when your recording URL is not available at the moment\nthe call ends (for example, Twilio Programmable Voice recordings that are\nonly fetchable after an asynchronous job completes ~60 seconds later).\nSubmit the transcript immediately at call end to get a `conversation_id`\nfor trace correlation, then PATCH the audio when the recording URL is\nready. Attaching audio triggers audio-dependent metrics as a second wave.\n\n**When to add metadata**\n\nUse this endpoint when a value you want to filter or segment on is only\nknown after the call was submitted (for example, an outcome produced by\npost-call analysis). Once added, the key is immediately available as a\nfilter on the Uploaded Conversations page and in the `filter` parameter of\n`GET /v1/conversations/uploaded`.\n\n**Two-wave metric timing**\n\n- Text-only metrics fire immediately after `POST /v1/conversations/uploaded:submit`\n and deliver their results via your configured webhook.\n- Audio-dependent metrics fire after an audio PATCH and deliver a separate,\n later webhook. Configure your consumer to expect both waves.\n\nAdding metadata does **not** run or re-run any metric. If a metric depends\non a key you added, rerun it with `POST /v1/conversations/simulated:rerunMetrics`.\n\n**When to assign an agent**\n\nUse `agent_id` when a conversation was submitted without one and you later\nknow which agent handled it. The conversation then appears under that agent\non the Uploaded Conversations page, in agent filters, and in agent-scoped\nmetric aggregates. Assigning an agent does **not** run or re-run any metric.\n\n**One-shot**\n\nEvery patch target is write-once. Audio can be attached only once per\nconversation; a second PATCH on a conversation that already has audio\nreturns `409 ALREADY_EXISTS`. Metadata is additive only; patching a key\nthat already has a value returns `409 ALREADY_EXISTS`. An agent can be\nassigned only to a conversation that has none; repeating the current agent\nsucceeds without change, and a different agent returns `409 ALREADY_EXISTS`.\n\n**Body**\n\nExactly one of `audio`, `audio_url`, `metadata` or `agent_id` is required.\n","operationId":"patchUploadedConversation","parameters":["2e7f9f54-be51-4971-a585-6d19a249c9d8"],"requestBody":"a640a6ac-484b-4d7d-8dac-78b26be2a2f8","responses":{"200":"8f745edd-eb28-4ed3-82a1-24e3845c132e","400":"94a9fd54-324c-4dc8-9dcb-a08d44daf323","401":"7b2ffc3e-7ab3-473f-bb27-55cf1470fe55","404":"de7c594a-1f98-4c97-94be-4c8031340eac","409":"76954d3a-c710-4bd3-8bac-a5019e43909a","500":"f52dc4b9-138e-4eb3-87a1-a22e87d2c0aa"},"method":"patch","type":"path","servers":["933594b5-10b9-4aba-bd75-1c97ffb042a1"],"security":["b6070fd3-c63f-4d34-bf38-d22958a77acb"],"path":"/conversations/uploaded/{conversation_id}","baseUrlOptions":["https://api.coval.dev/v1"],"title":"Attach audio, add metadata, or assign an agent to a conversation","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"2e7f9f54-be51-4971-a585-6d19a249c9d8":{"name":"conversation_id","in":"path","description":"Unique conversation identifier (22-26 characters)","required":true,"schema":{"type":"string","minLength":22,"maxLength":26,"isRequired":true,"description":"Unique conversation identifier (22-26 characters)","uniqueKey":"","typeLabel":"string"},"example":"gk3jK9mPq2xRt5vW8yZaBc"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_channel":{"oneOf":[{"type":"integer","minimum":0,"maximum":1,"description":"Channel containing the agent in the input stereo recording: 0 is\nleft, 1 is right. With channel selection enabled for the organization,\nomitted or null uses the organization default. Otherwise the legacy\nmapping applies and explicit overrides are rejected.\nRequires an audio input. No effect on mono recordings or supplied\ntranscript roles. The effective choice is captured for this audio.\n","uniqueKey":"agent_channel.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"maximum":1,"description":"Channel containing the agent in the input stereo recording: 0 is\nleft, 1 is right. With channel selection enabled for the organization,\nomitted or null uses the organization default. Otherwise the legacy\nmapping applies and explicit overrides are rejected.\nRequires an audio input. No effect on mono recordings or supplied\ntranscript roles. The effective choice is captured for this audio.\n","uniqueKey":"agent_channel.oneOf.1","typeLabel":"null"}],"uniqueKey":"agent_channel","typeLabel":"integer | null"},"audio_url":{"type":"string","format":"uri","description":"Presigned URL to the audio recording. Same validation rules as\n`audio_url` on `POST /v1/conversations/uploaded:submit` (WAV or MP3, 5 s to\n60 min, 200 MB max). Supports AWS S3, GCP Cloud Storage, Azure Blob\nStorage, or any public/presigned HTTP/HTTPS URL. Raw `s3://bucket/key`\nURLs are limited to Coval-issued uploads in the shared or\norganization-specific audio bucket under `audio/\u003cauthenticated_organization_id>/`.\nFor other storage locations, supply a presigned HTTPS URL.\nHTTP/HTTPS URLs must resolve entirely to publicly routable addresses; redirects are rejected.\n","example":"https://recordings.s3.amazonaws.com/calls/2025/11/call-4k2m9p.wav?X-Amz-Algorithm=...","uniqueKey":"audio_url","typeLabel":"string\u003curi>"},"audio":{"type":"string","description":"Base64-encoded audio bytes. Same format and size limits as `audio_url`.\nPrefer `audio_url` for anything other than very small clips.\n","uniqueKey":"audio","typeLabel":"string"},"metadata":{"type":"object","additionalProperties":true,"maxProperties":100,"description":"Metadata keys to add to the conversation, merged into any metadata sent\nat submit. Values may be strings, numbers, booleans, arrays or objects.\n\nAdditive only. A key that already holds a value returns\n`409 ALREADY_EXISTS`, and keys that identify the conversation\n(`conversation_id`, `external_conversation_id`, `call_id`, `trace_id`,\n`langfuse_trace_id`, `observation_id`, `langfuse_observation_id`,\n`project_id`, `environment`, `occurred_at`) return\n`400 INVALID_ARGUMENT`.\n\nAt most 100 keys per request; key names are limited to 200 characters.\n","example":{"called_back":1,"csat_bucket":"promoter"},"uniqueKey":"metadata","typeLabel":"object"},"agent_id":{"type":"string","pattern":"^[A-Za-z0-9-]{22}$","description":"Agent to assign to a conversation that was submitted without one. The\nagent must exist and be active in your organization for a new assignment, otherwise\n`404 NOT_FOUND`. Supply a 22-character agent resource ID (letters, digits, or hyphens);\nmalformed IDs return `400 INVALID_ARGUMENT`.\n\nSet-once. Repeating the conversation's current agent succeeds without\nchange; a different agent returns `409 ALREADY_EXISTS`. Does not run or\nre-run any metric.\n","example":"fZSUMoKq67ZarVYCbugjsd","uniqueKey":"agent_id","typeLabel":"string"}},"description":"Request to attach audio to, add metadata to, or assign an agent to an\nalready-submitted conversation.\n\n**Exactly one** of `audio_url`, `audio`, `metadata` or `agent_id` must be\nprovided. Submitting more than one, or none, returns `400 INVALID_ARGUMENT`.\nEach target is patched in a separate call so a rejected value can never\nleave another target half-applied.\n\n**Idempotency:** Audio can be attached only once per conversation. A\nsecond PATCH on a conversation that already has audio returns\n`409 ALREADY_EXISTS`. Conversations that were submitted with audio via\n`POST /v1/conversations/uploaded:submit` already have audio attached and cannot\nbe PATCHed. Metadata follows the same rule per key: adding a new key\nsucceeds, overwriting an existing one returns `409 ALREADY_EXISTS`. An agent\ncan be assigned once; a different agent returns `409 ALREADY_EXISTS`.\n","uniqueKey":"","typeLabel":"object"},"examples":{"audioUrl":{"title":"audioUrl","value":{"audio_url":"https://recordings.s3.amazonaws.com/calls/2025/11/call-4k2m9p.wav?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=..."}},"audioBase64":{"title":"audioBase64","value":{"audio":"UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAIA+AAACABAAZGF0YQAAAAA="}},"metadata":{"title":"metadata","value":{"metadata":{"called_back":1,"csat_bucket":"promoter"}}},"agentId":{"title":"agentId","value":{"agent_id":"fZSUMoKq67ZarVYCbugjsd"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"8f745edd-eb28-4ed3-82a1-24e3845c132e":{"description":"Audio attached successfully; audio metrics queued","content":{"application/json":{"schema":{"type":"object","required":["uploaded_conversation"],"properties":{"uploaded_conversation":{"type":"object","properties":{"name":{"type":"string","description":"Resource name in format \"conversations/{conversation_id}\"","example":"conversations/gk3jK9mPq2xRt5vW8yZaBc","isRequired":true,"uniqueKey":"uploaded_conversation.name","typeLabel":"string"},"conversation_id":{"type":"string","description":"Unique conversation identifier (22-26 characters)","minLength":22,"maxLength":26,"example":"gk3jK9mPq2xRt5vW8yZaBc","isRequired":true,"uniqueKey":"uploaded_conversation.conversation_id","typeLabel":"string"},"status":{"type":"string","enum":["PENDING","IN_QUEUE","IN_PROGRESS","COMPLETED","FAILED","CANCELLED","DELETED"],"description":"Current status of conversation evaluation.\n\n**Lifecycle:**\n- PENDING: Submitted, awaiting queue\n- IN_QUEUE: In run-setup-queue, awaiting worker\n- IN_PROGRESS: Evaluation running\n- COMPLETED: Successfully completed\n- FAILED: Encountered error\n- CANCELLED: User cancelled (via DELETE on PENDING/IN_PROGRESS)\n- DELETED: Deleted(via DELETE on COMPLETED/FAILED)\n","isRequired":true,"uniqueKey":"uploaded_conversation.status","typeLabel":"enum\u003cstring>"},"create_time":{"type":"string","format":"date-time","description":"When conversation was submitted (ISO 8601)","example":"2025-11-03T14:32:30Z","isRequired":true,"uniqueKey":"uploaded_conversation.create_time","typeLabel":"string\u003cdate-time>"},"workspace_id":{"oneOf":[{"type":"string","description":"Effective authorized workspace for a single-resource GET. Derived from the owning run; legacy unassigned runs use the authenticated default workspace after access checks. Null means no workspace proof is supplied, including other resource views.","uniqueKey":"uploaded_conversation.workspace_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Effective authorized workspace for a single-resource GET. Derived from the owning run; legacy unassigned runs use the authenticated default workspace after access checks. Null means no workspace proof is supplied, including other resource views.","uniqueKey":"uploaded_conversation.workspace_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.workspace_id","typeLabel":"string | null"},"external_conversation_id":{"oneOf":[{"type":"string","description":"External conversation ID from customer system","example":"external-call-7x8z9a","uniqueKey":"uploaded_conversation.external_conversation_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"External conversation ID from customer system","example":"external-call-7x8z9a","uniqueKey":"uploaded_conversation.external_conversation_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.external_conversation_id","typeLabel":"string | null"},"occurred_at":{"oneOf":[{"type":"string","format":"date-time","description":"The instant the audio recording begins, in ISO 8601 with sub-second precision. Coval uses it to align the recording with trace spans in the trace viewer and to locate traces around the call.\n\nWhen it was not provided at submit, this is the time Coval received the conversation, and the trace viewer draws the recording without aligning it to spans.\n","example":"2025-11-03T14:32:07.412Z","uniqueKey":"uploaded_conversation.occurred_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"The instant the audio recording begins, in ISO 8601 with sub-second precision. Coval uses it to align the recording with trace spans in the trace viewer and to locate traces around the call.\n\nWhen it was not provided at submit, this is the time Coval received the conversation, and the trace viewer draws the recording without aligning it to spans.\n","example":"2025-11-03T14:32:07.412Z","uniqueKey":"uploaded_conversation.occurred_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.occurred_at","typeLabel":"string\u003cdate-time> | null"},"has_audio":{"type":"boolean","description":"Whether audio is available for this conversation.\n\nUse GET /v1/conversations/uploaded/{id}/audio to retrieve presigned URL.\n","example":true,"uniqueKey":"uploaded_conversation.has_audio","typeLabel":"boolean"},"agent_id":{"oneOf":[{"type":"string","description":"Agent resource ID (22-character ShortUUID), if one was provided at submission","example":null,"uniqueKey":"uploaded_conversation.agent_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Agent resource ID (22-character ShortUUID), if one was provided at submission","example":null,"uniqueKey":"uploaded_conversation.agent_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.agent_id","typeLabel":"string | null"},"persona_id":{"oneOf":[{"type":"string","description":"Reference to persona resource (typically null for uploaded conversations)","example":null,"uniqueKey":"uploaded_conversation.persona_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Reference to persona resource (typically null for uploaded conversations)","example":null,"uniqueKey":"uploaded_conversation.persona_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.persona_id","typeLabel":"string | null"},"source":{"oneOf":[{"type":"object","description":"The caller/initiating side of the conversation; null when not addressable. Only included in single-resource GET, not LIST.","required":["type","value"],"properties":{"type":{"type":"string","enum":["phone"],"description":"Endpoint kind discriminator","isRequired":true,"uniqueKey":"uploaded_conversation.source.oneOf.0.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"Phone number in E.164 format","example":"+15551234567","isRequired":true,"uniqueKey":"uploaded_conversation.source.oneOf.0.value","typeLabel":"string"}},"uniqueKey":"uploaded_conversation.source.oneOf.0","typeLabel":"object"},{"type":"object","description":"The caller/initiating side of the conversation; null when not addressable. Only included in single-resource GET, not LIST.","required":["type","value"],"properties":{"type":{"type":"string","enum":["sip"],"description":"Endpoint kind discriminator","isRequired":true,"uniqueKey":"uploaded_conversation.source.oneOf.1.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"SIP URI","example":"sip:agent@voip.example.com","isRequired":true,"uniqueKey":"uploaded_conversation.source.oneOf.1.value","typeLabel":"string"}},"uniqueKey":"uploaded_conversation.source.oneOf.1","typeLabel":"object"},{"type":"object","description":"The caller/initiating side of the conversation; null when not addressable. Only included in single-resource GET, not LIST.","required":["type","value"],"properties":{"type":{"type":"string","enum":["websocket"],"description":"Endpoint kind discriminator","isRequired":true,"uniqueKey":"uploaded_conversation.source.oneOf.2.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"WebSocket URL","example":"wss://agent.example.com/stream","isRequired":true,"uniqueKey":"uploaded_conversation.source.oneOf.2.value","typeLabel":"string"}},"uniqueKey":"uploaded_conversation.source.oneOf.2","typeLabel":"object"},{"type":"null","uniqueKey":"uploaded_conversation.source.oneOf.3","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.source","typeLabel":"object · object · object · null"},"destination":{"oneOf":[{"type":"object","description":"The agent side of the conversation; null when not addressable. Only included in single-resource GET, not LIST.","required":["type","value"],"properties":{"type":{"type":"string","enum":["phone"],"description":"Endpoint kind discriminator","isRequired":true,"uniqueKey":"uploaded_conversation.destination.oneOf.0.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"Phone number in E.164 format","example":"+15551234567","isRequired":true,"uniqueKey":"uploaded_conversation.destination.oneOf.0.value","typeLabel":"string"}},"uniqueKey":"uploaded_conversation.destination.oneOf.0","typeLabel":"object"},{"type":"object","description":"The agent side of the conversation; null when not addressable. Only included in single-resource GET, not LIST.","required":["type","value"],"properties":{"type":{"type":"string","enum":["sip"],"description":"Endpoint kind discriminator","isRequired":true,"uniqueKey":"uploaded_conversation.destination.oneOf.1.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"SIP URI","example":"sip:agent@voip.example.com","isRequired":true,"uniqueKey":"uploaded_conversation.destination.oneOf.1.value","typeLabel":"string"}},"uniqueKey":"uploaded_conversation.destination.oneOf.1","typeLabel":"object"},{"type":"object","description":"The agent side of the conversation; null when not addressable. Only included in single-resource GET, not LIST.","required":["type","value"],"properties":{"type":{"type":"string","enum":["websocket"],"description":"Endpoint kind discriminator","isRequired":true,"uniqueKey":"uploaded_conversation.destination.oneOf.2.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"WebSocket URL","example":"wss://agent.example.com/stream","isRequired":true,"uniqueKey":"uploaded_conversation.destination.oneOf.2.value","typeLabel":"string"}},"uniqueKey":"uploaded_conversation.destination.oneOf.2","typeLabel":"object"},{"type":"null","uniqueKey":"uploaded_conversation.destination.oneOf.3","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.destination","typeLabel":"object · object · object · null"},"progress":{"oneOf":[{"type":"object","description":"Progress tracking (included when include_progress=true)","required":["total_metrics","failed_metrics","completed_metrics","in_progress_metrics"],"properties":{"total_metrics":{"type":"integer","description":"Total number of metrics being evaluated","example":5,"isRequired":true,"uniqueKey":"uploaded_conversation.progress.oneOf.0.total_metrics","typeLabel":"integer"},"completed_metrics":{"type":"integer","description":"Number of metrics completed successfully","example":5,"isRequired":true,"uniqueKey":"uploaded_conversation.progress.oneOf.0.completed_metrics","typeLabel":"integer"},"failed_metrics":{"type":"integer","description":"Number of metrics that failed evaluation","example":0,"isRequired":true,"uniqueKey":"uploaded_conversation.progress.oneOf.0.failed_metrics","typeLabel":"integer"},"in_progress_metrics":{"type":"integer","description":"Number of metrics currently running","example":0,"isRequired":true,"uniqueKey":"uploaded_conversation.progress.oneOf.0.in_progress_metrics","typeLabel":"integer"},"skipped_metrics":{"default":0,"description":"Number of metrics that were skipped (e.g., audio-dependent metric on a transcript-only conversation). Distinct from failed_metrics: skipped is expected/non-actionable.","type":"integer","uniqueKey":"uploaded_conversation.progress.oneOf.0.skipped_metrics","typeLabel":"integer"}},"uniqueKey":"uploaded_conversation.progress.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"uploaded_conversation.progress.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.progress","typeLabel":"object | null"},"metadata":{"type":"object","additionalProperties":true,"description":"Customer-provided metadata","example":{"campaign":"q4-support","channel":"phone"},"uniqueKey":"uploaded_conversation.metadata","typeLabel":"object"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"uploaded_conversation.tags.items.[INDEX]","typeLabel":"string"},"description":"Tags applied to this conversation","example":["restaurant","support-tier-1"],"uniqueKey":"uploaded_conversation.tags","typeLabel":"string[]"},"metric_ids":{"type":"array","items":{"type":"string","minLength":22,"maxLength":26,"uniqueKey":"uploaded_conversation.metric_ids.items.[INDEX]","typeLabel":"string"},"description":"List of metric IDs configured for this conversation.\n\nUse GET /v1/conversations/uploaded/{id}/metrics to retrieve computed metric values.\n","example":["29BlkepvvX19ebbLDB0y6Q","mymKvEg6ZA65srXbTX5wSM","fstokU4ev5UmT8sUBexiwV"],"uniqueKey":"uploaded_conversation.metric_ids","typeLabel":"string[]"},"metric_outputs":{"oneOf":[{"type":"array","description":"Full outputs matching the requested metric_id. Present only when the list\nrequest sets include=metric_outputs; omitted from the default summary view.\n","items":{"type":"object","required":["metric_id","metric_output_id","status"],"properties":{"metric_output_id":{"type":"string","description":"Unique metric output identifier (26-char ULID)","minLength":26,"maxLength":26,"example":"01JCQR8Z9PQSTNVWXY12345678","isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].metric_output_id","typeLabel":"string"},"metric_id":{"type":"string","description":"Metric definition identifier (22-char ID)","minLength":22,"maxLength":26,"example":"29BlkepvvX19ebbLDB0y6Q","isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].metric_id","typeLabel":"string"},"status":{"type":"string","enum":["IN QUEUE","IN PROGRESS","COMPLETED","SKIPPED","FAILED","CANCELLED"],"description":"Status of metric computation","example":"COMPLETED","isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"metric_version_ulid":{"oneOf":[{"type":"string","minLength":26,"maxLength":26,"description":"ULID of the metric version this output was scored against (null for outputs produced before metric versioning landed)","example":"01JCQR8Z9PQSTNVWXY12345678","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].metric_version_ulid.oneOf.0","typeLabel":"string"},{"type":"null","minLength":26,"maxLength":26,"description":"ULID of the metric version this output was scored against (null for outputs produced before metric versioning landed)","example":"01JCQR8Z9PQSTNVWXY12345678","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].metric_version_ulid.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].metric_version_ulid","typeLabel":"string | null"},"value":{"oneOf":[{"type":"number","description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","example":2.35,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","example":2.35,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"string","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"string"},"description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","example":2.35,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].value.oneOf.2","typeLabel":"string[]"},{"type":"string","description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","enum":[null],"example":2.35,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].value.oneOf.3","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","enum":[null],"example":2.35,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].value.oneOf.4","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].value","typeLabel":"number | string | string[] | enum\u003cstring> | null"},"status_reason":{"oneOf":[{"type":"string","description":"Stored reason for the current status, including the actionable reason a metric was skipped or failed. Null when no reason was recorded.","example":"No OTel trace spans were found for this simulation.","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].status_reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Stored reason for the current status, including the actionable reason a metric was skipped or failed. Null when no reason was recorded.","example":"No OTel trace spans were found for this simulation.","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].status_reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].status_reason","typeLabel":"string | null"},"explanation":{"oneOf":[{"type":"string","description":"The LLM judge's reasoning for this metric output, as a flat string. Null for metrics that produce no explanation (non-judge metrics) or when the output is not yet computed. This is a convenience surfacing of the reasoning that otherwise lives nested under result.llm.answer_explanation (or result.explanation); it is populated in both the list and single-output responses so callers do not have to request the full result object to read it.","example":"The agent never confirmed the caller's address before ending the call.","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].explanation.oneOf.0","typeLabel":"string"},{"type":"null","description":"The LLM judge's reasoning for this metric output, as a flat string. Null for metrics that produce no explanation (non-judge metrics) or when the output is not yet computed. This is a convenience surfacing of the reasoning that otherwise lives nested under result.llm.answer_explanation (or result.explanation); it is populated in both the list and single-output responses so callers do not have to request the full result object to read it.","example":"The agent never confirmed the caller's address before ending the call.","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].explanation.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].explanation","typeLabel":"string | null"},"evidence_references":{"oneOf":[{"type":"array","description":"Stable frame, trace-span, or metric-output identities supporting an Agent Judge decision.","items":{"oneOf":[{"type":"object","required":["frame_id"],"properties":{"frame_id":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.0.frame_id","typeLabel":"string"},"type":{"type":"string","enum":["frame"],"default":"frame","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["trace_id","span_id"],"properties":{"trace_id":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.1.trace_id","typeLabel":"string"},"span_id":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.1.span_id","typeLabel":"string"},"type":{"type":"string","enum":["trace_span"],"default":"trace_span","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","required":["type","metric_output_ulid"],"properties":{"type":{"type":"string","enum":["metric_output"],"isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"metric_output_ulid":{"type":"string","minLength":1,"maxLength":26,"isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.2.metric_output_ulid","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX].oneOf.2","typeLabel":"object"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Stable frame, trace-span, or metric-output identities supporting an Agent Judge decision.","items":{"oneOf":[{"type":"object","required":["frame_id"],"properties":{"type":{"type":"string","enum":["frame"],"default":"frame"},"frame_id":{"type":"string","minLength":1}},"additionalProperties":false},{"type":"object","required":["trace_id","span_id"],"properties":{"type":{"type":"string","enum":["trace_span"],"default":"trace_span"},"trace_id":{"type":"string","minLength":1},"span_id":{"type":"string","minLength":1}},"additionalProperties":false},{"type":"object","required":["type","metric_output_ulid"],"properties":{"type":{"type":"string","enum":["metric_output"]},"metric_output_ulid":{"type":"string","minLength":1,"maxLength":26}},"additionalProperties":false}]},"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].evidence_references","typeLabel":"object[] | null"},"result":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Structured metric result. Its keys depend on the metric type — for LLM-judge metrics the judge's reasoning is at result.llm.answer_explanation and the evaluation prompt at result.llm.prompt. Null for metrics that produce no structured result.","example":{"llm":{"answer_explanation":"The agent never confirmed the caller's address before ending the call.","prompt":"Did the agent confirm the caller's address?"}},"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].result.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Structured metric result. Its keys depend on the metric type — for LLM-judge metrics the judge's reasoning is at result.llm.answer_explanation and the evaluation prompt at result.llm.prompt. Null for metrics that produce no structured result.","example":{"llm":{"answer_explanation":"The agent never confirmed the caller's address before ending the call.","prompt":"Did the agent confirm the caller's address?"}},"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].result.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].result","typeLabel":"object | null"},"runtime_metadata":{"oneOf":[{"additionalProperties":true,"type":"object","description":"How the metric was calculated at runtime. Only populated when view=FULL.","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].runtime_metadata.oneOf.0","typeLabel":"object"},{"additionalProperties":true,"type":"null","description":"How the metric was calculated at runtime. Only populated when view=FULL.","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].runtime_metadata.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].runtime_metadata","typeLabel":"object | null"},"subvalues_by_timestamp":{"oneOf":[{"items":{"description":"A single metric measurement anchored to a time range.\n\nUsed for time-series and per-message metric data such as audio-timeline\nhighlighting and transcript message highlighting.","properties":{"start_offset":{"description":"Start position in seconds","type":"number","isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].start_offset","typeLabel":"number"},"end_offset":{"description":"End position in seconds","type":"number","isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].end_offset","typeLabel":"number"},"output_type":{"description":"Value type: float, string, or set","type":"string","isRequired":true,"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].output_type","typeLabel":"string"},"float_value":{"default":0,"description":"Numeric value (when output_type is float)","type":"number","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].float_value","typeLabel":"number"},"string_value":{"default":"","description":"String value (when output_type is string)","type":"string","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].string_value","typeLabel":"string"},"role":{"oneOf":[{"type":"string","description":"Speaker role for this interval (e.g. user, assistant)","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].role.oneOf.0","typeLabel":"string"},{"type":"null","description":"Speaker role for this interval (e.g. user, assistant)","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].role.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].role","typeLabel":"string | null"},"message_index":{"oneOf":[{"type":"integer","description":"0-based transcript message index","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].message_index.oneOf.0","typeLabel":"integer"},{"type":"null","description":"0-based transcript message index","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].message_index.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].message_index","typeLabel":"integer | null"},"metadata":{"oneOf":[{"additionalProperties":true,"type":"object","description":"Extra per-span context (e.g. LLM observation explanation)","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].metadata.oneOf.0","typeLabel":"object"},{"additionalProperties":true,"type":"null","description":"Extra per-span context (e.g. LLM observation explanation)","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].metadata.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX].metadata","typeLabel":"object | null"}},"required":["start_offset","end_offset","output_type"],"type":"object","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","description":"Time-series metric values anchored to time ranges. Capped at 500 entries; see subvalues_by_timestamp_truncated.","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.0","typeLabel":"object[]"},{"items":{"description":"A single metric measurement anchored to a time range.\n\nUsed for time-series and per-message metric data such as audio-timeline\nhighlighting and transcript message highlighting.","properties":{"start_offset":{"description":"Start position in seconds","type":"number"},"end_offset":{"description":"End position in seconds","type":"number"},"output_type":{"description":"Value type: float, string, or set","type":"string"},"float_value":{"default":0,"description":"Numeric value (when output_type is float)","type":"number"},"string_value":{"default":"","description":"String value (when output_type is string)","type":"string"},"role":{"oneOf":[{"type":"string","description":"Speaker role for this interval (e.g. user, assistant)"},{"type":"null","description":"Speaker role for this interval (e.g. user, assistant)"}]},"message_index":{"oneOf":[{"type":"integer","description":"0-based transcript message index"},{"type":"null","description":"0-based transcript message index"}]},"metadata":{"oneOf":[{"additionalProperties":true,"type":"object","description":"Extra per-span context (e.g. LLM observation explanation)"},{"additionalProperties":true,"type":"null","description":"Extra per-span context (e.g. LLM observation explanation)"}]}},"required":["start_offset","end_offset","output_type"],"type":"object"},"type":"null","description":"Time-series metric values anchored to time ranges. Capped at 500 entries; see subvalues_by_timestamp_truncated.","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp","typeLabel":"object[] | null"},"subvalues_by_timestamp_total_count":{"default":0,"description":"Total subvalues on the underlying row before truncation. 0 when the row has no subvalues.","type":"integer","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp_total_count","typeLabel":"integer"},"subvalues_by_timestamp_truncated":{"default":false,"description":"True when the stored row had more than 500 subvalues and the response array was truncated.","type":"boolean","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX].subvalues_by_timestamp_truncated","typeLabel":"boolean"}},"description":"Simplified metric output for conversations API.\n","uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Full outputs matching the requested metric_id. Present only when the list\nrequest sets include=metric_outputs; omitted from the default summary view.\n","items":{"type":"object","required":["metric_id","metric_output_id","status"],"properties":{"metric_output_id":{"type":"string","description":"Unique metric output identifier (26-char ULID)","minLength":26,"maxLength":26,"example":"01JCQR8Z9PQSTNVWXY12345678"},"metric_id":{"type":"string","description":"Metric definition identifier (22-char ID)","minLength":22,"maxLength":26,"example":"29BlkepvvX19ebbLDB0y6Q"},"metric_version_ulid":{"oneOf":[{"type":"string","minLength":26,"maxLength":26,"description":"ULID of the metric version this output was scored against (null for outputs produced before metric versioning landed)","example":"01JCQR8Z9PQSTNVWXY12345678"},{"type":"null","minLength":26,"maxLength":26,"description":"ULID of the metric version this output was scored against (null for outputs produced before metric versioning landed)","example":"01JCQR8Z9PQSTNVWXY12345678"}]},"value":{"oneOf":[{"type":"number","description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","example":2.35},{"type":"string","description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","example":2.35},{"type":"array","items":{"type":"string"},"description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","example":2.35},{"type":"string","description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","enum":[null],"example":2.35},{"type":"null","description":"Metric value (can be float, string, or list of strings depending on metric type, or null if failed)\n","enum":[null],"example":2.35}]},"status":{"type":"string","enum":["IN QUEUE","IN PROGRESS","COMPLETED","SKIPPED","FAILED","CANCELLED"],"description":"Status of metric computation","example":"COMPLETED"},"status_reason":{"oneOf":[{"type":"string","description":"Stored reason for the current status, including the actionable reason a metric was skipped or failed. Null when no reason was recorded.","example":"No OTel trace spans were found for this simulation."},{"type":"null","description":"Stored reason for the current status, including the actionable reason a metric was skipped or failed. Null when no reason was recorded.","example":"No OTel trace spans were found for this simulation."}]},"explanation":{"oneOf":[{"type":"string","description":"The LLM judge's reasoning for this metric output, as a flat string. Null for metrics that produce no explanation (non-judge metrics) or when the output is not yet computed. This is a convenience surfacing of the reasoning that otherwise lives nested under result.llm.answer_explanation (or result.explanation); it is populated in both the list and single-output responses so callers do not have to request the full result object to read it.","example":"The agent never confirmed the caller's address before ending the call."},{"type":"null","description":"The LLM judge's reasoning for this metric output, as a flat string. Null for metrics that produce no explanation (non-judge metrics) or when the output is not yet computed. This is a convenience surfacing of the reasoning that otherwise lives nested under result.llm.answer_explanation (or result.explanation); it is populated in both the list and single-output responses so callers do not have to request the full result object to read it.","example":"The agent never confirmed the caller's address before ending the call."}]},"evidence_references":{"oneOf":[{"type":"array","description":"Stable frame, trace-span, or metric-output identities supporting an Agent Judge decision.","items":{"oneOf":[{"type":"object","required":["frame_id"],"properties":{"type":{"type":"string","enum":["frame"],"default":"frame"},"frame_id":{"type":"string","minLength":1}},"additionalProperties":false},{"type":"object","required":["trace_id","span_id"],"properties":{"type":{"type":"string","enum":["trace_span"],"default":"trace_span"},"trace_id":{"type":"string","minLength":1},"span_id":{"type":"string","minLength":1}},"additionalProperties":false},{"type":"object","required":["type","metric_output_ulid"],"properties":{"type":{"type":"string","enum":["metric_output"]},"metric_output_ulid":{"type":"string","minLength":1,"maxLength":26}},"additionalProperties":false}]}},{"type":"null","description":"Stable frame, trace-span, or metric-output identities supporting an Agent Judge decision.","items":{"oneOf":[{"type":"object","required":["frame_id"],"properties":{"type":{"type":"string","enum":["frame"],"default":"frame"},"frame_id":{"type":"string","minLength":1}},"additionalProperties":false},{"type":"object","required":["trace_id","span_id"],"properties":{"type":{"type":"string","enum":["trace_span"],"default":"trace_span"},"trace_id":{"type":"string","minLength":1},"span_id":{"type":"string","minLength":1}},"additionalProperties":false},{"type":"object","required":["type","metric_output_ulid"],"properties":{"type":{"type":"string","enum":["metric_output"]},"metric_output_ulid":{"type":"string","minLength":1,"maxLength":26}},"additionalProperties":false}]}}]},"result":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Structured metric result. Its keys depend on the metric type — for LLM-judge metrics the judge's reasoning is at result.llm.answer_explanation and the evaluation prompt at result.llm.prompt. Null for metrics that produce no structured result.","example":{"llm":{"answer_explanation":"The agent never confirmed the caller's address before ending the call.","prompt":"Did the agent confirm the caller's address?"}}},{"type":"null","additionalProperties":true,"description":"Structured metric result. Its keys depend on the metric type — for LLM-judge metrics the judge's reasoning is at result.llm.answer_explanation and the evaluation prompt at result.llm.prompt. Null for metrics that produce no structured result.","example":{"llm":{"answer_explanation":"The agent never confirmed the caller's address before ending the call.","prompt":"Did the agent confirm the caller's address?"}}}]},"runtime_metadata":{"oneOf":[{"additionalProperties":true,"type":"object","description":"How the metric was calculated at runtime. Only populated when view=FULL."},{"additionalProperties":true,"type":"null","description":"How the metric was calculated at runtime. Only populated when view=FULL."}]},"subvalues_by_timestamp":{"oneOf":[{"items":{"description":"A single metric measurement anchored to a time range.\n\nUsed for time-series and per-message metric data such as audio-timeline\nhighlighting and transcript message highlighting.","properties":{"start_offset":{"description":"Start position in seconds","type":"number"},"end_offset":{"description":"End position in seconds","type":"number"},"output_type":{"description":"Value type: float, string, or set","type":"string"},"float_value":{"default":0,"description":"Numeric value (when output_type is float)","type":"number"},"string_value":{"default":"","description":"String value (when output_type is string)","type":"string"},"role":{"oneOf":[{"type":"string","description":"Speaker role for this interval (e.g. user, assistant)"},{"type":"null","description":"Speaker role for this interval (e.g. user, assistant)"}]},"message_index":{"oneOf":[{"type":"integer","description":"0-based transcript message index"},{"type":"null","description":"0-based transcript message index"}]},"metadata":{"oneOf":[{"additionalProperties":true,"type":"object","description":"Extra per-span context (e.g. LLM observation explanation)"},{"additionalProperties":true,"type":"null","description":"Extra per-span context (e.g. LLM observation explanation)"}]}},"required":["start_offset","end_offset","output_type"],"type":"object"},"type":"array","description":"Time-series metric values anchored to time ranges. Capped at 500 entries; see subvalues_by_timestamp_truncated."},{"items":{"description":"A single metric measurement anchored to a time range.\n\nUsed for time-series and per-message metric data such as audio-timeline\nhighlighting and transcript message highlighting.","properties":{"start_offset":{"description":"Start position in seconds","type":"number"},"end_offset":{"description":"End position in seconds","type":"number"},"output_type":{"description":"Value type: float, string, or set","type":"string"},"float_value":{"default":0,"description":"Numeric value (when output_type is float)","type":"number"},"string_value":{"default":"","description":"String value (when output_type is string)","type":"string"},"role":{"oneOf":[{"type":"string","description":"Speaker role for this interval (e.g. user, assistant)"},{"type":"null","description":"Speaker role for this interval (e.g. user, assistant)"}]},"message_index":{"oneOf":[{"type":"integer","description":"0-based transcript message index"},{"type":"null","description":"0-based transcript message index"}]},"metadata":{"oneOf":[{"additionalProperties":true,"type":"object","description":"Extra per-span context (e.g. LLM observation explanation)"},{"additionalProperties":true,"type":"null","description":"Extra per-span context (e.g. LLM observation explanation)"}]}},"required":["start_offset","end_offset","output_type"],"type":"object"},"type":"null","description":"Time-series metric values anchored to time ranges. Capped at 500 entries; see subvalues_by_timestamp_truncated."}]},"subvalues_by_timestamp_total_count":{"default":0,"description":"Total subvalues on the underlying row before truncation. 0 when the row has no subvalues.","type":"integer"},"subvalues_by_timestamp_truncated":{"default":false,"description":"True when the stored row had more than 500 subvalues and the response array was truncated.","type":"boolean"}},"description":"Simplified metric output for conversations API.\n"},"uniqueKey":"uploaded_conversation.metric_outputs.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_outputs","typeLabel":"object[] | null"},"metric_values":{"oneOf":[{"type":"array","description":"Every metric's value on this conversation, inline. Present when the list request\nsets include=metric_values or filters by metric value (filter=metric.\u003cid> ...);\nomitted from the default summary view. On this metric-aware path each conversation is\na summary projection: has_audio is reported false and persona_id / source / destination\nare null regardless of the underlying record — fetch GET /v1/conversations/uploaded/{id} for\nauthoritative audio, persona, and endpoint values.\n","items":{"type":"object","required":["metric_id"],"properties":{"metric_id":{"type":"string","description":"Metric definition identifier","example":"29BlkepvvX19ebbLDB0y6Q","isRequired":true,"uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX].metric_id","typeLabel":"string"},"value":{"oneOf":[{"type":"number","description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","example":0.92,"uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX].value.oneOf.0","typeLabel":"number"},{"type":"string","description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","example":0.92,"uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX].value.oneOf.1","typeLabel":"string"},{"type":"array","items":{"type":"string","uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX].value.oneOf.2.items.[INDEX]","typeLabel":"string"},"description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","example":0.92,"uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX].value.oneOf.2","typeLabel":"string[]"},{"type":"string","description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","enum":[null],"example":0.92,"uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX].value.oneOf.3","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","enum":[null],"example":0.92,"uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX].value.oneOf.4","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX].value","typeLabel":"number | string | string[] | enum\u003cstring> | null"}},"uniqueKey":"uploaded_conversation.metric_values.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"uploaded_conversation.metric_values.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Every metric's value on this conversation, inline. Present when the list request\nsets include=metric_values or filters by metric value (filter=metric.\u003cid> ...);\nomitted from the default summary view. On this metric-aware path each conversation is\na summary projection: has_audio is reported false and persona_id / source / destination\nare null regardless of the underlying record — fetch GET /v1/conversations/uploaded/{id} for\nauthoritative audio, persona, and endpoint values.\n","items":{"type":"object","required":["metric_id"],"properties":{"metric_id":{"type":"string","description":"Metric definition identifier","example":"29BlkepvvX19ebbLDB0y6Q"},"value":{"oneOf":[{"type":"number","description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","example":0.92},{"type":"string","description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","example":0.92},{"type":"array","items":{"type":"string"},"description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","example":0.92},{"type":"string","description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","enum":[null],"example":0.92},{"type":"null","description":"Metric value (float, string, or list of strings depending on metric type; null if unscored or failed)","enum":[null],"example":0.92}]}}},"uniqueKey":"uploaded_conversation.metric_values.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.metric_values","typeLabel":"object[] | null"},"error":{"oneOf":[{"type":"string","description":"Error message (only present if status=FAILED)","example":null,"uniqueKey":"uploaded_conversation.error.oneOf.0","typeLabel":"string"},{"type":"null","description":"Error message (only present if status=FAILED)","example":null,"uniqueKey":"uploaded_conversation.error.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.error","typeLabel":"string | null"},"transcript":{"oneOf":[{"items":{"additionalProperties":true,"type":"object","uniqueKey":"uploaded_conversation.transcript.oneOf.0.items.[INDEX]","typeLabel":"object"},"type":"array","description":"Conversation transcript messages. Only included in single-resource GET, not LIST.","uniqueKey":"uploaded_conversation.transcript.oneOf.0","typeLabel":"object[]"},{"items":{"additionalProperties":true,"type":"object"},"type":"null","description":"Conversation transcript messages. Only included in single-resource GET, not LIST.","uniqueKey":"uploaded_conversation.transcript.oneOf.1","typeLabel":"null"}],"uniqueKey":"uploaded_conversation.transcript","typeLabel":"object[] | null"}},"description":"Conversation resource object.\n","required":["conversation_id","create_time","status","name"],"isRequired":true,"uniqueKey":"uploaded_conversation","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"attached":{"title":"attached","value":{"uploaded_conversation":{"name":"conversations/gk3jK9mPq2xRt5vW8yZaBc","conversation_id":"gk3jK9mPq2xRt5vW8yZaBc","status":"IN_PROGRESS","create_time":"2025-11-03T14:32:30Z","external_conversation_id":"external-call-7x8z9a","occurred_at":"2025-11-03T14:32:00Z","has_audio":true,"agent_id":null,"persona_id":null,"metadata":{"campaign":"q4-support"}}}}},"exampleType":"examples"}},"exampleType":"examples"},"94a9fd54-324c-4dc8-9dcb-a08d44daf323":{"description":"Invalid request arguments","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Error code","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","NOT_FOUND","ALREADY_EXISTS","PAYLOAD_TOO_LARGE","INTERNAL_ERROR"],"example":"INVALID_ARGUMENT","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable error message","example":"Missing required input data","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Field that caused the error","example":"transcript","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"description":{"type":"string","description":"Detailed description of the error","example":"At least one of transcript, audio, or audio_url must be provided","uniqueKey":"error.details.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"description":"Additional error details","default":[],"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"missingInput":{"title":"missingInput","value":{"error":{"code":"INVALID_ARGUMENT","message":"Missing required input data","details":[{"field":"transcript","description":"At least one of transcript or audio_url must be provided"}]}}},"invalidFilter":{"title":"invalidFilter","value":{"error":{"code":"INVALID_ARGUMENT","message":"Invalid filter expression","details":[{"field":"filter","description":"Unknown field 'invalid_field'. Valid fields: status, create_time, occurred_at, external_conversation_id"}]}}},"invalidPageSize":{"title":"invalidPageSize","value":{"error":{"code":"INVALID_ARGUMENT","message":"Invalid page_size","details":[{"field":"page_size","description":"page_size must be between 1 and 250"}]}}},"audioFormatInvalid":{"title":"audioFormatInvalid","value":{"error":{"code":"INVALID_ARGUMENT","message":"Unsupported audio format: MP4. Only WAV and MP3 files are supported.","details":[{"field":"audio_url","description":"Audio format detected as MP4 via magic byte analysis. Convert to WAV or MP3."}]}}},"audioTooShort":{"title":"audioTooShort","value":{"error":{"code":"INVALID_ARGUMENT","message":"Audio too short: 3.0 seconds. Minimum duration is 5 seconds.","details":[{"field":"audio_url","description":"Audio file duration is below the 5 second minimum requirement"}]}}},"audioTooLong":{"title":"audioTooLong","value":{"error":{"code":"INVALID_ARGUMENT","message":"Audio too long: 75.0 minutes. Maximum duration is 60 minutes.","details":[{"field":"audio_url","description":"Audio file duration exceeds the 1 hour maximum limit"}]}}},"audioTooLarge":{"title":"audioTooLarge","value":{"error":{"code":"INVALID_ARGUMENT","message":"Audio file too large: 250.0 MB. Maximum size is 200 MB.","details":[{"field":"audio_url","description":"Audio file size exceeds 200 MB limit"}]}}},"audioEmpty":{"title":"audioEmpty","value":{"error":{"code":"INVALID_ARGUMENT","message":"Audio file is empty.","details":[{"field":"audio_url","description":"Audio file contains no data"}]}}},"audioCorrupt":{"title":"audioCorrupt","value":{"error":{"code":"INVALID_ARGUMENT","message":"Invalid or corrupt audio file. Unable to read audio metadata.","details":[{"field":"audio_url","description":"Audio file headers could not be read or are corrupted"}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"7b2ffc3e-7ab3-473f-bb27-55cf1470fe55":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Error code","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","NOT_FOUND","ALREADY_EXISTS","PAYLOAD_TOO_LARGE","INTERNAL_ERROR"],"example":"INVALID_ARGUMENT","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable error message","example":"Missing required input data","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Field that caused the error","example":"transcript","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"description":{"type":"string","description":"Detailed description of the error","example":"At least one of transcript, audio, or audio_url must be provided","uniqueKey":"error.details.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"description":"Additional error details","default":[],"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"UNAUTHENTICATED","message":"Invalid or missing API key","details":[]}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"UNAUTHENTICATED","message":"Invalid or missing API key","details":[]}}}},"exampleType":"examples"}},"exampleType":"examples"},"de7c594a-1f98-4c97-94be-4c8031340eac":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Error code","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","NOT_FOUND","ALREADY_EXISTS","PAYLOAD_TOO_LARGE","INTERNAL_ERROR"],"example":"INVALID_ARGUMENT","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable error message","example":"Missing required input data","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Field that caused the error","example":"transcript","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"description":{"type":"string","description":"Detailed description of the error","example":"At least one of transcript, audio, or audio_url must be provided","uniqueKey":"error.details.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"description":"Additional error details","default":[],"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"conversationNotFound":{"title":"conversationNotFound","value":{"error":{"code":"NOT_FOUND","message":"Conversation not found","details":[]}}},"simulationAccess":{"title":"simulationAccess","value":{"error":{"code":"NOT_FOUND","message":"Conversation not found","details":[]}}}},"exampleType":"examples"}},"exampleType":"examples"},"76954d3a-c710-4bd3-8bac-a5019e43909a":{"description":"Audio is already attached, a metadata key already has a value, or a different agent is already assigned","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Error code","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","NOT_FOUND","ALREADY_EXISTS","PAYLOAD_TOO_LARGE","INTERNAL_ERROR"],"example":"INVALID_ARGUMENT","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable error message","example":"Missing required input data","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Field that caused the error","example":"transcript","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"description":{"type":"string","description":"Detailed description of the error","example":"At least one of transcript, audio, or audio_url must be provided","uniqueKey":"error.details.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"description":"Additional error details","default":[],"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"ALREADY_EXISTS","message":"Conversation 'gk3jK9mPq2xRt5vW8yZaBc' already has audio attached. Overwriting audio is not supported.","details":[{"field":"audio","description":"Audio already attached"}]}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"ALREADY_EXISTS","message":"Conversation 'gk3jK9mPq2xRt5vW8yZaBc' already has audio attached. Overwriting audio is not supported.","details":[{"field":"audio","description":"Audio already attached"}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"f52dc4b9-138e-4eb3-87a1-a22e87d2c0aa":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Error code","enum":["INVALID_ARGUMENT","UNAUTHENTICATED","NOT_FOUND","ALREADY_EXISTS","PAYLOAD_TOO_LARGE","INTERNAL_ERROR"],"example":"INVALID_ARGUMENT","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable error message","example":"Missing required input data","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"Field that caused the error","example":"transcript","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"description":{"type":"string","description":"Detailed description of the error","example":"At least one of transcript, audio, or audio_url must be provided","uniqueKey":"error.details.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"description":"Additional error details","default":[],"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"INTERNAL_ERROR","message":"An internal error occurred while processing the request","details":[]}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"INTERNAL_ERROR","message":"An internal error occurred while processing the request","details":[]}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"b6070fd3-c63f-4d34-bf38-d22958a77acb":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key for authentication.\n","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"933594b5-10b9-4aba-bd75-1c97ffb042a1":{"url":"https://api.coval.dev/v1","description":"Production API"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key for authentication.\n","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"X-API-Key","type":"string","description":"API key for authentication.\n","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"X-API-Key"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"api-reference/v1/conversations-v1.yaml"},"subdomain":"coval-2e18a559","siteName":"Coval Documentation","title":"Attach audio, add metadata, or assign an agent to a conversation - Coval Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T21:46:40.064Z","originalFileLocation":"api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Attach an audio recording, add metadata keys, or assign an agent to a conversation previously submitted via POST /v1/conversations/uploaded:submit. When to attach audio Use this endpoint when your recording URL is not available at the moment the call ends (for example, Twilio Programmable Voice recordings that are only fetchable after an asynchronous job completes ~60 seconds later). Submit the transcript immediately at call end to get a conversation_id for trace correlation, then PATCH the audio when the recording URL is ready. Attaching audio triggers audio-dependent metrics as a second wave. When to add metadata Use this endpoint when a value you want to filter or segment on is only known after the call was submitted (for example, an outcome produced by post-call analysis). Once added, the key is immediately available as a filter on the Uploaded Conversations page and in the filter parameter of GET /v1/conversations/uploaded. Two-wave metric timing - Text-only metrics fire immediately after POST /v1/conversations/uploaded:submit and deliver their results via your configured webhook. - Audio-dependent metrics fire after an audio PATCH and deliver a separate, later webhook. Configure your consumer to expect both waves. Adding metadata does not run or re-run any metric. If a metric depends on a key you added, rerun it with POST /v1/conversations/simulated:rerunMetrics. When to assign an agent Use agent_id when a conversation was submitted without one and you later know which agent handled it. The conversation then appears under that agent on the Uploaded Conversations page, in agent filters, and in agent-scoped metric aggregates. Assigning an agent does not run or re-run any metric. One-shot Every patch target is write-once. Audio can be attached only once per conversation; a second PATCH on a conversation that already has audio returns 409 ALREADY_EXISTS. Metadata is additive only; patching a key that already has a value returns 409 ALREADY_EXISTS. An agent can be assigned only to a conversation that has none; repeating the current agent succeeds without change, and a different agent returns 409 ALREADY_EXISTS. Body Exactly one of audio, audio_url, metadata or agent_id is required.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Coval Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Attach audio, add metadata, or assign an agent to a conversation - Coval Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Attach an audio recording, add metadata keys, or assign an agent to a conversation previously submitted via POST /v1/conversations/uploaded:submit. When to attach audio Use this endpoint when your recording URL is not available at the moment the call ends (for example, Twilio Programmable Voice recordings that are only fetchable after an asynchronous job completes ~60 seconds later). Submit the transcript immediately at call end to get a conversation_id for trace correlation, then PATCH the audio when the recording URL is ready. Attaching audio triggers audio-dependent metrics as a second wave. When to add metadata Use this endpoint when a value you want to filter or segment on is only known after the call was submitted (for example, an outcome produced by post-call analysis). Once added, the key is immediately available as a filter on the Uploaded Conversations page and in the filter parameter of GET /v1/conversations/uploaded. Two-wave metric timing - Text-only metrics fire immediately after POST /v1/conversations/uploaded:submit and deliver their results via your configured webhook. - Audio-dependent metrics fire after an audio PATCH and deliver a separate, later webhook. Configure your consumer to expect both waves. Adding metadata does not run or re-run any metric. If a metric depends on a key you added, rerun it with POST /v1/conversations/simulated:rerunMetrics. When to assign an agent Use agent_id when a conversation was submitted without one and you later know which agent handled it. The conversation then appears under that agent on the Uploaded Conversations page, in agent filters, and in agent-scoped metric aggregates. Assigning an agent does not run or re-run any metric. One-shot Every patch target is write-once. Audio can be attached only once per conversation; a second PATCH on a conversation that already has audio returns 409 ALREADY_EXISTS. Metadata is additive only; patching a key that already has a value returns 409 ALREADY_EXISTS. An agent can be assigned only to a conversation that has none; repeating the current agent succeeds without change, and a different agent returns 409 ALREADY_EXISTS. Body Exactly one of audio, audio_url, metadata or agent_id is required.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Coval Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://coval-2e18a559.mintlify.app/_mintlify/api/og/v2?division=Uploaded+Conversations\u0026amp;title=Attach+audio%2C+add+metadata%2C+or+assign+an+agent+to+a+conversation\u0026amp;description=Attach+an+audio+recording%2C+add+metadata+keys%2C+or+assign+an+agent+to+a%0Aconversation+previously+submitted+via+%60POST+%2Fv1%2Fconversations%2Fuploaded%3Asubmit%60.%0A%0A**When+to\u0026amp;theme=6eac43fcf99f568552f38b9e\u0026amp;signature=0f0c2c65b1bc9d9dc5a1a38837af6e5aa25402e9ea5269d05565ae9d0c9c5dbc\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Attach audio, add metadata, or assign an agent to a conversation - Coval Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Attach an audio recording, add metadata keys, or assign an agent to a conversation previously submitted via POST /v1/conversations/uploaded:submit. When to attach audio Use this endpoint when your recording URL is not available at the moment the call ends (for example, Twilio Programmable Voice recordings that are only fetchable after an asynchronous job completes ~60 seconds later). Submit the transcript immediately at call end to get a conversation_id for trace correlation, then PATCH the audio when the recording URL is ready. Attaching audio triggers audio-dependent metrics as a second wave. When to add metadata Use this endpoint when a value you want to filter or segment on is only known after the call was submitted (for example, an outcome produced by post-call analysis). Once added, the key is immediately available as a filter on the Uploaded Conversations page and in the filter parameter of GET /v1/conversations/uploaded. Two-wave metric timing - Text-only metrics fire immediately after POST /v1/conversations/uploaded:submit and deliver their results via your configured webhook. - Audio-dependent metrics fire after an audio PATCH and deliver a separate, later webhook. Configure your consumer to expect both waves. Adding metadata does not run or re-run any metric. If a metric depends on a key you added, rerun it with POST /v1/conversations/simulated:rerunMetrics. When to assign an agent Use agent_id when a conversation was submitted without one and you later know which agent handled it. The conversation then appears under that agent on the Uploaded Conversations page, in agent filters, and in agent-scoped metric aggregates. Assigning an agent does not run or re-run any metric. One-shot Every patch target is write-once. Audio can be attached only once per conversation; a second PATCH on a conversation that already has audio returns 409 ALREADY_EXISTS. Metadata is additive only; patching a key that already has a value returns 409 ALREADY_EXISTS. An agent can be assigned only to a conversation that has none; repeating the current agent succeeds without change, and a different agent returns 409 ALREADY_EXISTS. Body Exactly one of audio, audio_url, metadata or agent_id is required.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://coval-2e18a559.mintlify.app/_mintlify/api/og/v2?division=Uploaded+Conversations\u0026amp;title=Attach+audio%2C+add+metadata%2C+or+assign+an+agent+to+a+conversation\u0026amp;description=Attach+an+audio+recording%2C+add+metadata+keys%2C+or+assign+an+agent+to+a%0Aconversation+previously+submitted+via+%60POST+%2Fv1%2Fconversations%2Fuploaded%3Asubmit%60.%0A%0A**When+to\u0026amp;theme=6eac43fcf99f568552f38b9e\u0026amp;signature=0f0c2c65b1bc9d9dc5a1a38837af6e5aa25402e9ea5269d05565ae9d0c9c5dbc\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/coval-2e18a559/vkF1RiAFS33s2q-K/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Coval Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.coval.ai/#organization\",\"name\":\"Coval Documentation\",\"url\":\"https://docs.coval.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/coval-2e18a559/Notp6opJUCHArykW/logo/coval-logo-vector.svg?fit=max\u0026auto=format\u0026n=Notp6opJUCHArykW\u0026q=85\u0026s=f08474458e9c5bbff1e1d7119fdc8012\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.coval.ai#website\",\"name\":\"Coval Documentation\",\"url\":\"https://docs.coval.ai\",\"publisher\":{\"@id\":\"https://docs.coval.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation#webpage\",\"url\":\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation\",\"name\":\"Attach audio, add metadata, or assign an agent to a conversation\",\"description\":\"Attach an audio recording, add metadata keys, or assign an agent to a conversation previously submitted via POST /v1/conversations/uploaded:submit. When to attach audio Use this endpoint when your recording URL is not available at the moment the call ends (for example, Twilio Programmable Voice recordings that are only fetchable after an asynchronous job completes ~60 seconds later). Submit the transcript immediately at call end to get a conversation_id for trace correlation, then PATCH the audio when the recording URL is ready. Attaching audio triggers audio-dependent metrics as a second wave. When to add metadata Use this endpoint when a value you want to filter or segment on is only known after the call was submitted (for example, an outcome produced by post-call analysis). Once added, the key is immediately available as a filter on the Uploaded Conversations page and in the filter parameter of GET /v1/conversations/uploaded. Two-wave metric timing - Text-only metrics fire immediately after POST /v1/conversations/uploaded:submit and deliver their results via your configured webhook. - Audio-dependent metrics fire after an audio PATCH and deliver a separate, later webhook. Configure your consumer to expect both waves. Adding metadata does not run or re-run any metric. If a metric depends on a key you added, rerun it with POST /v1/conversations/simulated:rerunMetrics. When to assign an agent Use agent_id when a conversation was submitted without one and you later know which agent handled it. The conversation then appears under that agent on the Uploaded Conversations page, in agent filters, and in agent-scoped metric aggregates. Assigning an agent does not run or re-run any metric. One-shot Every patch target is write-once. Audio can be attached only once per conversation; a second PATCH on a conversation that already has audio returns 409 ALREADY_EXISTS. Metadata is additive only; patching a key that already has a value returns 409 ALREADY_EXISTS. An agent can be assigned only to a conversation that has none; repeating the current agent succeeds without change, and a different agent returns 409 ALREADY_EXISTS. Body Exactly one of audio, audio_url, metadata or agent_id is required.\",\"dateModified\":\"2026-10-28T21:46:40.064Z\",\"isPartOf\":{\"@id\":\"https://docs.coval.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Uploaded Conversations\",\"item\":\"https://docs.coval.ai/api-reference/audio/upload-audio\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Attach audio, add metadata, or assign an agent to a conversation\",\"item\":\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation#apireference\",\"headline\":\"Attach audio, add metadata, or assign an agent to a conversation\",\"name\":\"Attach audio, add metadata, or assign an agent to a conversation\",\"description\":\"Attach an audio recording, add metadata keys, or assign an agent to a conversation previously submitted via POST /v1/conversations/uploaded:submit. When to attach audio Use this endpoint when your recording URL is not available at the moment the call ends (for example, Twilio Programmable Voice recordings that are only fetchable after an asynchronous job completes ~60 seconds later). Submit the transcript immediately at call end to get a conversation_id for trace correlation, then PATCH the audio when the recording URL is ready. Attaching audio triggers audio-dependent metrics as a second wave. When to add metadata Use this endpoint when a value you want to filter or segment on is only known after the call was submitted (for example, an outcome produced by post-call analysis). Once added, the key is immediately available as a filter on the Uploaded Conversations page and in the filter parameter of GET /v1/conversations/uploaded. Two-wave metric timing - Text-only metrics fire immediately after POST /v1/conversations/uploaded:submit and deliver their results via your configured webhook. - Audio-dependent metrics fire after an audio PATCH and deliver a separate, later webhook. Configure your consumer to expect both waves. Adding metadata does not run or re-run any metric. If a metric depends on a key you added, rerun it with POST /v1/conversations/simulated:rerunMetrics. When to assign an agent Use agent_id when a conversation was submitted without one and you later know which agent handled it. The conversation then appears under that agent on the Uploaded Conversations page, in agent filters, and in agent-scoped metric aggregates. Assigning an agent does not run or re-run any metric. One-shot Every patch target is write-once. Audio can be attached only once per conversation; a second PATCH on a conversation that already has audio returns 409 ALREADY_EXISTS. Metadata is additive only; patching a key that already has a value returns 409 ALREADY_EXISTS. An agent can be assigned only to a conversation that has none; repeating the current agent succeeds without change, and a different agent returns 409 ALREADY_EXISTS. Body Exactly one of audio, audio_url, metadata or agent_id is required.\",\"url\":\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation\",\"mainEntityOfPage\":{\"@id\":\"https://docs.coval.ai/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation#webpage\"},\"dateModified\":\"2026-10-28T21:46:40.064Z\",\"publisher\":{\"@id\":\"https://docs.coval.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.coval.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Coval Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Coval Documentation","nav":{"global":null,"tabs":[{"tab":"Home","icon":"house","pages":[{"title":"Home","href":"/welcome"}]},{"tab":"API","icon":"square-terminal","groups":[{"group":"API","pages":[{"sidebarTitle":"Introduction","title":"API Reference","href":"/api-reference/v1/introduction"},{"title":"Conversation API compatibility","sidebarTitle":"Conversation compatibility","href":"/api-reference/v1/conversations-compatibility"}]},{"group":"Runs","icon":"play","pages":[{"title":"List runs","deprecated":null,"version":null,"openapi":"/api-reference/v1/runs-v1.yaml get /runs","href":"/api-reference/runs/list-runs"},{"title":"Launch run","deprecated":null,"version":null,"openapi":"/api-reference/v1/runs-v1.yaml post /runs","href":"/api-reference/runs/launch-run"},{"title":"Get run","deprecated":null,"version":null,"openapi":"/api-reference/v1/runs-v1.yaml get /runs/{run_id}","href":"/api-reference/runs/get-run"},{"title":"Update run","deprecated":null,"version":null,"openapi":"/api-reference/v1/runs-v1.yaml patch /runs/{run_id}","href":"/api-reference/runs/update-run"},{"title":"Delete run","deprecated":null,"version":null,"openapi":"/api-reference/v1/runs-v1.yaml delete /runs/{run_id}","href":"/api-reference/runs/delete-run"},{"title":"List run tag values","deprecated":null,"version":null,"openapi":"/api-reference/v1/runs-v1.yaml get /runs/tags","href":"/api-reference/runs/list-run-tag-values"}]},{"group":"Simulated Conversations","icon":"rocket","pages":[{"title":"List simulations","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /conversations/simulated","href":"/api-reference/simulated-conversations/list-simulations"},{"title":"Get simulation","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /conversations/simulated/{simulation_id}","href":"/api-reference/simulated-conversations/get-simulation"},{"title":"Update simulation","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml patch /conversations/simulated/{simulation_id}","href":"/api-reference/simulated-conversations/update-simulation"},{"title":"Delete or cancel simulation","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml delete /conversations/simulated/{simulation_id}","href":"/api-reference/simulated-conversations/delete-or-cancel-simulation"},{"title":"Batch rerun metrics","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml post /conversations/simulated:rerunMetrics","href":"/api-reference/simulated-conversations/batch-rerun-metrics"},{"title":"Discover SDK WebSocket connection","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /simulations/{simulation_id}/connect","href":"/api-reference/simulated-conversations/discover-sdk-websocket-connection"},{"title":"Rerun a simulation","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml post /conversations/simulated/{simulation_id}/resimulate","href":"/api-reference/simulated-conversations/rerun-a-simulation"},{"title":"Get audio file URL","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /conversations/simulated/{simulation_id}/audio","href":"/api-reference/simulated-conversations/get-audio-file-url"},{"title":"Retrieve a named simulation attribute","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /simulations/{simulation_id}/attributes/{attribute_name}","href":"/api-reference/simulated-conversations/retrieve-a-named-simulation-attribute"},{"group":"Metric Outputs","pages":[{"title":"List metrics","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /conversations/simulated/{simulation_id}/metrics","href":"/api-reference/metric-outputs/list-metrics"},{"title":"Get simulation metric output(s)","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /conversations/simulated/{simulation_id}/metrics/{metric_output_id}","href":"/api-reference/metric-outputs/get-simulation-metric-outputs"}]},{"group":"Conversation Comments","pages":[{"title":"List simulated conversation comments","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /conversations/simulated/{conversation_id}/comments","href":"/api-reference/conversation-comments/list-simulated-conversation-comments"},{"title":"Get a simulated conversation comment","deprecated":null,"version":null,"openapi":"/api-reference/v1/simulations-v1.yaml get /conversations/simulated/{conversation_id}/comments/{comment_id}","href":"/api-reference/conversation-comments/get-a-simulated-conversation-comment"}]}]},{"group":"Uploaded Conversations","icon":"messages","pages":[{"title":"Upload audio","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml post /audio:upload","href":"/api-reference/audio/upload-audio"},{"title":"Submit conversation for evaluation","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml post /conversations/uploaded:submit","href":"/api-reference/uploaded-conversations/submit-conversation-for-evaluation"},{"title":"List conversations","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml get /conversations/uploaded","href":"/api-reference/uploaded-conversations/list-conversations"},{"title":"Get conversation details","description":"Retrieve detailed information about a specific conversation in the authenticated workspace.\nConversations in another workspace return 404. Only the default workspace can include\nlegacy conversations without a workspace.\n","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml get /conversations/uploaded/{conversation_id}","href":"/api-reference/uploaded-conversations/get-conversation-details"},{"title":"Attach audio, add metadata, or assign an agent to a conversation","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml patch /conversations/uploaded/{conversation_id}","href":"/api-reference/uploaded-conversations/attach-audio-add-metadata-or-assign-an-agent-to-a-conversation"},{"title":"Delete or cancel conversation","description":"Delete or cancel a conversation evaluation.\n","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml delete /conversations/uploaded/{conversation_id}","href":"/api-reference/uploaded-conversations/delete-or-cancel-conversation"},{"title":"Get conversation audio","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml get /conversations/uploaded/{conversation_id}/audio","href":"/api-reference/audio/get-conversation-audio"},{"group":"Metrics","pages":[{"title":"List conversation metrics","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml get /conversations/uploaded/{conversation_id}/metrics","href":"/api-reference/uploaded-conversations/list-conversation-metrics"},{"title":"Get conversation metric output(s)","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml get /conversations/uploaded/{conversation_id}/metrics/{metric_output_id}","href":"/api-reference/uploaded-conversations/get-conversation-metric-outputs"}]},{"group":"Conversation Comments","pages":[{"title":"List uploaded conversation comments","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml get /conversations/uploaded/{conversation_id}/comments","href":"/api-reference/conversation-comments/list-uploaded-conversation-comments"},{"title":"Get a uploaded conversation comment","deprecated":null,"version":null,"openapi":"/api-reference/v1/conversations-v1.yaml get /conversations/uploaded/{conversation_id}/comments/{comment_id}","href":"/api-reference/conversation-comments/get-a-uploaded-conversation-comment"}]}]},{"group":"Agents","icon":"robot","pages":[{"title":"List agents","deprecated":null,"version":null,"openapi":"/api-reference/v1/agents-v1.yaml get /agents","href":"/api-reference/agents/list-agents"},{"title":"Connect an agent","deprecated":null,"version":null,"openapi":"/api-reference/v1/agents-v1.yaml post /agents","href":"/api-reference/agents/connect-an-agent"},{"title":"Get agent","deprecated":null,"version":null,"openapi":"/api-reference/v1/agents-v1.yaml get /agents/{agent_id}","href":"/api-reference/agents/get-agent"},{"title":"Update agent","deprecated":null,"version":null,"openapi":"/api-reference/v1/agents-v1.yaml patch /agents/{agent_id}","href":"/api-reference/agents/update-agent"},{"title":"Delete agent","deprecated":null,"version":null,"openapi":"/api-reference/v1/agents-v1.yaml delete /agents/{agent_id}","href":"/api-reference/agents/delete-agent"},{"title":"Duplicate an agent","deprecated":null,"version":null,"openapi":"/api-reference/v1/agents-v1.yaml post /agents/{agent_id}/duplicate","href":"/api-reference/agents/duplicate-an-agent"},{"group":"Versions","pages":[{"title":"List agent versions","deprecated":null,"version":null,"openapi":"/api-reference/v1/agents-v1.yaml get /agents/{agent_id}/versions","href":"/api-reference/agents/list-agent-versions"},{"title":"Revert agent version","deprecated":null,"version":null,"openapi":"/api-reference/v1/agents-v1.yaml post /agents/{agent_id}/versions/{version_id}/revert","href":"/api-reference/agents/revert-agent-version"}]}]},{"group":"Mutations","icon":"flask-vial","pages":[{"title":"List mutations","deprecated":null,"version":null,"openapi":"/api-reference/v1/mutations-v1.yaml get /agents/{agent_id}/mutations","href":"/api-reference/mutations/list-mutations"},{"title":"Create mutation","deprecated":null,"version":null,"openapi":"/api-reference/v1/mutations-v1.yaml post /agents/{agent_id}/mutations","href":"/api-reference/mutations/create-mutation"},{"title":"Get mutation","deprecated":null,"version":null,"openapi":"/api-reference/v1/mutations-v1.yaml get /agents/{agent_id}/mutations/{mutation_id}","href":"/api-reference/mutations/get-mutation"},{"title":"Update mutation","deprecated":null,"version":null,"openapi":"/api-reference/v1/mutations-v1.yaml patch /agents/{agent_id}/mutations/{mutation_id}","href":"/api-reference/mutations/update-mutation"},{"title":"Delete mutation","deprecated":null,"version":null,"openapi":"/api-reference/v1/mutations-v1.yaml delete /agents/{agent_id}/mutations/{mutation_id}","href":"/api-reference/mutations/delete-mutation"}]},{"group":"Test Sets","icon":"database","pages":[{"title":"List test sets","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml get /test-sets","href":"/api-reference/test-sets/list-test-sets"},{"title":"Create test set","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml post /test-sets","href":"/api-reference/test-sets/create-test-set"},{"title":"Get test set","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml get /test-sets/{test_set_id}","href":"/api-reference/test-sets/get-test-set"},{"title":"Update test set","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml patch /test-sets/{test_set_id}","href":"/api-reference/test-sets/update-test-set"},{"title":"Delete test set","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml delete /test-sets/{test_set_id}","href":"/api-reference/test-sets/delete-test-set"},{"title":"Duplicate a test set","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml post /test-sets/{test_set_id}/duplicate","href":"/api-reference/test-sets/duplicate-a-test-set"},{"title":"Associate agents with a test set","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml post /test-sets/{test_set_id}/agents:add","href":"/api-reference/test-sets/associate-agents-with-a-test-set"},{"title":"List test set records","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml get /test-sets/{test_set_id}/records","href":"/api-reference/test-sets/list-test-set-records"},{"group":"Versions","pages":[{"title":"List test set versions","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml get /test-sets/{test_set_id}/versions","href":"/api-reference/test-sets/list-test-set-versions"},{"title":"Revert test set version","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml post /test-sets/{test_set_id}/versions/{version_id}/revert","href":"/api-reference/test-sets/revert-test-set-version"}]},{"group":"Agents","pages":[{"title":"List associated agents","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml get /test-sets/{test_set_id}/agents","href":"/api-reference/test-sets/list-associated-agents"},{"title":"Remove an agent association","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-sets-v1.yaml delete /test-sets/{test_set_id}/agents/{agent_id}","href":"/api-reference/test-sets/remove-an-agent-association"}]}]},{"group":"Test Cases","icon":"flask","pages":[{"title":"List test cases","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-cases-v1.yaml get /test-cases","href":"/api-reference/test-cases/list-test-cases"},{"title":"Create test case","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-cases-v1.yaml post /test-cases","href":"/api-reference/test-cases/create-test-case"},{"title":"Get test case","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-cases-v1.yaml get /test-cases/{test_case_id}","href":"/api-reference/test-cases/get-test-case"},{"title":"Update test case","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-cases-v1.yaml patch /test-cases/{test_case_id}","href":"/api-reference/test-cases/update-test-case"},{"title":"Delete test case","deprecated":null,"version":null,"openapi":"/api-reference/v1/test-cases-v1.yaml delete /test-cases/{test_case_id}","href":"/api-reference/test-cases/delete-test-case"}]},{"group":"Personas","icon":"circle-user","pages":[{"title":"List personas","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml get /personas","href":"/api-reference/personas/list-personas"},{"title":"Create persona","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml post /personas","href":"/api-reference/personas/create-persona"},{"title":"Get persona","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml get /personas/{persona_id}","href":"/api-reference/personas/get-persona"},{"title":"Update persona","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml patch /personas/{persona_id}","href":"/api-reference/personas/update-persona"},{"title":"Delete persona","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml delete /personas/{persona_id}","href":"/api-reference/personas/delete-persona"},{"title":"List background sounds","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml get /personas/background-sounds","href":"/api-reference/personas/list-background-sounds"},{"title":"Create background sound upload","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml post /personas/background-sounds","href":"/api-reference/personas/create-background-sound-upload"},{"title":"Update background sound","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml patch /personas/background-sounds/{background_sound_id}","href":"/api-reference/personas/update-background-sound"},{"title":"List phone number mappings","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml get /personas/phone-numbers","href":"/api-reference/personas/list-phone-number-mappings"},{"title":"List available voices","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml get /personas/voices","href":"/api-reference/personas/list-available-voices"},{"title":"List persona tag values","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml get /personas/tags","href":"/api-reference/personas/list-persona-tag-values"},{"title":"Duplicate a persona","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml post /personas/{persona_id}/duplicate","href":"/api-reference/personas/duplicate-a-persona"},{"title":"Complete background sound upload","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml post /personas/background-sounds/{background_sound_id}/complete","href":"/api-reference/personas/complete-background-sound-upload"},{"group":"Versions","pages":[{"title":"List persona versions","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml get /personas/{persona_id}/versions","href":"/api-reference/personas/list-persona-versions"},{"title":"Revert persona version","deprecated":null,"version":null,"openapi":"/api-reference/v1/personas-v1.yaml post /personas/{persona_id}/versions/{version_id}/revert","href":"/api-reference/personas/revert-persona-version"}]}]},{"group":"Metrics","icon":"ballot-check","pages":[{"title":"List metrics","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics","href":"/api-reference/metrics/list-metrics"},{"title":"Create metric","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics","href":"/api-reference/metrics/create-metric"},{"title":"List metric template variables","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/template-variables","href":"/api-reference/metrics/list-metric-template-variables"},{"title":"Get metric","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/{metric_id}","href":"/api-reference/metrics/get-metric"},{"title":"Update metric","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml patch /metrics/{metric_id}","href":"/api-reference/metrics/update-metric"},{"title":"Delete metric","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml delete /metrics/{metric_id}","href":"/api-reference/metrics/delete-metric"},{"title":"List recently-deleted metrics","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/recently-deleted","href":"/api-reference/metrics/list-recently-deleted-metrics"},{"title":"List available metric models","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /models/metric","href":"/api-reference/metrics/list-available-metric-models"},{"title":"List metric flows","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/flows","href":"/api-reference/metrics/list-metric-flows"},{"title":"Create a metric flow","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/flows","href":"/api-reference/metrics/create-a-metric-flow"},{"title":"Update a metric flow","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml patch /metrics/flows/{flow_id}","href":"/api-reference/metrics/update-a-metric-flow"},{"title":"Delete a metric flow","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml delete /metrics/flows/{flow_id}","href":"/api-reference/metrics/delete-a-metric-flow"},{"title":"Test a draft SQL metric query","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/sql:test","href":"/api-reference/metrics/test-a-draft-sql-metric-query"},{"title":"Get the SQL metric schema","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/sql-schema","href":"/api-reference/metrics/get-the-sql-metric-schema"},{"title":"Batch-get metric outputs by ULID","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/outputs:batchGet","href":"/api-reference/metrics/batch-get-metric-outputs-by-ulid"},{"title":"List metric tag values","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/tags","href":"/api-reference/metrics/list-metric-tag-values"},{"title":"Duplicate a metric","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/{metric_id}/duplicate","href":"/api-reference/metrics/duplicate-a-metric"},{"title":"Restore a recently-deleted metric","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/{metric_id}/restore","href":"/api-reference/metrics/restore-a-recently-deleted-metric"},{"title":"Trigger test metric execution","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/{metric_id}/test","href":"/api-reference/metrics/trigger-test-metric-execution"},{"group":"Versions","pages":[{"title":"List metric versions","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/{metric_id}/versions","href":"/api-reference/metrics/list-metric-versions"},{"title":"Revert metric version","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/{metric_id}/versions/{version_id}/revert","href":"/api-reference/metrics/revert-metric-version"}]},{"group":"Thresholds","pages":[{"title":"List metric thresholds","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/{metric_id}/thresholds","href":"/api-reference/metrics/list-metric-thresholds"},{"title":"Create metric threshold","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/{metric_id}/thresholds","href":"/api-reference/metrics/create-metric-threshold"},{"title":"Get metric threshold","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/{metric_id}/threshold","href":"/api-reference/metrics/get-metric-threshold"},{"title":"Update metric threshold","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml patch /metrics/{metric_id}/threshold","href":"/api-reference/metrics/update-metric-threshold"},{"title":"Delete metric threshold","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml delete /metrics/{metric_id}/thresholds/{threshold_id}","href":"/api-reference/metrics/delete-metric-threshold"}]},{"group":"Baselines","pages":[{"title":"List metric baselines","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/{metric_id}/baselines","href":"/api-reference/metrics/list-metric-baselines"},{"title":"Create metric baseline","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml post /metrics/{metric_id}/baselines","href":"/api-reference/metrics/create-metric-baseline"},{"title":"Get metric baseline","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/{metric_id}/baselines/{baseline_id}","href":"/api-reference/metrics/get-metric-baseline"},{"title":"Update metric baseline","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml patch /metrics/{metric_id}/baselines/{baseline_id}","href":"/api-reference/metrics/update-metric-baseline"},{"title":"Delete metric baseline","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml delete /metrics/{metric_id}/baselines/{baseline_id}","href":"/api-reference/metrics/delete-metric-baseline"},{"title":"Get baseline history","deprecated":null,"version":null,"openapi":"/api-reference/v1/metrics-v1.yaml get /metrics/{metric_id}/baselines/{baseline_id}/history","href":"/api-reference/metrics/get-baseline-history"}]}]},{"group":"Run Templates","icon":"puzzle-piece","pages":[{"title":"List run templates","deprecated":null,"version":null,"openapi":"/api-reference/v1/run-templates-v1.yaml get /run-templates","href":"/api-reference/run-templates/list-run-templates"},{"title":"Create run template","deprecated":null,"version":null,"openapi":"/api-reference/v1/run-templates-v1.yaml post /run-templates","href":"/api-reference/run-templates/create-run-template"},{"title":"Get run template","deprecated":null,"version":null,"openapi":"/api-reference/v1/run-templates-v1.yaml get /run-templates/{run_template_id}","href":"/api-reference/run-templates/get-run-template"},{"title":"Update run template","deprecated":null,"version":null,"openapi":"/api-reference/v1/run-templates-v1.yaml patch /run-templates/{run_template_id}","href":"/api-reference/run-templates/update-run-template"},{"title":"Delete run template","deprecated":null,"version":null,"openapi":"/api-reference/v1/run-templates-v1.yaml delete /run-templates/{run_template_id}","href":"/api-reference/run-templates/delete-run-template"}]},{"group":"Scheduled Runs","icon":"clock","pages":[{"title":"List scheduled runs","deprecated":null,"version":null,"openapi":"/api-reference/v1/scheduled-runs-v1.yaml get /scheduled-runs","href":"/api-reference/scheduled-runs/list-scheduled-runs"},{"title":"Create scheduled run","deprecated":null,"version":null,"openapi":"/api-reference/v1/scheduled-runs-v1.yaml post /scheduled-runs","href":"/api-reference/scheduled-runs/create-scheduled-run"},{"title":"Get scheduled run","deprecated":null,"version":null,"openapi":"/api-reference/v1/scheduled-runs-v1.yaml get /scheduled-runs/{scheduled_run_id}","href":"/api-reference/scheduled-runs/get-scheduled-run"},{"title":"Update scheduled run","deprecated":null,"version":null,"openapi":"/api-reference/v1/scheduled-runs-v1.yaml patch /scheduled-runs/{scheduled_run_id}","href":"/api-reference/scheduled-runs/update-scheduled-run"},{"title":"Delete scheduled run","deprecated":null,"version":null,"openapi":"/api-reference/v1/scheduled-runs-v1.yaml delete /scheduled-runs/{scheduled_run_id}","href":"/api-reference/scheduled-runs/delete-scheduled-run"},{"title":"List a scheduled run's produced runs","deprecated":null,"version":null,"openapi":"/api-reference/v1/scheduled-runs-v1.yaml get /scheduled-runs/{scheduled_run_id}/runs","href":"/api-reference/scheduled-runs/list-a-scheduled-runs-produced-runs"}]},{"group":"Reviews","icon":"clipboard-check","pages":[{"title":"List review annotations","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml get /review-annotations","href":"/api-reference/review-annotations/list-review-annotations"},{"title":"Create review annotation","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml post /review-annotations","href":"/api-reference/review-annotations/create-review-annotation"},{"title":"Get review annotation","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml get /review-annotations/{annotation_id}","href":"/api-reference/review-annotations/get-review-annotation"},{"title":"Update review annotation","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml patch /review-annotations/{annotation_id}","href":"/api-reference/review-annotations/update-review-annotation"},{"title":"Delete review annotation","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml delete /review-annotations/{annotation_id}","href":"/api-reference/review-annotations/delete-review-annotation"},{"title":"List review projects","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml get /review-projects","href":"/api-reference/review-projects/list-review-projects"},{"title":"Create review project","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml post /review-projects","href":"/api-reference/review-projects/create-review-project"},{"title":"Get review project","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml get /review-projects/{project_id}","href":"/api-reference/review-projects/get-review-project"},{"title":"Update review project","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml patch /review-projects/{project_id}","href":"/api-reference/review-projects/update-review-project"},{"title":"Delete review project","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml delete /review-projects/{project_id}","href":"/api-reference/review-projects/delete-review-project"},{"title":"Get review disagreement state","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml post /review-projects/disagreement-state","href":"/api-reference/review-projects/get-review-disagreement-state"},{"title":"Get metric health stats","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml get /review-annotations/metric-health-stats","href":"/api-reference/review-annotations/get-metric-health-stats"},{"title":"Get annotations with metric outputs","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml post /review-annotations:withMetricOutputs","href":"/api-reference/review-annotations/get-annotations-with-metric-outputs"},{"title":"Get project metric agreement","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml get /review-projects/{project_id}/metric-agreement","href":"/api-reference/review-projects/get-project-metric-agreement"},{"title":"Get review project progress","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml get /review-projects/{project_id}/progress","href":"/api-reference/review-projects/get-review-project-progress"},{"title":"Get project insights","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml get /review-projects/{project_id}/insights","href":"/api-reference/review-projects/get-project-insights"},{"title":"Complete a review-project conversation","deprecated":null,"version":null,"openapi":"/api-reference/v1/reviews-v1.yaml post /review-projects/{project_id}/complete-conversation","href":"/api-reference/review-projects/complete-a-review-project-conversation"}]},{"group":"Dashboards","icon":"chart-line","pages":[{"title":"List dashboards","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml get /dashboards","href":"/api-reference/dashboards/list-dashboards"},{"title":"Create dashboard","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml post /dashboards","href":"/api-reference/dashboards/create-dashboard"},{"title":"Get dashboard","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml get /dashboards/{dashboard_id}","href":"/api-reference/dashboards/get-dashboard"},{"title":"Update dashboard","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml patch /dashboards/{dashboard_id}","href":"/api-reference/dashboards/update-dashboard"},{"title":"Delete dashboard","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml delete /dashboards/{dashboard_id}","href":"/api-reference/dashboards/delete-dashboard"},{"group":"Widgets","pages":[{"title":"List widgets","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml get /dashboards/{dashboard_id}/widgets","href":"/api-reference/widgets/list-widgets"},{"title":"Create widget","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml post /dashboards/{dashboard_id}/widgets","href":"/api-reference/widgets/create-widget"},{"title":"Get widget","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml get /dashboards/{dashboard_id}/widgets/{widget_id}","href":"/api-reference/widgets/get-widget"},{"title":"Update widget","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml patch /dashboards/{dashboard_id}/widgets/{widget_id}","href":"/api-reference/widgets/update-widget"},{"title":"Delete widget","deprecated":null,"version":null,"openapi":"/api-reference/v1/dashboards-v1.yaml delete /dashboards/{dashboard_id}/widgets/{widget_id}","href":"/api-reference/widgets/delete-widget"}]}]},{"group":"Alerts","icon":"bell","pages":[{"title":"List alerts","deprecated":null,"version":null,"openapi":"/api-reference/v1/alerts-v1.yaml get /alerts","href":"/api-reference/alerts/list-alerts"},{"title":"Create an alert","deprecated":null,"version":null,"openapi":"/api-reference/v1/alerts-v1.yaml post /alerts","href":"/api-reference/alerts/create-an-alert"},{"title":"Get an alert","deprecated":null,"version":null,"openapi":"/api-reference/v1/alerts-v1.yaml get /alerts/{alert_id}","href":"/api-reference/alerts/get-an-alert"},{"title":"Update an alert","deprecated":null,"version":null,"openapi":"/api-reference/v1/alerts-v1.yaml patch /alerts/{alert_id}","href":"/api-reference/alerts/update-an-alert"},{"title":"Delete an alert","deprecated":null,"version":null,"openapi":"/api-reference/v1/alerts-v1.yaml delete /alerts/{alert_id}","href":"/api-reference/alerts/delete-an-alert"},{"title":"List alert events","deprecated":null,"version":null,"openapi":"/api-reference/v1/alerts-v1.yaml get /alerts/{alert_id}/events","href":"/api-reference/alert-events/list-alert-events"},{"title":"Test evaluate an alert","deprecated":null,"version":null,"openapi":"/api-reference/v1/alerts-v1.yaml post /alerts/{alert_id}/test-evaluate","href":"/api-reference/alerts/test-evaluate-an-alert"}]},{"group":"Reports","icon":"file-chart-column","pages":[{"title":"List reports","deprecated":null,"version":null,"openapi":"/api-reference/v1/reports-v1.yaml get /reports","href":"/api-reference/reports/list-reports"},{"title":"Create report","deprecated":null,"version":null,"openapi":"/api-reference/v1/reports-v1.yaml post /reports","href":"/api-reference/reports/create-report"},{"title":"Get report","deprecated":null,"version":null,"openapi":"/api-reference/v1/reports-v1.yaml get /reports/{report_id}","href":"/api-reference/reports/get-report"},{"title":"Update report","deprecated":null,"version":null,"openapi":"/api-reference/v1/reports-v1.yaml patch /reports/{report_id}","href":"/api-reference/reports/update-report"},{"title":"Delete report","deprecated":null,"version":null,"openapi":"/api-reference/v1/reports-v1.yaml delete /reports/{report_id}","href":"/api-reference/reports/delete-report"},{"title":"List report rows","deprecated":null,"version":null,"openapi":"/api-reference/v1/reports-v1.yaml get /reports/{report_id}/rows","href":"/api-reference/reports/list-report-rows"}]},{"group":"Tags","icon":"tags","pages":[{"title":"List tags","deprecated":null,"version":null,"openapi":"/api-reference/v1/tags-v1.yaml get /tags","href":"/api-reference/tags/list-tags"},{"title":"Create tag","deprecated":null,"version":null,"openapi":"/api-reference/v1/tags-v1.yaml post /tags","href":"/api-reference/tags/create-tag"},{"title":"Get tag","deprecated":null,"version":null,"openapi":"/api-reference/v1/tags-v1.yaml get /tags/{tag_id}","href":"/api-reference/tags/get-tag"},{"title":"Update tag","deprecated":null,"version":null,"openapi":"/api-reference/v1/tags-v1.yaml patch /tags/{tag_id}","href":"/api-reference/tags/update-tag"},{"title":"Delete tag","deprecated":null,"version":null,"openapi":"/api-reference/v1/tags-v1.yaml delete /tags/{tag_id}","href":"/api-reference/tags/delete-tag"}]},{"group":"Webhooks","icon":"webhook","pages":[{"title":"List webhooks","deprecated":null,"version":null,"openapi":"/api-reference/v1/webhooks-v1.yaml get /webhooks","href":"/api-reference/webhooks/list-webhooks"},{"title":"Create a webhook","deprecated":null,"version":null,"openapi":"/api-reference/v1/webhooks-v1.yaml post /webhooks","href":"/api-reference/webhooks/create-a-webhook"},{"title":"Update a webhook","deprecated":null,"version":null,"openapi":"/api-reference/v1/webhooks-v1.yaml patch /webhooks/{webhook_id}","href":"/api-reference/webhooks/update-a-webhook"},{"title":"Delete a webhook","deprecated":null,"version":null,"openapi":"/api-reference/v1/webhooks-v1.yaml delete /webhooks/{webhook_id}","href":"/api-reference/webhooks/delete-a-webhook"}]},{"group":"Traces","icon":"bezier-curve","pages":[{"title":"Ingest OTLP traces","deprecated":null,"version":null,"openapi":"/api-reference/v1/traces-v1.yaml post /traces","href":"/api-reference/traces/ingest-otlp-traces"},{"title":"Search trace-bearing calls","deprecated":null,"version":null,"openapi":"/api-reference/v1/traces-v1.yaml post /traces/search","href":"/api-reference/traces/search-trace-bearing-calls"},{"title":"Inspect trace quality and signal coverage","deprecated":null,"version":null,"openapi":"/api-reference/v1/traces-v1.yaml get /traces/summary","href":"/api-reference/traces/inspect-trace-quality-and-signal-coverage"},{"title":"List trace spans for a simulation output","deprecated":null,"version":null,"openapi":"/api-reference/v1/traces-v1.yaml get /traces/spans","href":"/api-reference/traces/list-trace-spans-for-a-simulation-output"}]},{"group":"Conversations Config","icon":"building","pages":[{"title":"List organization users","deprecated":null,"version":null,"openapi":"/api-reference/v1/organization-v1.yaml get /organization/users","href":"/api-reference/organization-users/list-organization-users"},{"title":"Get conversation metrics config","deprecated":null,"version":null,"openapi":"/api-reference/v1/organization-v1.yaml get /organization/conversation-metrics","href":"/api-reference/organization-conversations-config/get-conversation-metrics-config"},{"title":"Update conversation metrics config","deprecated":null,"version":null,"openapi":"/api-reference/v1/organization-v1.yaml patch /organization/conversation-metrics","href":"/api-reference/organization-conversations-config/update-conversation-metrics-config"},{"title":"Get conversation metrics config using the legacy path","deprecated":true,"version":null,"openapi":"/api-reference/v1/organization-v1.yaml get /organization/monitoring-metrics","href":"/api-reference/organization-conversations-config/get-conversation-metrics-config-using-the-legacy-path"},{"title":"Update conversation metrics config using the legacy path","deprecated":true,"version":null,"openapi":"/api-reference/v1/organization-v1.yaml patch /organization/monitoring-metrics","href":"/api-reference/organization-conversations-config/update-conversation-metrics-config-using-the-legacy-path"}]},{"group":"API Keys","icon":"key","pages":[{"title":"List API keys","deprecated":null,"version":null,"openapi":"/api-reference/v1/api-keys-v1.yaml get /api-keys","href":"/api-reference/api-keys/list-api-keys"},{"title":"Create API key","deprecated":null,"version":null,"openapi":"/api-reference/v1/api-keys-v1.yaml post /api-keys","href":"/api-reference/api-keys/create-api-key"},{"title":"Update API key status","deprecated":null,"version":null,"openapi":"/api-reference/v1/api-keys-v1.yaml patch /api-keys/{api_key_id}","href":"/api-reference/api-keys/update-api-key-status"},{"title":"Delete API key","deprecated":null,"version":null,"openapi":"/api-reference/v1/api-keys-v1.yaml delete /api-keys/{api_key_id}","href":"/api-reference/api-keys/delete-api-key"}]},{"group":"Workspaces","icon":"layer-group","pages":[{"title":"List workspaces","deprecated":null,"version":null,"openapi":"/api-reference/v1/workspaces-v1.yaml get /workspaces","href":"/api-reference/workspaces/list-workspaces"},{"title":"Create workspace","deprecated":null,"version":null,"openapi":"/api-reference/v1/workspaces-v1.yaml post /workspaces","href":"/api-reference/workspaces/create-workspace"},{"title":"Get workspace","deprecated":null,"version":null,"openapi":"/api-reference/v1/workspaces-v1.yaml get /workspaces/{workspace_id}","href":"/api-reference/workspaces/get-workspace"},{"title":"Update workspace","deprecated":null,"version":null,"openapi":"/api-reference/v1/workspaces-v1.yaml patch /workspaces/{workspace_id}","href":"/api-reference/workspaces/update-workspace"},{"title":"Delete workspace","deprecated":null,"version":null,"openapi":"/api-reference/v1/workspaces-v1.yaml delete /workspaces/{workspace_id}","href":"/api-reference/workspaces/delete-workspace"},{"title":"Archive workspace","deprecated":null,"version":null,"openapi":"/api-reference/v1/workspaces-v1.yaml post /workspaces/{workspace_id}/archive","href":"/api-reference/workspaces/archive-workspace"}]},{"group":"Integrations","icon":"plug","pages":[{"title":"Get Slack integration status","deprecated":null,"version":null,"openapi":"/api-reference/v1/slack-v1.yaml get /integrations/slack","href":"/api-reference/integrations/get-slack-integration-status"},{"title":"Disconnect Slack integration","deprecated":null,"version":null,"openapi":"/api-reference/v1/slack-v1.yaml delete /integrations/slack","href":"/api-reference/integrations/disconnect-slack-integration"},{"title":"Connect a Slack workspace","deprecated":null,"version":null,"openapi":"/api-reference/v1/slack-v1.yaml post /integrations/slack/connect","href":"/api-reference/integrations/connect-a-slack-workspace"}]}]},{"tab":"CLI","icon":"terminal","pages":[{"title":"CLI","href":"/cli/overview"}]},{"tab":"Developers","icon":"code","pages":[{"title":"Developers","href":"/sdks/overview"}]},{"tab":"Agents","icon":"microchip","pages":[{"title":"Agents","href":"/agents/overview"}]},{"tab":"Connectors","icon":"diagram-project","pages":[{"title":"Connectors","href":"/mcp/overview"}]}]},"title":"Attach audio, add metadata, or assign an agent to a conversation - Coval Documentation","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DmVyH30O.js","utils-BHQqGGOd.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CD-E4BIt.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp5Lq9Ds.js","snippetPresets-C4xAVCFP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CgXVLxUC.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BF8I5oUf.js","shallow-Byd0lWnC.js","getApiPlaygroundDisplay-BGOZG1OK.js","CodeSnippet-CpvQL0CY.js","CodeSnippets-B8wkBKXa.js","Page-CBCH2P7b.js","getPastedJson-Ry3scI3Y.js","icon-D7a9HcdD.js","MethodPill-CJ8pmHhz.js","DuplicateIcon-rh1HJF0t.js","createIcon-DvGznqYs.js","DynamicMarkdown-Cc6AuSHS.js","SectionHeading-B4A0S-ep.js","axios-vUo_bRtp.js","Markdown-Cc16CX65.js","clsx-Cs6nMGht.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-zbf22OZA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-C_fs-y5n.js"]}