Skip to content
TriedDocs
Account

Update QA result

Mark a scored call as passed or failed, or clear the human label.

PATCHhttps://api.tried.com.au/qa/results/{id}

Sets the human override on a QA result. The override wins over the AI verdict in effective_passed, effective_resolved, the cohort overview and alert metrics. Labelled results are also the input for Calibrate QA cohort.

Request#

Field Type Required Description
id string Yes QA result ID, for example qa_result_7a9c1e3b5d7f9a2c4e6b8d0f.

Body:

Field Type Required Description
override string or null Yes pass, fail, or null to clear the label.

Example request#

curl -X PATCH https://api.tried.com.au/qa/results/qa_result_7a9c1e3b5d7f9a2c4e6b8d0f \
  -H "Authorization: Bearer $TRIED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "override": "fail"
  }'
const res = await fetch("https://api.tried.com.au/qa/results/qa_result_7a9c1e3b5d7f9a2c4e6b8d0f", {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${process.env.TRIED_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "override": "fail"
  }),
});
const result = await res.json();
import os, requests

res = requests.patch(
    "https://api.tried.com.au/qa/results/qa_result_7a9c1e3b5d7f9a2c4e6b8d0f",
    headers={"Authorization": f"Bearer {os.environ['TRIED_API_KEY']}"},
    json={
        "override": "fail",
    },
)
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": "fail",
  "effective_resolved": false,
  "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": false,
  "wer_corrections": [],
  "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 updated result. See Get QA result for the fields. The nested call object here does not include agent_name.

Errors#

Status When
400 override is missing or not pass, fail or null.
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 No result with that ID in the workspace: QA result <id> not found.
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.