Unprofane
All comparisons

Unprofane vs the OpenAI moderation endpoint

More abuse caught at the same false-alarm rate, profanity as a category of its own, and every disguise named.

The OpenAI moderation endpoint returns category scores (hate, harassment, self-harm, sexual, violence and their subtypes) for text and images, free to API customers.

Toxic text caught at the same false-alarm rate
  1. Unprofane89.0%flagging 7.0% of clean text
  2. OpenAI moderation40.8%its largest abuse category at 0.689, the same rate

48.2 points ahead

Clean text flagged, each as shipped
7.0%vs20.6%
Toxic usernames caught, each as shipped
76.5%vs18.8%

The private test set, 9,029 texts labelled blind, read once on 2026-09-28, engine 2026-09-29. How it was measured

Side by side

The measured rows are the private test set, read once; the rest is what each returns.

WhatUnprofaneOpenAI moderation
Toxic text caught, same false-alarm rate89.0%40.8%
Clean text flagged, each as shipped7.0%20.6%
Toxic usernames caught, each as shipped76.5%18.8%
Disguised spellings caught, each as shipped86.0%45.5%
Profanity as a categoryYesNo
Names how each word was disguisedYesNo
A censored version, ready to showYesNo
Reserved names: admin, support, your brandYesNo
Keeps every text at the edge, on requestYesNo

The private test set, 9,029 texts labelled blind, read once on 2026-09-28, engine 2026-09-29. Every system, every row.

Try to fool it

The real engine, live. Type a disguised word and watch it read, named and judged; type an innocent one and watch it pass.

Every answer carries the same evidence through the API: the words, where they were, how they were disguised and a censored version.

Enter to check

Why Unprofane

  1. 01

    Profanity, disguised or not

    Profanity is a category of its own, and every disguise is undone and named: leetspeak, look-alike letters, separators, reversal.

    username

    xXsh1tXxshit

    leetspeakreview ยท strong

    Shown as xX****Xx

  2. 02

    Milliseconds at the edge

    The rules answer inside the Worker, and an Edge-only project never sends a text to any model.

    5ms

    at p99 inside the Worker, for a check the rules answer

    Our own measurement in workerd, 300 requests, 2026-09-28

  3. 03

    Built for usernames

    A name that poses as your platform is blocked as reserved, not as rude, so the sign-up form can say what is wrong.

    username

    official_support

    official: reservedsupport: reservedblock

    The form can say the name is taken, not that it is rude.

For usernames, chat and comments, where the question is whether a text can be shown, Unprofane catches more and says why.

The first call

A test key is free, with a plan or without one. One request, in the language you use, and the answer carries the evidence.

curl -X POST https://api.unprofane.com/v1/check \
  -H "Authorization: Bearer up_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"xXsh1tXx","context":"username","policy":"teen"}'
Open the quickstart

Try it on your own text

Free test keys, 100 checks a day, no card. Live from $9 a month. Every answer shows its evidence.

Other comparisons