Needs keys Saves corrected text for user utterances in the call's transcript, then re-scores the call right away. The wer metric compares the transcript against these corrections. The full list replaces any corrections saved before.
Re-scoring uses OpenAI for AI criteria when a key is set, and the keyword scorer otherwise.
Request#
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | QA result ID, for example qa_result_7a9c1e3b5d7f9a2c4e6b8d0f. |
Body:
| Field | Type | Required | Description |
|---|---|---|---|
corrections |
object[] | Yes | Up to 500 corrections. Each has index (position of the utterance in the call's transcript, 0 or more) and text (the correct words, up to 5000 characters). Every index must point at a user utterance. |
Example request#
curl -X PUT https://api.tried.com.au/qa/results/qa_result_7a9c1e3b5d7f9a2c4e6b8d0f/wer-corrections \
-H "Authorization: Bearer $TRIED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"corrections": [
{
"index": 1,
"text": "Do you have anything on Thursday afternoon?"
}
]
}'const res = await fetch("https://api.tried.com.au/qa/results/qa_result_7a9c1e3b5d7f9a2c4e6b8d0f/wer-corrections", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.TRIED_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"corrections": [
{
"index": 1,
"text": "Do you have anything on Thursday afternoon?"
}
]
}),
});
const result = await res.json();import os, requests
res = requests.put(
"https://api.tried.com.au/qa/results/qa_result_7a9c1e3b5d7f9a2c4e6b8d0f/wer-corrections",
headers={"Authorization": f"Bearer {os.environ['TRIED_API_KEY']}"},
json={
"corrections": [
{
"index": 1,
"text": "Do you have anything on Thursday afternoon?",
},
],
},
)
result = res.json()Response#
200 OK
{
"qa_result_id": "qa_result_7a9c1e3b5d7f9a2c4e6b8d0f",
"qa_cohort_id": "qa_cohort_2c4e6a8b0d1f3e5a7c9b1d3f",
"call_id": "call_5e7a9c1b3d5f7e9a2c4b6d8f",
"score": 50,
"resolved": true,
"override": null,
"effective_resolved": true,
"criteria": [
{
"name": "Confirms the booking",
"passed": true,
"explanation": "Every quoted phrase appears in the call."
},
{
"name": "Offers a reminder",
"passed": false,
"explanation": "1 of 4 keywords found (appointment). Mock scorer passes at 50%."
}
],
"summary": "Mock QA: 1 of 2 criteria met.",
"metrics": [
{
"metric": "latency",
"value": 880,
"score": 100,
"passed": true,
"details": {
"e2e": {
"p50": 880,
"p90": 1240,
"p95": 1240,
"p99": 1240,
"max": 1240,
"min": 610,
"num": 6,
"values": [
610,
790,
880,
880,
940,
1240
]
},
"threshold": 60,
"judge": "heuristic"
}
},
{
"metric": "sentiment",
"value": 100,
"score": 100,
"passed": true,
"details": {
"user_sentiment": "Positive",
"threshold": 60,
"judge": "heuristic"
}
}
],
"weighted_score": 80,
"passed": true,
"effective_passed": true,
"wer_corrections": [
{
"index": 1,
"text": "Do you have anything on Thursday afternoon?"
}
],
"questions": [
"Do you have anything on Thursday afternoon?"
],
"created_timestamp": 1792395060000,
"call": {
"call_id": "call_5e7a9c1b3d5f7e9a2c4b6d8f",
"agent_id": "agent_4b7e2c9a1f3d5e8b0c6a2d1f",
"call_type": "phone_call",
"start_timestamp": 1792308600000,
"duration_ms": 142000,
"disconnection_reason": "user_hangup",
"user_sentiment": "Positive",
"call_successful": true,
"e2e_p50": 880,
"transcript_with_tool_calls": []
}
}Returns the re-scored result. See Get QA result for the fields. The nested call object here does not include agent_name.
Errors#
| Status | When |
|---|---|
400 |
Body validation failed, or an index is not a user turn: Utterance <index> is not a user utterance. |
401 |
Missing or invalid API key. |
403 |
The key's IP allowlist or scopes reject the request. This route needs the analytics scope. Dashboard users with the member role get The member role is read-only. |
404 |
QA result <id> not found, or The call was deleted. |
429 |
Rate limit exceeded. See Rate limits. |
See Errors for the body format.
Retell compatibility#
Retell's public API reference has no AI QA endpoints, so this route has no Retell SDK equivalent.