Data Validation — entry 004 of 7

PurgoMalum

Verified Jul 2026

PurgoMalum is a free, keyless GET-only web service that strips or flags profanity and obscenity in a submitted text string, recognizing common character substitutions ("@" for "a", "$" for "s") and an internal profanity list that can be extended per-request with an `add` parameter of extra blocked words. Separate request-type paths return the cleaned text as plain text, XML, or JSON, or return just a "true"/"false" verdict via its `containsprofanity` endpoint, so callers pick the shape they need without content negotiation headers. It's a single-purpose text-moderation utility rather than a full profile of a company's platform — there is no dashboard, key, or paid tier.

PurgoMalum is a free, keyless GET-only profanity filter: a live GET to /service/json?text=... in this run returned the input text with recognized profanity replaced by asterisks, and the same call against /service/plain and /service/xml returned the identical cleaned string wrapped in plain text and a <PurgoMalum> XML envelope respectively.

profanity-filtercontent-moderationtext-validationobscenity-filter
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSON, XML, Plain TextResponses can be requested as JSON or XML or Plain Text.

GreatAPIs Score

Score80out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs0/20No docs or spec available
Formats15/15Supports 3 response formats
Freshness20/20Verified within 6 months

Embed this badge

Scored 80 on greatapis.com
<a href="https://greatapis.com/api/purgomalum/"><img src="https://greatapis.com/badge/purgomalum.svg" alt="Scored 80 on greatapis.com"></a>

Auth quickstart

  1. No API key or signup required — every container (/service/json, /service/plain, /service/xml, /service/containsprofanity) answered fully keyless in this run's probes, with access-control-allow-origin: * on every response.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Filter profanity from a text string

GEThttps://www.purgomalum.com/service/json?text=this+is+shitty+test

200 application/json

{"result":"this is ****** test"}

Developer reference

Base URLhttps://www.purgomalum.com/service

Gotchas & limits

  • Errors don't use an HTTP error status — they're always HTTP 200, with the error message shaped to match the requested container: a live GET to /service/json with an over-long fill_text returned {"error":"User Replacement Text Exceeds Limit of 20 Characters."}, the same call against /service/plain returned the bare string User Replacement Text Exceeds Limit of 20 Characters., and against /service/xml returned <PurgoMalum xmlns="http://www.purgomalum.com"><error>User Replacement Text Exceeds Limit of 20 Characters.</error></PurgoMalum> — a client checking only the status code will never see these fail.
  • A request with no text param at all is also a 200: a live GET to /service/json with text omitted returned {"error":"No Input"}, not a 4xx.
  • fill_char only accepts a narrow set of characters, not "any single character" or "alphanumeric only": live probes this run showed * (the default) and - both accepted, while %, @, !, and even a plain digit 0 all returned {"error":"Invalid User Replacement Characters"} — check your exact character against a live call rather than assuming it's allowed.
  • /service/containsprofanity returns a bare true/false string (confirmed live: text=this is shitty testtrue), not a JSON boolean or a 0/1 flag, regardless of which container path you hit it through.
  • The add parameter extends the blocklist per-request rather than needing a stored list: a live GET with text=this is a bogusword test&add=bogusword filtered the custom word too, returning {"result":"this is a ********* test"}, even though "bogusword" isn't profanity on its own.