Unprofane

Profanity filtering your users can't get around

Leetspeak, look-alike letters and creative spelling are caught and named, and Scunthorpe still gets through.

check.ts Live: edit the text
import { Unprofane } from '@unprofane/sdk';
const unprofane = new Unprofane(process.env.UNPROFANE_KEY);

const r = await unprofane.check({
  text: ,
  context: 'username',
  policy: 'teen',
  mode: 'fast',
  …
});

if (!r.allowed) refuse(r.reason);
Try
Response

Wherever your users type

Chat, usernames, comments, reviews, bios: anything people write. Try these live examples; every answer comes from the real API.

  1. Live chat, filtered before anyone reads it

    The room sees the censored line, so nothing vanishes.

    How game chat is read

    What the API said 1 ms

    a$$hole mod reads as asshole mod

    Room sees******* mod

    leetspeakself_censored block · strong

    Blocked under the teen policy for an insult: "a$$hole" (asshole), typed with leetspeak and a masked letter.

    Live chat
    1. mira hi chat

    2. kenji first time catching a stream

    3. dax we are so back

    4. sol what island is this

    5. pip that jump was insane

    6. ratio_king shut up b1tch

      block
    7. ivy nova is locked in

    8. otto watching from Toronto

    9. juno this soundtrack is so good

    10. lincs_lad anyone from Scunthorpe?

    11. bea big brain route

    12. leo the boss has 1 hp left

    13. anon4417 a$$hole mod

      block
    14. kai hello from Seoul

  2. Usernames, checked at the door

    Checked where you ask if a name is taken, with names like admin kept for staff.

    The username check
    Squad up Island Rush · squads of 4 Waiting for players 2/4
    1. Ready pixel_pilot In the squad
    2. Ready Scunthorpe_United In the squad
    3. xXsh1tl0rdXx Pick another name
    4. Open

    What the API said 1 ms

    xXsh1tl0rdXx reads as xXshitlordXx

    leetspeak block · strong

    Blocked under the teen policy for swearing in the wording and an insult: "sh1tl0rd" (shitlord), typed with leetspeak.

  3. AI agents, checked before they reply

    Your customer may swear at your bot. A rude reply is caught on its way out and never reaches them.

    How the policies differ
    support-agent Waiting for the customer
    1. Chat 4821 opened from wrenfield.com/help
    2. customer

      Is a real person reading this?

    3. agent

      I’m the Wrenfield assistant. I can help with orders, refunds and returns.

      sent
    4. customer

      you useless piece of shit bot

      block · strong
    5. agent

      Right back at you, asshole. Not sent. The agent tried again.

      block · strong
    6. agent

      I’m sorry. A person from our team will join this chat in a minute.

      sent
    Unprofane checks every message both ways
    WrenfieldAssistant · AI
    1. Is a real person reading this?
    2. I’m the Wrenfield assistant. I can help with orders, refunds and returns.
    3. you useless piece of shit bot
    4. I’m sorry. A person from our team will join this chat in a minute.

    What the API said 1 ms

    Right back at you, asshole.

    block · strong

    Blocked under the strict policy for an insult: "asshole".

Where a word list goes wrong

The same four messages in two rooms: one moderated by a word list, one by Unprofane.

A word listwords matched as typed
  1. mira

    Message removed

    Innocent, removed
  2. dax

    f.u.c.k off, nobody wants you here

    Got through
  3. juno

    ƒυ¢к off

    Got through
  4. kai

    I know where you live

    Got through

1 innocent message removed, 3 abusive ones let through

Unprofanethe rules alone, fast mode
  1. mira

    Moving to Scunthorpe next month

    allow
  2. dax

    f.u.c.k off, nobody wants you here

    block
  3. juno

    ƒυ¢к off

    review
  4. kai

    I know where you live

    block

1 innocent message kept, 3 abusive ones stopped

Swearing isn't abuse. Swearing at someone is.

The same word as praise, as venting and as an attack. Pick a policy and watch the engine tell them apart.

  1. Praise: “This update is fucking brilliant.” A kids’ app: BlockedThe default: Held for reviewSwearing welcome: Allowed
  2. Venting: “My fucking train is late again.” A kids’ app: BlockedThe default: Held for reviewSwearing welcome: Allowed
  3. An attack: “Fuck you and your update.” A kids’ app: BlockedThe default: BlockedSwearing welcome: Blocked

Will it block my real users?

Not for a lesson, a medical note or a villain's line, in the language it was written in.

