# Run the pre-dial compliance gate for one number, without dialling

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

> Runs the exact checks an outbound call runs (DLT, A2P declaration, calling window, DNC, carrier DND, consent) and records the same audit rows.

`POST /v1/compliance/check`
Runs the exact checks an outbound call runs (DLT, A2P declaration, calling window, DNC, carrier DND, consent) and records the same audit rows. Returns the verdict instead of enforcing it — use it to pre-flight a number you dial on your own infrastructure.

Requires the `write` scope.

## Request body

| Field | Type | | Meaning |
|---|---|---|---|
| `e164` | string | required | The number you intend to dial, in E.164. |
| `purpose` | string | optional | The sender classification this call falls under, which decides the legal calling window and whether consent is required. Omit to use your organisation's declared `defaultCallPurpose`. It may only ever narrow — you cannot declare a stricter default and then send a looser purpose per request. Open set — handle an unrecognised value rather than throwing. Today: `promotional`, `service`, `transactional`, `collections`. |

### Example request

```json
{
  "e164": "+919876543210",
  "purpose": "promotional"
}
```

## Response

| Field | Type | | Meaning |
|---|---|---|---|
| `allowed` | boolean | required | The answer. A refusal is still `200` — branch on this, not on the status. |
| `blockedBy` | string | null | required | Which check refused. Null when allowed. |
| `checks` | object[] | required | Every audit row written while deciding — the evidence, not a summary of it. |
| `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`. |
| `e164` | string | required | The number the verdict is about, in E.164. |
| `purpose` | string | required | The classification the gate evaluated — declared on the request, or your organization’s default. Recorded so the verdict is self-describing months later. Open set — handle an unrecognised value rather than throwing. Today: `promotional`, `service`, `transactional`, `collections`. |

### Example response

```json
{
  "data": {
    "allowed": true,
    "blockedBy": null,
    "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"
      }
    ],
    "e164": "+919876543210",
    "purpose": "promotional"
  }
}
```
