Production Evals
Define eval criteria for production calls and evaluate completed calls against them.
Production evals let you run the same assertion and metric checks used in simulations against your workspace's live completed calls. You define eval definitions (what to check), evaluate completed calls on demand, and retrieve the verdicts.
Metric evals reference metrics defined in the metric store, so define the metric there first:
Production Eval Definitions
A production eval definition specifies an eval that runs against live calls. Definitions can be scoped to a specific service or applied workspace-wide (service ID omitted). When a call is evaluated, workspace-wide definitions apply to all calls, and service-scoped definitions apply only to calls handled by that service. If both a workspace-wide and a service-scoped definition share the same eval key, the service-scoped definition takes priority for that service's calls.
Create a Production Eval Definition
Create a production eval definition.
metric_key must name an active ai_query metric on call_intelligence in
this workspace's metric settings; any other key returns 422.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
trueSuccessful Response
An eval (assertion or metric-eval) that runs against a workspace's live
calls — the production analogue of a sim case's evals. service_id
None applies to every service in the workspace. expected is JSON: a
phrase string for assertions, or a {gte|lte|equals|...} threshold for
metric-evals.
trueValidation Error
POST /v1/{workspace_id}/production-eval-definitions HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 190
{
"eval_key": "text",
"eval_type": "metric",
"service_id": "123e4567-e89b-12d3-a456-426614174000",
"metric_key": "text",
"expected": null,
"params": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"active": true
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"service_id": "123e4567-e89b-12d3-a456-426614174000",
"eval_key": "text",
"eval_type": "assertion",
"assertion_kind": "text",
"metric_key": "text",
"expected": null,
"params": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"active": true,
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Creates a new production eval definition.
Errors:
409 Conflict- A definition with this eval key already exists in this scope422 Unprocessable Entity- Validation error (e.g.metrictype withoutmetric_key, orservice_idnot in this workspace)
List Production Eval Definitions
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
[]50Successful Response
Validation Error
GET /v1/{workspace_id}/production-eval-definitions HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"items": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"service_id": "123e4567-e89b-12d3-a456-426614174000",
"eval_key": "text",
"eval_type": "assertion",
"assertion_kind": "text",
"metric_key": "text",
"expected": null,
"params": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"active": true,
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}
],
"has_more": true,
"continuation_token": null
}Returns a paginated list of production eval definitions.
Get a Production Eval Definition
The separate single-definition read endpoint has been removed. Read definition records through the list operation above; updates and deletion still use the definition identifier.
Update a Production Eval Definition
Update a production eval definition.
A patch that sets metric_key or eval_type, or sets active to
true, re-checks the metric: a metric eval must name an active ai_query
metric on call_intelligence, else 422. Clearing metric_key on a metric
eval also returns 422. Any other patch, including active: false,
leaves the stored key alone.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
An eval (assertion or metric-eval) that runs against a workspace's live
calls — the production analogue of a sim case's evals. service_id
None applies to every service in the workspace. expected is JSON: a
phrase string for assertions, or a {gte|lte|equals|...} threshold for
metric-evals.
trueValidation Error
PATCH /v1/{workspace_id}/production-eval-definitions/{definition_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 217
{
"service_id": "123e4567-e89b-12d3-a456-426614174000",
"eval_key": "text",
"eval_type": "assertion",
"assertion_kind": "text",
"metric_key": "text",
"expected": null,
"params": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"active": true
}{
"id": "123e4567-e89b-12d3-a456-426614174000",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"service_id": "123e4567-e89b-12d3-a456-426614174000",
"eval_key": "text",
"eval_type": "assertion",
"assertion_kind": "text",
"metric_key": "text",
"expected": null,
"params": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"active": true,
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Partial update. Include only the fields you want to change.
Errors:
404 Not Found- Definition does not exist409 Conflict- Update would create a duplicate eval key in this scope422 Unprocessable Entity- No fields provided, orservice_idnot in this workspace
Delete a Production Eval Definition
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
No content
Validation Error
DELETE /v1/{workspace_id}/production-eval-definitions/{definition_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
Evaluating a Call
Run the workspace's active eval definitions against one completed call and persist the verdicts. Synchronous (the caller waits on the judge); the eager post-call trigger is a separate change.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Validation Error
POST /v1/{workspace_id}/calls/{conversation_id}/evaluate HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"conversation_id": "123e4567-e89b-12d3-a456-426614174000",
"results": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"service_id": "123e4567-e89b-12d3-a456-426614174000",
"conversation_id": "123e4567-e89b-12d3-a456-426614174000",
"call_sid": "text",
"eval_key": "text",
"eval_type": "assertion",
"assertion_kind": "text",
"metric_key": "text",
"status": "passed",
"passed": true,
"score": 1,
"expected": null,
"actual": null,
"rationale": "text",
"justification": "text",
"cited_turns": [],
"computed_at": "2026-01-01T00:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z"
}
]
}Runs all active production eval definitions against one completed call and persists the verdicts. The call must exist in the workspace. Definitions scoped to the call's service and workspace-wide definitions are both applied. If a workspace-wide and a service-scoped definition share the same eval key, the service-scoped definition takes priority.
This endpoint is synchronous - the caller waits while the eval judge processes. Assertion evals (transcript contains, tool called, final state) are deterministic and fast. AI judge assertions and metric evals invoke an AI model and may take several seconds per eval.
Re-evaluating a call overwrites prior verdicts for the same eval keys rather than creating duplicates.
Errors:
404 Not Found- Conversation does not exist in this workspace
Notes:
An empty
resultsarray means the call was found but no active definitions apply to it.Each eval definition that encounters an error (e.g. AI model unavailable) produces an individual
errorstatus verdict rather than failing the entire evaluation.
Retrieving Call Eval Results
A call's verdicts. Empty when the call exists but hasn't been evaluated; 404 when it doesn't exist.
API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.
Successful Response
Conversation not found
Validation Error
GET /v1/{workspace_id}/calls/{conversation_id}/eval-results HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"conversation_id": "123e4567-e89b-12d3-a456-426614174000",
"results": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"workspace_id": "123e4567-e89b-12d3-a456-426614174000",
"service_id": "123e4567-e89b-12d3-a456-426614174000",
"conversation_id": "123e4567-e89b-12d3-a456-426614174000",
"call_sid": "text",
"eval_key": "text",
"eval_type": "assertion",
"assertion_kind": "text",
"metric_key": "text",
"status": "passed",
"passed": true,
"score": 1,
"expected": null,
"actual": null,
"rationale": "text",
"justification": "text",
"cited_turns": [],
"computed_at": "2026-01-01T00:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z"
}
]
}Returns all persisted eval verdicts for a completed call.
Permissions
All production eval endpoints require workspace authentication.
List, get definitions
Service view
Create, update, delete definitions
Service update
Evaluate a call
Service update
Get eval results
Service view
Assertion Kinds
transcript_contains / must_contain
Passes if the expected phrase appears in the transcript (case-insensitive)
transcript_not_contains / must_not_contain
Passes if the expected phrase does NOT appear in the transcript
tool_called
Passes if the expected tool was called during the conversation
final_state
Passes if the conversation ended in the expected state
llm_judge (default)
An AI judge evaluates the transcript against the assertion's expected text
For transcript_contains and tool_called, the expected value can be provided as the expected field or within params (as phrase, text, tool_name, or state depending on the kind).
Metric Eval Expectations
Metric evals compute the metric value for the call and compare it against the expected threshold:
{"gte": N} or {"min": N}
Passes if value >= N
{"lte": N} or {"max": N}
Passes if value <= N
{"equals": V}
Passes if value equals V
{"contains": S}
Passes if string representation contains S
Bare value
Passes if value equals the expected value
null / omitted
No threshold check; the metric value is computed and returned without a pass/fail judgment
Multiple threshold keys can be combined (e.g. {"gte": 0.5, "lte": 1.0}).
Last updated
Was this helpful?

