Video moderation
Screen a video against the configured moderation checks
Video moderation evaluates the whole clip against the configured moderation categories. These are the same checks as image moderation, applied to the video directly.
Input#
Submit a multipart/form-data request with:
| Field | Type | Required | Description |
|---|---|---|---|
video |
string | Yes | Publicly reachable HTTP or HTTPS URL of an MP4, WebM or QuickTime file, up to 100 MB. |
webhook_url |
string | No | URL to receive the result on completion. |
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"
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 100 MB.
The URL must link directly to the video file. The API probes the URL before it accepts the job, and rejects the request without creating a job or charging your account when:
- the file is larger than 100 MB (
413 PAYLOAD_TOO_LARGE); - the URL serves something other than a video file, such as an HLS playlist (
.m3u8), a DASH manifest or an HTML page (415 UNSUPPORTED_MEDIA); - the origin refuses the URL, for example with HTTP 404 or 403 (
422 MEDIA_UNREACHABLE).
Streaming manifests are never accepted: submit a single MP4 rendition of the clip instead. See error codes for the response format.
Serve the file with a video Content-Type (video/mp4, video/webm or video/quicktime). The
API accepts a URL that serves an untyped application/octet-stream, but the video model does not
fetch it, and the job fails with error_code UNSUPPORTED_MEDIA. Object stores such as Google
Cloud Storage and Amazon S3 serve the content type that is set on the object at upload.
Checks#
AI Adult General#
The clip is analysed for the always-on AI Adult General policy, which covers prohibited adult content and content that depicts, or appears to depict, a minor in a sexual or exploitative context. It also folds in any enabled custom categories. This check cannot be disabled.
NSFW label#
When the NSFW check is enabled, the informational nsfw boolean is returned alongside the decision.
It never causes a rejection on its own.
Output#
{
"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
check is enabled. See decision logic for how the prohibition decision is
determined.
Video jobs do not return risk scores.
Latency#
Per-check progress is not exposed: the job reports queued until every check has finished, then
flips straight to its final decision. Register a webhook so you are notified
when it lands, rather than polling tightly.