Unprofane

7 Profanity Filters for Developers in 2026 (Perspective API Is Shutting Down)

The ones I’d actually put in front of a signup form, a chat box or a comment section.

A cover in signal blue: 7 profanity filters for developers, compared before Perspective API shuts down on December 31, 2026, beside a stack of seven cards naming them, Perspective pulled out and marked ends Dec 31

If you have ever shipped a signup form, you know the moment. Somebody registers a username you really don’t want on your leaderboard, and it’s sitting there in the top ten by Friday.

So you add a word list. A week later they’re back as sh1t, f.u.c.k or with a Greek letter swapped in, and when you tighten the list, somebody from Scunthorpe can’t sign up anymore. (Written with AI help; every number here is checked against the source I link.)

And if you handed this problem to Google’s Perspective API, there’s a date in your calendar you may not know about: Jigsaw says the service runs until December 31, 2026, and its FAQ says access can’t be extended past that.

So I went through the options developers actually reach for. Five are APIs, one is an npm package, one is on its way out. A few are free, and I’ll say which. I’ll also say where each one falls short, because nothing annoys me more than a “best tools” list where everything is perfect.

Let’s start the list:

1. Unprofane

The Unprofane playground reading fuck typed with a Greek upsilon: verdict review, strong, tagged homoglyph and mixed_script, censored to four asterisks

The unprofane.com playground

Unprofane is a profanity filter API built for the two problems at the top of this post. Full disclosure, I built this one.

You send it a username, a chat message or a review, and it answers allow, review or block, with the evidence: which words it found, where they were, how each one was disguised, and a censored copy to display. It undoes 13 measured kinds of disguise, from a swapped digit to a look-alike letter out of another alphabet.

It also answers on Perspective’s path, with Perspective’s JSON and Perspective’s errors, so a Python or Node client moves over by changing one line, and Coral Talk or Discourse by changing two.

On the numbers: in my own head-to-head, read once on 2026-09-28 against 9,029 texts labeled blind by AI judges, it caught 89.0% of the 2,672 toxic ones while flagging 7.0% of the clean ones. Perspective, read at the threshold where it flags that same 7.0%, caught 58.4%. On the public split of the Scunthorpe Test (run of 2026-10-19) its rules flagged 0 of 549 innocent words and names, though that list is the engine’s own, so it was built not to flag them. Your own innocent words are not in it.

Where it falls short: there is no free plan, only free test keys at 100 checks a day for building. It reads text, not images or video. It’s a young product. And the benchmark above is mine, with labels from AI judges, not an independent lab’s.

Plans start at $9 a month for 25,000 checks, half price for the first three months until December 31, 2026.

There are lots of other features also:

  • 17 languages, each with its own words and spellings
  • Catches insults and threats written in ordinary words, not only listed ones
  • Typed SDKs for JavaScript and Python
  • An MCP server, so a coding agent can write the call itself

Checkout here: unprofane.com/bench

2. OpenAI Moderation

OpenAI’s moderation guide on developers.openai.com

Screenshot: OpenAI's moderation guide

OpenAI’s moderation endpoint is free to use, and if you already have an OpenAI key, it’s one request away. That’s a real advantage worth taking seriously.

The current model, omni-moderation-latest, classifies text and images into thirteen categories across harassment, hate, illicit, self-harm, sexual and violence, with their subcategories. You get a flagged boolean, plus a flag and a score for each category.

The catch for this particular job: none of those thirteen categories is profanity. It’s built to find harm, not swearing. On my test set, read at the threshold where it flags the same 7.0% of clean text as the others, it caught 40.8% of the toxic texts. Its own flagged verdict catches more, 62.2%, but flags 20.6% of the clean text, which is a lot of false alarms to hand your moderators.

There are lots of other features also:

  • Free
  • Reads images as well as text
  • OpenAI’s data controls list /v1/moderations as not used for training

Checkout here: OpenAI moderation guide

3. Perspective API

The perspectiveapi.com home page

Screenshot: perspectiveapi.com

Perspective was the free default for years, and it earned that. Coral Talk and Discourse both shipped it, at a 0.7 threshold, which is why so many comment queues look the way they do.

You ask for the attributes you want, such as TOXICITY, SEVERE_TOXICITY, INSULT, PROFANITY and THREAT, and it answers with a probability for each, for the whole comment and optionally per sentence. TOXICITY is listed for seventeen languages, the other production attributes for seven.

One thing worth knowing about that 0.7 default: on my test set it flags only 1.0% of clean text there, which is lovely, but it catches 33.0% of the toxic text. Quiet queues are not the same as clean comments.

It’s on this list as a warning, though. Jigsaw says the service remains active until December 31, 2026, and the FAQ says access cannot be extended past the final date. Requests for new access were taken only until February 2026. The sunset notice on its own home page adds the part that matters most if you’re integrated: there will be no direct migration support. If it’s in your stack today, you need a plan before then.

There are lots of other features also:

  • Free, with a default quota averaging one query per second per project
  • Experimental attributes, including ones trained on New York Times comments
  • A doNotStore flag, which the docs tell you to set for private text

Checkout here: perspectiveapi.com

4. WebPurify

WebPurify’s documentation for its check method

Screenshot: webpurify.com documentation

WebPurify does more than text, and that’s the reason to pick it. Its in-house team moderates images around the clock, every day of the year, and it says it doesn’t crowdsource that work. Video gets AI review across 16 or more categories, with the audio transcribed and read too.

