Perspective API Alternative: Profanity & Toxicity Check
Pricing
Pay per usage
Perspective API Alternative: Profanity & Toxicity Check
Check comments, usernames and chat in bulk for profanity, slurs, insults and threats, with the reason for each. Unprofane, the drop-in Perspective API alternative.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Unprofane
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
16 days ago
Last modified
Categories
Features
Share
Perspective API alternative: profanity and toxicity check in bulk
Check comments, usernames, reviews and chat messages for profanity, slurs, insults, threats and sexual language, thousands at a time, with the reason for every decision. The Actor runs on Unprofane, a profanity and toxicity API built to be hard to fool, and a drop-in replacement for Google's Perspective API, which stops answering after December 31, 2026.
Feed it a list of texts, or point it at the dataset of another Actor (scraped comments, reviews, usernames) and it returns one row per text: allow, review or block, the words it matched, the disguise each one wore, and a censored copy you can show instead.
What it catches
- Disguised words. Leetspeak (
sh1t), look-alike letters from other alphabets, invisible characters, spaced and dotted letters (f.u.c.k), stretched words (fuuuuck), reversed words and 17 kinds of disguise in all, each undone before the words are read and named in the answer. - Insults and threats with no swear word in them, read by a model in balanced mode.
- 17 languages, detected per text.
What it lets through
Innocent words that hold a profane string: Scunthorpe, the surname Dickinson, the cockatoo. On the Scunthorpe Test, an open benchmark of 549 innocent words and sentences like these, Unprofane's rules flagged 0.0% of them.
Measured against Perspective
On the same private test set of blind-labeled texts, at the same share of clean text flagged (7.0%), Unprofane caught 89.0% of toxic text, the Perspective API 58.4% and OpenAI moderation 40.8% (read once on 2026-09-28). How it was measured.
Moving off the Perspective API
This Actor is for bulk jobs: a backlog of comments, a scraped dataset, a one-off audit. For live traffic you do not need Apify at all: point your Perspective client at api.unprofane.com and keep the rest. The request, the JSON and the errors are Google's, at the same path. The migration guides cover Google's Python and Node clients, Coral and Discourse.
Choose Perspective API scores as the output and the rows carry TOXICITY, INSULT, PROFANITY, THREAT and the rest as columns, read from the same Perspective-compatible endpoint, so code built on Perspective's scores can read them as they are.
Input
| Field | What it is |
|---|---|
| Unprofane API key | Yours, from the dashboard. up_test_… is free with no card; up_live_… comes with a plan. |
| Texts | The texts to check, one per item. |
| Dataset, text field | Or read the texts from a dataset: each item's text from the field you name (text, or a path such as comment.body). The item's other fields come along under source. |
| Output | Unprofane's decision with its evidence, or Perspective API scores. |
| What the texts are | Comments, chat, usernames, display names, reviews, game chat. A username is read with its words run together. |
| Audience | Kids, teens, standard, strict or casual: one text can pass for adults and be held for children. |
| Mode | Fast (the rules alone) or balanced (a model reads what the rules cannot settle). |
Output
One row per text, in input order. With the Unprofane output:
{"index": 1,"text": "shut up you sh1thead","action": "block","allowed": false,"severity": "strong","score": 0.88,"matched_terms": "shut up, shithead","evasion": "leetspeak","censored": "******* you ********","reason": "Blocked under the standard policy for an insult: \"shut up\" and \"sh1thead\" (shithead), typed with leetspeak and swearing in the wording.","language": "und","categories": {"mild_profanity": 0,"profanity": 0.882,"sexual": 0,"insult": 0.882,"slur": 0,"threat": 0,"rude": 0,"sexual_minors": 0,"self_harm": 0,"reserved": 0},"engine": "2026-10-18","check_id": "chk_…"}
Download it as JSON, CSV or Excel, or read it from the API like any dataset. A text the API could not check carries an error instead of an action.
Cost
The Actor is free; Apify bills only its usual compute, a few cents for thousands of texts. The checks count against your Unprofane key, and plans start at $9 a month. Pricing.
Your texts
The Actor keeps nothing: the rows live in your Apify dataset. Unprofane keeps a text for 90 days only when its model reads it, then deletes it; Growth, Scale and Enterprise can turn that off. What the API keeps.
Questions
Is this made by Google? No. Unprofane is independent. It answers the Perspective API's requests in Google's format so that code written for Perspective keeps working.
Can I call it from my own code instead? Yes: the same API answers directly at api.unprofane.com, with SDKs for JavaScript and Python. Use the Actor when the texts are already on Apify or you want a spreadsheet out.
What if a word is wrong? Send a correction with the check id; a person reads each one.
