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})ycdr({cdr_base64})devuelven el mismo JSON que la CLI y el paquete npm, ya convertido endict. La llave PEM tiene que ser RSA sin cifrar;signature_idessignatureKGsi no se indica.exchange(kind, input, user, password, endpoint, timeout=60):kindessend,summary,ticketostatus, einput, la entrada de ese comando de la CLI:nameyxmlensendysummary;ticketenticket;ruc,document_type,seriesynumberenstatus.send,summaryyticketvan a la URL del billService, ystatus, a la del billConsultService. Verifica TLS con el contexto por defecto del sistema;context=admite otrossl.SSLContext, nunca uno sin verificación.soap_request,soap_responseysoap_timeoutson 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. Siticketostatusno reciben respuesta, el resultado es{"outcome": "no_verdict", ...}: se vuelve a consultar y nunca se reenvía. Ensendysummary, ese caso lanzaSunatSdkError, porque el documento pudo haber llegado. - Toda entrada inválida lanza
sunat_sdk.SunatSdkError(subclase deValueError) 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)
| File | Size | Uploaded | |
|---|---|---|---|
| facturacion_electronica_sunat_sdk-0.1.0b3.tar.gz | 97.6 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| 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
|