Profanity Filter (Bulk, Multi-Language, Leetspeak-Aware)
Pricing
from $2.00 / 1,000 record scanneds
Profanity Filter (Bulk, Multi-Language, Leetspeak-Aware)
Flag or mask profanity & offensive language in bulk text. Catches leetspeak, unicode & spaced obfuscation. Custom wordlist + allowlist. No API keys. Pay per record.
Pricing
from $2.00 / 1,000 record scanneds
Rating
0.0
(0)
Developer
Simon Fletcher
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Profanity Content Filter
Flag or mask profanity and offensive language in bulk text — and actually catch the obfuscated stuff. This Actor scans thousands of user-supplied text records (reviews, comments, chat logs, form submissions, product listings) and returns clean, agent-friendly JSON: masked text plus a precise per-record hit list (term, matched substring, category, language, character offsets). It normalizes leetspeak, unicode look-alikes, spacing, and stretched letters, so sh1t, s h i t, shit, and shiiit are all caught — not just the dictionary spelling.
It runs entirely on the text you provide inline. It scrapes nothing, needs no API key or login, and stores no third-party data — so it never breaks when a website changes and carries no scraping-ToS risk.
Why use Profanity Content Filter?
- Moderation at scale — screen user-generated content (reviews, comments, support tickets, usernames) before it goes live.
- Beats naive word lists — obfuscation-aware normalization defeats the common tricks (
f4ggot,@ss,b u l l s h i t) that simplestr.containsfilters miss. - Low false positives — a word-boundary guard fixes the classic "Scunthorpe problem":
class,assessment, andpassedare not flagged for containingass. - Multi-language — built-in English, Spanish, French, and German lists, extensible per run.
- Fully tunable — add your own banned terms with a custom wordlist, and whitelist safe words (brand names, surnames) with an allowlist.
- Agent- & pipeline-ready — concise structured JSON, one record in → one record out, callable via API, schedule, or the Apify MCP server.
How to use Profanity Content Filter
- Click Try for free.
- In the Input tab, paste your text records into
records— either plain strings or{ "id": "...", "text": "..." }objects (useidto map results back to your rows). - (Optional) Choose Action (
maskorflag), set a mask character, restrict languages/categories, or supply a custom wordlist / allowlist. - Click Start and read the results in the Output tab, or pull them from the dataset via API/integration.
Input
| Field | Type | Description |
|---|---|---|
records (required) | array | Text to scan: strings or {id, text} objects. |
action | string | mask (default) rewrites offending text; flag reports only. |
maskChar | string | Character used for masking (default *). |
languages | array | Subset of en, es, fr, de (default: all). |
categories | array | Subset of profanity, sexual, insult, slur (default: all). |
customWordlist | array | Extra terms to flag (reported as category custom). |
allowlist | array | Terms that must never be flagged. |
maxRecords | integer | Optional cap on records processed (0 = no cap). |
Input example
{"records": ["You sh1t, that was a b4stard move","what a s h i t experience",{ "id": "review-42", "text": "Great seller, fast shipping!" }],"action": "mask","allowlist": ["scunthorpe"]}
Output
Each input record produces exactly one dataset item. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
{"id": "review-42","text": "You sh1t, that was a b4stard move","cleaned": "You ****, that was a ******* move","hasProfanity": true,"hitCount": 2,"hits": [{ "term": "shit", "match": "sh1t", "category": "profanity", "language": "en", "start": 4, "end": 8 },{ "term": "bastard", "match": "b4stard", "category": "insult", "language": "en", "start": 21, "end": 28 }],"categories": ["insult", "profanity"],"status": "scanned","charged": true}
Output fields
| Field | Type | Description |
|---|---|---|
id | string/int | Your record id, or its array index. |
text | string | Original input text. |
cleaned | string | Masked text (or original, in flag mode). |
hasProfanity | boolean | Whether any offensive term was found. |
hitCount | integer | Number of distinct terms detected. |
hits | array | Per-match {term, match, category, language, start, end}. |
categories | array | Sorted unique categories present. |
status | string | scanned, empty, or error. |
charged | boolean | Whether this record was billed. |
Pricing
This Actor uses pay-per-result: you are billed once per non-empty record scanned. Blank/whitespace rows and any record that errors are never charged, and the Actor honors your run's max-charge limit — it stops billing before doing unpaid work. Because it is pure text processing (no proxies, no browser), compute cost per record is tiny; see the Actor's pricing on this page for the current per-record rate.
Tips & advanced options
- Reduce false positives by adding safe words (brand names, surnames, place names) to
allowlist. - Tighten or widen scope with
categories— e.g. flag onlyslurfor a strict hate-speech gate, or onlyprofanityfor a mild filter. - Localize by setting
languagesto just the locales you serve. - Correlate results by passing
{ "id": ..., "text": ... }objects so every output row carries your own key. - Cost guard: combine
maxRecordswith the run's max-charge limit for hard spend control on large batches.
FAQ, disclaimers & support
- Does it catch obfuscation? Yes — leetspeak (
1→i,4→a,@→a,$→s), full-width/unicode letters, separators (s h i t,s.h.i.t), and stretched letters (shiiit). - Will it flag
Scunthorpeorassessment? No. A word-boundary check prevents substring false positives; use theallowlistfor any remaining edge cases specific to your domain. - Is my data stored or sent anywhere? No. The Actor processes only the text you pass in and writes results to your own dataset. It performs no scraping and requires no credentials.
- Can I add my own banned words? Yes —
customWordlist(per run). For a tailored/enterprise list or a language not yet covered, use the Issues tab to request it.
Found a gap or a false positive? Please open an issue via the Issues tab with an example — it helps improve the wordlists.