# The evidence pack for one number

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

> Every check, consent record, outcome and suppression we hold for a number — the document to hand an access provider when a complaint lands.

`GET /v1/compliance/evidence`
Every check, consent record, outcome and suppression we hold for a number — the document to hand an access provider when a complaint lands.

Requires the `read` scope.

## Parameters

| Name | In | | Meaning |
|---|---|---|---|
| `e164` | query | required | The number to assemble evidence for. Returns every check, consent record, suppression entry and reported outcome Tone holds about it. |
| `from` | query | optional | Inclusive lower bound. Omit for everything on record. |
| `to` | query | optional | Exclusive upper bound. |

## Response

| Field | Type | | Meaning |
|---|---|---|---|
| `checks` | object[] | required | Every gate decision, in the order it ran. |
| `checks[].callId` | string | null | required | Null for a standalone check. |
| `checks[].checkType` | string | required | Which rule ran. Open set — handle an unrecognised value rather than throwing. Today: `dnc`, `carrier_dnd`, `consent`, `dlt`, `a2p`, `time_window`, `enforcement_change`, `profile_change`, `call_outcome`, `suppression_change`. |
| `checks[].createdAt` | string | required | When this check ran, RFC 3339 UTC. A check row is a snapshot: it says what was true at dial time even if the underlying consent or suppression entry changes later. |
| `checks[].detail` | object | required | Rule-specific evidence, as recorded at the time. |
| `checks[].e164` | string | required | The number this check was about, in E.164. |
| `checks[].enforced` | boolean | required | Whether enforcement was ON when this ran. A recorded block with `false` did not stop anything. |
| `checks[].id` | string | required | The audit row’s id — cite it when reporting an outcome. |
| `checks[].outcome` | string | required | Only `block` refuses a call. A `warn` is advisory and is recorded, not enforced — carrier DND data is warn-only by design. An `error` means the check itself failed to run: recorded so a broken check is a visible fact, and treated as a block when the check is mandatory. Open set — handle an unrecognised value rather than throwing. Today: `pass`, `warn`, `block`, `error`. |
| `checks[].reason` | string | null | required | Why the check came out this way, when the outcome alone does not say it. |
| `checks[].source` | string | required | Where the answer came from. Open set — handle an unrecognised value rather than throwing. Today: `internal`, `carrier`, `operator`. |
| `consents` | object[] | required | The full consent history, revocations included — the ledger is append-only. |
| `consents[].active` | boolean | required | Whether this record satisfies the gate right now. |
| `consents[].capturedAt` | string | required | When the RECIPIENT consented, not when you told us. |
| `consents[].createdAt` | string | required | When this consent was recorded with Tone, RFC 3339 UTC. Distinct from `capturedAt`, which is when the recipient actually consented. |
| `consents[].e164` | string | required | The number that consented, in E.164. |
| `consents[].evidenceRef` | string | null | required | Where the proof lives — form id, recording URL, DCA reference. |
| `consents[].expiresAt` | string | null | required | When the consent lapses. RFC 3339, UTC. Null means it stands until revoked. |
| `consents[].id` | string | required | The consent record’s id. Pass it to `POST /v1/consent/{id}/revoke` to revoke this one record. |
| `consents[].kind` | string | required | Open set — handle an unrecognised value rather than throwing. Today: `explicit`, `inferred`. |
| `consents[].purpose` | string | required | What they consented TO. Open set — handle an unrecognised value rather than throwing. Today: `promotional`, `service`, `transactional`, `collections`. |
| `consents[].revokedAt` | string | null | required | The ledger is append-only; revocation is a stamp, not a delete. |
| `consents[].revokedReason` | string | null | required | Why the consent was revoked, when a reason was given. |
| `consents[].scope` | string | null | required | What the recipient agreed to, as it was recorded. |
| `consents[].source` | string | required | Weakest to strongest as evidence. Open set — handle an unrecognised value rather than throwing. Today: `api`, `web_form`, `ivr`, `dtmf`, `otp`, `dca`, `import`. |
| `e164` | string | required | The number this evidence pack is about, in E.164. |
| `generatedAt` | string | required | When this pack was assembled. RFC 3339, UTC. |
| `outcomes` | object[] | required | Outcomes reported back for this number. |
| `outcomes[].callId` | string | null | required | Null for a standalone check. |
| `outcomes[].checkType` | string | required | Which rule ran. Open set — handle an unrecognised value rather than throwing. Today: `dnc`, `carrier_dnd`, `consent`, `dlt`, `a2p`, `time_window`, `enforcement_change`, `profile_change`, `call_outcome`, `suppression_change`. |
| `outcomes[].createdAt` | string | required | When this check ran, RFC 3339 UTC. A check row is a snapshot: it says what was true at dial time even if the underlying consent or suppression entry changes later. |
| `outcomes[].detail` | object | required | Rule-specific evidence, as recorded at the time. |
| `outcomes[].e164` | string | required | The number this check was about, in E.164. |
| `outcomes[].enforced` | boolean | required | Whether enforcement was ON when this ran. A recorded block with `false` did not stop anything. |
| `outcomes[].id` | string | required | The audit row’s id — cite it when reporting an outcome. |
| `outcomes[].outcome` | string | required | Only `block` refuses a call. A `warn` is advisory and is recorded, not enforced — carrier DND data is warn-only by design. An `error` means the check itself failed to run: recorded so a broken check is a visible fact, and treated as a block when the check is mandatory. Open set — handle an unrecognised value rather than throwing. Today: `pass`, `warn`, `block`, `error`. |
| `outcomes[].reason` | string | null | required | Why the check came out this way, when the outcome alone does not say it. |
| `outcomes[].source` | string | required | Where the answer came from. Open set — handle an unrecognised value rather than throwing. Today: `internal`, `carrier`, `operator`. |
| `suppression` | object | null | required | The suppression entry, if this number carries one. |
| `truncated` | boolean | required | True when more evidence existed in the window than the cap returns. Narrow the window. |
| `window` | object | required | The time range this pack covers. Null bounds mean everything on record. |
| `window.from` | string | null | required | Start of the range, RFC 3339 UTC. Null means from the beginning of the record. |
| `window.to` | string | null | required | End of the range, RFC 3339 UTC. Null means up to now. |