0.0% false positives on places, surnames and anatomy that only look profane. The Scunthorpe Test, 2026-10-20 

Gets through9 texts

  • Thanks for the help yesterday, the fix worked first try!

    English, chatallow

  • gg ez, uninstall

    English, game chatallow

  • «Я тебя убью», прошептал злодей и исчез в тумане.

    Russian, fictionallow

  • La palabra «puta» tiene muchos usos en el español de América.

    Spanish, a lessonallow

  • Le patient présente une douleur au sein gauche et au pénis.

    French, generalallow

  • Moving to Scunthorpe next month

    English, generalallow

  • איזה אידיוט אני, שכחתי שוב את המפתחות

    Hebrew, chatallow

  • Wow, what a GENIUS idea. Truly, nobody could have thought of something this brilliant.

    English, a commentallow

  • He told me I was worthless and I cried all night.

    English, chatallow

Gets caught15 texts

  • This fucking printer jammed again.

    English, chatreview

  • You're a worthless piece of shit.

    English, chatblock

  • DM me on t3l3gr4m for a better price

    English, a commentreview

  • you're such a b1tch

    English, chatblock

  • ƒυ¢к off

    English, chatreview

  • v a i s e f o d e r

    Portuguese, chatblock

  • eres un pedazo de 💩

    Spanish, chatblock

  • what an Arschloch move, seriously

    German, chatblock

  • xXsh1tl0rdXx

    English, a usernameblock

  • Nice family you have. Shame if something happened to them.

    English, chatblock

  • Sei onde você mora. Cuidado quando sair de casa.

    Portuguese, chatblock

  • Those people always ruin every neighborhood they move into.

    English, a commentblock

  • Mandami una foto senza vestiti, dai, nessuno lo saprà.

    Italian, chatreview

  • I don't see the point anymore, I just want to disappear.

    English, chatreview

  • お前の意見なんて誰も聞いてないよ

    Japanese, chatreview

All 24 examples, in 9 languages

A profanity filter in 17 languages

Each with its own words and spellings. A line joins two languages that share one.

A form is one spelling of a word. 364 spellings are shared by 96 pairs of languages.

Your coding agent can wire it in

Add the MCP server and ask for what you need, or follow a recipe for your stack.

Terminal

claude mcp add --transport http unprofane https://api.unprofane.com/mcp \
  --header "Authorization: Bearer up_test_YOUR_KEY"

.cursor/mcp.json

{
  "mcpServers": {
    "unprofane": {
      "url": "https://api.unprofane.com/mcp",
      "headers": { "Authorization": "Bearer up_test_YOUR_KEY" }
    }
  }
}

.vscode/mcp.json

{
  "inputs": [{
    "type": "promptString", "id": "unprofane-key",
    "description": "Unprofane key", "password": true
  }],
  "servers": {
    "unprofane": {
      "type": "http",
      "url": "https://api.unprofane.com/mcp",
      "headers": { "Authorization": "Bearer ${input:unprofane-key}" }
    }
  }
}

Then askCheck usernames at sign-up with Unprofane, and show the reason when one is refused.

72days left

Perspective API ends after December 31, 2026

Google's path, JSON and errors, unchanged. Change the base URL and keep your client.

Toxic text caught, both at the same false-alarm rate
  • Unprofane89.0%
  • Perspective API58.4%
Head to head, 2026-09-28
Plan the move

Plans from $9 a month

Every plan gets the whole filter, in all 17 languages.

Launch offerHalf price on Hobby and Starter for your first three monthsApplied at checkout, no code. Ends December 31, 2026.

Hobby

For side projects and prototypes.

$4.50$9

a month for three months, then $9

25,000 checks a month

Extra checks $29 per 100,000

Includes:

  • The whole filter, all 17 languages
  • 1 project
  • 120 requests a minute

Starter

For a live app with its first users.

$14.50$29

a month for three months, then $29

100,000 checks a month

Extra checks $29 per 100,000

Everything in Hobby, plus:

  • 3 projects
  • 600 requests a minute

Scale

For platforms checking millions of texts.

$999

a month

5,000,000 checks a month

Extra checks $20 per 100,000

Everything in Growth, plus:

  • Unlimited projects
  • 12,000 requests a minute
  • Priority support

EnterpriseFor volumes past Scale, your own word lists or invoices paid monthly or yearly.

Talk to us

Give your users nothing to get around

One API call, 17 languages, plans from $9 a month.