profanity.word
The text matches a word or phrase on the applicable language's profanity list.
What it looks at#
Whole-word matching against StormDoor’s per-language profanity word/phrase lists (seeded from LDNOOBW, CC-BY-4.0), after normalising the text:
- Case is folded.
- Repeated letters collapse — “shiiiit” and “shit” match the same way. Only runs of three or more collapse, so ordinary doubled letters (“committee”, “sorry”, “kaffe”) are untouched.
- Common leetspeak substitutes fold to their letter:
0→o 1→i 3→e 4→a 5→s 7→t @→a, and the dollar sign folds tos. - A word spelled out with a separator between every letter —
f.u.c.k,f-u-c-k,f u c k— is reconstructed, but only when every piece really is a single letter; ordinary abbreviations like “a.m.” or two-letter words on either side of a period are never treated as spelled-out evasion. - Multi-word phrases on the list match the same way, tolerating any amount of whitespace between the words.
Matching is whole-word, the same “Scunthorpe problem” guard /v1/pii and /v1/secrets
apply: “cunt” inside “Scunthorpe” is a substring, never a whole word, and never fires.
Word boundaries are Unicode-aware, so å/ä/ö/ü/ß and similar are letters, not separators —
Swedish “skit” inside “skitbra” doesn’t fire either, because “skitbra” is one whole word.
Which list applies#
The caller’s languages when given, else the language /v1/profanity detects with
confidence, else English — never every list at once. Sending languages is the single
biggest thing you can do to reduce both misses and false positives: without it, short or
ambiguous text falls back to the English list, and an English list run over ordinary
Swedish or Norwegian text will flag words that are completely unremarkable in their own
language (Swedish “fan”, “slut” — see the docs’ languages guidance).
What to do#
Medium severity — a real match, but plan-appropriate content moderation is a judgement
call your product makes, not this API. redact: "mask" before storing or forwarding
text you don’t need the raw wording in.