> ## 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.

# Video moderation

> Screen a video against the configured moderation categories

Video moderation sends the whole clip to a video-capable vision model and evaluates it against the
configured categories — the same checks as [image moderation](/moderation/image-moderation), applied
to the video directly (no frame extraction).

## Input

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

| Field         | Type   | Required | Description                                                                                         |
| ------------- | ------ | -------- | --------------------------------------------------------------------------------------------------- |
| `video`       | string | Yes      | Publicly reachable HTTP or HTTPS URL of the video to scan, up to 300 MB. The classifier fetches it. |
| `webhook_url` | string | No       | URL to receive the result on completion.                                                            |

```bash theme={null}
curl -X POST https://api.omnifence.ai/api/v1/moderate/video \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "video=https://storage.example.com/generated/output.mp4"
```

<Note>
  The `video` field must be a public HTTP or HTTPS URL. URLs using another scheme, or resolving to a
  private or internal network address, are rejected with `400 INVALID_REQUEST`. The linked video
  must be no larger than **300 MB**.
</Note>

## Pipeline

Checks run in parallel on the submitted video:

### VLM classification

A video-capable vision-language model analyses the clip for the always-on **AI Adult General** policy
(which also folds in any enabled per-client [custom categories](/moderation/categories#custom-categories))
and, when enabled, the informational **NSFW** label. The AI Adult General step is the sole
prohibited-decision source; NSFW is returned alongside the result but never causes a rejection on its
own.

## Output

```json theme={null}
{
  "is_prohibited": false,
  "nsfw": false,
  "job_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "type": "video",
  "status": "completed",
  "created_at": "2026-05-19T12:00:00.000Z",
  "completed_at": "2026-05-19T12:00:08.000Z"
}
```

On a rejection, a `reason` field explains what tripped. The `nsfw` field is only present when the NSFW
classifier is enabled. See [decision logic](/moderation/decisions) for how the prohibition decision is
determined.

## Legacy: frame-by-frame moderation

A frame-by-frame variant is available at
[`POST /moderate/video/frame`](/api-reference/endpoint/video-frame-moderate). It samples frames from
the video with FFmpeg (default: one frame every 5 seconds, snapped to the nearest keyframe), classifies
each frame individually, and merges the results with OR logic — if **any single frame** trips a
category, the entire video is flagged. Track frame-by-frame progress via
[SSE](/platform/sse-progress); progress events include `frames_completed` and `frame_count` fields.
