Perspective API Alternative: Profanity & Toxicity Check avatar

Perspective API Alternative: Profanity & Toxicity Check

Pricing

Pay per usage

Go to Apify Store
Perspective API Alternative: Profanity & Toxicity Check

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

Unprofane

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

16 days ago

Last modified

Features

Limited permissions

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

FieldWhat it is
Unprofane API keyYours, from the dashboard. up_test_… is free with no card; up_live_… comes with a plan.
TextsThe texts to check, one per item.
Dataset, text fieldOr 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.
OutputUnprofane's decision with its evidence, or Perspective API scores.
What the texts areComments, chat, usernames, display names, reviews, game chat. A username is read with its words run together.
AudienceKids, teens, standard, strict or casual: one text can pass for adults and be held for children.
ModeFast (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.