> ## Documentation Index
> Fetch the complete documentation index at: https://docs.interchange.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Check moderation

> Pre-check text against the moderation policy without blocking

`POST /api/v2/moderation/check`

Runs the content-moderation engine against the supplied text **without blocking**, returning structured findings so a buyer agent can validate input before submitting it to a blocking surface. Mirrors the engine behind `POST /campaigns` brief screening — `wouldBlock: true` predicts a `422` on the real call.

## Request

```bash theme={null}
curl -X POST https://api.interchange.io/api/v2/moderation/check \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Premium video for outdoor-gear buyers in the US and Canada.",
    "direction": "input",
    "surface": "campaign.brief"
  }'
```

## Parameters

| Field       | Type   | Required | Notes                                                                                                            |
| ----------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------- |
| `text`      | string | Yes      | Text to evaluate, 1–10,000 chars. Exceeding 10,000 chars returns a `400 VALIDATION_ERROR`                        |
| `direction` | enum   | No       | `input` (default) runs brief/jailbreak/policy patterns; `output` runs LLM-output (refusal/identity/PII) patterns |
| `surface`   | string | No       | Surface label for metric attribution, 1–100 chars. Defaults to `moderation.check`                                |

## Response

```json theme={null}
{
  "passed": true,
  "wouldBlock": false,
  "findings": []
}
```

A blocking example:

```json theme={null}
{
  "passed": false,
  "wouldBlock": true,
  "findings": [
    {
      "category": "jailbreak_attempt",
      "severity": "high",
      "suggestion": "Remove instructions that try to override system behavior, then resubmit."
    }
  ]
}
```

`passed` is `true` only when no patterns matched. `wouldBlock` is `true` when at least one finding would trigger a `422` on a blocking surface. `findings` reports both blocking and non-blocking matches, so medium-severity signals are visible even when `wouldBlock` is `false`. Each finding carries a `category`, a `severity` (`low`, `medium`, `high`, `critical`), and a `suggestion`.

## Errors

* `400 VALIDATION_ERROR` — empty `text`, `text` over 10,000 chars, or an unknown `direction`.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Moderation tasks" href="/v2/buyer/moderation/tasks" icon="list-check">
    All moderation operations
  </Card>

  <Card title="Moderation overview" href="/v2/buyer/moderation/overview" icon="shield-check">
    What it is and when to use it
  </Card>
</CardGroup>
