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: 552120222detect() returns a DetectionResult object with:
text- the original input textfindings- list ofFindingobjectsdetector_names- list of detector types that triggeredprocessing_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 → TrueGermany
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 → TrueFrance
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 cz6. 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)