Saltar al contenido

Emite documentos tributarios 🇨🇱 electrónicos con TypeScript.

invoice.ts
import { issueDocument, createEnvelope } from 'dte-sdk'
import { signEnvelope, uploadEnvelope } from 'dte-sdk'

const doc = issueDocument({ document, caf, certificate })
doc.header.totals.vatAmount      // → 22800
doc.header.totals.totalAmount    // → 142800

const env = createEnvelope(input)  // EnvioDTE
const signed = signEnvelope(env, certificate)
await uploadEnvelope(sii, { envelope: signed })  // trackId

dte-sdk construye, timbra y firma DTE chilenos tal como los espera el SII, los envía por los servicios web del SII y les hace seguimiento, y cubre lo que rodea la emisión: los libros, los folios, el portal del SII, la certificación y las muestras impresas.

Tipos de documento

91

Puntos de entrada

4

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, y de ahí a los libros, los folios y la certificación: cada función se encarga de un paso, así que compones solo lo que tu flujo necesita.

Con ejemplos

De las líneas de detalle a un DTE aceptado, y todo lo que lo rodea

Documentos con totales correctos según el SII, el TED y la firma XMLDSig, envíos y estados, los libros del SII, folios desde el portal del SII, la certificación y las muestras impresas. Recorre las pestañas para verlos en contexto.

import { issueDocument, loadCertificateFromPkcs12, parseCaf } from 'dte-sdk'

const certificate = loadCertificateFromPkcs12(pfx, process.env.PFX_PASSWORD!)
const caf = parseCaf(cafXml)            // folios authorized for type 33

const invoice = issueDocument({
  document: {
    type: 33,                           // Factura electrónica
    folio: 1024,
    issuer,                             // { rut: '76543210-3', ... }
    receiver,                           // { rut: '12345678-5', ... }
    items: [{ name: 'Plan anual', quantity: 1, unitPrice: 120000 }],
  },
  caf,
  certificate,
})

invoice.header.totals
// → { netAmount: 120000, vatRate: 19, vatAmount: 22800, totalAmount: 142800 }
invoice.xml                             // signed <DTE> with its TED

Demo en vivo

Arma un documento y mira los totales

Elige un tipo de documento y una línea. El neto, el IVA, el total y la vista previa del XML se actualizan en tu navegador con las reglas que aplica createDocument(): sin servidor ni cuenta.

Pruébalo — arma un documento

RUT del receptor válidotrue
totals.netAmount$120.000
totals.vatAmount (19%)$22.800
totals.totalAmount$142.800

Vista previa de buildDocumentXml() — sin firma ni TED

<DTE xmlns="http://www.sii.cl/SiiDte" version="1.0">
  <Documento ID="DTE_T33F1024">
    <Encabezado>
      <IdDoc>
        <TipoDTE>33</TipoDTE>
        <Folio>1024</Folio>
        <FchEmis>2026-11-06</FchEmis>
      </IdDoc>
      <Emisor>
        <RUTEmisor>76543210-3</RUTEmisor>
        <RznSoc>Comercial Andina SpA</RznSoc>
        <GiroEmis>Software</GiroEmis>
        <Acteco>620200</Acteco>
        <DirOrigen>Av. Los Aromos 1540</DirOrigen>
        <CmnaOrigen>Santiago</CmnaOrigen>
        <CiudadOrigen>Santiago</CiudadOrigen>
      </Emisor>
      <Receptor>
        <RUTRecep>12345678-5</RUTRecep>
        <RznSocRecep>Comercializadora Rapel Ltda</RznSocRecep>
        <GiroRecep>Comercio</GiroRecep>
        <DirRecep>Pasaje Los Olmos 88</DirRecep>
        <CmnaRecep>Providencia</CmnaRecep>
      </Receptor>
      <Totales>
        <MntNeto>120000</MntNeto>
        <TasaIVA>19</TasaIVA>
        <IVA>22800</IVA>
        <MntTotal>142800</MntTotal>
      </Totales>
    </Encabezado>
    <Detalle>
      <NroLinDet>1</NroLinDet>
      <NmbItem>Plan anual</NmbItem>
      <QtyItem>1</QtyItem>
      <PrcItem>120000</PrcItem>
      <MontoItem>120000</MontoItem>
    </Detalle>
  </Documento>
</DTE>

Por qué un SDK

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

Puedes armar un DTE a mano con una plantilla. Lo difícil es todo lo que lo rodea: un redondeo que calce con el SII, el TED y la firma XMLDSig canónica, los bytes en ISO-8859-1, la semilla y el token, envíos que nunca deben repetirse, los libros, los folios que raciona el portal del SII y una certificación con decenas de pasos. Esto es lo que significa en la práctica.

CapacidadA manodte-sdk
XML según el esquema del SII para nueve tipos de documentoSoporte parcialSoportado
Totales con redondeo por línea, líneas exentas y precios con IVA incluidoSoporte parcialSoportado
TED firmado con la llave del CAF, con rango de folios y vencimiento revisadosSoporte parcialSoportado
Firma XMLDSig enveloped que el SII valida, byte a byteNo soportadoSoportado
Semilla y token, envíos, estados, aceptación y reclamosSoporte parcialSoportado
Envíos que nunca se repiten una vez que el SII respondióNo soportadoSoportado
Libro de compras y ventas, libro de guías y consumo de foliosNo soportadoSoportado
Folios y solicitudes de CAF en el portal del SIINo soportadoSoportado
Registro de compras y ventas (RCV) y respaldo MIPYMENo soportadoSoportado
Certificación: sets de prueba, libros, simulación, intercambio, muestrasNo soportadoSoportado
Muestras impresas con el timbre PDF417Soporte parcialSoportado
Errores tipados sin datos personales en los mensajesNo soportadoSoportado

dte-sdk es todo esto en una sola librería tipada: cuatro puntos de entrada, un modelo de dominio en inglés mapeado a las etiquetas del SII y más de 3.000 pruebas detrás de una exigencia de cobertura del 100 %.

Corre donde sea que corra tu TypeScript, con Node solo para el portal del SII y los PDF

La entrada principal (documentos, timbres, firmas, sobres, libros y los servicios web del SII sobre fetch) corre en Node, Bun y Deno y se empaqueta para el navegador sin configuración. El portal del SII, los adaptadores de Node y las muestras impresas tienen entradas propias porque necesitan Node: el portal pide un certificado de cliente que fetch no puede presentar. Solo módulos ES, Node ≥ 22.12, tipado completo.

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 npm install dte-sdk. Antes de la 1.0.0 cualquier versión puede cambiar la API, así que fija la versión: la guía de instalación muestra cómo.

2

Carga tus credenciales

loadCertificateFromPkcs12() lee tu .pfx/.p12 (loadCertificateFromPem() un par PEM) y parseCaf() lee el CAF que autoriza tus folios.

3

Emite el documento

issueDocument({ document, caf, certificate }) valida la entrada, calcula los totales, agrega el TED y firma; createEnvelope() y signEnvelope() lo envuelven en un EnvioDTE.

4

Envíalo al SII

createSiiClient() se encarga de la semilla y el token; uploadEnvelope() devuelve el track id y waitForUploadStatus() te dice si el SII lo aceptó.

Preguntas frecuentes

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

    Emitir uno exige acertar en cada detalle: los totales y el IVA, folios autorizados por un CAF, el timbre, la firma, el sobre y el envío al SII; y alrededor de eso, los libros, los folios que pides en el portal del SII y, antes que todo, la certificación. Eso es 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