Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

SDK de facturación electrónica SUNAT (Perú) para Python

Un SDK para emitir comprobantes electrónicos ante la SUNAT desde Python. Con los datos de una factura (01), una boleta (03), una nota de crédito (07) o de débito (08), un resumen diario de boletas (RC) o una comunicación de baja (RA), arma el archivo XML que pide la SUNAT, lo firma con tu certificado digital, lo comprime, lo envía y lee la respuesta de la SUNAT, que dice si lo aceptó. Es la versión para Python del SDK, que también funciona en JavaScript y TypeScript, PHP, Rust y la línea de comandos: los mismos datos dan el mismo comprobante firmado en todos.

SUNAT (Peru) electronic invoicing SDK for Python.

Tu sistema calcula los importes; el paquete los valida y los pone en el XML, pero no calcula impuestos. Guías y ejemplos: https://fe.kembec.com

Instalación

El paquete está en PyPI desde la 0.1.0-beta.3. Como es una beta, pip la instala solo si se le pide:

pip install --pre facturacion-electronica-sunat-sdk

El paquete trae el núcleo en Rust del SDK ya compilado (wheels abi3), así que no llama a ningún binario externo. Hay wheels para CPython 3.10 o posterior en Linux (x86_64 y aarch64, glibc), macOS (arm64 y x86_64) y Windows (x86_64). En otra plataforma, pip lo compila desde el código fuente (el sdist) y necesita Rust.

Para instalar la versión en desarrollo (la rama main) desde el repositorio hace falta Rust:

git clone https://github.com/Kembec/facturacion-electronica-sunat-sdk.git
cd facturacion-electronica-sunat-sdk
cp LICENSE NOTICE bindings/python/
pip install ./bindings/python

Tu primer comprobante

Baja a una carpeta vacía la factura de prueba y el certificado de prueba del repositorio. Ese certificado es autogenerado y no sirve para emitir.

base=https://raw.githubusercontent.com/Kembec/facturacion-electronica-sunat-sdk/v0.1.0-beta.4
curl -fsSLO "$base/fixtures/01-invoice-taxed-cash.json"
curl -fsSLO "$base/tests/vectors/test-cert/test-cert.pem"
curl -fsSLO "$base/tests/vectors/test-cert/test-key.pem"
# primer_comprobante.py
import sunat_sdk

def read(file):
    with open(file, encoding="utf-8") as f:
        return f.read()

built = sunat_sdk.build(read("01-invoice-taxed-cash.json"))
signed = sunat_sdk.sign(built["xml"], read("test-cert.pem"), read("test-key.pem"))
print(built["file_name"], signed["digest_value"])  # 20123456789-01-F001-1 +te61a2ub5MlTFf8tKTPNGWEXKI=

+te61a2ub5MlTFf8tKTPNGWEXKI= es el DigestValue del vector 01-invoice-taxed-cash: el mismo que dan JavaScript, PHP, Rust y la CLI. Tus documentos llevan la forma del modelo de entrada, como dict o como texto JSON.

Enviar a la SUNAT

sent = sunat_sdk.exchange(
    "send", {"name": built["file_name"], "xml": signed["xml"]},
    sol_user, sol_password, bill_service_url,            # sol_user: RUC + usuario SOL
)
# {"outcome": "cdr", "cdr": {...}, "cdr_zip_base64": "..."} o {"outcome": "fault", "code", "message", "class"}

API

