Skip to main content

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 extracts representative frames from a video and runs vision-language classification on each one. Categories are merged across all frames using OR logic — if a single frame trips a category, the entire video is flagged.

Input

Submit a multipart/form-data request with:
FieldTypeRequiredDescription
video_urlstringYesPublicly reachable HTTP or HTTPS URL of the video to scan, up to 300 MB. The worker downloads it for frame extraction.
webhook_urlstringNoURL to receive the result on completion.
curl -X POST https://api.evershield.ai/api/v1/moderate/video \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "video_url=https://storage.example.com/generated/output.mp4"
The video_url 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 — a larger file is rejected during frame extraction and the job ends as failed.

Pipeline

Video moderation runs in two stages:

Frame extraction

A worker samples frames from the video at regular intervals using FFmpeg. The sampling interval is configured per deployment (default: every 5 seconds). The extracted frames are queued for individual analysis.

Frame moderation

Each extracted frame is analysed against the configured visual moderation categories and any enabled custom categories. Frame moderation jobs run in parallel for faster processing. You can track frame-by-frame progress via SSE. Progress events include frames_completed and frame_count fields.

Category merging

Categories are merged across all frames using OR logic: if any single frame trips a category, that category is true for the entire video. For example, if frame 12 of 45 trips nsfw, the final result shows nsfw: true even though the other 44 frames are clean.

Output

{
  "job_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "type": "video",
  "status": "completed",
  "is_prohibited": true,
  "categories": {
    "ai_adult_general": false,
    "underage": false,
    "nsfw": true,
    "custom": {}
  },
  "created_at": "2026-05-19T12:00:00.000Z",
  "completed_at": "2026-05-19T12:02:30.000Z"
}
See decision logic for how the prohibition decision is determined.