Python SDK para construir, firmar y timbrar CFDI 4.0 contra el API de ContaDB
Project description
contadb-sdk
SDK oficial de Python para construir, firmar y timbrar CFDI 4.0 contra el API público de ContaDB.
Consume timbres de tu bolsa prepagada usando un API token. Sin pagos por uso, sin contratos mensuales — solo timbra cuando lo necesites.
Instalación
pip install contadb-sdk
Requiere Python 3.10+.
Quickstart
from decimal import Decimal
from contadb_sdk import (
ContaDBClient,
CFDIBuilder,
Certificado,
Emisor,
Receptor,
Concepto,
)
# 1. Carga tu CSD (Certificado de Sello Digital del SAT)
cert = Certificado.cargar(
cer_path="emisor.cer",
key_path="emisor.key",
password="MI_PASSWORD",
)
# 2. Construye el CFDI
cfdi_xml = (
CFDIBuilder(
emisor=Emisor(
rfc="EKU9003173C9",
nombre="ESCUELA KEMPER URGATE",
regimen_fiscal="601",
),
receptor=Receptor(
rfc="URE180429TM6",
nombre="UNIVERSIDAD ROBOTICA ESPAÑOLA",
uso_cfdi="G03",
domicilio_fiscal_receptor="65000",
regimen_fiscal_receptor="601",
),
serie="A",
folio="1001",
forma_pago="03", # Transferencia electrónica
metodo_pago="PUE", # Pago en una sola exhibición
lugar_expedicion="64000",
)
.agregar_concepto(
Concepto(
clave_prod_serv="43232408",
clave_unidad="E48",
descripcion="Servicios de consultoría en sistemas",
cantidad=Decimal("1"),
valor_unitario=Decimal("1000.00"),
objeto_imp="02",
tasa_iva=Decimal("0.16"),
)
)
.construir_y_firmar(cert)
)
# 3. Timbra contra ContaDB
with ContaDBClient(api_token="cdb_TU_TOKEN_AQUI") as client:
resultado = client.timbrar(cfdi_xml)
print(f"UUID: {resultado.uuid}")
print(f"Saldo restante: {resultado.saldo_restante} timbres")
print(f"XML timbrado: {len(resultado.xml_timbrado)} chars")
Características
- ✅ Construcción CFDI 4.0 — Builder con API fluida, validación Pydantic, cálculo automático de impuestos.
- ✅ Firma RSA-SHA256 — Carga
.cer+.keydel SAT, firma cadena original generada con XSLT oficial. - ✅ Cliente HTTP tipado — Errores mapeados a excepciones específicas (
SaldoInsuficienteError,TokenRevocadoError, etc.). - ✅ Idempotency-Key — Auto-generado por llamada para resistir reintentos.
- ✅ 100% tipado — Marcador
py.typedpara inferencia perfecta en IDEs ymypy --strict. - ✅ Cero dependencias mágicas — Solo
pydantic,httpx,cryptography,lxml.
Manejo de errores
from contadb_sdk import (
ContaDBClient,
SaldoInsuficienteError,
RateLimitError,
TokenRevocadoError,
)
try:
resultado = client.timbrar(xml)
except SaldoInsuficienteError:
# Comprar más timbres en https://contadb.com/facturacion
...
except RateLimitError as e:
# Esperar e.retry_after segundos
...
except TokenRevocadoError:
# Generar un nuevo token
...
Configuración
Por defecto el cliente apunta a https://api.contadb.com. Puedes cambiarlo:
client = ContaDBClient(
api_token="cdb_xxx",
base_url="https://staging.contadb.com", # o env var CONTADB_BASE_URL
timeout=60.0,
)
Documentación
Cómo obtener un API token
- Crea cuenta en contadb.com.
- Ve a Facturación → API Tokens y genera uno.
- Compra una bolsa de timbres (desde 100 timbres / $200 MXN).
- Usa el token con este SDK.
Licencia
MIT — ver LICENSE.
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
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
File details
Details for the file contadb_sdk-1.1.0.tar.gz.
File metadata
- Download URL: contadb_sdk-1.1.0.tar.gz
- Upload date:
- Size: 91.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c885c83a4b54b4832b991642889fbb6eb503443eab981573b7e11d76eb6b929
|
|
| MD5 |
8fe3a17fc4d14214951d5e6da48c3048
|
|
| BLAKE2b-256 |
6a35a65f14f58dac2a701ef0d2d669309a4c061867276fead1463e60c8692e55
|
File details
Details for the file contadb_sdk-1.1.0-py3-none-any.whl.
File metadata
- Download URL: contadb_sdk-1.1.0-py3-none-any.whl
- Upload date:
- Size: 70.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc85e0b1fedc4d13702c9654bd5a1be9c71e991866d881bcacb217f309049365
|
|
| MD5 |
d1e275e6edc6f3423a780d2102d1835c
|
|
| BLAKE2b-256 |
a4ab596a3b68a062f49095ea9c89dcff132da08c33726cdb644cabc76fe20600
|