La API de facturación electrónica chilena
REST estilo Stripe. Claves sk_test y sk_live, entorno sandbox real contra Maullín, webhooks de cambio de estado en el SII y documentación pensada para developers.
Si integrabas el SII con BaseAPI, cierra el 11 de diciembre de 2026: cómo migrar sin rehacer tu integración.
En resumen
- Emites un DTE con una llamada REST: mandas el JSON y nosotros generamos el XML, lo firmamos, lo timbramos y lo enviamos al SII.
- Hay dos claves. Con sk_test pruebas contra el ambiente de certificación sin gastar folios reales; con sk_live emites de verdad.
- Los webhooks te avisan cuando el SII cambia el estado del documento, así no tienes que ir a preguntarle.
Una llamada HTTP, una factura emitida
# Emite una factura electrónica con una llamada (sandbox: usa tu sk_test)curl https://api.facturador.pulsandotech.cl/api/public/v1/dte \ -H "X-Api-Key: sk_test_5f3a...e91" \ -H "Content-Type: application/json" \ -d '{ "tipo_dte": 33, "receptor": { "rut": "76543210", "dv": "3", "razon_social": "Acme SpA" }, "items": [{ "nombre": "Asesoría", "cantidad": 1, "precio_unitario": 250000, "monto_item": 250000 }], "totales": { "monto_neto": 250000, "monto_iva": 47500, "monto_total": 297500 } }' # Respuesta (201) — emisión asíncrona; el estado final del SII llega por webhook{ "id": 1042, "folio": 1042, "estado_local": "pendiente", "monto_total": 297500, "message": "DTE creado y encolado para envío al SII."}En sandbox emites contra Maullín, sin tocar tu facturación real. Solo cuando cambies a sk_live empieza tu producción.
No hagas polling. Te avisamos.
Cada cambio de estado de un DTE en el SII te llega como evento firmado. Sin colas raras ni cron jobs.
# Ejemplo de webhook que recibes cuando un DTE cambia de estado en el SIIPOST https://tu-app.com/webhooks/facturadorContent-Type: application/jsonX-Webhook-Signature: sha256=4f3a1c...e91 # HMAC-SHA256 del body con tu secretX-Webhook-Timestamp: 1789653261X-Webhook-Signature-V2: t=1789653261,v1=9b2e...07 # HMAC-SHA256 de "timestamp.body" (anti-replay)X-Webhook-Event: dte.aceptadoX-Webhook-Delivery: 8812 # id del intento: cambia en cada reintento { "id": "wh_3f9a1c07b2e4d618", "event": "dte.aceptado", "created_at": "2026-05-29T10:14:21-04:00", "livemode": true, "ambiente": "produccion", "data": { "dte_id": 1042, "tipo_dte": 33, "folio": 1042, "estado_sii": "DOK", "glosa_sii": "Documento recibido por el SII. Datos coinciden con los registrados", "monto_total": 119000, "rut_receptor": "76123456", "rut_receptor_completo": "76123456-0", "dv_receptor": "0", "respondido_at": "2026-05-29T10:14:21-04:00" }}Sandbox real
Mismo flujo que producción, contra Maullín.
Eventos firmados
HMAC-SHA256 con tu signing secret. Verificables en tu lado.
Docs claras
Ejemplos cURL, códigos de error legibles y mapping al SII.
ILA e IABA en la API: un campo en el ítem
Bebidas alcohólicas, analcohólicas y suntuarios del Art. 37. Marcas la línea con su código y el backend deriva la tasa y el monto.
# Impuesto adicional a las bebidas (ILA/IABA): se marca la LÍNEA con su código.curl https://api.facturador.pulsandotech.cl/api/public/v1/dte \ -H "X-Api-Key: sk_test_5f3a...e91" \ -H "Content-Type: application/json" \ -d '{ "tipo_dte": 33, "fecha_emision": "2026-09-07", "receptor": { "rut": "76123456", "dv": "K", "razon_social": "Restaurante Los Robles SpA" }, "items": [ { "nombre": "Pisco 40 750cc", "cantidad": 12, "precio_unitario": 10000, "monto_item": 120000, "cod_imp_adic": 24 }, { "nombre": "Vino tinto 750cc", "cantidad": 6, "precio_unitario": 8000, "monto_item": 48000, "cod_imp_adic": 25 } ], "totales": { "monto_neto": 168000, "monto_iva": 31920, "monto_total": 247560 } }' # No hay campo para mandar la tasa ni el monto del impuesto: los deriva el# backend desde el codigo de la linea.HTTP/1.1 201 Created { "id": 1043, "tipo_dte": 33, "folio": 1043, "estado_local": "pendiente", "monto_total": 247560, "origen": "api", "message": "DTE creado y encolado para envio al SII.", "impuestos": [ { "codigo": 24, "nombre": "Licores", "tasa": 31.5, "monto": 37800, "resta": false }, { "codigo": 25, "nombre": "Vinos", "tasa": 20.5, "monto": 9840, "resta": false } ], "monto_imp_adicional": 47640} # Las claves `impuestos` y `monto_imp_adicional` aparecen SOLO si el documento# lleva impuesto adicional: un DTE normal responde exactamente como siempre. # Un codigo fuera del alcance NO se ignora en silencio:HTTP/1.1 422 Unprocessable Content{ "message": "items.0.cod_imp_adic: el codigo 331 no esta soportado. ...", "errors": { "items": ["items.0.cod_imp_adic: el codigo 331 no esta soportado. ..."] }}Códigos disponibles: 24, 25, 26, 27 y 271 (bebidas) y 23, 44 y 45 (Art. 37). En factura 33, nota de débito 56 y nota de crédito 61; en boleta 39/41 no existe el campo en el formato del SII y respondemos 422 antes de gastar el folio. La tasa y el monto los calcula el backend con la tabla del SII, así que no se pueden enviar mal.
Quick start en sandbox
Crea tu cuenta, copia tu sk_test y emite un DTE de prueba en menos de 10 minutos.