Nudity detection that returns a level, not a guess.
One request returns a nudity level from 0 to 3, the three level scores, art and adult-object flags, and whether your policy blocks it. GIF and video frames included. Processed in memory in Germany, never stored.
500 free credits every month. No card.
{
"nudity": { "level": 2, "scores": { "revealing": 96.2, "implied_nudity": 71.5, "explicit": 8.1 } },
"flags": { "art": { "score": 3.4, "detected": false }, "sex_object": { "score": 0.9, "detected": false } },
"policy": { "blocked": true, "reason": "level", "matched_level": 2 },
"media": { "kind": "gif", "frames_analyzed": 5 },
"usage": { "credits": 5, "balance": 9995 }
}Four levels, not one score
Swimwear is not nudity, and a nude statue is not a photo. Every image gets a level; you decide where to draw the line, per community, per request.
Regular, fully clothed content. Always allowed.
Swimwear, lingerie and outfits that show more skin.
Unclothed, with intimate areas covered or out of view.
Visible intimate areas.
Policy as a request
Send block_level, block_sex_objects and an art rule; get blocked: true or false. The same engine that moderates Discord servers through SfwBot.
Nothing is stored
Media is downloaded or uploaded into memory, scored, and gone. No URLs, hashes or file names are logged. Failed requests cost nothing.
GIF and video built in
Frames are sampled evenly across the clip; you pay one credit per analysed frame and can read every frame if you want to.
Simple prepaid pricing
1 credit = 1 image or 1 analysed frame. Credits never expire.
Two lines to start
curl -X POST https://api.sfwapi.dev/v1/analyze \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/photo.jpg","policy":{"block_level":2}}'