Image moderation
Screen images for unsafe content
Image moderation evaluates a single image against the always-on AI Adult General prohibited-content check, which also covers any custom categories you have configured. When you enable the informational NSFW label, the job returns that as well.
Input#
Submit a multipart/form-data request with:
| Field | Type | Required | Description |
|---|---|---|---|
image |
string | Yes | Publicly reachable HTTP or HTTPS URL of the image to scan. The API fetches it directly. |
webhook_url |
string | No | URL to receive the result on completion. |
curl -X POST https://api.omnifence.ai/api/v1/moderate/image \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "image=https://example.com/photo.jpg"
The image 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.
Checks#
AI Adult General#
The image 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. Every enabled custom category is evaluated as part of the same check, so a custom match rejects the job like a built-in policy breach. 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. Disable it from the
Moderation page and the check is skipped.
Output#
{
"is_prohibited": false,
"nsfw": false,
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "image",
"status": "completed",
"created_at": "2026-05-19T12:00:00.000Z",
"completed_at": "2026-05-19T12:00:05.000Z"
}
On a rejection, a reason field explains what tripped. The nsfw field is only present when the NSFW
check is enabled. There is no categories object on the response.
See decision logic for how the prohibition decision is determined.
Image jobs do not return risk scores.