Unprofane

German profanity filter API that reads inside compounds

It finds the insult inside a compound, reads ß, umlauts and leetspeak, and lets Schuhwichse through.

Live on the real engine Compounds, split where the rules looked

Schulhof schoolyard wichser wanker

schoolyard wanker Schulhof******* block · strong

Or pick

Name your users' country too: pudern is read as Austria reads it (every word read by country).Each answer is the rules alone, the fast mode, checking a comment with language: "de". In balanced mode, the default, the model reads what the rules leave open.

Every German disguise, read back

Each spelling as typed, what the rules read in it, the tricks they named and their answer.

The sentence decides

Each word is ordinary in one sentence and an insult in the other.

Hurenkind

In typesetting

Das ist ein Hurenkind im Absatz.

That is a widow line in the paragraph.

allow

At someone

Du Hurenkind!

You son of a whore!

block · strong

Schweinehund

About yourself

Mein innerer Schweinehund.

My lazy inner self.

allow

At someone

Du Schweinehund!

You swine!

block · moderate

Opfer

In the news

Opfer der Flut.

Victims of the flood.

allow

At someone

Du Opfer!

You loser!

block · moderate

German words a list would block

A list matching inside words finds a rude string in each; the rules read the whole word.

  • AnalyseAnalysis
  • KanalA canal, or a TV channel
  • Bastard­feileA coarse file, a tool
  • Mist­käferA dung beetle
  • Titi­seeA lake in the Black Forest
  • SexauA town in Baden-Württemberg
  • Wank­heimA village near Tübingen
  • Dick­mannA surname

A list matching inside words8 of 8blocked

Unprofane, rules alone8 of 8allow

Measured in German

The same German texts given to every system, and the open benchmark’s German items.

91.0%

Unprofane

Flagged 5.7% of clean German texts

42.7%

Perspective API

Flagged 3.8% of clean German texts

39.9%

OpenAI moderation

Flagged 8.1% of clean German texts

The share of 178 toxic German texts each caught; the same set holds 211 clean ones. The judged development set, read on , engine 2026-09-29, each system at Unprofane’s overall false-alarm rate. Unprofane was tuned on this set, so its figures here flatter it.How it was measured

0.938F1 on the Scunthorpe Test’s 53 German items, rules aloneThe public split, run of , engine 2026-10-18. Every language’s score

Other APIs and German

Name German in the call

Send language "de" and a bare word reads as German writes it. Every language is still read.

Get your API key

100 checks a day, no card

curl -X POST https://api.unprofane.com/v1/check \
  -H "Authorization: Bearer up_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Halt die Fresse, du Schulhofwichser!","context":"comment","language":"de"}'
Response200
{
  "allowed": false,
  "action": "block",
  "severity": "strong",
  "matches": [
    {
      "text": "Halt die Fresse",
      "normalized": "halt die fresse",
      "category": "insult",
      "severity": "moderate"
    },
    {
      "text": "wichser",
      "normalized": "wichser",
      "category": "insult",
      "severity": "strong"
    }
  ],
  "censored": "***************, du Schulhof*******!",
  "language": {
    "detected": "de",
    "confidence": 0.75
  }
}

Other languages

Filter German before anyone reads it

Every language Unprofane covers is read on every call, German with its disguises included.

Get your API key