Skip to main content

LibreDTE: SDK Python para la API de LibreDTE Lib

SDK Python (libredte_lib_sdk) que orquesta la API de LibreDTE Lib (https://core.libredte.cl/api por defecto) para cubrir el ciclo de emisión de un DTE: borrador, documento timbrado y firmado, envío al SII, consulta de estado por Track ID, y generación de HTML/PDF — más carga y validación de CAF real, y generación de CAF y certificado ficticios para poder probar todo lo anterior sin credenciales reales.

Pensado como base de una app de facturación (ej. Django): este SDK concentra la lógica de negocio/orquestación de DTE, para que la app web sea solo vista, autenticación y persistencia.

El paquete Python espeja la organización de la propia API (package.component.worker::operation): sdk.billing.<component> .<worker> para negocio DTE, sdk.system.<component>.<worker> para infraestructura de la biblioteca (catálogos reales, carga de certificados — ver “Recursos de system” más abajo).

Instalación

pip install libredte-lib-sdk

Uso

from libredte_lib_sdk import LibreDTE
from libredte_lib_sdk.billing.trading_parties import Mandatario

sdk = LibreDTE()  # base_url y api_token también vía env vars, ver abajo
b = sdk.billing

input_data = {
    'Encabezado': {
        'IdDoc': {
            'TipoDTE': 33,
            'Folio': 1
        },
        'Emisor': {
            'RUTEmisor': '76192083-9',
            'RznSoc': 'SASCO SpA',
            'GiroEmis': 'Servicios',
            'DirOrigen': 'Santiago',
            'CmnaOrigen': 'Santiago',
        },
        'Receptor': {
            'RUTRecep': '12345678-5',
            'RznSocRecep': 'Cliente de prueba',
            'GiroRecep': 'Giro',
            'DirRecep': 'Santiago',
            'CmnaRecep': 'Santiago',
        },
    },
    'Detalle': [
        {
            'NmbItem': 'Producto A',
            'QtyItem': 1,
            'PrcItem': 1000
        }
    ],
}

# CAF y certificado ficticios, para pruebas/desarrollo:
caf = b.identifier.caf_faker.create(
    {'rut': '76192083-9', 'razon_social': 'SASCO SpA'},
    codigo_documento=33, folio_desde=1, folio_hasta=100,
)
certificate = b.trading_parties.mandatario_manager.create_fake_certificate(
    Mandatario(rut='76192083-9', nombre='SASCO SpA', email='sasco@example.com'),
)

# En producción: cargar y validar el CAF real que el SII le entregó
# al emisor, en vez del CAF ficticio de arriba.
# caf = b.identifier.caf_loader.load(xml_base64_del_caf_subido)
# b.identifier.caf_validator.validate(caf.xml_base64)

# 1. Borrador.
borrador = b.document.builder.build_draft(input_data)

# 2. Documento real, timbrado y firmado.
documento = b.document.builder.build_signed(
    input_data, caf_xml=caf.xml_base64, certificate=certificate,
)

# 3. Envío al SII (arma el sobre EnvioDTE y luego lo envía).
# `documento` ya trae certificate/emisor incluidos — no hace falta
# pasarlos aparte.
sobre = b.document.dispatcher.create(documento)
envio = b.integration.sii_dte.send(
    sobre.xml_base64, certificate=certificate, company_rut='76192083-9',
)

# 4. Estado del envío, por Track ID.
estado = b.integration.sii_dte.check_status(
    envio.track_id, certificate=certificate, company_rut='76192083-9',
)

# 5. HTML o PDF — misma forma de respuesta para ambos.
html = b.document.renderer.render(documento.xml_base64, format='html')
pdf = b.document.renderer.render(documento.xml_base64, format='pdf')
pdf_bytes = pdf.first.content_bytes

# Varias copias/presentaciones en una sola llamada (ej. cedible +
# tributaria):
copias = b.document.renderer.render(
    documento.xml_base64,
    format='pdf',
    renderings={'tributaria': 1, 'cedible': 1},
)
cedible_bytes = copias.by_label('cedible')[0].content_bytes

Cada componente (document, identifier, trading_parties, integration) agrupa servicios independientes, uno por worker de la API: cada método hace exactamente una llamada HTTP, sin encadenar red por detrás. Encadenar los pasos (ej. armar el documento, el sobre, y enviarlo) es responsabilidad de quien use el SDK.

Configuración

Base URL

Por defecto el SDK apunta a https://core.libredte.cl/api. Para usar otra API (ej. https://pro.libredte.cl/api, o un ambiente propio), pasar base_url al construir LibreDTE o setear la variable de entorno LIBREDTE_LIB_SDK_BASE_URL:

sdk = LibreDTE(base_url='https://pro.libredte.cl/api')
export LIBREDTE_LIB_SDK_BASE_URL=https://pro.libredte.cl/api

core.libredte.cl y pro.libredte.cl exponen el mismo contrato con límites de solicitudes distintos; ambos aceptan la variante LibreDTE (base_url=..., ...) con el resto de los parámetros de configuración (api_token, auth_scheme, timeout, http_client).

Autenticación

LibreDTE(api_token=...) o la variable de entorno LIBREDTE_LIB_SDK_TOKEN — si está presente, se manda como header Authorization: <esquema> <token>. El esquema es Bearer por defecto (lo que espera core.libredte.cl/pro.libredte.cl); configurable con LibreDTE(auth_scheme=...) o la variable de entorno LIBREDTE_LIB_SDK_AUTH_SCHEME para hablar con otra API que use un esquema distinto (ej. 'Token'):

sdk = LibreDTE(
    base_url='https://app.apigateway.cl/api/v2/libredte',
    api_token='...',
    auth_scheme='Token',
)

Recursos de system

Además de billing (negocio DTE), el SDK expone system: infraestructura de la biblioteca que una app consumidora necesita para poblar sus propios datos, no operaciones de facturación.

s = sdk.system

# Ejemplos de documentos reales (los mismos casos de prueba,
# validados, de libredte-lib-core) — útiles para poblar datos de
# demostración con variedad real en vez de inventada a mano.
ejemplos = b.document.examples.list()  # [ExampleSummary(id=..., category=..., case=...), ...]
ejemplo = b.document.examples.get(ejemplos[0].id)
documento = b.document.builder.build_signed(
    ejemplo.example, caf_xml=caf.xml_base64, certificate=certificate,
)

# Catálogos/repositorios reales (comunas, tipos de documento, etc.)
# — el esquema de cada elemento depende del repositorio pedido, no
# hay un DTO fijo: se devuelve el dict/list tal cual la API.
repositorios = s.repository.catalog.list()  # FQCN de cada repositorio disponible
tipos_dte = s.repository.catalog.find_by(
    'libredte\\lib\\Core\\Package\\Billing\\Component\\Document'
    '\\Contract\\TipoDocumentoInterface',
    criteria={'codigo': [33, 39]},  # coincidencia con cualquiera de estos códigos
)

# Cargar un certificado real (.p12/.pfx) sin desempaquetarlo
# localmente: la API entrega certificado (PEM) + RUT/nombre/correo
# ya extraídos en una sola llamada — mismo `Certificate` que usan
# build_signed()/dispatcher.create(), ya con todos los datos.
certificate = s.certificate.loader.load(datos_del_archivo_pfx, 'contraseña')
print(certificate.id, certificate.name, certificate.email)

Errores

Cualquier error de la API (validación, regla de negocio, error interno) levanta libredte_lib_sdk.LibreDteApiError, con .status_code, .detail y .php_class (la clase real de la excepción PHP detrás, si la API la informó — ej. DocumentException, o una excepción de autenticación del SII). Un 429 de la API levanta LibreDteRateLimitError (subclase de lo anterior), con .retry_after/.limit/.remaining. Un problema de red levanta libredte_lib_sdk.LibreDteConnectionError.

Desarrollo

make install-dev
make check       # ruff + tests unitarios (offline, sin red)
make test-live   # tests de integración reales contra la API

Los tests unitarios no hacen red real: mockean la API con respx. Los de tests/integration/ sí (marker live), y están excluidos por defecto de pytest/make test/make check.

Términos y condiciones de uso

Este proyecto está licenciado bajo la Licencia MIT. Ver LICENSE.

Metadata

Release files for libredte-lib-sdk 0.5.3

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

Source distribution (sdist)

Source distribution for libredte-lib-sdk 0.5.3
File Size Uploaded Provenance Actions
libredte_lib_sdk-0.5.3.tar.gz 60.0 kB Without provenance Details for libredte_lib_sdk-0.5.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for libredte-lib-sdk 0.5.3
File Interpreter ABI Platform Actions
libredte_lib_sdk-0.5.3-py3-none-any.whl Python 3 none any Details for libredte_lib_sdk-0.5.3-py3-none-any.whl

Total release size: 121.0 kB

Release files / libredte_lib_sdk-0.5.3.tar.gz

Download URL libredte_lib_sdk-0.5.3.tar.gz
Size 60.0 kB
Tags Source
SHA-256 checksum
How to use checksums
68f7011a88dfce86b83e02fa4c35c0cf073483a7f88fd7f9386e8c83fdb0aed5
BLAKE2b-256 checksum
How to use checksums
22373453d3c2d2725a9b672b95657bef5dbb6ebffa2b8f37884d36caae5f8e81
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.3

Release files / libredte_lib_sdk-0.5.3-py3-none-any.whl

Download URL libredte_lib_sdk-0.5.3-py3-none-any.whl
Size 61.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0444efb7a56e271589ab103e49739189bf773c505080c3cbad4f46d7c1cc1f62
BLAKE2b-256 checksum
How to use checksums
0cb5673e11b4b2397a2a9f5340c19822ed75ff2bdc30801cef430bb5fe004567
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.3

Security for libredte-lib-sdk 0.5.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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