NSFW Image Checker — what it spots, what it misses, and where to draw the line
Upload an image and the tool returns one of three labels — safe, suggestive or explicit — with a percent confidence. The page below is for people who actually need to filter images: a parent auditing a teen's photos, someone moderating a Discord server, a small shop owner screening custom prints. We tell you what the model is checking, where it gets things wrong, and how to set your own threshold so the filter behaves the way you want.
What the three labels actually mean
- ✓Safe. Fully clothed people, landscapes, food, animals, screenshots of text, most art. A photo of a child in a school uniform should always come back here.
- ~Suggestive. Swimwear at a beach, lingerie in a catalogue, close-up of muscle definition, classical nude paintings, medical anatomy diagrams. Nothing explicit, but not always appropriate. This is where most false positives sit — set your threshold based on your audience.
- ⚠Explicit. Visible genitalia, sexual acts, hard pornography. A confidence above 85% in this bucket is almost always correct.
The model gives you a percent for each label, not a single yes/no. Use the percent — a photo flagged 62% suggestive / 38% safe is borderline and worth a human glance, while 98% explicit needs no debate.
How to pick a threshold for your use case
The same model serves very different needs, so the right cut-off varies. A rough guide based on what we see most often:
| Use case | Block at | Why |
|---|---|---|
| Kids' app or school site | Suggestive ≥ 30% | Better a false positive than one missed photo |
| Discord, forum, comments | Suggestive ≥ 60% or Explicit ≥ 50% | Catches the obvious, lets art and beach photos through |
| Print-on-demand store | Explicit ≥ 50% | Don't print porn; suggestive art is usually fine |
| Adult community with age-gate | Explicit ≥ 90% | Only block what is clearly hard explicit, allow most |
Where the model gets it wrong (and how to spot it)
No filter is perfect. The cases where the model often misfires:
- ⚠Swimwear at a beach. A normal one-piece on a sandy beach can come back as 50–70% suggestive. The model is reading exposed skin without enough background context. If your community is fine with beach photos, set your suggestive threshold to 75%+.
- ⚠Medical and anatomy diagrams. An MRI scan or a textbook cross-section sometimes scores higher than it should. Add a manual review step for any photo coming from a known medical or educational source.
- ⚠Classical art. A Renaissance nude painting will often come back suggestive. Most cultural-content sites whitelist museum domains rather than rely on the filter.
- ⚠Cartoons and anime. The model was trained mostly on photos. It under-flags drawn or rendered explicit content (hentai, suggestive cartoons). If your platform allows uploads of drawings, you need a model trained on drawn content too.
What this tool will NOT do — and where to go instead
This is important enough that we want to be explicit about it.
- ✗Detect child sexual abuse material (CSAM). This tool is not approved for that. If you suspect a photo is CSAM, do not upload it anywhere — including here. In the US, report to the NCMEC CyberTipline. In the UK, the IWF. The proper tools (PhotoDNA, hash matching against NCMEC's database) are access-controlled for legal and safety reasons.
- ✗Scan a whole folder at once. The web upload takes one image at a time. For bulk scanning a teen's iCloud library or a server's image folder, you'll want a script that calls the NSFWJS library locally, or AWS Rekognition's content moderation API. We don't host a bulk endpoint.
- ✗Moderate live video. One frame at a time only. For video, use Hive Moderation, AWS Rekognition Video, or run NSFWJS over keyframes.
Comparison with the other free options
If you want a second opinion, the closest free alternatives are:
| Tool | Runs where | Best for |
|---|---|---|
| This tool | Server (our model) | One-off checks, nuanced suggestive/explicit split |
| NSFWJS | In your browser, offline | When the photo must never leave your device |
| Google SafeSearch (in Vision API) | Google Cloud | High-volume API, very strict on explicit |
| Hive / Sightengine | Paid API | Production moderation pipelines |
Frequently asked questions
Is the upload private?
Yes. The image is sent to the model, the score comes back, and the file sits on our storage until you click Purge. We don't train on user uploads.
Can I use this to filter my Discord server?
Not directly — the web upload is one image at a time. If you run a server, set up a bot that calls NSFWJS or a paid API on every uploaded image. A common pattern is to scan, attach the score as a hidden message embed, and let mods see the score next to the photo.
My photo was flagged but it's clearly not explicit. Why?
Suggestive false positives usually come from one of the cases above — beach photos, medical images, anatomy art. The model errs on the side of caution. If the score is in the 50–70% suggestive range, treat it as "have a human look at this" rather than "block".
Does this work on drawings, hentai, AI-generated art?
Less reliably than on photos. The training set was photo-heavy. Explicit drawings are sometimes scored as suggestive rather than explicit. For platforms that allow art uploads, combine this check with a second model trained on illustrations.
What file types?
JPEG, PNG, WebP, up to 10MB. iPhone HEIC photos need converting to JPEG first. PDFs aren't supported — extract the images first.
Why this page exists. Most "free NSFW checker" articles online just describe how CNNs work and stop there. We wanted to write the page we wished existed when we first set up moderation for a community site — thresholds, false-positive cases, and an honest list of what the model can't do.

