Saltar al contenido

Emite documentos tributarios 🇨🇱 electrónicos con TypeScript.

invoice.ts
import { createDte, stampDte } from 'dte-sdk'
import { signDte, sendToSii } from 'dte-sdk'

const dte = createDte(invoice)
dte.totals.vat             // → 22800
dte.totals.total           // → 142800

const doc = stampDte(dte, caf)  // TED ✓
const signed = await signDte(doc, cert)
await sendToSii(signed, opts)  // → { trackId }

dte-sdk es un toolkit TypeScript para DTE chilenos según la definición del SII: construye, timbra, firma y envía facturas, boletas y notas de crédito desde cualquier runtime.

Tipos de documento

81

Dependencias

0

Licencia

MIT

Tipado de punta a punta,
hecho para el SII;
listo para tus flujos de facturación

De las líneas de detalle a un documento aceptado: cada función se encarga de un paso del ciclo de vida, así que compones solo lo que tu flujo necesita.

Con ejemplos

De las líneas de detalle a un DTE aceptado

Nueve funciones componibles para todo el ciclo de vida: documentos tipados, totales con el IVA correcto, el timbre TED, firma XMLDSig, envío y seguimiento en el SII, y errores que no filtran datos personales. Recorre las pestañas para verlas en contexto.

import { createDte } from 'dte-sdk'

const dte = createDte({
  type: 33,                // Factura electrónica
  folio: 1024,
  issuer,                  // { rut: '76.123.456-0', ... }
  receiver,                // { rut: '77.654.321-7', ... }
  items: [
    { name: 'Licencia anual', quantity: 1, unitPrice: 120000 },
  ],
})

dte.totals.net     // → 120000
dte.totals.vat     // → 22800
dte.totals.total   // → 142800

Demo en vivo

Arma un documento y mira los totales

Elige un tipo de documento y una línea de detalle. Neto, IVA, total y la vista previa del XML se actualizan en vivo en tu navegador: sin servidor y sin cuenta.

Pruébalo — arma un documento

RUT del receptor válidotrue
totals.net$120.000
totals.exempt$0
totals.vat (19%)$22.800
totals.total$142.800

Vista previa de toXml() — sin firma ni TED

<DTE version="1.0">
  <Documento ID="F1024T33">
    <Encabezado>
      <IdDoc>
        <TipoDTE>33</TipoDTE>
        <Folio>1024</Folio>
        <FchEmis>2026-10-30</FchEmis>
      </IdDoc>
      <Emisor>
        <RUTEmisor>76123456-0</RUTEmisor>
        <RznSoc>Arrow Software SpA</RznSoc>
      </Emisor>
      <Receptor>
        <RUTRecep>77654321-7</RUTRecep>
      </Receptor>
      <Totales>
        <MntNeto>120000</MntNeto>
        <TasaIVA>19</TasaIVA>
        <IVA>22800</IVA>
        <MntTotal>142800</MntTotal>
      </Totales>
    </Encabezado>
    <Detalle>
      <NroLinDet>1</NroLinDet>
      <NmbItem>Licencia anual</NmbItem>
      <QtyItem>1</QtyItem>
      <PrcItem>120000</PrcItem>
      <MontoItem>120000</MontoItem>
    </Detalle>
  </Documento>
</DTE>

Por qué un SDK

“¿Por qué no armo el XML yo mismo?”

Puedes armar un DTE a mano con una plantilla. Lo difícil es todo lo demás: el redondeo del IVA que espera el SII, el control de folios del CAF, el timbre TED, la canonicalización de XMLDSig, el baile de semilla y token, y el seguimiento de la aceptación. Así se comparan las alternativas.

CapacidadOtros SDKXML hecho a manodte-sdk
Genera XML según el esquema del SIISoportadoSoportadoSoportado
IVA y totales con las reglas de redondeo del SIISoportadoSoporte parcialSoportado
Timbre TED con tu CAF (y payload PDF417)SoportadoSoporte parcialSoportado
Firma XMLDSig con Web Crypto, sin binario de OpenSSLSoporte parcialNo soportadoSoportado
Valida rango de folios y vencimiento del CAF antes de timbrarSoporte parcialNo soportadoSoportado
Autenticación, envío y seguimiento en el SIISoporte parcialNo soportadoSoportado
Tipos TypeScript de punta a punta, sin paquete @typesNo soportadoNo soportadoSoportado
Errores tipados y sin datos personales (códigos de DteError)No soportadoNo soportadoSoportado
Corre en Node, Deno, Bun, Edge y el navegadorNo soportadoSoporte parcialSoportado
Cero dependencias en runtimeNo soportadoSoportadoSoportado
Mantenido activamente y probado (412 casos)Soporte parcialNo soportadoSoportado

dte-sdk es la versión enfocada y completamente tipada de todo esto: nueve funciones componibles que cubren todo el ciclo de vida, en ~8,4 KB y sin dependencias en runtime.

Corre donde sea que se ejecute tu TypeScript o JavaScript

Cero dependencias, tipado completo, ESM y CommonJS con tree-shaking. La firma usa Web Crypto, así que dte-sdk se comporta igual en Node (>= 20), Deno y Bun, en el Edge y en el navegador.

Node.js
Bun
React
Astro
Node.js
Bun
React
Astro
Deno
TypeScript
Next.js
Vercel
Deno
TypeScript
Next.js
Vercel

Tu primer DTE en cuatro pasos

1

Instala el SDK

Agrega el paquete con tu gestor favorito: npm install dte-sdk — también funciona con bun, pnpm y yarn.

2

Construye el documento

Llama a createDte({ type: 33, folio, issuer, receiver, items }) y obtén un documento inmutable y validado, con sus totales ya calculados.

3

Timbra y firma

stampDte() agrega el TED con tu CAF; signDte() aplica la firma XMLDSig con tu certificado digital.

4

Envíalo al SII

sendToSii() sube el sobre firmado y devuelve un track id; getStatus() te avisa cuando quedó aceptado.

Preguntas frecuentes

  • Un DTE (Documento Tributario Electrónico) es la versión electrónica de un documento tributario chileno —facturas, boletas, guías de despacho, notas de débito y de crédito— según la definición del SII. Cada uno es un documento XML con un folio, un timbre electrónico (TED) y una firma digital.

    Emitir uno significa hacer bien todo el recorrido: totales e IVA, folios autorizados por un CAF, el timbre, la firma y el envío al SII. Ese ciclo de vida es justamente lo que modela dte-sdk.

Profundiza en los DTE.

El blog cubre la ingeniería detrás de dte-sdk: cómo funcionan realmente los documentos tributarios electrónicos, desde folios y timbres hasta firmas y la aceptación del SII.

dte-sdk

Licencia MIT © 2026 Arrow Software