Overview
Some of the most useful things you can know about a call are not known when the call ends. A post-call classifier finishes a few minutes later. A quality workflow assigns a disposition. A downstream system records whether the customer called back.PATCH /v1/conversations/{conversation_id} lets you add those values to a conversation that already exists. Once a key is added, it is immediately available as a filter on the Conversations page and in the filter parameter of GET /v1/conversations, so you can compare metric results between segments — for example, how your agent scored on calls where called_back = 1 against calls where it is 0.
This is the same endpoint used to attach audio after a call, and it follows the same shape: submit what you have at call end, add the rest when it arrives.
The two-call flow
1
Submit the conversation at call end
POST /v1/conversations:submit returns a conversation_id synchronously. Send whatever metadata you already have.conversation_id.2
Add the new values when your analysis completes
PATCH /v1/conversations/{conversation_id} with a metadata object. The keys are merged into the metadata already on the conversation.channel, queue, called_back, csat_bucket and resolved_intent, and every one of them is filterable.Filtering on what you added
Added keys behave exactly like metadata sent at submit time.- On the Conversations page, the key appears in the metadata filter and can be combined with metric, agent and date filters.
-
Through the API, filter with
metadata.<key>:
Metrics are not re-run
Adding metadata does not run or re-run any metric. This is deliberate: the common case is enrichment for filtering, and re-running evaluation on every metadata write would be surprising and expensive. If you have a metric that depends on a key you added — for example, an LLM judge whose prompt references{{customer_metadata.resolved_intent}} — rerun it explicitly after the PATCH lands:
A metric whose prompt references a metadata key that is not present fails for that conversation. If a metric depends on a delayed value, expect it to fail on the first pass and succeed on the rerun after the metadata is added.
Additive only
Metadata is write-once per key. You can keep adding new keys to a conversation, but you cannot change a key that already has a value.- Adding a key that is not yet present succeeds.
- Patching a key that already holds a value returns
409 ALREADY_EXISTS, and nothing is written. - A stored
0,""ornullcounts as a value. It is a set key, not an empty slot.
external_conversation_id.
Keys you cannot set
Some metadata keys identify the conversation rather than describe it, and are rejected with400 INVALID_ARGUMENT:
conversation_id, external_conversation_id, call_id, trace_id, langfuse_trace_id, observation_id, langfuse_observation_id, project_id, environment, occurred_at
Set these when you submit the conversation.
Limits
- One patch target per request. Send
metadataor an audio field, not both. Use two calls if you need to do both. - At most 100 keys per request; key names are limited to 200 characters.
- Values may be strings, numbers, booleans, arrays or objects.