Submit video moderation
Submit a video URL for moderation. The video is sent directly to a video-capable vision model. It runs the same checks as image moderation, applied to the whole clip (no frame extraction). Pass a publicly reachable HTTP or HTTPS video that links directly to an MP4, WebM or QuickTime file. URLs that use another scheme, or that resolve to a private or internal network address, are rejected with 400 INVALID_REQUEST. The API probes the URL before accepting the job: a file larger than 100 MB is rejected with 413 PAYLOAD_TOO_LARGE, a resource that is not a video file (for example an HLS playlist or a DASH manifest) with 415 UNSUPPORTED_MEDIA, and a URL the origin refuses with 422 MEDIA_UNREACHABLE. No job is created and nothing is charged for a rejected URL. Returns a job ID for polling or webhook delivery. Multipart requests allow at most eight non-file fields. Each field other than text must be at most 16,384 UTF-8 bytes. Oversized fields return 400; too many fields return 413.
https://api.omnifence.ai/api/v1/moderate/videoRequires the moderate:video scope. Requests without this scope receive a 403 FORBIDDEN
response. See authentication.
Request#
Headers#
| Name | Type | Required | Description |
|---|---|---|---|
Authorization |
string | Yes | Your API key as a Bearer token: Bearer YOUR_API_KEY. |
The request fields are described in Video moderation.
Example request#
curl -X POST https://api.omnifence.ai/api/v1/moderate/video \
-H "Authorization: Bearer $OMNIFENCE_API_KEY" \
-F "video=https://example.com/clip.mp4" \
-F "webhook_url=https://your-app.com/webhooks/omnifence" # optional
Responses#
202 Accepted#
| Field | Type | Always present | Description |
|---|---|---|---|
job_id |
string (uuid) | Yes | |
status |
string | Yes | One of queued. |
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "queued"
}
413 Payload Too Large#
The media behind the URL is larger than the modality allows (PAYLOAD_TOO_LARGE). No job was created and nothing was charged.
| Field | Type | Always present | Description |
|---|---|---|---|
error |
string | Yes | |
message |
string | Yes | |
statusCode |
integer | Yes | One of 413. |
{
"error": "string",
"message": "string",
"statusCode": 413
}
415 Unsupported Media Type#
The URL does not serve a supported media file — for example an HLS playlist or a DASH manifest instead of a video file (UNSUPPORTED_MEDIA). No job was created and nothing was charged.
| Field | Type | Always present | Description |
|---|---|---|---|
error |
string | Yes | |
message |
string | Yes | |
statusCode |
integer | Yes | One of 415. |
{
"error": "string",
"message": "string",
"statusCode": 415
}
422 Unprocessable Content#
The origin refused the media URL (MEDIA_UNREACHABLE) — a 404, a 403, an expired signed link. No job was created and nothing was charged.
| Field | Type | Always present | Description |
|---|---|---|---|
error |
string | Yes | |
message |
string | Yes | |
statusCode |
integer | Yes | One of 422. |
{
"error": "string",
"message": "string",
"statusCode": 422
}
503 Service Unavailable#
Moderation intake is busy or a dependency is unavailable. Capacity rejections include Retry-After (seconds); retry with backoff and jitter. SUBMISSION_STATUS_UNKNOWN includes a job_id: poll it before submitting again because acceptance could not be confirmed.
| Field | Type | Always present | Description |
|---|---|---|---|
error |
string | Yes | |
message |
string | Yes | |
statusCode |
integer | Yes | One of 503. |
job_id |
string (uuid) | No | Recovery ID when the acceptance outcome is unknown. |
{
"error": "string",
"message": "string",
"statusCode": 503,
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}