Profanity filtering users can't bypass.
Write any text in leetspeak, or read leetspeak back as plain English, as you type.
Digits only, the classic 1337 spelling: 4, 8, 3, 9, 1, 0, 5 and 7.
Every letter with the stand-ins the translator writes for it, each level adding to the ones before.
| Letter | Basic | Advanced | Extreme |
|---|---|---|---|
| A | 4 | @ | /\ |
| B | 8 | · | |3 |
| C | · | (<¢ | · |
| D | · | · | |) |
| E | 3 | € | · |
| F | · | · | |= |
| G | 9 | 6 | · |
| H | · | # | |-| |
| I | 1 | ! | · |
| J | · | ] | _| |
| K | · | · | |< |
| L | 1 | |£ | |_ |
| M | · | · | |\/|/\/\ |
| Letter | Basic | Advanced | Extreme |
|---|---|---|---|
| N | · | ~ | |\| |
| O | 0 | · | () |
| P | · | · | |*|> |
| Q | · | · | (,) |
| R | · | · | |2 |
| S | 5 | $ | · |
| T | 7 | + | · |
| U | · | · | |_|(_) |
| V | · | · | \/ |
| W | · | · | \/\/ |
| X | · | % | >< |
| Y | · | · | `/ |
| Z | · | · | · |
A few words outlived the bulletin boards and games where leetspeak began.
A word list needs an entry for every spelling; Unprofane reads them all and names the trick.
One request checks a chat line, a username or a comment, and names the trick it found.
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":"n1ce try, sh1th34d","context":"chat"}'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": "n1ce try, sh1th34d",
"context": "chat"
}),
});
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": "n1ce try, sh1th34d",
"context": "chat",
},
timeout=5.0,
)
result = r.json()req, _ := http.NewRequest("POST", "https://api.unprofane.com/v1/check",
strings.NewReader(`{"text":"n1ce try, sh1th34d","context":"chat"}`))
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":"n1ce try, sh1th34d","context":"chat"}',
]]));
$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":"n1ce try, sh1th34d","context":"chat"}'
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\":\"n1ce try, sh1th34d\",\"context\":\"chat\"}", 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\":\"n1ce try, sh1th34d\",\"context\":\"chat\"}"){
"allowed": false,
"action": "block",
"evasion": [
"leetspeak"
],
"matches": [
{
"text": "sh1th34d",
"normalized": "shithead"
}
],
"censored": "n1ce try, ********"
}