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.

POSThttps://api.omnifence.ai/api/v1/moderate/video

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

cURLShell
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.
Example responseJSON
{
  "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.
Example responseJSON
{
  "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.
Example responseJSON
{
  "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.
Example responseJSON
{
  "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.
Example responseJSON
{
  "error": "string",
  "message": "string",
  "statusCode": 503,
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}