Skip to main content

pii-safe — Redact PII from text

PyPI Python Ruff

Uses the OpenAI Privacy Filter model to detect and redact personally identifiable information (PII) from text.

Why hash-based redaction?

Plain [REDACTED] placeholders lose all information about which PII values are the same. Using hash(salt | pii_data) instead:

  • Consistent identifiers: The same PII always maps to the same hash, enabling cross-document correlation (e.g., "how many documents mention the same person?")
  • Reversible with salt: With the salt, you can recompute hashes to identify original PII if needed
  • Salt prevents rainbow table attacks: Without a salt, hashes could be precomputed for common names/emails to reverse-identify PII from redacted text

Install

pip install pii-safe

Usage

from pii_safe import redact_text

text = "mi nombre es Dario Clavijo"
redacted = redact_text(text)
print(redacted)  # mi nombre es[REDACTED_<hash>]

Salt for hashing

By default, a random 64-character salt is generated at startup. You can specify a salt to ensure consistent hashing across runs:

from pii_safe import redact_text, set_salt

# Option 1: Pass salt to redact_text
redacted = redact_text("mi nombre es Dario Clavijo", salt="my_secret_salt")

# Option 2: Set salt globally
set_salt("my_secret_salt")
redacted = redact_text("mi nombre es Dario Clavijo")

Using the Redacter class

from pii_safe import Redacter

redacter = Redacter(salt="my_secret_salt")
result1 = redacter.redact("mi nombre es Dario Clavijo")
result2 = redacter.redact("el es Dario Clavijo")

# Same PII gets consistent hash within this instance
hash_map = redacter.get_hash_map()
print(hash_map)  # {' Dario Clavijo': '<hash>'}

CLI

pii-safe input.txt
pii-safe input.txt -o output.txt
pii-safe input.txt --salt my_secret_salt

Development

git clone https://github.com/daedalus/pii-safe.git
cd pii-safe
pip install -e ".[test]"

# run tests
pytest

# format
ruff format src/ tests/

# lint
ruff check src/ tests/

# type check
mypy src/

API

redact_text(text: str, salt: str | None = None) -> str

Redacts PII from text using the openai/privacy-filter model.

set_salt(salt: str) -> None

Set the salt for hashing PII in the default redacter.

class Redacter

Context manager for consistent PII-to-hash mapping across calls.

  • __init__(salt: str | None = None): Initialize with optional salt
  • redact(text: str) -> str: Redact PII from text
  • get_hash_map() -> dict[str, str]: Get PII-to-hash mapping

Metadata

Release files for pii-safe 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pii-safe 0.1.1
File Size Uploaded
pii_safe-0.1.1.tar.gz 5.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pii-safe 0.1.1
File Interpreter ABI Platform
pii_safe-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 12.5 kB

Release files / pii_safe-0.1.1.tar.gz

Download URL pii_safe-0.1.1.tar.gz
Size 5.7 kB
Tags Source
SHA-256 checksum
How to use checksums
1691ef4243938149886cef88a5b0482bfcae2c7e8fe855066faf02bb7ca81d9d
BLAKE2b-256 checksum
How to use checksums
19e0aa9b3a85bf000c818fb21224e7606dbf1993f5439cb5f57d6f8fa035b137
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.

Transparency log

Release files / pii_safe-0.1.1-py3-none-any.whl

Download URL pii_safe-0.1.1-py3-none-any.whl
Size 6.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4049dcd7dcc3d3aa92b53008cd0285b9adc0946ee8cb3cfdc8764ac7cadee94a
BLAKE2b-256 checksum
How to use checksums
81f3b75f67677f91548f12ea5b8184987c14b5d37b6b709f8bc7d9529eb523eb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 24, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page