SEEAPISEEAPI
Developer CenterDocs
Get API Key
  • Getting Started
  • Authentication
  • List Model Prices
  • Create a Generation
  • Get Task Details
Image Models
Alibaba
Black Forest Labs
ByteDance
Google
Grok
OpenAI
SeeAPI
Video Models
Alibaba
ByteDance
Google
Grok
Kling
Lightricks
MiniMax
PixVerse
Runway
SeeAPI
www.seeapi.com

One AI API for every leading model. Create images, videos, music, and multimodal AI assets online, or build with one unified API.

Support
  • Pricing
  • [email protected]
Legal
  • Privacy Policy
  • Refund Policy
  • Terms & Conditions

Copyright 2026 © SeeAPI. All rights reserved.

GROWCRAFT PTE. LTD.

·5 RAFFLES PLACE, #06-00, RAFFLES PLACE MRT STATION, SINGAPORE 048618

SeeAPI/stable

Video NSFW Filter · Video Moderation

Analyze sampled video frames for NSFW and special-care content. Results are for reference only and may include false positives or false negatives; adjust num_frames, threshold_offset and strict_special_care to suit your project’s moderation requirements.

Developer API pricing

Provider: SeeAPI

USD estimate: $0.0037 / credit · Estimated equivalent, not an additional charge.

Video moderation

return_frames=none: 0.5 credits for the first 8 frames (≈ $0.002); +0.02 credits per additional frame (≈ $0.00/frame).

return_frames=flagged: 0.8 credits for the first 8 frames (≈ $0.003); +0.08 credits per additional frame (≈ $0.00/frame).

return_frames=all: 0.8 credits for the first 8 frames (≈ $0.003); +0.08 credits per additional frame (≈ $0.00/frame).

Charged by num_frames, not by the number of images returned. none: no images; flagged: flagged frames only; all: all sampled frames.

Query a task

Replace task_xxx with the complete id returned when the inference task was created. Use the same API environment and API key.

⚠️ Use GET /v1/inferences/{task_id} for Video NSFW Filter tasks. Do not use /v1/generations/{task_id}; the generation task endpoint does not apply to this model.

export SEEAPI_API_BASE_URL='https://api.seeapi.com'
export SEEAPI_API_KEY='YOUR_API_KEY'
export SEEAPI_TASK_ID='task_xxx'

curl --request GET "$SEEAPI_API_BASE_URL/v1/inferences/$SEEAPI_TASK_ID" \
  --header "Authorization: Bearer $SEEAPI_API_KEY"

Query response — 200 OK

A successful lookup returns the current task state, even while processing. This illustrative one-frame assessment shows no detected labels and a successfully stored image with all frame images requested. The image URL is a placeholder; optional fields are not guaranteed to appear in every response.

{
  "id": "task_xxx",
  "object": "inference",
  "model": "video-nsfw-filter",
  "endpoint": "video-moderation",
  "provider": "seeapi",
  "status": "succeeded",
  "result": {
    "type": "json",
    "data": {
      "flagged": false,
      "output": {
        "nsfw_detected": false,
        "scope": "sampled_frames",
        "sampling_complete": true,
        "checked_frames": 1,
        "timestamp_source": "frame_index_div_fps_estimate",
        "output_layout": "named-files-v1",
        "report_schema_version": 5,
        "flagged_frame_count": 0,
        "frames": [
          {
            "frame_number": 1,
            "timestamp_seconds": 0,
            "nsfw_detected": false,
            "nsfw": [],
            "special": [],
            "image_url": "https://client.example.com/inference/task_xxx/frame-1.jpg"
          }
        ]
      }
    }
  },
  "error": null
}

Response fields

status:

queued or processing means the result is not ready. Continue polling with backoff.

succeeded describes execution, not whether content passed moderation.

result.data.flagged: The overall content verdict, indicating whether the content passes the check: false means passed; true means flagged and not passed.

output.frames: One entry per checked frame.

frame_number identifies the source frame (not the array index);

timestamp_seconds gives its approximate time in seconds;

nsfw_detected is the frame’s detection verdict.

nsfw lists normal NSFW labels, with [] meaning none were reported for that frame.

special: Optional special-care category labels for the frame. [] means the field was returned with no labels.

