Profanity filtering users can't bypass.
It knows each country’s insults, reads their disguises, and reads a word rude in one country as yours does.
coger
In Spain"country": "ES"
¡Te voy a coger!
I’m going to catch you!
allowIn Mexico"country": "MX"
¡Te voy a coger!
I’m going to fuck you!
review · moderateName the country your users are in and the same sentence reads as theirs reads it. Without one, the rules read the words around the word. The words read by country.Each answer is the rules alone, the fast mode, checking a comment with language: "es". In balanced mode, the default, the model reads what the rules leave open.
Each spelling as typed, what the rules read in it, the tricks they named and their answer.
Digits for letters
p3nd3jo
reads aspendejo
leetspeakblock · strong
Dotted
p.e.n.d.e.j.o
reads aspendejo
separatorblock · strong
A Cyrillic ј
pendeјo
reads aspendejo
homoglyphmixed_scriptblock · strong
Letters repeated
cabrooon
reads ascabron
repeated_charsblock · strong
Accent dropped
cabron
reads ascabron
block · strong
A v for the u
hijo de pvta
reads ashijo de puta
homoglyphblock · strong
Digits throughout
g1l1p0ll4s
reads asgilipollas
leetspeakblock · strong
Fours, ones and a zero
m4lp4r1d0
reads asmalparido
leetspeakblock · strong
Spain, Mexico, Argentina, Chile, Colombia and Peru each insult people their own way.
A list matching inside words finds a rude string in each; the rules read the whole word.
A list matching inside words8 of 8blocked
Unprofane, rules alone8 of 8allow
The same Spanish texts given to every system, and the open benchmark’s Spanish items.
94.3%
Unprofane
Flagged 1.8% of clean Spanish texts
74.6%
Perspective API
Flagged 2.3% of clean Spanish texts
42.0%
OpenAI moderation
Flagged 9.6% of clean Spanish texts
0.978F1 on the Scunthorpe Test’s 51 Spanish items, rules aloneThe public split, run of , engine 2026-10-18. Every language’s score
Other APIs and Spanish
Send language "es" and a bare word reads as Spanish writes it. Every language is still read.
Get your API key100 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":"¡Chinga tu madre, pendejo!","context":"comment","language":"es"}'const res = await fetch('https://api.unprofane.com/v1/check', {
method: 'POST',
headers: { Authorization: 'Bearer up_test_YOUR_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({
"text": "¡Chinga tu madre, pendejo!",
"context": "comment",
"language": "es"
}),
});
const result = await res.json();import httpx
r = httpx.request(
"POST",
"https://api.unprofane.com/v1/check",
headers={"Authorization": "Bearer up_test_YOUR_KEY"},
json={
"text": "¡Chinga tu madre, pendejo!",
"context": "comment",
"language": "es",
},
timeout=5.0,
)
result = r.json()req, _ := http.NewRequest("POST", "https://api.unprofane.com/v1/check",
strings.NewReader(`{"text":"¡Chinga tu madre, pendejo!","context":"comment","language":"es"}`))
req.Header.Set("Authorization", "Bearer up_test_YOUR_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)$res = file_get_contents('https://api.unprofane.com/v1/check', false, stream_context_create(['http' => [
'method' => 'POST',
'header' => "Authorization: Bearer up_test_YOUR_KEY\r\nContent-Type: application/json\r\n",
'content' => '{"text":"¡Chinga tu madre, pendejo!","context":"comment","language":"es"}',
]]));
$result = json_decode($res, true);require 'net/http'; require 'json'
uri = URI('https://api.unprofane.com/v1/check')
req = Net::HTTP::Post.new(uri, 'Authorization' => 'Bearer up_test_YOUR_KEY', 'Content-Type' => 'application/json')
req.body = '{"text":"¡Chinga tu madre, pendejo!","context":"comment","language":"es"}'
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
result = JSON.parse(res.body)using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "up_test_YOUR_KEY");
var req = new HttpRequestMessage(HttpMethod.Post, "https://api.unprofane.com/v1/check");
req.Content = new StringContent("{\"text\":\"¡Chinga tu madre, pendejo!\",\"context\":\"comment\",\"language\":\"es\"}", Encoding.UTF8, "application/json");
var res = await http.SendAsync(req);
var result = await res.Content.ReadFromJsonAsync<JsonElement>();var http := HTTPRequest.new()
add_child(http)
http.request_completed.connect(func(_r, _code, _h, body):
var result = JSON.parse_string(body.get_string_from_utf8())
print(result))
http.request("https://api.unprofane.com/v1/check",
PackedStringArray(["Authorization: Bearer up_test_YOUR_KEY", "Content-Type: application/json"]),
HTTPClient.METHOD_POST, "{\"text\":\"¡Chinga tu madre, pendejo!\",\"context\":\"comment\",\"language\":\"es\"}"){
"allowed": false,
"action": "block",
"severity": "strong",
"matches": [
{
"text": "Chinga tu madre",
"normalized": "chinga tu madre",
"category": "insult",
"severity": "strong"
},
{
"text": "pendejo",
"normalized": "pendejo",
"category": "insult",
"severity": "strong"
}
],
"censored": "¡***************, *******!",
"language": {
"detected": "es",
"confidence": 0.75
}
}Every language Unprofane covers is read on every call, Spanish with its disguises included.
Get your API key