Skip to main content

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.

PyPI Python Coverage Code style: ruff CI License: MIT


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

MIT

Project details


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)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

validabr-0.2.0-py3-none-any.whl (50.5 kB view details)

Uploaded Python 3

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

Hashes for validabr-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8560f4f5e3601f64d29da46ecf09dea92c45a6dd5463916458c6ef38a3a8f788
MD5 301b4f382903b16d508aa3ee5922d68c
BLAKE2b-256 9d4f91668026e5ca9b5b8febbec9734cf65cbf1ea0831a99e419f088ff1d790d

See more details on using hashes here.

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

Hashes for validabr-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7312200826b3ba022ec55daff2cc9d83c45f9ff25d8c615e00f6996d637a0f89
MD5 92d249651645400b88494730f5e31a6c
BLAKE2b-256 60d6f0125f37b89508128009a1b003677e8d947e63e6c3cc4b8867d8d82d1642

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page