The correct term is pseudonymization, although many call it anonymization. We keep the mapping until 30 minutes after its last use, at the latest 8 hours after its first use, so you can get the real values back. That is why the replaced data is still personal data.
No registration required • Public API available
How it works
A placeholder names the kind of value and an identifier, for example [PERSON:…] for a name or [PHONE:…] for a phone number. A stand-in name looks like a real name.
-
- Original
- Carola Wendt asks for a call back on +49 15228817 042.
- With placeholders
- [PERSON:95aab13a] asks for a call back on [PHONE:fc00263b].
- With stand-in names
- Ian Gruning asks for a call back on +49 15254599 441.
-
- Original
- Please find attached the quote for Tobias Kranz, Holzbau Brenner GmbH.
- With placeholders
- Please find attached the quote for [PERSON:cc4fe119], [ORGANISATION:a17bf909].
- With stand-in names
- Please find attached the quote for Isabell Koczulla, Schmitt-Sagonas Bozsik Jarets-Kappler.
-
- Original
- Please transfer the deposit to DE89 3704 0044 0532 0130 00.
- With placeholders
- Please transfer the deposit to [IBAN:22c99e1b].
- With stand-in names
- Please transfer the deposit to XX00 0000 0000 0000 0019 74.
Trust through Transparency
What we do technically:
- ✓ Art. 25 GDPR: Data protection by design. Detection on our server in Germany, only the data needed, pseudonymisation.
- ✓ Art. 32 GDPR: Security of processing. Transfer over TLS. The service only returns the real values with the matching session ID. The log holds no plain text, only the number of detected values and checksums of them made with a secret key (HMAC-SHA256).
- ✓ Art. 5 GDPR: Data minimisation. We do not store the text. The mapping stays in memory and is deleted 30 minutes after its last use, at the latest 8 hours after its first use.
- ✓ Art. 44 to 49 GDPR: No transfer to third countries. Detection (GLiNER) runs on our server in Germany, and the service passes no text on to other services.
Self-Assessment: Michael SCHILLER - Organisation. Digital.
Date: 17.10.2026
Responsible: Michael Schiller (Managing Director)
For Businesses
Compliance documents for download
Servers in Germany
Detection on our rented server
Short storage
Mapping until 30 min after last use, max. 8 h
Encrypted
Transfer over TLS
No plain text in the log
Checksums only
According to GDPR Art. 4 Para. 1, personal data is any information relating to an identified or identifiable natural person. This means: Any information that can be directly or indirectly attributed to a person is considered personal and subject to data protection.
What does our pseudonymizer detect?
We detect full names ('Erika Mustermann'), direct contact information (emails, phone numbers) and identifying combinations ('Franziska from Berlin'). Single first names and places are usually replaced as well.
You choose how values are replaced. Detection is the same either way. Use placeholders for documents and for data you pass on: anyone sees at once what was replaced. Use stand-in names when the text should stay readable, for example for a language model.
Original: Carola Wendt works at Holzbau Brenner GmbH, carola.wendt@example.org.
With placeholders
Every detected value is replaced by a placeholder: the kind of value in capitals, then eight characters as an identifier, all in square brackets.
[PERSON:5c868a01] works at [ORGANISATION:3c2a1679], [EMAIL:2aa30689].
Typical use case: Documents, handing data to other programs, API integrations. A placeholder is recognisable as replaced at once and can be mapped back by a program.
With stand-in names
Names, companies, addresses and numbers are replaced by made-up values. Within one session the same value always gets the same stand-in. Phone and account numbers come from ranges reserved for examples.
Kurt Rother works at Pfeiffer Cronjäger Vokuhl, carlyn@cormier.test.
Typical use case: Texts that should stay readable, for example for a language model (ChatGPT, Claude, Gemini). A stand-in name looks like a real name: whoever reads the text cannot see what was replaced.
Both modes available via API:
Set the query parameter ?marker_format=tagged (placeholders, default) or ?marker_format=faker (stand-in names) in your call. Pass the same value as marker_format when you get the real values back.
What the GDPR requires and where automatic detection reaches its limits.
What the GDPR requires
Art. 32 GDPR – Appropriate Technical Measures
GDPR does not require 100% detection, but rather "appropriate technical and organizational measures" taking into account the state of the art.
State of the Art
The GDPR asks for measures that reflect the state of the art. Automatic detection finds a lot, but not everything.
There is no fixed percentage in GDPR – the standard is the proportionality of the measures employed.
Residual Risk Assessment
Despite high detection rates, there is a residual risk that individual PII may not be detected:
- Unusual spellings: Very rare names, dialects, typos
- Context-dependent PII: Information that is only identifying in context
- New formats: Not yet known phone or ID formats
Risk Mitigation
- For critical documents, we recommend manual review
- Get the real values back to check the results
- For sensitive data: Combine with manual review
Professional Use
Our PII pseudonymizer is suitable for professional use:
- Edge cases with real output documented
- Transparent processing with traceable results
- Data protection by design (Art. 25 GDPR)
- Regular updates of detection patterns
- Data Processing Agreement (DPA) pursuant to Art. 28 GDPR available for download
- Technical & Organizational Measures (TOM) pursuant to Art. 32 GDPR documented
⚠️ Note: Responsibility for correct pseudonymization lies with the user. We recommend verifying results for critical use cases.
Our PII pseudonymizer supports all 27 EU countries plus UK, USA, Switzerland, and Turkey. Detection happens automatically based on recognized patterns.
Supported Countries (32 Countries)
Multilingual Name Recognition
Our AI recognizes names in 40+ languages automatically:
John Smith, José García, François Dubois, Maria Rossi, Piotr Kowalski, Γιώργος Παπαδόπουλος
International Phone Numbers
Supports all international formats from 32 countries:
+49 (30) 533 206 -0, +1-555-123-4567, +44 20 1234 5678, +33 1 42 86 82 00
Extensible: Our modular plugin system with 32 Country Detectors enables easy extension with additional countries and formats.
This data can identify individuals and is automatically detected:
Full Names & Pattern-based Detection
Erika Mustermann, Franziska Holm, Dr. Robert Hase, 'I am Peter', 'my name is Anna'
Full names uniquely identify individuals. NEW: Single first names in patterns like 'I am Peter' or 'my name is Anna' are also detected.
Email Addresses
erika.mustermann@example.com
Email addresses are direct contact information.
Phone Numbers (International)
+49 (0) 157 – 80636302 • +49-30-12345678 • 0033 1 23 45 67 89 • +44 20 1234 5678
International phone numbers in all formats. Supports +49, 0049, 0033 prefixes, parentheses (0), hyphens, en-dash (–), em-dash (—), and spaces in any combination. Short numbers under 8 digits are not detected.
Addresses & Street Names (29 Countries)
Grüne Str. 2-8 • Karl-Marx-Allee 45 • Alte Gasse 1 • Berliner Chaussee 9 • Via Esempio 5, 00100 Roma
Complete addresses from all of Europe (DE, AT, CH, FR, IT, ES, NL, BE, PL, SE, UK, etc.). Supports house number ranges (2-8), multi-word street names (Grüne Str., Alte Gasse), hyphenated names (Karl-Marx-Allee), all street suffixes (Straße, Weg, Platz, Allee, Gasse, Ring, Damm, Ufer, Chaussee, Pfad, Steig). Multi-line formats and country prefixes are recognized.
Bank Details (IBAN)
DE89 3704 0044 0532 0130 00
IBANs are sensitive financial data.
Birth Dates
23.07.1985, 15.03.1990
Birth dates can contribute to identification.
Cryptocurrencies
1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2 (Bitcoin)
Bitcoin and Ethereum wallet addresses are detected. Crypto wallets can identify individuals and their assets.
German Social & Financial Data
SV: 65 170839 J 003 • StNr: 133/8150/8159 • Tax ID: 12 345 678 901 • KG: 123FK123456 • KV: A123456789 • BIC: COBADEFFXXX • HRB 12345
Comprehensive detection of German social security and financial data: Social Insurance Number (with date validation), Tax Number (context-based for spaces/dashes), Tax ID (context-based with keyword), Child Benefit Number, Health Insurance Number, BIC/SWIFT (ISO-validated), and Commercial Register Number (HRA/HRB). All formats support flexible separators: spaces, slashes, dashes, and mixed combinations.
EU IDs & Tax Numbers
DE333 099 231 • ATU12345678 • AT-SV 1234567890 • FR83 404 833 048 • NL BSN • ES DNI/NIE • CH AHV • BE Rijksregister • FR INSEE • DE-Personalausweis
National ID documents and tax numbers from across the EU. EU VAT IDs (USt-IdNr, UID, TVA, BTW, IVA, NIF) from all 27 countries with flexible formats. Additionally: Swiss AHV, Spanish DNI/NIE, French INSEE, Dutch BSN, Belgian Rijksregisternummer, German Personalausweis, Austrian social-security number.
Profile URLs & URLs with Person References
linkedin.com/in/max-mustermann • github.com/mschiller • xing.com/profile/Anna_Schmidt • t.me/maxmustermann
Profile URLs on 35+ platforms (LinkedIn, Xing, GitHub, Facebook, Instagram, Twitter/X, TikTok, Twitch, Behance, etc.). Only the username part is replaced, the platform URL is preserved. Additionally: Cross-referencing detects person names in any URL path (e.g. example.com/team/anna-schmidt).
Limit: abbreviations stay
ACME, MKTG, HRBP
The service does not replace short codes in capital letters. If a code points to a company or a person, check it yourself.
This is how detection behaves in edge cases. Every output comes from the real service.
Single first names are replaced
Original: Holger calls back tomorrow.
With placeholders: [PERSON:2313d870] calls back tomorrow.
A first name without a surname is usually replaced as well.
Cities are replaced
Original: We drive to Kassel tomorrow.
With placeholders: We drive to [CITY:3e05c1a3] tomorrow.
A place name is replaced, even without street and house number.
Company names are replaced
Original: We order the timber from Holzbau Brenner GmbH.
With placeholders: We order the timber from [ORGANISATION:0debcb85].
Written-out company names are replaced.
Dates stay
Original: Work starts on 12.10.2026.
With placeholders: Work starts on 12.10.2026.
An ordinary date stays.
Dates of birth are replaced
Original: Born on 03.05.1981.
With placeholders: Born on [BIRTHDATE:6510ebd5].
A date given as a date of birth is replaced.
Limit: sometimes more is replaced
Original: The tenant in flat 3 called.
With placeholders: The [PERSON:cbf73c2f] in [CITY:e5a73f27] [STREET:a782fdf8] called.
English text sometimes loses words that are not personal data. Check the output before you rely on it.
Limit: numbers written as words
Original: Call zero one five two two eight eight one seven.
With placeholders: Call zero one five two two eight eight one seven.
A number written as words is not detected. Only digits are recognized as a phone number.
Our system also detects combinations that only become identifying together:
Examples of identifying combinations:
Franziska from Berlin
→ First name + City
Thomas works at Microsoft
→ First name + Company
Anna lives in Cologne
→ First name + City
How does it work?
- GLiNER detects individual entities: people, places, organisations, emails, phones, IBANs, identifiers
- A single first name is usually recognized as a person too, with or without a place or company next to it.
- Name and place each get their own placeholder, for example
[PERSON:a1b2c3d4]and[CITY:b2c3d4e5]
🇩🇪 Local Processing
Detection runs on our servers in Germany. The mapping sits in a cache (Redis) in the memory of that server, with no copy on disk.
🗑️ What we keep and for how long
Original text: not stored
Mapping (detected value to placeholder or stand-in): until 30 minutes after its last use, at the latest 8 hours after its first use, so you can get the real values back
Pseudonymised text: not stored
Log: time, a hashed session ID, the number of detected values and checksums of them made with a secret key (HMAC-SHA256), for 7 days
🔐 Access
The real values only come back with this session ID, so keep it to yourself. Without an API key the service issues a signed session ID and accepts no other. With an API key the session ID only works for that key. The mapping is deleted 30 minutes after its last use, at the latest 8 hours after its first use.
📝 Log without plain text
The log holds no plain text, but the number of detected values and checksums of them. They are made with a secret key (HMAC-SHA256), so without it no name can be recomputed from them.
🔄 Getting the real values back
Only possible with your session ID. Not possible 30 minutes after its last use, at the latest 8 hours after its first use, the mapping is deleted by then. Getting values back appears with its time in our server log, without content.
🌍 No passing on
Detection runs on our servers in Germany, including the AI detection (GLiNER). The service passes no text on to other services and sends no request to a language model. What you do with the pseudonymised texts is your responsibility.
Short texts are done in about a tenth of a second. Longer texts take correspondingly longer.
| Text length | Characters | Matches | Time |
|---|---|---|---|
| Short message | ~80 | 3 | ~0.1 s |
| One page of text | ~870 | 30 | ~0.5 s |
| Longer document | ~3,900 | 135 | ~1.2 s |
| Very long document | ~11,700 | 405 | ~3.1 s |
Measured on 30 September 2026 on the production server through the public API with invented texts. Median of 3 to 6 requests per row, processing time on the server without the network.