Skip to content
TriedDocs
Account

Update QA WER corrections

Save human transcript corrections for a scored call and re-score it.

PUThttps://api.tried.com.au/qa/results/{id}/wer-corrections

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.