For text, its API checks against a word list it maintains, and answers with a count, the words it found, or the text with them masked. You can add your own block and allow lists per license key, by API or in the admin.

Two things to check before you build on it. The documented text responses don’t tell you where each word was, what category it is, how severe it is, or how it was disguised, so you can’t highlight a span or tune by category. And language isn’t detected: the caller names it. Its docs list twelve languages plus three in beta.

There are lots of other features also:

  • Email addresses, phone numbers and URLs can count as profanity
  • Plugins for WordPress, Drupal, Joomla and bbPress
  • Endpoints in the US, the EU and Asia-Pacific
  • Texts up to 30,000 characters, with no cap on queries

Checkout here: webpurify.com

5. CleanSpeak

The cleanspeak.com home page

Screenshot: cleanspeak.com

CleanSpeak is the heavyweight. It’s a filter plus a full moderation console: approval queues, alerts, user reputation, ban and mute tools, and reports by tag, severity and top offenders. If you have actual moderators, that console is worth more than any accuracy number.

Its filter answers well, too. Each match comes back with its position, length, matched text, root word, a severity and tags such as vulgarity, sexual or bullying. You can self-host it or let them run a private server for you, and 22 or more base language lists come included for you to edit.

Three things to know. Prices aren’t published, so you’ll be talking to sales. The machine-learning models cost extra, and its features page says those models come from Google Perspective, which ends after December 31, 2026; I couldn’t find a page that says what happens to them then. And self-hosting wants MySQL 8 or Postgres 10 and an OpenSearch or Elasticsearch cluster beside it.

There are lots of other features also:

  • Filters for email addresses, phone numbers, URLs and usernames
  • An allowlist mode for children’s chat
  • Webhooks for approvals, user actions, edits and deletes
  • A 30-day free trial with no credit card

Checkout here: cleanspeak.com

6. Azure AI Content Safety

Azure AI Content Safety’s harm categories on learn.microsoft.com

Screenshot: Azure AI Content Safety docs

If you’re already on Azure, this is the natural place to look, and keeping it in one bill is a genuine reason to choose it.

It reads text and images for four harm categories: hate and fairness, sexual, violence and self-harm. Each comes back with a severity, 0 to 7, or four levels by default. You get a categoriesAnalysis array and, if you use blocklists, the list name and the item that matched.

Profanity isn’t a category here. Microsoft’s own harm-category docs put curse words, profanity and insults that don’t target an identity group at level 2 of hate, the lowest band above nothing. So a plain “is this rude?” answer means tuning thresholds rather than reading a field. You’ll also need an Azure subscription and a resource in a supported region before your first call.

There are lots of other features also:

  • Your own blocklists, stored in your resource’s region
  • Prompt Shields for LLM apps, plus groundedness detection in preview
  • Inputs not stored during detection and not used for training
  • Trained and tested on eight languages; others may work at varying quality

Checkout here: Azure AI Content Safety

7. obscenity (npm)

The obscenity repository on GitHub

Screenshot: obscenity on GitHub

If you don’t want an API at all, obscenity is the npm package I’d reach for. It runs inside your own Node process, which means no network call, no per-check cost, and the text never leaves your server.

It matches more than an exact string: repeated letters, look-alike Unicode letters, and a word hidden inside a longer one. It tells you where each match is and can censor it for you. It’s MIT licensed, and you can add your own words on top of the built-in list.

Its README is honest about the limit, and says to treat the output as a heuristic. A word list reads words, not meaning, so “nobody wants you here” goes straight through, and so does a disguise nobody has added yet. For a side project, that trade is often exactly right.

There are lots of other features also:

  • Zero cost and no network latency
  • Works anywhere Node runs
  • Your own word list on top of the default English one

Checkout here: github.com/jo3-l/obscenity


That’s the list.

How I’d pick, honestly:

  • You want harassment and self-harm flags more than swearing, for free: OpenAI Moderation.
  • You need images or video moderated, or people in the loop: WebPurify.
  • You have moderators and want them a console: CleanSpeak.
  • You’re already deep in Azure: Content Safety.
  • It’s a side project and a heuristic is fine: obscenity, for nothing.
  • Usernames and chat that people will deliberately spell around, or a Perspective integration to replace: that’s the gap I built Unprofane for, and the migration guide is at unprofane.com/perspective.

One last thing, whichever way you go. The 0.7 threshold everybody inherited from Perspective is a choice, not a default, and it’s a quiet one. Measure your own false alarms before you ship, on your own text, in your own languages. Every number in this post came with a false-alarm rate beside it for exactly that reason.

If you’ve built a filter yourself, or you’ve seen a disguise none of these catch, drop it in the comments. I’m always looking for the next one.

Thanks for reading :)

I build Unprofane, an API that decides whether a text is profane.

Catch what Perspective misses. Change one line.

A profanity and toxicity API your users can’t spell their way around, on Perspective’s own path and JSON. Point your client at it and your queue gets better, not quieter.

89.0%
of toxic texts caught at a 7.0% false-alarm rate. Perspective, at the same rate: 58.4%.
0 of 549
innocent words and names flagged on the Scunthorpe Test’s public split: Scunthorpe, cockatoo, Dickinson.

How it was measured, on 9,029 held-back texts.

Hobby50% off for 3 months

$4.50a month for 3 months, then $9

25,000 checks a month, every language and disguise included.

Get your API key

Keep reading

Every post