image_url: Optional URL of the stored image for this specific frame, not the input video. With return_frames=none, no frame images are requested; flagged requests flagged frames only; all requests all sampled frames. A URL is included only when that image is returned successfully. If no image is available, the field is omitted, while the frame’s detection results remain valid. Do not treat a missing image as an unchecked or safe frame. Replace the placeholder in this example with the URL from your actual response.

reason=content_policy_blocked: A policy-blocked outcome returns status=succeeded, flagged=true, output=null and a message. It remains billable; there is no per-frame report.

error: Failure details with code and message; null when no task error is reported. A flagged assessment is not a task failure. See Responses for the complete field reference.

Related Resources

Market Overview

Explore all available models

Credits & Billing

View credit balance, plans, and billing activity

Usage

Review API usage and credit consumption

Request

POST/v1/inferences
AuthorizationSend your API key in the Authorization header using the Bearer scheme.Authorization: Bearer ****************

Header Params

stringrequired

A unique key for this inference request. Reuse it only when retrying the same request body to avoid duplicate tasks.

max length: 255
Example:
order-20260818-001

Body Params

application/json
stringrequired

Set to video-nsfw-filter.

Allowed:video-nsfw-filter
Default:
video-nsfw-filter
Example:
video-nsfw-filter
stringrequired

Set to video-moderation to analyze a single video.

Allowed:video-moderation
Default:
video-moderation
Example:
video-moderation
stringrequired

Required public provider identifier. Set to seeapi.

Allowed:seeapi
Default:
seeapi
Example:
seeapi
objectrequired

Video source and detection settings. Supply the parameters directly inside input.

Provider parameters

SeeAPIseeapiDefault Provider
string <uri>required

Keep the URL accessible while the task is processing.

  • A publicly accessible HTTPS URL to one MP4 or MOV video.
  • At most 30 seconds and 100 M.
Example:
https://client.example.com/input.mp4
integeroptional

Number of frames to sample. More samples improve coverage but do not inspect every frame or guarantee that brief content will be detected.

min: 8max: 32
Default:
8
numberoptional

Offset applied to the model’s detection threshold. Tune this setting for your project and evaluate the results on representative content.

  • Adjust the detection threshold. Lower values make the assessment stricter and more likely to flag potentially sensitive content; higher values make it more permissive. Adjust this setting to suit your application's requirements.
min: 0max: 0.1
Default:
0.02
booleanoptional

Enable stricter handling of special-care categories. This affects the model’s assessment, not whether optional category fields are present.

Default:
true
stringoptional

Select which sampled frame images to request.

  • none: returns no images;
  • flagged: requests only flagged frames;
  • all: requests all sampled frames. The report still contains detection results for the checked frames.
Allowed:noneflaggedall
Default:
none
string <uri>optional

Optional absolute HTTPS URL for terminal task notifications.

max length: 2048
Example:
https://client.example.com/webhooks/seeapi

Responses

202Inference accepted for asynchronous processing.
Bodyapplication/json
  • HTTP 202 confirms acceptance, not completion. The initial result is null. Query GET /v1/inferences/{id} for the final assessment; the result schema below describes that completed result.
stringrequired

Platform task identifier. Use this complete value to query the inference.

Example:
task_xxx
stringrequired

Resource type; always inference.

Allowed:inference
Example:
inference
stringrequired

Model used for the task: video-nsfw-filter.

Allowed:video-nsfw-filter
Example:
video-nsfw-filter
stringrequired

Requested capability: video-moderation.

Allowed:video-moderation
Example:
video-moderation
stringrequired

Public provider used for the task: seeapi.

Allowed:seeapi
Example:
seeapi
stringrequired

Task execution state, not a content-safety verdict. A 202 response is queued or processing. Query the task for its terminal status.

Allowed:queuedprocessing
Example:
processing
object | nullrequired

Null while processing. On success, contains the structured JSON assessment described below. Nested result fields apply only when result is present.

stringrequired

Result format; json for this endpoint.

Allowed:json
objectrequired

Overall assessment and the sampled-frame report.

booleanrequired

Overall content verdict. true means content was flagged or blocked by content policy; false means the report did not flag sampled content, not that the entire video is guaranteed safe.

object | nullrequired

Sampled-frame report. Null for content_policy_blocked, where no frame report is available. That outcome has status succeeded and remains billable.

