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.3
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 22 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.0b3

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.0b3
File Size Uploaded
facturacion_electronica_sunat_sdk-0.1.0b3.tar.gz 97.6 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for facturacion-electronica-sunat-sdk 0.1.0b3
File
facturacion_electronica_sunat_sdk-0.1.0b3-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
facturacion_electronica_sunat_sdk-0.1.0b3-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.0b3-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.0b3-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
facturacion_electronica_sunat_sdk-0.1.0b3-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 4.4 MB

Release files / facturacion_electronica_sunat_sdk-0.1.0b3.tar.gz

Download URL facturacion_electronica_sunat_sdk-0.1.0b3.tar.gz
Size 97.6 kB
Tags Source
SHA-256 checksum
How to use checksums
29ea4ede87a4df0701f6a8f31a2d36febf06c8891b1b1fca88699993a40f4df5
BLAKE2b-256 checksum
How to use checksums
5f8d047fed20f703073f0956f73a317c471561f5281af919277ae8debb33642e
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.0b3-cp310-abi3-win_amd64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b3-cp310-abi3-win_amd64.whl
Size 740.6 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
077abcb430d9bbe0a72fd3facdc844164e8eb5c80f8f4645e45e94a4ab77ce1c
BLAKE2b-256 checksum
How to use checksums
8a6d566958a4f9cfa5663e81c6c89a8ff3d903867483364603e4934597f1f25d
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.0b3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 946.6 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
d32b80e98a29e1835642ff60f772b6b3ff7535266df6b12c2a5520e348f9b448
BLAKE2b-256 checksum
How to use checksums
33d6d2af67e818216a4f02fe613d3ccd9cd7a213499239a9896d61d086511f15
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.0b3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 939.0 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
36493f06597b0e38a9b933487f937debb74fa789d9666cb86eb5d2d52e4b0084
BLAKE2b-256 checksum
How to use checksums
04ecb1e27ef794828025817250b19ae21fee102c850f25a289d096f530373218
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.0b3-cp310-abi3-macosx_11_0_arm64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b3-cp310-abi3-macosx_11_0_arm64.whl
Size 850.5 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f55d6ab9353d3ea6abf0cc88816b9b203cd6ab67d94350ce2a62dc049cbeec94
BLAKE2b-256 checksum
How to use checksums
c4081a4c48c83af7b5b0cc56042ea8b24e9e1b18e1f5dcd58b8b556a793590c0
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.0b3-cp310-abi3-macosx_10_12_x86_64.whl

Download URL facturacion_electronica_sunat_sdk-0.1.0b3-cp310-abi3-macosx_10_12_x86_64.whl
Size 874.6 kB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
4d3d099a53a856347e5cfa0a751f98722ac7baa9894b703793c59aeaa9fc8f71
BLAKE2b-256 checksum
How to use checksums
ec526ca37b8d83e1416e846d96190d695433e3343f0c34b89a8cf5e1ac5c594c
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