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

# Chat moderation

> Run the LLM prohibition check on a single chat turn, without blocklist filtering

Chat moderation evaluates a single chat turn against the language-model prohibition check only. The
keyword blocklist is **not** applied, so conversational text isn't rejected for incidental mentions of
flagged terms. A turn the model judges prohibited is rejected, and the reason is returned on the
completed job.

Use chat moderation when you want policy-grade protection on free-form chat without false positives
from a static term list. For pre-generation prompt screening that includes the blocklist, use
[prompt moderation](/moderation/prompt-moderation) instead.

## Input

Submit a `multipart/form-data` request with:

| Field         | Type   | Required | Description                              |
| ------------- | ------ | -------- | ---------------------------------------- |
| `text`        | string | Yes      | The chat turn to moderate.               |
| `webhook_url` | string | No       | URL to receive the result on completion. |

```bash theme={null}
curl -X POST https://api.omnifence.ai/api/v1/moderate/chat \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "text=Hey, how are you doing today?"
```

## Pipeline

Chat moderation runs a single step:

1. **LLM prohibition check.** A language model reviews the chat turn for policy violations. If it
   judges the turn prohibited, the job is rejected with `is_prohibited: true` and a short `reason`.

Unlike [prompt moderation](/moderation/prompt-moderation), the keyword blocklist scan is skipped
entirely — chat moderation never short-circuits on an exact-match term.

## Output

```json theme={null}
{
  "is_prohibited": true,
  "reason": "The message requests sexual content involving a minor.",
  "categories": {},
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "type": "chat",
  "status": "completed",
  "created_at": "2026-05-26T12:00:00.000Z",
  "completed_at": "2026-05-26T12:00:01.500Z"
}
```

When `is_prohibited` is `true`, `reason` explains why the chat turn was prohibited. A turn that
passes returns `is_prohibited: false` with no `reason`. See [decision logic](/moderation/decisions)
for how the prohibition decision is determined.
