What's inside
See what happens after you hit anonymize - the features behind the text box, from custom rules to file redaction. Works in German, English and other languages.
Redacting is just the start: review, correct, and close gaps right in the result. An inspect view shows what's in there before you redact anything, and once you do, the “Found” list counts every match by category.
- See confidence: hover any marker to see how sure the model was.
- Redact with a click: uncertain hits stay visibly flagged until you redact them with one click.
- Redact it yourself: mark whatever the model misses - select text, pick a category, done.
The result below is real and touchable - try it.
Speaker lines with a timestamp and mail headers are read as what they are - not as prose. On Android you can share a chat straight out of WhatsApp: unpii opens with the text already pasted in.
3/12/26, 9:14 AM - Julia Ostermann: Can you resend the access details? 3/12/26, 9:16 AM - Ben Krause: Sure, forwarding the email now. From: Ben Krause <ben.krause@northpark-solutions.com> To: julia.ostermann@web.com Subject: Customer portal access Hi Julia, here are the access details. Call me at +49 151 22334455 if you have questions. Best, Ben
A JSON or CSV body is detected automatically: indentation and keys hold still, only the values are replaced - a hit inside a number is quoted correctly, so the result stays valid JSON. Without structure detection, the same marker lands unquoted and breaks the JSON.
You can also upload files and get them back redacted. Structure and formatting are preserved wherever that is lossless - anything that cannot be carried over cleanly is listed as a warning in the response. Before you download, the review view shows every hit. Supported formats: .docx and .pdf - a PDF comes back as an editable Word file.
onboarding-en.docx → onboarding-en-redacted.docx
4 details redacted
This run came back without warnings - nothing was lost in the rebuild.
Paste the AI's reply back in, markers turn into names again - happens in your browser, the text goes nowhere for this. Across several texts, the same person keeps the same number; that register lives in the tab, not with us.
Hello [PERSON_1], This confirms your appointment on [DATE_1] at 2pm. If you have questions, reach us at [PHONE_1] or by email at [EMAIL_1]. Best regards
Hello Mr. Klaus Bergmann, This confirms your appointment on 15.09.2026 at 2pm. If you have questions, reach us at +49 89 7712345 or by email at klaus.bergmann@lindenhof-consulting.com. Best regards
Internal IDs, ticket formats, project names: things nobody knows but you - catch them with your own rules. A rule is a pattern plus a category, testable live before it goes out, and fires reliably before the model has to guess. Start from a ready-made pack or import and export your own as a file. Here: an employee ID the model alone does not recognize.
The rule in this scene: M-\d{4}-[A-Z]
Some hits should stay: your own support address, the hotline, the product name. An allowlist entry protects exactly these terms - everything else keeps getting redacted.
The entry in this scene: support@nordlicht-consulting.com
Instead of [PERSON_1] you can assign your own label per category - useful when a downstream system expects specific placeholders or your documentation has a fixed convention.
The labels in this scene: PERSON → REDACTED-NAME EMAIL → REDACTED-EMAIL PHONE → REDACTED-PHONE
People get invented names instead of markers - the salutation in front of the name is kept. Text only, not files.
Everything here also works via API: text in, masked text plus findings with position, category and confidence out. An inspect-only endpoint reports the same findings without touching the text, and every output carries a signed receipt anyone can verify without us. The request below is the documented format, the response a real result.
Request
curl -X POST https://unpii.me/api/v1/anonymize \
-H "Authorization: Bearer ak_your_key_here" \
-H "Content-Type: application/json" \
-d '{"text": "Maria Keller (maria.keller@web.de) asked about invoice RECH-2026-4471."}'Response
{
"anonymized": "[PERSON_1] ([EMAIL_1]) asked about invoice [ACCOUNT_1].",
"spans": [
{
"start": 0,
"end": 12,
"category": "PERSON",
"id": 1,
"original": "Maria Keller",
"score": 0.9981087446212769
},
{
"start": 14,
"end": 33,
"category": "EMAIL",
"id": 1,
"original": "maria.keller@web.de",
"score": 1
},
{
"start": 55,
"end": 69,
"category": "ACCOUNT",
"id": 1,
"original": "RECH-2026-4471",
"score": 0.9164328575134277
}
],
"uncertainSpans": [],
"stats": {
"request_id": "req-bh",
"processed_chars": 70,
"servedBy": "gpu"
}
}Every scene is a real pipeline result, frozen once - nothing is mocked up or polished after the fact.
Also included
API keys
Create and revoke them yourself.
Data export
One click, one JSON: everything we store about you - including your rules and allowlist.
Usage overview
Daily usage and limits, live in your account.
Account deletion
Immediate and final.
Simple masks
xxxxx and blackbar are available to everyone - no account needed.
Keyboard
Submit, copy, jump to the next UNKLAR spot - without a mouse.
What we guarantee
- Request bodies are never logged.
- Detected PII spans are never logged or persisted beyond the response that returns them.
- Uploaded file bytes are processed in memory only and are never persisted or logged.
- Custom redaction patterns and allowlist values are encrypted at rest with per-user keys. Compromise of one account's data does not reveal another.
- Audit log entries for rule and allowlist changes contain only the entry ID, never the value or pattern.
- You can download a full export of your account data at any time via GET /api/v1/users/me/export.
- Account deletion (DELETE /api/v1/users/me) cascades through your custom rules, allowlist entries, API keys, and sessions.