# Report what happened to a call you placed yourself

Source: https://docs.usetone.ai/reference/compliance/complianceChecks.recordOutcome

> Closes the audit loop on a verdict.

`POST /v1/compliance/call-outcomes`
Closes the audit loop on a verdict. `opt_out` revokes consents and suppresses the number for 90 days; `complaint` suppresses it permanently.

Requires the `write` scope.

## Request body

| Field | Type | | Meaning |
|---|---|---|---|
| `callReference` | string | optional | Your own identifier for the call, echoed back on reads so you can reconcile against your CDR. |
| `checkId` | string | optional | The `checks[].id` from the verdict this call acted on, if you pre-flighted it. Ties the outcome to that verdict's audit rows. |
| `durationSeconds` | integer | optional | How long the call lasted, in whole seconds. |
| `e164` | string | required | The number that was called. Repeated even when `checkId` is present, so an outcome for a call you never pre-flighted still lands on the right number's evidence. |
| `notes` | string | optional | Free text kept with the record and returned in the evidence pack. |
| `occurredAt` | string | optional | When the call happened. Defaults to now — send it explicitly when reporting in batches after the fact. |
| `outcome` | string | required | What happened. 🔴 `opt_out` and `complaint` are not just labels: they suppress the number through the same code path a mid-call opt-out uses — `opt_out` applies the 90-day re-consent lockout, `complaint` suppresses permanently. Both revoke every consent on record for that number in the same transaction. Open set — handle an unrecognised value rather than throwing. Today: `connected`, `no_answer`, `busy`, `failed`, `opt_out`, `complaint`, `wrong_number`. |

### Example request

```json
{
  "callReference": "acme-crm-4417",
  "checkId": "8814",
  "durationSeconds": 45,
  "e164": "+919876543210",
  "notes": "Customer asked to be called after 6pm.",
  "occurredAt": "2026-08-25T09:14:22Z",
  "outcome": "connected"
}
```

## Response

| Field | Type | | Meaning |
|---|---|---|---|
| `consentsRevoked` | integer | required | How many consent records this outcome revoked. Non-zero only for an opt_out or a complaint, which suppress the number as well. |
| `e164` | string | required | The number the outcome was reported for, in E.164. |
| `id` | string | required | The compliance-check row that recorded the outcome. |
| `outcome` | string | required | What you reported. Open set — handle an unrecognised value rather than throwing. Today: `connected`, `no_answer`, `busy`, `failed`, `opt_out`, `complaint`, `wrong_number`. |
| `suppressed` | boolean | required | A suppression entry was written — this number will not be dialled again. |

### Example response

```json
{
  "data": {
    "consentsRevoked": 0,
    "e164": "+919876543210",
    "id": "8814",
    "outcome": "connected",
    "suppressed": true
  }
}
```
