FastPII Docs
Getting Started

Quick Start

Five-minute introduction to detection, validation, transformation, and CLI usage with FastPII across 4 regions.

Quick Start

1. Detect PII

from fastpii import FastPII, DEFAULT_PRIORITY
from fastpii.countries.cz import CzechPack

engine = FastPII(priority=DEFAULT_PRIORITY)
engine.register(CzechPack())

text = "Email: jan.novak@example.cz, RČ: 8001011238"
result = engine.detect(text)

for finding in result.findings:
    print(f"[{finding.region}] {finding.type}: {finding.value} ({finding.confidence:.0%})")

Example output:

[cz] email: jan.novak@example.cz (95%)
[cz] rodne_cislo: 8001011238 (100%)

Multi-region detection

from fastpii import FastPII, DEFAULT_PRIORITY
from fastpii.countries.cz import CzechPack
from fastpii.countries.pl import PolishPack
from fastpii.countries.de import GermanPack
from fastpii.countries.fr import FrenchPack

engine = FastPII(priority=DEFAULT_PRIORITY)
engine.register_many([CzechPack(), PolishPack(), GermanPack(), FrenchPack()])

text = "PESEL: 44051401458, Steuer-ID: 86095742719, SIREN: 552120222"
result = engine.detect(text)

for finding in result.findings:
    print(f"[{finding.region}] {finding.type}: {finding.value}")

Output:

[pl] pesel: 44051401458
[de] steuer_id: 86095742719
[fr] siren: 552120222

detect() returns a DetectionResult object with:

  • text - the original input text
  • findings - list of Finding objects
  • detector_names - list of detector types that triggered
  • processing_time_ms - processing time in milliseconds

Selective detection

Use detector_names to run only specific detectors:

result = engine.detect(text, detector_names=["rodne_cislo", "email"])

2. Validate a single identifier

from fastpii import FastPII, DEFAULT_PRIORITY
from fastpii.countries.cz import CzechPack

engine = FastPII(priority=DEFAULT_PRIORITY)
engine.register(CzechPack())

validation = engine.validate("8001011238", "rodne_cislo")

print(validation.is_valid)
print(validation.metadata)

Expected result:

True
{
    "checksum_valid": True,
    "birth_date": "1980-01-01",
    "gender": "male",
    "article_9": True,
}

Poland

from fastpii import FastPII, DEFAULT_PRIORITY
from fastpii.countries.pl import PolishPack

engine = FastPII(priority=DEFAULT_PRIORITY)
engine.register(PolishPack())

result = engine.validate("44051401458", "pesel")
# result.is_valid → True
# result.metadata → {'sex': 'male', 'birth_date': '1944-05-14'}

result = engine.validate("5260250274", "nip")
# result.is_valid → True

result = engine.validate("123456785", "regon")
# result.is_valid → True

Germany

from fastpii import FastPII, DEFAULT_PRIORITY
from fastpii.countries.de import GermanPack

engine = FastPII(priority=DEFAULT_PRIORITY)
engine.register(GermanPack())

result = engine.validate("86095742719", "steuer_id")
# result.is_valid → True

result = engine.validate("DE136695976", "ust_id")
# result.is_valid → True

result = engine.validate("München HRB 12345", "handelsregister")
# result.is_valid → True

France

from fastpii import FastPII, DEFAULT_PRIORITY
from fastpii.countries.fr import FrenchPack

engine = FastPII(priority=DEFAULT_PRIORITY)
engine.register(FrenchPack())

result = engine.validate("552120222", "siren")
# result.is_valid → True

result = engine.validate("73282932000074", "siret")
# result.is_valid → True

result = engine.validate("180012A00100161", "insee")
# result.is_valid → True
# result.metadata → {'sex': 'male', 'department': 'Corse-du-Sud', 'checksum_valid': True}

3. Transform detected values

Four privacy modes are available:

from fastpii import FastPII, DEFAULT_PRIORITY
from fastpii.countries.cz import CzechPack

engine = FastPII(priority=DEFAULT_PRIORITY)
engine.register(CzechPack())

text = "Email: jan.novak@example.cz, RČ: 8001011238"

# Anonymize - replace with [REDACTED]
print(engine.anonymize(text))
# Email: [REDACTED], RČ: [REDACTED]

# Redact - replace with type labels
print(engine.redact(text))
# Email: [EMAIL], RČ: [RODNE_CISLO]

# Mask - replace with asterisks
print(engine.mask(text))
# Email: *******************, RČ: **********

# Remove - delete PII entirely
print(engine.remove(text))
# Email: , RČ:

You can also use custom replacements:

engine.anonymize(text, replacement="<PII>")
# Email: <PII>, RČ: <PII>

4. Confidence scoring

from fastpii import FastPII, DEFAULT_PRIORITY, DEFAULT_CONFIDENCE_SCORES, DEFAULT_CONTEXT_BOOST
from fastpii.core.confidence import ConfidenceScorer
from fastpii.countries.cz import CzechPack

scorer = ConfidenceScorer(
    base_scores=DEFAULT_CONFIDENCE_SCORES,
    context_boost=DEFAULT_CONTEXT_BOOST,
)

engine = FastPII(priority=DEFAULT_PRIORITY, confidence_scorer=scorer)
engine.register(CzechPack())

result = engine.detect("Email: jan.novak@example.cz, RČ: 8001011238")

for finding in result.findings:
    print(f"{finding.type}: confidence={finding.confidence}")

5. CLI usage

# Detect PII
fastpii detect "Email: jan.novak@example.cz, RČ: 8001011238" -r cz

# JSON output
fastpii detect "Email: jan.novak@example.cz, RČ: 8001011238" -r cz --format json

# Multi-region
fastpii detect "PESEL: 44051401458, Steuer-ID: 86095742719" -r cz pl de fr

# Validate an identifier
fastpii validate 8001011238 --detector rodne_cislo -r cz

# List available detectors
fastpii list-detectors -r cz

# Evaluate against benchmark corpus
fastpii evaluate --corpus tests/benchmarks/corpus --output reports -r cz

6. Minimal working example

from fastpii import FastPII, DEFAULT_PRIORITY
from fastpii.countries.cz import CzechPack
from fastpii.countries.pl import PolishPack
from fastpii.countries.de import GermanPack
from fastpii.countries.fr import FrenchPack

engine = FastPII(priority=DEFAULT_PRIORITY)
engine.register_many([CzechPack(), PolishPack(), GermanPack(), FrenchPack()])

text = "RČ: 8001011238, PESEL: 44051401458, Steuer-ID: 86095742719"

detection = engine.detect(text)
validation = engine.validate("8001011238", "rodne_cislo")
redacted = engine.redact(text)

print(len(detection.findings))
print(validation.is_valid)
print(redacted)

On this page