Profanity Filter (Bulk, Multi-Language, Leetspeak-Aware) avatar

Profanity Filter (Bulk, Multi-Language, Leetspeak-Aware)

Pricing

from $2.00 / 1,000 record scanneds

Go to Apify Store
Profanity Filter (Bulk, Multi-Language, Leetspeak-Aware)

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

Simon Fletcher

Maintained by Community

Actor 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 simple str.contains filters miss.
  • Low false positives — a word-boundary guard fixes the classic "Scunthorpe problem": class, assessment, and passed are not flagged for containing ass.
  • 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

  1. Click Try for free.
  2. In the Input tab, paste your text records into records — either plain strings or { "id": "...", "text": "..." } objects (use id to map results back to your rows).
  3. (Optional) Choose Action (mask or flag), set a mask character, restrict languages/categories, or supply a custom wordlist / allowlist.
  4. Click Start and read the results in the Output tab, or pull them from the dataset via API/integration.

Input

FieldTypeDescription
records (required)arrayText to scan: strings or {id, text} objects.
actionstringmask (default) rewrites offending text; flag reports only.
maskCharstringCharacter used for masking (default *).
languagesarraySubset of en, es, fr, de (default: all).
categoriesarraySubset of profanity, sexual, insult, slur (default: all).
customWordlistarrayExtra terms to flag (reported as category custom).
allowlistarrayTerms that must never be flagged.
maxRecordsintegerOptional 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

FieldTypeDescription
idstring/intYour record id, or its array index.
textstringOriginal input text.
cleanedstringMasked text (or original, in flag mode).
hasProfanitybooleanWhether any offensive term was found.
hitCountintegerNumber of distinct terms detected.
hitsarrayPer-match {term, match, category, language, start, end}.
categoriesarraySorted unique categories present.
statusstringscanned, empty, or error.
chargedbooleanWhether 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 only slur for a strict hate-speech gate, or only profanity for a mild filter.
  • Localize by setting languages to just the locales you serve.
  • Correlate results by passing { "id": ..., "text": ... } objects so every output row carries your own key.
  • Cost guard: combine maxRecords with 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 Scunthorpe or assessment? No. A word-boundary check prevents substring false positives; use the allowlist for 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.