build arma XML UBL 2.1 (comprobantes) o UBL 2.0 (resúmenes y bajas), y sign lo firma con XML-DSig.

  • build(document), sign(xml, cert_pem, key_pem, signature_id=None), zip({name, xml}) y cdr({cdr_base64}) devuelven el mismo JSON que la CLI y el paquete npm, ya convertido en dict. La llave PEM tiene que ser RSA sin cifrar; signature_id es signatureKG si no se indica.
  • exchange(kind, input, user, password, endpoint, timeout=60): kind es send, summary, ticket o status, e input, la entrada de ese comando de la CLI: name y xml en send y summary; ticket en ticket; ruc, document_type, series y number en status. send, summary y ticket van a la URL del billService, y status, a la del billConsultService. Verifica TLS con el contexto por defecto del sistema; context= admite otro ssl.SSLContext, nunca uno sin verificación.
  • soap_request, soap_response y soap_timeout son las mismas piezas sin red, para quien hace el POST con su propio cliente HTTP (httpx, aiohttp).
  • Un error SOAP de la SUNAT es un resultado ({"outcome": "fault", ...}), no una excepción. Si ticket o status no reciben respuesta, el resultado es {"outcome": "no_verdict", ...}: se vuelve a consultar y nunca se reenvía. En send y summary, ese caso lanza SunatSdkError, porque el documento pudo haber llegado.
  • Toda entrada inválida lanza sunat_sdk.SunatSdkError (subclase de ValueError) con el motivo.
  • El certificado, la llave y las credenciales SOL los pasa quien llama: el paquete no los busca en archivos ni en el entorno, y no escribe logs.

Cómo se comprueba

En cada cambio, el CI instala el paquete en un entorno limpio y exige, para los 38 vectores de prueba del repositorio, el XML sin firmar igual al del vector en C14N y el DigestValue y el SignatureValue exactos: las mismas firmas que dieron código 0 en la beta de la SUNAT el 16/10/2026, enviadas con la CLI. exchange se prueba contra un servidor local, sin red.

Licencia

MIT, © 2026 Manuel Benancio: ver LICENSE.

Metadata

Release files for facturacion-electronica-sunat-sdk 0.1.0b4

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

Source distribution (sdist)

Source distribution for facturacion-electronica-sunat-sdk 0.1.0b4
File Size Uploaded
facturacion_electronica_sunat_sdk-0.1.0b4.tar.gz 129.7 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for facturacion-electronica-sunat-sdk 0.1.0b4
File
facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 5.0 MB

Release files / facturacion_electronica_sunat_sdk-0.1.0b4.tar.gz

Download URL facturacion_electronica_sunat_sdk-0.1.0b4.tar.gz
Size 129.7 kB
Tags Source
SHA-256 checksum
How to use checksums
1daee37a3174bf3a7cb34238550ce43f152fbc69c6b87b4e5f024b27e67eb203
BLAKE2b-256 checksum
How to use checksums
c5d88a3f144feb6dab9b6c89947bdf03bf1abfa5dea4d7edb1ec8ec2bd7c86d5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-win_amd64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-win_amd64.whl
Size 853.3 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
7c93fdb1ea52f1553e25e59385eed8aaf2fd04773ca485f7e3f1cdf12c9a1e97
BLAKE2b-256 checksum
How to use checksums
8444fb9faf427dbb9de1794a31bca9ca359b5161682d297dcfeae34ef3db5188
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.1 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
6a4c2db7565262936780486378f61a237303772e83eb2f48929ccb6eb3d39c6c
BLAKE2b-256 checksum
How to use checksums
c7971d7a2bfcb8844037af8f45285e7c4cc2345151a2c5a58580fc0c51746bde
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 1.0 MB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
2db634cd5641ee8efca037807000d61e545065915c7098bc91762e0cb090c442
BLAKE2b-256 checksum
How to use checksums
09658137a7f9f2d5c85746530eeaeeda510d5839efa2e155dad6073db3419541
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-macosx_11_0_arm64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-macosx_11_0_arm64.whl
Size 948.6 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e2b3b57a96b3705c77e89fb5d71f07deef74358a846a6b368d2dc34efe2b6e30
BLAKE2b-256 checksum
How to use checksums
3135b363f9840e3b36c9fa337b439bf1ec3ed989a3725abb91e3e73ee4079a1c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-macosx_10_12_x86_64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b4-cp310-abi3-macosx_10_12_x86_64.whl
Size 981.2 kB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
bb650bd71dd28e058326653e79a4383877be8e1bcb0a5b2953aac53acdcd85c6
BLAKE2b-256 checksum
How to use checksums
fba69b4f1d88ab96af42e46259ff84a38e141511100f93aa6b56c338e79fc591
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14
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