Enterprise toolkit for validating, parsing, enriching, and anonymizing Brazilian documents (LGPD-ready)
Project description
validabr
The Python library for validating, generating, formatting, and masking Brazilian documents — CPF to CNH to Pix keys.
Installation
pip install validabr
pip install validabr[django] # Django validators and form fields
pip install validabr[pydantic] # Pydantic v2 custom types
pip install validabr[pandas] # Pandas Series accessor
pip install validabr[polars] # Polars DataFrame expressions
Core validabr has zero dependencies — stdlib only.
Supported Documents
| Document | Validate | Generate | Format | Parse | Mask |
|---|---|---|---|---|---|
| CPF | is_valid_cpf |
generate_cpf |
format_cpf |
parse_cpf |
mask_cpf |
| CNPJ (+ alfanumérico) | is_valid_cnpj |
generate_cnpj |
format_cnpj |
parse_cnpj |
mask_cnpj |
| CNJ | is_valid_cnj |
generate_cnj |
format_cnj |
parse_cnj |
— |
| IE (27 states) | is_valid_ie |
generate_ie |
format_ie |
parse_ie |
— |
| RENAVAM | is_valid_renavam |
generate_renavam |
format_renavam |
parse_renavam |
— |
| Título de Eleitor | is_valid_titulo_eleitor |
generate_titulo_eleitor |
format_titulo_eleitor |
parse_titulo_eleitor |
— |
| CNH | is_valid_cnh |
generate_cnh |
format_cnh |
parse_cnh |
— |
| PIS/PASEP | is_valid_pis |
generate_pis |
format_pis |
parse_pis |
— |
| CEP | is_valid_cep |
— | format_cep |
parse_cep |
— |
| CNS (SUS) | is_valid_cns |
generate_cns |
format_cns |
parse_cns |
— |
| NFe/CTe/NFC-e (44 digits) | is_valid_nfe |
generate_nfe |
format_nfe |
parse_nfe |
— |
| Chave Pix | classify_pix |
— | format_pix |
parse_pix |
— |
Quick Start
Core API — Validate, Generate, Format, Parse
import validabr
# Validate
validabr.is_valid_cpf("529.982.247-25") # True
validabr.is_valid_cnpj("11.222.333/0001-81") # True
validabr.is_valid_ie("110.042.490.114", "SP") # True
# Generate
validabr.generate_cpf() # "52998224725"
validabr.generate_cpf(formatted=True) # "529.982.247-25"
validabr.generate_ie("MG") # "062.107.170.0110"
# Format — idempotent (handles raw or formatted input)
validabr.format_cpf("52998224725") # "529.982.247-25"
validabr.format_cnpj("11222333000181") # "11.222.333/0001-81"
# Parse — returns NamedTuple with structured fields
data = validabr.parse_cpf("529.982.247-25")
print(data.root, data.check_digits) # "52998224" "25"
Bulk Operations
# Same-type batch
validabr.validate_list("cpf", ["529.982.247-25", "000.000.000-00"]) # [True, False]
validabr.generate_list("cnpj", 3, formatted=True)
# Mixed-type batch
validabr.validate_docs([("cpf", "529.982.247-25"), ("cnpj", "11.222.333/0001-81")]) # [True, True]
CLI
validabr validate cpf 529.982.247-25 # exit 0
validabr generate cpf --formatted # 529.982.247-25
validabr format cpf 52998224725 # 529.982.247-25
validabr parse cpf 529.982.247-25 # {"root": "52998224", "check_digits": "25", ...}
validabr mask cpf 529.982.247-25 # ***.982.247-**
LGPD / Secure — Mask & Redact
from validabr import mask_cpf, mask_cnpj, redact_text, BRDocFilter
mask_cpf("529.982.247-25") # "***.982.247-**"
mask_cnpj("11.222.333/0001-81") # "**.222.333/****-**"
# Redact all CPF/CNPJ in free text
redact_text("CPF 529.982.247-25 belongs to João") # "CPF ***.982.247-** belongs to João"
# Logging filter — attach to any Python logger
import logging
logging.getLogger().addFilter(BRDocFilter())
Data Enrichment
from validabr import enrich_cnpj, enrich_cep
info = enrich_cnpj("11222333000181")
# CNPJEnrichmentData(cnpj='...', razao_social='...', cnae='...', municipio='...', uf='...', ...)
cep = enrich_cep("01310-100")
# CEPEnrichmentData(cep='...', logradouro='...', bairro='...', cidade='...', uf='...')
Pandas
import pandas as pd
import validabr.integrations.pandas # registers .validabr accessor
df = pd.DataFrame({"cpf": ["529.982.247-25", "000.000.000-00"]})
df["valid"] = df["cpf"].validabr.is_valid_cpf() # bool Series
df["formatted"] = df["cpf"].validabr.format_cpf() # str Series
df["masked"] = df["cpf"].validabr.mask_cpf() # str Series
df["tipo_pix"] = df["pix"].validabr.classify_pix() # "CPF" | "CNPJ" | "EMAIL" | "PHONE" | ""
Polars
import polars as pl
import validabr.integrations.polars # registers .validabr on Expr
df = pl.DataFrame({"cpf": ["529.982.247-25", "000.000.000-00"]})
df.select(pl.col("cpf").validabr.is_valid_cpf()) # Expr → [True, False]
df.select(pl.col("cpf").validabr.format_cpf()) # Expr → ["529.982.247-25", ...]
df.select(pl.col("cpf").validabr.mask_cpf()) # Expr → ["***.982.247-**", ...]
df.select(pl.col("pix").validabr.classify_pix()) # Expr → ["CPF", "CNPJ", "EMAIL", "PHONE", ""]
Django
from validabr.integrations.django import CPFField, CNPJField, BRDocumentField
class Person(models.Model):
cpf = CPFField(unique=True) # validates + strips formatting on save
cnpj = CNPJField(blank=True)
documento = BRDocumentField() # polymorphic — accepts CPF or CNPJ
Pydantic
from pydantic import BaseModel
from validabr.integrations.pydantic import CPF, CNPJ, IE, CNJ, Renavam, TituloEleitor
class Pessoa(BaseModel):
cpf: CPF
cnpj: CNPJ | None = None
class Inscricao(BaseModel):
ie: IE
estado: str
p = Pessoa(cpf="529.982.247-25") # auto-strips to "52998224725"
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
validabr-0.2.0.tar.gz
(31.4 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
validabr-0.2.0-py3-none-any.whl
(50.5 kB
view details)
File details
Details for the file validabr-0.2.0.tar.gz.
File metadata
- Download URL: validabr-0.2.0.tar.gz
- Upload date:
- Size: 31.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8560f4f5e3601f64d29da46ecf09dea92c45a6dd5463916458c6ef38a3a8f788
|
|
| MD5 |
301b4f382903b16d508aa3ee5922d68c
|
|
| BLAKE2b-256 |
9d4f91668026e5ca9b5b8febbec9734cf65cbf1ea0831a99e419f088ff1d790d
|
File details
Details for the file validabr-0.2.0-py3-none-any.whl.
File metadata
- Download URL: validabr-0.2.0-py3-none-any.whl
- Upload date:
- Size: 50.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7312200826b3ba022ec55daff2cc9d83c45f9ff25d8c615e00f6996d637a0f89
|
|
| MD5 |
92d249651645400b88494730f5e31a6c
|
|
| BLAKE2b-256 |
60d6f0125f37b89508128009a1b003677e8d947e63e6c3cc4b8867d8d82d1642
|