Para developers

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.
Emite tu primer DTE

Una llamada HTTP, una factura emitida

emitir-dte.sh
# 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.

Webhooks

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.

webhook.json
# 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.

Impuestos adicionales

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.

factura-con-ila.sh
# 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.
respuesta.txt
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.

Integra hoy

Quick start en sandbox

Crea tu cuenta, copia tu sk_test y emite un DTE de prueba en menos de 10 minutos.