booleanrequired

Whether the report detected NSFW content among the sampled frames; matches data.flagged for a normal report.

stringrequired

Assessment scope; sampled_frames means only sampled frames were checked.

Allowed:sampled_frames
booleanrequired

Whether the sampling process completed. false indicates incomplete coverage and must not be interpreted as a complete clean assessment.

integerrequired

Actual number of frames checked; matches the number of entries in frames.

stringrequired

How timestamps were estimated. frame_index_div_fps_estimate derives time from the frame index and frame rate; timestamps are approximate.

stringrequired
Allowed:named-files-v1
integerrequired
Allowed:5
integerrequired
arrayrequired

Per-frame assessments in report order. Frames remain present even when no image is returned.

objectrequired

One sampled frame and its detection results.

integerrequired

Frame number in the source video, not the array index.

numberrequired

Approximate position in the video in seconds. May contain fractional values.

booleanrequired

Whether this sampled frame was flagged.

arrayrequired

NSFW category labels detected for this frame. An empty array means no matching NSFW labels were returned.

stringrequired

One detected NSFW label.

arrayoptional

Optional special-care labels for this frame. An empty array means no labels were reported in this field; omission means the response did not include this category information. Interpret labels alongside nsfw_detected and the overall flagged value, not as verified facts. Deduplicate labels when combining frames for display.

stringrequired

One special-care label.

stringoptional

Stored image URL for this specific frame, not the input video. Returned only when permitted by return_frames and the image was returned and saved successfully. Omitted when no image is requested, available or successfully saved; the frame’s detection results remain valid. A missing URL is not evidence that a frame was unchecked or safe.

stringoptional

Optional business outcome code. content_policy_blocked indicates that policy restrictions prevented a frame report from being returned.

Allowed:content_policy_blocked
stringoptional

Human-readable assessment message. For a policy block: We detected content that potentially violates our terms of service.

object | nullrequired

Null unless the task ends unsuccessfully. A flagged assessment is not a task error.

stringrequired
stringrequired
400

The request could not be accepted. Read the error code and correct the request before retrying.

401

Authentication failed. Check the Bearer API key.

402

Insufficient credits for this request.

403

The request is not permitted for the current credentials or access policy.

404

The resource is unavailable or not visible to this API key. Verify the model, endpoint, environment and permissions.

409

A request conflict occurred. Check whether the idempotency key was reused with a different body.

422

The request could not be processed. Inspect the returned error details before retrying.

429

A rate or usage limit was reached. Check the error code and Retry-After header when present.

503

The service is temporarily unavailable. Retry with backoff, preserving the same idempotency key and body for the same logical request.

Code Examples
Request
const response = await fetch("https://api.seeapi.com/v1/inferences", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Idempotency-Key": "order-20260818-001",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
  "model": "video-nsfw-filter",
  "endpoint": "video-moderation",
  "provider": "seeapi",
  "input": {
    "video_url": "https://client.example.com/input.mp4",
    "num_frames": 8,
    "threshold_offset": 0.02,
    "strict_special_care": true,
    "return_frames": "none"
  },
  "callback_url": "https://client.example.com/webhooks/seeapi"
})
});

const result = await response.json();
ResponseHTTP 202
{
  "id": "task_xxx",
  "object": "inference",
  "model": "video-nsfw-filter",
  "endpoint": "video-moderation",
  "provider": "seeapi",
  "status": "processing",
  "result": null,
  "error": null
}
PreviousRunway Gen4 Turbo · Image to Video
Request
const response = await fetch("https://api.seeapi.com/v1/inferences", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Idempotency-Key": "order-20260818-001",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
  "model": "video-nsfw-filter",
  "endpoint": "video-moderation",
  "provider": "seeapi",
  "input": {
    "video_url": "https://client.example.com/input.mp4",
    "num_frames": 8,
    "threshold_offset": 0.02,
    "strict_special_care": true,
    "return_frames": "none"
  },
  "callback_url": "https://client.example.com/webhooks/seeapi"
})
});

const result = await response.json();
ResponseHTTP 202
{
  "id": "task_xxx",
  "object": "inference",
  "model": "video-nsfw-filter",
  "endpoint": "video-moderation",
  "provider": "seeapi",
  "status": "processing",
  "result": null,
  "error": null
}