### Example response

```json
{
  "data": {
    "checks": [
      {
        "callId": "9f1c2d84-4e3a-4f6c-b902-7d1e8a33c451",
        "checkType": "dnc",
        "createdAt": "2026-08-25T09:14:22Z",
        "detail": {},
        "e164": "+919876543210",
        "enforced": true,
        "id": "8814",
        "outcome": "pass",
        "reason": "Asked to be removed during a call on 2026-08-20.",
        "source": "internal"
      }
    ],
    "consents": [
      {
        "active": true,
        "capturedAt": "2026-08-20T11:02:00Z",
        "createdAt": "2026-08-25T09:14:22Z",
        "e164": "+919876543210",
        "evidenceRef": "form-sub-88213",
        "expiresAt": "2026-11-23T09:14:22Z",
        "id": "8814",
        "kind": "explicit",
        "purpose": "promotional",
        "revokedAt": null,
        "revokedReason": null,
        "scope": "Order updates and delivery reminders.",
        "source": "api"
      }
    ],
    "e164": "+919876543210",
    "generatedAt": "2026-08-25T09:14:22Z",
    "outcomes": [
      {
        "callId": "9f1c2d84-4e3a-4f6c-b902-7d1e8a33c451",
        "checkType": "dnc",
        "createdAt": "2026-08-25T09:14:22Z",
        "detail": {},
        "e164": "+919876543210",
        "enforced": true,
        "id": "8814",
        "outcome": "pass",
        "reason": "Asked to be removed during a call on 2026-08-20.",
        "source": "internal"
      }
    ],
    "suppression": {
      "createdAt": "2026-08-25T09:14:22Z",
      "e164": "+919876543210",
      "expiresAt": "2026-11-23T09:14:22Z",
      "id": "8814",
      "reason": "Asked to be removed during a call on 2026-08-20.",
      "removedAt": null,
      "removedReason": null,
      "source": "manual",
      "sourceCallId": null
    },
    "truncated": true,
    "window": {
      "from": "2026-08-01T00:00:00Z",
      "to": "2026-08-25T00:00:00Z"
    }
  }
}
```
