La entrada raíz del paquete. Contiene documentos, timbres, firmas y sobres, la verificación de documentos recibidos, los libros del SII y el cliente de los servicios web del SII (semilla y token, envíos, consultas de estado, aceptación y reclamos) y el registro público de emisores autorizados. Corre en Node, Bun y Deno, se empaqueta para el navegador y nunca menciona un módulo node:. Los adaptadores de Node, el portal y las muestras impresas tienen sus propias entradas: dte-sdk/node, dte-sdk/portal y dte-sdk/pdf.
TypeScript
import { createDocument, stampDocument, signDocument, createSiiClient, DteError } from 'dte-sdk'
⚠️
Los documentos, timbres, firmas, sobres y libros aún no se han enviado al SII real, y la verificación de documentos recibidos aún no se ha enfrentado a un documento que haya enviado un proveedor. Del cliente de los servicios web, solo la semilla y el token por SOAP y el registro de aceptación o reclamo se han probado contra el SII real, y solo en producción; los envíos, las consultas de estado y la API REST de boletas aún no se ejecutan en ninguno de los dos ambientes (issue 8), y del registro de emisores autorizados no consta ninguna ejecución. Todo está probado con respuestas sintéticas del SII. Ver Estado y las convenciones que comparte toda la API.
Toda falla que lanza el SDK es un DteError con un code estable. Discrimina por error.code, nunca por el mensaje. El mensaje es genérico y solo lleva claves seguras (nombres de campo, códigos, números); el valor ofensivo, si lo hay, va en details, así ningún RUT ni texto libre llega a tus logs. Todas las entradas lanzan esta clase. El significado de cada código está en Errores.
// Error tipado que lanza dte-sdk. El mensaje es genérico (código + claves seguras como el nombre// del campo); el valor ofensivo, si lo hay, va en `details`, así ningún RUT ni texto libre llega a// los logs.class DteError extends Error { readonly code: DteErrorCode readonly details: DteErrorDetails constructor(code: DteErrorCode, details?: DteErrorDetails)}// Códigos de error estables que lanza dte-sdk. Discrimina por `error.code`, nunca por el texto del// mensaje.const DTE_ERROR_CODES: { readonly INVALID_RUT: "INVALID_RUT" readonly INVALID_DOCUMENT_TYPE: "INVALID_DOCUMENT_TYPE" readonly INVALID_FOLIO: "INVALID_FOLIO" readonly INVALID_DATE: "INVALID_DATE" readonly INVALID_AMOUNT: "INVALID_AMOUNT" readonly MISSING_FIELD: "MISSING_FIELD" // ... 40 miembros más}// El código de un valor lanzado cuando es un `DteError`, si no undefined. Para resultados que// reportan fallas como datos.function errorCode(error: unknown): DteErrorCode | undefined// Guarda de tipo para `DteError`.function isDteError(value: unknown): value is DteError
Tipo
Descripción
DteErrorCode
Unión de todos los valores de DTE_ERROR_CODES.
DteErrorDetails
Contexto estructurado de un error. Puede traer el valor ofensivo; nunca se copia al message. Definido como Readonly<Record<string, unknown>>.
Catálogos cerrados de los códigos que usan los esquemas del SII, indexados por nombres en inglés, con los predicados y guardas de tipo que los acompañan. Los tipos de documento soportados son 33, 34, 39, 41, 43, 46, 52, 56 y 61. Ver Documentos.
TypeScript
// `TipoDTE` — Códigos de tipo de documento del SII que soporta dte-sdk, por su nombre en inglés.const DOCUMENT_TYPES: { readonly invoice: 33 readonly exemptInvoice: 34 readonly receipt: 39 readonly exemptReceipt: 41 readonly settlementInvoice: 43 readonly purchaseInvoice: 46 readonly dispatchGuide: 52 readonly debitNote: 56 readonly creditNote: 61}// Todos los códigos soportados, ascendentes.const DOCUMENT_TYPE_VALUES: readonly DocumentType[] = [33, 34, 39, 41, 43, 46, 52, 56, 61]// Guarda de tipo: true cuando `value` es uno de los códigos `TipoDTE` soportados.function isDocumentType(value: unknown): value is DocumentType// True para boletas (39, 41): no exigen receptor identificado, no llevan `TasaIVA`, van por REST.function isReceipt(type: DocumentType): boolean// True para los tipos exentos (34, 41): todas las líneas son exentas.function isExemptType(type: DocumentType): boolean// True para notas de débito y crédito (56, 61), que deben referenciar otro documento.function isNote(type: DocumentType): boolean// True cuando el tipo exige receptor identificado (todo menos boletas).function requiresReceiver(type: DocumentType): boolean// True cuando el impreso lleva copia cedible y recuadro de acuse de recibo Ley 19.983 (33, 34, 43,// 46, 52).function isTransferable(type: DocumentType): boolean// Nombre oficial del tipo: `long` (por defecto), `short` (mayúsculas sin tildes) o `printed`// (mayúsculas según el manual de muestras impresas del SII).function documentTypeName(type: DocumentType, variant?: keyof NameVariants): string// Ambientes del SII: `certification` (maullin, certificación) y `production` (palena, producción).const ENVIRONMENTS: { readonly certification: "certification"; readonly production: "production" }// Guarda de tipo para `Environment`.function isEnvironment(value: unknown): value is Environment// `CodRef` — Códigos de referencia de notas de crédito y débito: 1 anula, 2 corrige texto, 3// corrige montos.const REFERENCE_CODES: { readonly cancels: 1 readonly correctsText: 2 readonly correctsAmounts: 3}// `IndTraslado` — Tipo de traslado de la guía de despacho (1 venta, 2 ventas por efectuar, 3// consignación, 4 entrega gratuita, 5 traslado interno, 6 otros no venta, 7 devolución, 8 traslado// para exportación, 9 venta para exportación).const TRANSFER_TYPES: { readonly sale: 1 readonly pendingSale: 2 readonly consignment: 3 readonly freeDelivery: 4 readonly internalTransfer: 5 readonly otherNonSale: 6 readonly return: 7 readonly exportTransfer: 8 readonly exportSale: 9}// `TipoDespacho` — 1 por cuenta del receptor, 2 por cuenta del emisor a instalaciones del// receptor, 3 por cuenta del emisor a otras instalaciones.const DISPATCH_TYPES: { readonly byReceiver: 1 readonly byIssuerToReceiver: 2 readonly byIssuerToOther: 3}// `IndServicio` — 1 servicios periódicos, 2 servicios periódicos domiciliarios, 3 ventas y// servicios (el habitual), 4 espectáculos.const SERVICE_INDICATORS: { readonly periodicServices: 1 readonly periodicHomeServices: 2 readonly salesAndServices: 3 readonly shows: 4}// `FmaPago` — Forma de pago: 1 contado, 2 crédito, 3 sin costo (entrega gratuita).const PAYMENT_TERMS: { readonly cash: 1; readonly credit: 2; readonly free: 3 }// `IndExe` — 1 no afecto o exento, 2 no facturable, 3 garantía por depósito de envases, 4 no// constituye venta, 5 ítem a rebajar, 6 no facturable negativo.const EXEMPT_INDICATORS: { readonly exempt: 1 readonly nonBillable: 2 readonly containerDeposit: 3 readonly notASale: 4 readonly deduction: 5 readonly nonBillableNegative: 6}// `TipoImp` — Códigos de impuesto de retención: 15 = IVA retenido total (factura de compra, tipo// 46).const WITHHOLDING_TAX_CODES: { readonly totalVatWithholding: 15 }// `TasaIVA` — Tasa de IVA vigente, en porcentaje (19).const VAT_RATE = 19// RUT del SII, receptor de todo sobre: 60803000-K.const SII_RUT = '60803000-K'// RUT genérico de consumidor final para boletas sin comprador identificado: 66666666-6.const FINAL_CONSUMER_RUT = '66666666-6'// `IDK` — Valor que marca un CAF del ambiente de certificación (100).const CERTIFICATION_KEY_ID = 100
El modelo de dominio en inglés. Le pasas un DocumentInput a createDocument y recibes un Document inmutable, con RUT validados, texto sanitizado y totales calculados. Donde un tipo tiene un gemelo Input, el Input es lo que escribes y el otro es su forma normalizada. La tabla lista todos los tipos del modelo; DocumentInput y Totals se detallan debajo. Ver Documentos y Totales.
Tipo
Descripción
Issuer
Emisor — Quien emite el documento.
IssuerInput
Emisor tal como lo entrega el llamador: el RUT puede venir en cualquier forma.
Receiver
Receptor — Quien recibe el documento.
ReceiverInput
Receptor tal como lo entrega el llamador.
ItemCode
CdgItem — Código del ítem: sistema (TpoCodigo, p. ej.
LineItem
Detalle — Línea de detalle normalizada.
LineItemInput
Línea de detalle tal como la entrega el llamador; los montos se calculan salvo que venga amount.
Withholding
ImptoReten — Impuesto de retención, p. ej.
CommissionTotals
Comisiones (dentro de Totales) — Totales de comisiones de una liquidación factura.
Totals
Totales — Totales del documento. Enteros en pesos.
ReceiptReference
Referencia de una boleta, normalizada.
ReceiptReferenceInput
Referencia de una boleta (39, 41) tal como la entrega el llamador. El esquema de boletas le da a Referencia su propia forma: sin fecha, y con un código que es texto propio de la empresa.
Reference
Referencia — Referencia normalizada.
ReferenceInput
Referencia — Referencia a otro documento tal como la entrega el llamador.
GlobalAdjustment
DscRcgGlobal — Descuento o recargo global normalizado.
GlobalAdjustmentInput
DscRcgGlobal — Descuento o recargo global tal como lo entrega el llamador.
CommissionLine
Comisiones — Línea de comisión u otro cargo de una liquidación factura (43).
CommissionLineInput
Línea de comisión tal como la entrega el llamador. Definido como Omit<CommissionLine, 'lineNumber'>.
Driver
Chofer — Conductor del transporte.
Transport
Transporte — Datos de transporte de una guía de despacho (52).
TransportInput
Transporte tal como lo entrega el llamador.
Payment
MntPagos — Una cuota de pago.
HeaderOptions
Campos opcionales de IdDoc. Solo se emiten los que se fijan, en el orden del esquema.
SubtotalInfo
SubTotInfo — Subtotal informativo.
Header
Encabezado — Encabezado del documento.
Document
Documento normalizado, listo para renderizar, timbrar y firmar. Lo produce createDocument.
DocumentInput
Lo que el llamador entrega a createDocument.
Campos de Totals
Campo
Tipo
Descripción
netAmount?
number
MntNeto — Monto neto: líneas afectas sin IVA; se omite si es 0.
exemptAmount?
number
MntExe — Monto exento (líneas con IndExe=1).
vatRate?
number
TasaIVA — Tasa de IVA (19); nunca en boletas.
vatAmount?
number
IVA — Monto del IVA.
ownVatAmount?
number
IVAProp — IVA propio (liquidaciones).
thirdPartyVatAmount?
number
IVATerc — IVA de terceros (liquidaciones).
withholdings?
readonly Withholding[]
ImptoReten — Retenciones.
commissions?
CommissionTotals
Comisiones — Totales de comisiones (43).
totalAmount
number
MntTotal — Monto total: neto + IVA + exento (sin IVA si está retenido).
nonBillableAmount?
number
MontoNF — Monto no facturable (líneas con IndExe 2 a 6).
periodAmount?
number
MontoPeriodo — Monto del período.
previousBalance?
number
SaldoAnterior — Saldo anterior.
amountDue?
number
VlrPagar — Valor a pagar.
Campos de DocumentInput
Campo
Tipo
Descripción
type
DocumentType
TipoDTE — Tipo de documento.
folio
number
Folio — Folio autorizado por el CAF.
issueDate?
string
FchEmis — Fecha de emisión AAAA-MM-DD; por defecto hoy en hora de Chile.
issuer
IssuerInput
receiver?
ReceiverInput
Receptor; opcional en boletas (consumidor final anónimo).
items
readonly LineItemInput[]
references?
readonly ReferenceInput[]
receiptReferences?
readonly ReceiptReferenceInput[]
Referencia — Referencias de una boleta (39, 41); references es para los demás tipos.
globalAdjustments?
readonly GlobalAdjustmentInput[]
subtotals?
readonly SubtotalInfo[]
commissions?
readonly CommissionLineInput[]
transport?
TransportInput
options?
HeaderOptions
pricesIncludeVat?
boolean
Los precios unitarios ya incluyen IVA: emite MntBruto=1 y deriva neto/IVA del bruto.
withholdVat?
boolean
ImptoReten — Retener todo el IVA (código 15, total sin IVA); true por defecto en facturas de compra (46), se puede fijar en las notas que las afectan.
totals?
Totals
Totales explícitos (uso avanzado); se calculan si se omiten.
El modelo usa nombres en inglés; los esquemas del SII usan sus propias etiquetas (MntTotal, RznSoc). toSiiDocument y fromSiiDocument convierten entre ambos, con las claves en el orden del esquema. Los tipos Sii* describen las etiquetas oficiales.
TypeScript
// Convierte un `Document` de dominio a la estructura SII (etiquetas oficiales, orden del esquema).// Es el único lugar que conoce los nombres de etiqueta; el XML siempre se renderiza desde su// salida.function toSiiDocument(doc: Document): SiiDocumento// Convierte un documento en forma SII al modelo de dominio (para DTE recibidos e// interoperabilidad). Los RUT se validan con rut.ts al entrar.function fromSiiDocument(sii: SiiDocumento): Document
Tipo
Descripción
SiiDocumento
Cuerpo del documento con etiquetas oficiales, en el orden que exigen Documento/Liquidacion. TED y TmstFirma se agregan al renderizar.
SiiEncabezado
Encabezado en forma SII.
SiiIdDoc
IdDoc con las etiquetas oficiales, en el orden del esquema.
SiiMntPagos
MntPagos — Cuota de pago, forma SII.
SiiEmisor
Emisor en forma SII (las boletas usan RznSocEmisor/GiroEmisor).
SiiReceptor
Receptor en forma SII.
SiiTransporte
Transporte en forma SII.
SiiTotales
Totales en forma SII, orden del esquema.
SiiImptoReten
ImptoReten en forma SII.
SiiComisionesTotales
Totales/Comisiones en forma SII.
SiiDetalle
Detalle en forma SII, orden del esquema.
SiiCdgItem
CdgItem en forma SII.
SiiSubTotInfo
SubTotInfo en forma SII.
SiiDscRcgGlobal
DscRcgGlobal en forma SII.
SiiReferencia
Referencia en forma SII.
SiiReferenciaBoleta
Referencia de una boleta (39, 41) en forma SII: el esquema de boletas no trae fecha y su código es texto libre.
El manejo de RUT se delega en rut.ts. toSiiRut acepta entrada con puntos, con guión o compacta, la valida (módulo 11) y devuelve el string con marca SiiRut en la forma que esperan los esquemas del SII (12345678-5: sin puntos, con guión, K mayúscula).
TypeScript
// Valida un RUT con rut.ts (módulo 11) y lo devuelve en forma SII. Acepta entrada con puntos, con// guión o compacta.function toSiiRut(value: string, field?: string): SiiRut// Guarda de tipo: true cuando `value` ya es un RUT válido en forma SII.function isSiiRut(value: unknown): value is SiiRut// Separa un RUT SII en cuerpo y dígito verificador (lo que piden los campos `rutSender`/`dvSender`// del SII).function splitSiiRut(rut: SiiRut): { readonly body: string; readonly verifier: string; }
Tipo
Descripción
SiiRut
Un RUT ya validado con rut.ts y en la forma que exigen los esquemas del SII: sin puntos, con guión, K mayúscula (12345678-5). La marca es fantasma: la única forma de obtener uno es toSiiRut.
Sanitizado de texto, la codificación ISO-8859-1 que exige el SII y el reloj de Chile (America/Santiago, con horario de verano). Las funciones de hora reciben un now opcional para que los tests no dependan del reloj real.
// Normaliza texto libre para un campo del DTE: quita apóstrofes y comillas dobles (rompen la// validación de firma del SII), pasa guiones y puntos suspensivos tipográficos a ASCII, elimina// todo lo que no es ISO-8859-1 (emoji, comillas curvas) y recorta espacios.function sanitizeText(text: string | null | undefined): string// Pliega texto a ASCII imprimible para el TED (`RSR`, `IT1`): quita diacríticos (á→a, ñ→n),// expande ligaduras y letras especiales (ß→ss, Æ→AE, Þ→TH) y elimina lo que siga fuera de ASCII.function foldToAscii(text: string | null | undefined): string// Sanitiza y corta el texto a `maxLength`; con `preserveWords`, retrocede al último espacio si// queda después del 70 % del límite.function truncateText( text: string | null | undefined, maxLength: number, preserveWords?: boolean,): string// Lanza `FIELD_TOO_LONG` cuando el texto (ya sanitizado) supera el `xs:maxLength` del esquema del// SII. El SII rechaza el sobre COMPLETO cuando un documento falla el schema, por eso se falla// temprano en vez de truncar en silencio.function assertMaxLength(value: string, maxLength: number, field: string): void// Codifica texto como bytes ISO-8859-1 (lo que esperan los endpoints de subida del SII). Lanza en// vez de truncar un code point mayor a U+00FF a su byte bajo, que es como llegaban caracteres de// control corruptos al SII.function encodeLatin1(text: string): Uint8Array// Decodifica bytes ISO-8859-1 a string (un carácter por byte).function decodeLatin1(bytes: Uint8Array): string
// La fecha de hoy en Chile como `AAAA-MM-DD` (formato de `FchEmis`/`FchResol` del SII).function chileDate(now?: Date): string// Marca de tiempo en hora de Chile `AAAA-MM-DDTHH:MM:SS` sin zona ni milisegundos (`TmstFirma`,// `TmstFirmaEnv`, `TSTED`). Nunca se arma con `toISOString()`, que siempre es UTC y dejaba los// sobres ~3 h en el futuro ("Error en Carátula").function chileTimestamp(now?: Date): string// Descompone un instante (por defecto: ahora) en componentes de hora de Chile con `Intl`, nunca// con la zona del proceso.function chileDateTimeParts(now?: Date): ChileDateTimeParts// Normaliza `DD-MM-AAAA`, `DD/MM/AAAA` o `AAAA-MM-DD` (como muestran las fechas el portal y las// resoluciones del SII) a ISO.function toIsoDate(value: string, field?: string): string// True cuando `value` es una fecha de calendario real en `AAAA-MM-DD`.function isIsoDate(value: string): boolean
Tipo
Descripción
ChileDateTimeParts
Componentes de fecha y hora de un instante en Chile (America/Santiago, con horario de verano), con ceros a la izquierda.
Montos de línea y totales del documento con las reglas de redondeo del SII. Ver Totales.
TypeScript
// Calcula el monto de una línea con redondeo por línea (el SII compara `MontoItem` contra `QtyItem// × PrcItem`).function calculateLineAmount(input: LineAmountInput): LineAmount// Calcula `Totales` desde las líneas: neto, exento, IVA (derivado del bruto con// `pricesIncludeVat`), no facturable, retención en facturas de compra y el total.function calculateTotals( items: readonly Pick<LineItem, "amount" | "exemptIndicator">[], options: TotalsOptions,): Totals
Tipo
Descripción
LineAmountInput
Entradas del monto de una línea.
LineAmount
Resultado del cálculo del monto de una línea, enteros en pesos.
TotalsOptions
Opciones de calculateTotals.
Campos de LineAmountInput
Campo
Tipo
Descripción
quantity?
number
QtyItem — Cantidad (por defecto 1).
unitPrice?
number
PrcItem — Precio unitario (por defecto 0).
discountPercent?
number
DescuentoPct — Porcentaje de descuento.
surchargePercent?
number
RecargoPct — Porcentaje de recargo.
Campos de LineAmount
Campo
Tipo
Descripción
base
number
round(cantidad × precio).
discountAmount
number
DescuentoMonto — Descuento en pesos.
surchargeAmount
number
RecargoMonto — Recargo en pesos.
amount
number
MontoItem — base − descuento + recargo.
Campos de TotalsOptions
Campo
Tipo
Descripción
type
DocumentType
Tipo de documento (decide boletas y retención).
pricesIncludeVat?
boolean
Los montos de línea incluyen IVA.
vatRate?
number
Tasa de IVA en porcentaje (por defecto 19).
globalAdjustments?
readonly GlobalAdjustment[]
Descuentos/recargos globales.
withholdVat?
boolean
Retener todo el IVA (por defecto: true en facturas de compra, 46).
Crear, renderizar, firmar y emitir documentos. createDocument valida y normaliza un DocumentInput; issueDocument corre todo el proceso (crear, timbrar con el CAF, firmar con el certificado). Ver Documentos y Firma.
TypeScript
// Construye un `Document` normalizado desde la entrada: valida tipo, folio y fechas, normaliza RUT// con rut.ts, sanitiza textos y exige los largos del esquema (falla temprano en vez de dejar que// el SII rechace el sobre entero), numera líneas, calcula montos y totales, aplica los defaults de// boleta (consumidor final, `IndServicio=3`) y fija `MntBruto=1` cuando los precios incluyen IVA.function createDocument(input: DocumentInput, options?: CreateDocumentOptions): Document// `xs:maxLength` del esquema del SII por elemento; `createDocument` los exige sobre el texto ya// sanitizado.const FIELD_LIMITS: { readonly RznSoc: 100 readonly GiroEmis: 80 readonly DirOrigen: 70 readonly CmnaOrigen: 20 readonly CiudadOrigen: 20 readonly Sucursal: 20 // ... 29 miembros más}// Renderiza el XML `<DTE>` sin firma: namespaces en el raíz (el digest los hereda), `ID` en el// elemento firmado, secciones en el orden del esquema, el TED textual y un salto de línea entre// secciones.function buildDocumentXml(doc: Document, options?: BuildDocumentXmlOptions): string// Nombre del elemento firmado: `Liquidacion` para liquidación factura (43), `Documento` para el// resto.function documentElementName(type: DocumentType): "Documento" | "Liquidacion"// Firma un documento timbrado con el certificado del emisor (XMLDSig envuelta sobre// `Documento`/`Liquidacion`). `TmstFirma` es la hora de Chile de `now`, o `signedAt` tal como se// entrega.function signDocument( doc: StampedDocument, certificate: Certificate, options?: { readonly now?: Date; readonly signedAt?: string; },): SignedDocument// Verifica la firma de un XML `<DTE>` (propio o recibido).function verifyDocumentSignature(xml: string): SignatureVerification// El flujo completo: crear (si hace falta) → timbrar con el CAF → firmar con el certificado.function issueDocument(input: IssueDocumentInput): SignedDocument
Tipo
Descripción
CreateDocumentOptions
Opciones de createDocument.
BuildDocumentXmlOptions
Opciones de buildDocumentXml.
SignedDocument
Un documento timbrado y firmado: trae el XML final.
IssueDocumentInput
Entrada de issueDocument.
Campos de CreateDocumentOptions
Campo
Tipo
Descripción
now?
Date
Reloj para la fecha de emisión por defecto (tests).
Campos de BuildDocumentXmlOptions
Campo
Tipo
Descripción
ted?
Ted
TED a incluir.
signedAt?
string
Valor de TmstFirma.
Campos de SignedDocument
Campo
Tipo
Descripción
id
string
Atributo ID del elemento firmado: DTE_T{tipo}F{folio}.
header
Header
items
readonly LineItem[]
subtotals
readonly SubtotalInfo[]
globalAdjustments
readonly GlobalAdjustment[]
references
readonly Reference[]
receiptReferences
readonly ReceiptReference[]
Referencia — Referencias de una boleta (39, 41), que tiene forma propia; vacío en los demás tipos.
commissions
readonly CommissionLine[]
Comisiones — Líneas de comisión (solo 43).
ted
Ted
xml
string
XML <DTE> firmado (sin prólogo).
signedAt
string
TmstFirma, hora de Chile.
signature
XmlSignature
Valores de digest y firma.
Campos de IssueDocumentInput
Campo
Tipo
Descripción
document
DocumentInput | Document
Entrada cruda o un documento ya creado.
caf
Caf
CAF que cubre el folio.
certificate
Certificate
Certificado del emisor.
now?
Date
Reloj para fechas y marcas de tiempo.
checkCafExpiry?
boolean
Chequear vencimiento del CAF (por defecto true).
timestamp?
string
TSTED y TmstFirma tal como se entregan, en vez de la hora de Chile de now.
Utilidades XML pequeñas sobre las que se construye el resto del SDK: serializar, parsear, escapar y disposición de Base64.
TypeScript
// Serializa un objeto plano a XML compacto. Las claves son elementos en orden de inserción, las// claves `@_nombre` son atributos, los arreglos repiten el elemento y los valores se escapan con// entidades.function buildXml(value: Readonly<Record<string, unknown>>): string// Parsea XML a objeto plano (valores como string). Lanza `XML_PARSE_FAILED` si no está bien// formado.function parseXml(xml: string): ParsedXml// Como `parseXml` pero quita los prefijos de namespace (`SII:RESPUESTA` → `RESPUESTA`), útil para// respuestas SOAP.function parseXmlWithoutNamespaces(xml: string): ParsedXml// Texto de la primera ocurrencia de `<tag>…</tag>`, o `null`. Por regex, para respuestas planas// del SII.function extractTagContent(xml: string, tag: string): string | null// Decodifica las cinco entidades XML (las respuestas SOAP suelen traer XML escapado).function decodeXmlEntities(xml: string): string// Escapa el valor de un nodo de texto con las cinco entidades XML (`& < > " '`).function escapeXmlText(value: string): string// Escapa el valor de un atributo entre comillas dobles.function escapeXmlAttribute(value: string): string// Quita los espacios de un base64 y lo corta en columnas de `width`.function wrapBase64(value: string, width?: number): string// Recorta `SignatureValue`, `Modulus` y `X509Certificate` a 64 columnas, la disposición que espera// el SII.function formatBase64Columns(xml: string): string
Tipo
Descripción
ParsedXml
Resultado de parsear XML a objeto plano: los elementos son claves, los repetidos son arreglos, los atributos son claves @_nombre y todo valor queda como string. Definido como Readonly<Record<string, unknown>>.
Todo DOM que parsea el SDK (documentos recibidos, firmas, CAF, las respuestas del SII) rechaza los elementos anidados a más de 100 niveles con XML_PARSE_FAILED, antes de que algo los recorra. Ningún documento que escriben el SII o un emisor se acerca a eso; antes de la 0.7.0 un archivo de unos miles de elementos anidados desbordaba la pila con un RangeError.
Las primitivas detrás del TED y de la firma XMLDSig: SHA-1, RSA-SHA1 y lectura de X.509.
TypeScript
// SHA-1 en base64 de `data` codificado como `encoding` (por defecto UTF-8). Se usa en el// `DigestValue` de XMLDSig.function sha1Base64(data: string, encoding?: TextEncoding): string// Firma SHA1withRSA (PKCS#1 v1.5) de `data`, en base64. Determinista: misma clave y bytes, misma// firma.function rsaSha1SignBase64(privateKeyPem: string, data: string, encoding?: TextEncoding): string// Verifica una firma SHA1withRSA en base64 contra una clave pública dada como módulo/exponente.// Nunca lanza: entrada malformada es `false`.function rsaSha1VerifyBase64( publicKey: RsaPublicKeyParts, data: string, encoding: TextEncoding, signatureBase64: string,): boolean// Módulo y exponente públicos de una clave privada PEM (PKCS#1 o PKCS#8).function rsaPublicKeyParts(privateKeyPem: string): RsaPublicKeyParts// Módulo y exponente públicos de un certificado PEM.function rsaPublicKeyPartsFromCertificatePem(certificatePem: string): RsaPublicKeyParts// Parsea un certificado PEM a los campos que dte-sdk necesita.function parseCertificatePem(certificatePem: string): ParsedCertificate// Cuerpo base64 de un certificado PEM (sin cabeceras ni espacios).function certificateBase64(certificatePem: string): string
Tipo
Descripción
TextEncoding
Cómo se convierte un string JS a bytes antes de hashear o firmar. Definido como 'utf8' | 'latin1'.
RsaPublicKeyParts
Clave pública RSA como los enteros base64 big-endian sin signo que usan RSAKeyValue de XMLDSig y RSAPK del CAF.
Carga el certificado digital que firma documentos, sobres y la semilla del SII, desde PKCS#12 (.pfx) o PEM. Las claves vienen de tu propia configuración (por ejemplo process.env.PFX_PASSWORD). Ver Firma.
TypeScript
// True cuando `now` pasó `notAfter` menos `marginDays`.function isCertificateExpired( certificate: Pick<Certificate, "notAfter">, options?: { readonly now?: Date; readonly marginDays?: number; },): boolean// Días enteros hasta `notAfter` (negativo una vez vencido).function daysUntilExpiry( certificate: Pick<Certificate, "notAfter">, options?: { readonly now?: Date; },): number// Construye un `Certificate` desde strings PEM (p. ej. tras `openssl pkcs12 -nodes`). Verifica que// la llave corresponda al certificado y que esté vigente ahora: no vencido (`CERT_EXPIRED`) y no// antes de su `notBefore` (`CERT_NOT_YET_VALID`, `details.validFrom`). `allowExpired` carga ambos.function loadCertificateFromPem( input: PemCertificateInput, options?: LoadCertificateOptions,): Certificate// Carga un PKCS#12 (`.pfx`/`.p12`) como `Certificate`: archivos legacy (3DES/RC2) y modernos// (PBES2/AES), bolsas de llave cifradas o planas, detección de la hoja por llave, cadena ordenada// hoja → raíz, RUT desde el certificado. Igual que el cargador PEM, lanza `CERT_EXPIRED` pasado// `notAfter` y `CERT_NOT_YET_VALID` antes de `notBefore`; `allowExpired` carga ambos.function loadCertificateFromPkcs12( bytes: Uint8Array, password: string, options?: LoadCertificateOptions,): Certificate
Tipo
Descripción
Certificate
Certificado de firma cargado desde PKCS#12 o PEM: llave privada, certificado hoja, cadena para mTLS y los campos de identidad que le importan al SII.
LoadCertificateOptions
Opciones comunes a los cargadores de certificado.
PemCertificateInput
Material PEM para loadCertificateFromPem.
Campos de Certificate
Campo
Tipo
Descripción
privateKeyPem
string
Llave privada en PEM.
certificatePem
string
Certificado hoja en PEM (firma XML).
chainPem
string
Hoja → intermedios → raíz en PEM (autenticación TLS); igual a certificatePem si no hay cadena.
certificateBase64
string
Hoja en DER base64 (X509Certificate).
publicKey
RsaPublicKeyParts
Módulo/exponente públicos (RSAKeyValue).
rut
SiiRut | null
RUT del titular o null.
commonName
string | null
Nombre común.
subject
Readonly<Record<string, string>>
Campos del sujeto.
notBefore
Date
Inicio de vigencia.
notAfter
Date
Fin de vigencia.
Campos de LoadCertificateOptions
Campo
Tipo
Descripción
now?
Date
Reloj para los chequeos de vigencia (tests).
allowExpired?
boolean
Cargar un certificado fuera de su vigencia en vez de lanzar CERT_EXPIRED (vencido) o CERT_NOT_YET_VALID (con notBefore aún por delante).
Campos de PemCertificateInput
Campo
Tipo
Descripción
privateKeyPem
string
Llave privada PEM (PKCS#1 o PKCS#8, sin cifrar).
certificatePem
string
Certificado hoja PEM.
chainPem?
string
Cadena completa PEM para TLS; por defecto la hoja.
El CAF (Código de Autorización de Folios): lee el archivo que entrega el SII, revisa el rango de folios y el vencimiento, y firma con su llave privada. El XML del CAF contiene una llave privada: trátalo como un secreto. Ver Timbre.
TypeScript
// Parsea un archivo CAF XML tal como se descarga del SII. Valida estructura, tipo, rango y llaves// (la llave privada `RSASK` debe ser el par de la clave pública `RSAPK` que firmó el SII), y que el// texto tenga un `<CAF` y un `</CAF`, para que el bloque `<CAF>` que se guarda para el TED sea el// CAF del que se leen sus campos. Las referencias numéricas de carácter (`Ñ`, `Ñ`) de sus// campos se decodifican como las decodifica un DOM. Lanza `CAF_INVALID`, también para llaves que// no son par, un DOCTYPE u otro `<CAF` o `</CAF` en cualquier parte del texto, como en un// comentario.function parseCaf(xml: string): Caf// Instante de vencimiento de un CAF: seis meses después de `authorizationDate` (Res. Ex. SII// 58/2017) para facturas y notas (33, 46, 56, 61), a medianoche de Chile continental (UTC-4). Un// día que el sexto mes no tiene es su último día: un CAF autorizado el 31-08-2026 vence el// 28-02-2027, no en marzo. `null` para tipos que no vencen o sin fecha.function cafExpiresAt(caf: Pick<Caf, "documentType" | "authorizationDate">): Date | null// True si el CAF venció o vence dentro de `marginMs` (por defecto un día: el SII rechaza cada// documento timbrado con un CAF vencido con `CAF-3-517`, y el sobre puede recibirse después de// timbrado).function isCafExpired( caf: Pick<Caf, "documentType" | "authorizationDate">, options?: { readonly now?: Date; readonly marginMs?: number; },): boolean// True cuando `folio` es un entero dentro del rango del CAF.function isFolioInRange(caf: Pick<Caf, "range">, folio: number): boolean// Lanza `FOLIO_OUT_OF_RANGE` salvo que `folio` esté dentro del rango del CAF.function assertFolioInRange(caf: Pick<Caf, "range" | "documentType">, folio: number): void// Cantidad de folios que autoriza el CAF.function availableFolios(caf: Pick<Caf, "range">): number// Firma SHA1withRSA (base64) de `data` con la llave privada del CAF sobre sus bytes ISO-8859-1, la// codificación en que el TED se transmite e imprime.function signWithCaf(caf: Pick<Caf, "privateKeyPem">, data: string): string// Verifica una firma tipo TED con la clave pública del CAF (`RSAPK`).function verifyWithCaf(caf: Pick<Caf, "publicKey">, data: string, signatureBase64: string): boolean// Las llaves del SII que firman el `DA` de cada CAF, por `IDK`: 100 para el ambiente de// certificación y 300 para producción. Cada una es la llave RSA de 512 bits de un certificado// autofirmado del SII cuyo número de serie es el `IDK`, de CryptoSys y de LibreDTE, los mismos// bytes en ambos.const SII_CAF_KEYS: SiiCafKeys// El ambiente de la llave del SII que nombra un CAF en su `IDK`: `certification` para 100,// `production` para 300, null para otra.function cafEnvironment(keyId: number): Environment | null// Verifica la firma del SII sobre un CAF (`FRMA`, SHA1withRSA sobre el `DA`) con la llave del SII// que nombra su `IDK`. Recibe un archivo CAF tal como lo emite el SII o el bloque `<CAF>` que trae// un TED. `unchecked` si no se conoce llave para ese `IDK`; `invalid` para un CAF del otro ambiente// que `environment` (producción por defecto), sea cual sea su firma, y para una `FRMA` vacía, sea// cual sea su llave. Lanza `CAF_INVALID` si el texto no es XML, trae un DOCTYPE o no tiene un solo// `CAF` con un `DA` y una `FRMA`.function verifyCafSignature(cafXml: string, options?: CafSignatureOptions): VerificationStatus
Tipo
Descripción
Caf
Un CAF (Código de Autorización de Folios) parseado: la autorización del SII de un rango de folios más la llave privada que firma cada TED. privateKeyPem es secreto.
SiiCafKeys
Llaves públicas del SII que verifican la FRMA de un CAF, por el IDK que nombra el CAF. Definido como Readonly<Record<number, RsaPublicKeyParts>>.
CafSignatureOptions
Opciones de verifyCafSignature.
VerificationStatus
Resultado de un chequeo que puede quedar sin hacerse: unchecked cuando falta lo que necesita, como la llave del SII de un CAF. Definido como 'valid' | 'invalid' | 'unchecked'.
Campos de Caf
Campo
Tipo
Descripción
issuerRut
SiiRut
DA/RE — RUT del emisor autorizado.
issuerName
string
DA/RS — Razón social del emisor.
documentType
DocumentType
DA/TD — Tipo de documento del rango.
range
{ readonly from: number; readonly to: number }
DA/RNG — Rango de folios, inclusivo (D desde, H hasta).
authorizationDate
string | null
DA/FA — Fecha de autorización AAAA-MM-DD, o null si no viene.
publicKey
RsaPublicKeyParts
DA/RSAPK — Clave pública que verifica las firmas del TED.
keyId
number
DA/IDK — Identificador de llave; 100 marca certificación.
siiSignature
string
FRMA — Firma del SII sobre los datos de autorización.
privateKeyPem
string
RSASK — Llave privada PEM con la que se firma el TED, el par de publicKey.
xml
string
El bloque <CAF>…</CAF> tal como lo emitió el SII (sin espacios entre etiquetas), que va íntegro en cada TED.
Campos de CafSignatureOptions
Campo
Tipo
Descripción
environment?
Environment
El ambiente cuyos CAF se aceptan, production por defecto: un CAF de la llave del SII del otro ambiente (100 en certificación, 300 en producción) es invalid.
siiKeys?
SiiCafKeys
Las llaves del SII por IDK, en lugar de SII_CAF_KEYS (para agregar una, expándela).
El timbre electrónico (TED) de un documento, firmado con la llave del CAF. Ver Timbre.
TypeScript
// Timbra un documento con un CAF: verifica tipo, emisor, rango de folios y vencimiento, arma el// `DD` exacto y lo firma con la llave del CAF (SHA1withRSA sobre bytes Latin-1).function stampDocument(doc: Document, caf: Caf, options?: StampOptions): StampedDocument// Verifica un XML `TED` contra la clave pública del CAF: true solo si los bytes del `<DD>`// coinciden con la firma `FRMT`.function verifyTed(tedXml: string, caf: Pick<Caf, "publicKey">): boolean// El string `<DD>…</DD>` exacto que se firma y se imprime en el PDF417.function buildDdString(fields: Omit<Ted, "signature" | "xml">): string// Envuelve un `DD` y su firma en el elemento `TED`.function buildTedXml(dd: string, signature: string): string// Pliega el texto a ASCII y después lo corta a 40, como exigen `RSR` e `IT1` (el plegado puede// alargar el texto).function tedText(text: string): string
Tipo
Descripción
Ted
TED — Timbre electrónico: los campos de DD, el CAF que incluyen y la firma hecha con la llave del CAF.
StampedDocument
Un documento con su TED.
StampOptions
Opciones de stampDocument.
Campos de Ted
Campo
Tipo
Descripción
issuerRut
SiiRut
RE — RUT del emisor.
documentType
DocumentType
TD — Tipo de documento.
folio
number
F — Folio.
issueDate
string
FE — Fecha de emisión.
receiverRut
string
RR — RUT del receptor.
receiverName
string
RSR — Razón social del receptor plegada a ASCII, máximo 40.
totalAmount
number
MNT — Monto total.
firstItemName
string
IT1 — Nombre del primer ítem plegado a ASCII, máximo 40.
caf
string
CAF — Bloque <CAF>…</CAF> exacto.
stampedAt
string
TSTED — Marca de tiempo del timbre, hora de Chile.
signature
string
FRMT — Firma SHA1withRSA del <DD>, base64.
xml
string
XML completo <TED version="1.0">…</TED>.
Campos de StampedDocument
Campo
Tipo
Descripción
id
string
Atributo ID del elemento firmado: DTE_T{tipo}F{folio}.
header
Header
items
readonly LineItem[]
subtotals
readonly SubtotalInfo[]
globalAdjustments
readonly GlobalAdjustment[]
references
readonly Reference[]
receiptReferences
readonly ReceiptReference[]
Referencia — Referencias de una boleta (39, 41), que tiene forma propia; vacío en los demás tipos.
commissions
readonly CommissionLine[]
Comisiones — Líneas de comisión (solo 43).
ted
Ted
Campos de StampOptions
Campo
Tipo
Descripción
now?
Date
Reloj para TSTED y el chequeo de vencimiento.
checkExpiry?
boolean
Chequear el vencimiento del CAF (por defecto true).
stampedAt?
string
TSTED tal como se entrega, en vez de la hora de Chile de now.
Firmas XML envueltas (C14N 1.0, RSA-SHA1), el tipo que valida el SII. Ver Firma.
TypeScript
// Arma `SignedInfo`. `referenceId` es el `ID` del elemento firmado, o `''` para referenciar el// documento completo (`URI=""`).function buildSignedInfo( referenceId: string, digestValue: string, options?: { readonly expandTags?: boolean; readonly includeXsi?: boolean; },): string// Arma el elemento `Signature` a partir del `SignedInfo` guardado, la firma recortada y el// material de clave.function buildSignatureXml( signedInfo: string, signatureValue: string, keyInfo: { readonly modulus: string; readonly exponent: string; readonly certificate: string; },): string// Firma `elementTag` con una firma XMLDSig envuelta (C14N 1.0, RSA-SHA1) y devuelve el XML con la// `Signature` insertada justo antes de `</rootTag>`.function signEnveloped( input: SignEnvelopedInput,): { readonly xml: string; readonly signature: XmlSignature; }// Firma el elemento raíz completo con una firma XMLDSig envuelta (`Reference URI=""`, transformada// enveloped-signature, C14N 1.0, RSA-SHA1) e inserta `Signature` justo antes del cierre del raíz.function signRootElement( input: SignRootElementInput,): { readonly xml: string; readonly signature: XmlSignature; }// Verifica la firma envuelta que es hija directa de `rootTag`: ubica el elemento firmado por el// `ID` que nombra `Reference/@URI` (ver `referencedElement`), recalcula su digest y comprueba// `SignatureValue` con el `X509Certificate` que viene en `KeyInfo`. Solo pasa la firma que esto// calcula: una `Reference`, con el único `DigestValue`, con SHA-1 y sin transformadas salvo// enveloped-signature o C14N 1.0 (si no, `digestValid: false`), bajo C14N 1.0 y RSA-SHA1 (si no,// `signatureValid: false`).function verifyEnveloped( xml: string, target: { readonly elementTag: string; readonly rootTag: string; },): SignatureVerification
Tipo
Descripción
XmlSignature
Los dos valores que identifican una firma.
SignEnvelopedInput
Entrada de signEnveloped.
SignRootElementInput
Entrada de signRootElement.
SignatureVerification
Resultado de verificar una firma envuelta.
Campos de XmlSignature
Campo
Tipo
Descripción
digestValue
string
DigestValue — SHA-1 en base64 del elemento firmado canónico.
signatureValue
string
SignatureValue — Firma RSA en base64, en una línea.
Campos de SignEnvelopedInput
Campo
Tipo
Descripción
xml
string
XML sin firma.
elementTag
string
Etiqueta del elemento con ID a firmar.
rootTag
string
Etiqueta raíz cuyo cierre sigue al elemento firmado.
Reference/@URI sin #, o null si SignedInfo no trae referencia, o trae más de una.
digestValid
boolean
SignedInfo tiene una sola Reference, con SHA-1, sin transformadas salvo enveloped-signature o C14N 1.0, y el único DigestValue; el elemento que referencia es único, está junto a Signature bajo el raíz, tiene la etiqueta esperada y sigue produciendo ese DigestValue.
signatureValid
boolean
SignedInfo declara C14N 1.0 y RSA-SHA1, y SignatureValue verifica con el certificado embebido.
Sobres para el SII: EnvioDTE y EnvioBOLETA. Ver Sobres.
TypeScript
// Agrupa documentos firmados bajo una carátula: valida el tipo de sobre, normaliza RUT y fecha de// resolución, cuenta documentos por tipo (`SubTotDTE`, con 33/61/56 primero en `EnvioDTE`) y// genera el id del set.function createEnvelope(input: CreateEnvelopeInput): Envelope// `PREFIJO_dd_mm_aaaa_hh_mm_ss_mmm` en hora de Chile.function generateSetId(prefix: string, now?: Date): string// Renderiza el sobre sin firma: prólogo ISO-8859-1, raíz con schemaLocation, `SetDTE` con// `Caratula` y los documentos firmados uno por línea (conservan sus namespaces: los digests// dependen de ellos).function buildEnvelopeXml(envelope: Envelope): string// Elemento raíz de cada tipo de sobre.function envelopeRootName(kind: Envelope["kind"]): "EnvioDTE" | "EnvioBOLETA"// Firma el `SetDTE` con el certificado de quien envía.function signEnvelope(envelope: Envelope, certificate: Certificate): SignedEnvelope// Verifica la firma del `SetDTE` de un XML `EnvioDTE`/`EnvioBOLETA`.function verifyEnvelopeSignature(xml: string): SignatureVerification
Tipo
Descripción
EnvelopeCover
Caratula — Carátula normalizada.
EnvelopeCoverInput
Caratula — Carátula del sobre tal como la entrega el llamador.
EnvelopeSubtotal
SubTotDTE — Cantidad de documentos por tipo dentro del sobre.
Revisa lo que te envió un proveedor: la firma del propio sobre y, por cada documento, su firma XMLDSig, su timbre (TED), el CAF que trae el timbre y la firma del SII sobre ese CAF, con SII_CAF_KEYS (ver CAF). Un documento que falla un chequeo es un resultado, no un error. Sin reloj ni red. Ver Firma.
TypeScript
// Verifica los documentos de un `DTE`, `EnvioDTE` o `EnvioBOLETA` tal como llega de un proveedor,// y la firma del propio sobre. Cada documento se lee desde su elemento en la entrada parseada,// nunca de un trozo del texto: su firma se chequea sobre formas escritas desde ese elemento, y sus// campos y su timbre se leen de él. Se chequea: su firma XMLDSig; su TED, cuya `FRMT` debe// verificar con la llave del CAF que trae el TED y cuyo `DD` debe coincidir con el encabezado; ese// CAF contra el documento (el emisor, el tipo, el folio dentro del rango); y la firma del SII// sobre el CAF (`FRMA`) con la llave del SII de su `IDK` (`SII_CAF_KEYS`, o `siiKeys`), solo para// los CAF de `environment` (producción por defecto).function verifyReceivedDocuments( xml: string, options?: VerifyReceivedDocumentsOptions,): ReceivedDocumentsVerification
Lanza XML_PARSE_FAILED para XML vacío o malformado, un DOCTYPE, otro raíz, un sobre sin exactamente un SetDTE, un DTE fuera de lugar o con prefijo, un DTE sin un Documento o Liquidacion sin prefijo, o elementos anidados a más de 100 niveles, y ENVELOPE_EMPTY para un sobre sin documentos. Un CAF cuyo IDK no tiene llave conocida deja el documento unchecked. Un CAF con una FRMA vacía se encuentra y falla su firma del SII, y el timbre se chequea con la llave del CAF como cualquier otro. No se chequea: de quién es el certificado que firma, ni si el CAF estaba vencido.
Tipo
Descripción
VerifyReceivedDocumentsOptions
Opciones de verifyReceivedDocuments.
ReceivedDocumentsVerification
Resultado de verifyReceivedDocuments.
ReceivedDocument
Un documento recibido con sus chequeos. Los campos del encabezado son null si faltan, y los números si no son enteros.
ReceivedSignatureCheck
Una firma XMLDSig, chequeada: una SignatureVerification más found. valid prueba que el elemento firmado está íntegro respecto del certificado de KeyInfo; que ese certificado sea del emisor no se chequea.
ReceivedTedCheck
TED — El timbre electrónico, chequeado.
ReceivedCafCheck
TED/DD/CAF — El CAF que trae el timbre, chequeado contra el documento y contra la firma del SII.
TedMismatch
Un campo del DD del TED comparado con el encabezado del documento: issuerRut (RE/RUTEmisor), documentType (TD/TipoDTE), folio (F/Folio), issueDate (FE/FchEmis), receiverRut (RR/RUTRecep), totalAmount (MNT/MntTotal). Definido como 'issuerRut' | 'documentType' | 'folio' | 'issueDate' | 'receiverRut' | 'totalAmount'.
CafMismatch
Lo que el CAF debe cumplir: issuerRut (RE frente a RUTEmisor), documentType (TD frente a TipoDTE), folio (Folio dentro de RNG) y environment (el ambiente de la llave del SII que nombra su IDK frente a la opción environment). Definido como 'issuerRut' | 'documentType' | 'folio' | 'environment'.
Campos de VerifyReceivedDocumentsOptions
Campo
Tipo
Descripción
environment?
Environment
El ambiente cuyos CAF se aceptan, production por defecto: un CAF firmado con la llave del SII del otro ambiente (100 en certificación, 300 en producción) es invalid, con la diferencia environment.
siiKeys?
SiiCafKeys
Las llaves del SII que verifican la FRMA de cada CAF, por IDK, en lugar de SII_CAF_KEYS (para agregar una, expándela).
Campos de ReceivedDocumentsVerification
Campo
Tipo
Descripción
root
'DTE' | 'EnvioDTE' | 'EnvioBOLETA'
Raíz de la entrada: un documento o un sobre.
envelope
ReceivedSignatureCheck | null
La firma del propio sobre sobre SetDTE; null para un DTE solo.
documents
readonly ReceivedDocument[]
Cada documento, en el orden de la entrada.
status
VerificationStatus
El peor estado entre el sobre y los documentos.
Campos de ReceivedDocument
Campo
Tipo
Descripción
xml
string
El <DTE> escrito desde su elemento: los elementos, atributos, declaraciones de namespace propias, texto, comentarios e instrucciones de la entrada, que se leen y verifican igual, pero no la entrada byte a byte (una sección CDATA pasa a texto escapado, una referencia de carácter al carácter, un elemento vacío a <X/>); no se agregan los namespaces que hereda del sobre. Para archivar un documento recibido, guarda los bytes de la propia entrada.
id
string | null
Documento/@ID (o Liquidacion/@ID) — ID del elemento firmado.
type
number | null
TipoDTE — Tipo de documento, cualquier código del SII.
folio
number | null
Folio.
issueDate
string | null
FchEmis — Fecha de emisión tal como viene.
issuerRut
string | null
RUTEmisor — RUT del emisor tal como viene.
receiverRut
string | null
RUTRecep — RUT del receptor tal como viene.
totalAmount
number | null
MntTotal — Monto total.
signature
ReceivedSignatureCheck
La firma XMLDSig del documento sobre su elemento firmado.
ted
ReceivedTedCheck
TED — El timbre electrónico.
caf
ReceivedCafCheck
TED/DD/CAF — El CAF que trae el timbre.
status
VerificationStatus
invalid si falla un chequeo; unchecked si ninguno falla pero la FRMA del CAF no se pudo chequear; valid en otro caso.
Campos de ReceivedSignatureCheck
Campo
Tipo
Descripción
found
boolean
Hay una Signature con SignedInfo bajo el raíz; si es false, los demás campos son false o null.
referenceId
string | null
Como en SignatureVerification.
digestValid
boolean
Como en SignatureVerification.
signatureValid
boolean
Como en SignatureVerification.
valid
boolean
Pasaron ambos chequeos.
Campos de ReceivedTedCheck
Campo
Tipo
Descripción
found
boolean
Hay un solo TED en el documento, por nombre local, está en el elemento firmado, es simple (sin prefijos, sin declaraciones de namespace, sin comentarios, CDATA ni instrucciones) y tiene exactamente un DD y luego una FRMT, sin otro DD ni FRMT dentro.
signatureValid
boolean
FRMT verifica con la RSAPK del CAF que trae el TED, sobre el DD escrito desde su elemento en bytes ISO-8859-1: aplanado, con sus textos escapados a la manera del SII o con solo &, < y > escapados.
mismatches
readonly TedMismatch[]
Los campos del DD que difieren del encabezado, o que falta en uno de los dos. RSR e IT1 son texto libre que cada emisor pliega y corta a su manera, y no se comparan.
valid
boolean
Encontrado, su firma verifica y nada difiere.
Campos de ReceivedCafCheck
Campo
Tipo
Descripción
found
boolean
Se encontró el timbre y su DD tiene un solo CAF, DA y FRMA por nombre local, el CAF hijo directo del DD con los otros dos como hijos directos suyos, y el DA tiene RE, TD, RNG, RSAPK e IDK; si es false, los demás campos son null o vacíos y el estado es invalid.
keyId
number | null
DA/IDK — Id de la llave del SII que lo firmó; 100 marca certificación y 300 producción.
environment
Environment | null
El ambiente de esa llave del SII: certification para 100, production para 300, null para otra.
issuerRut
string | null
DA/RE — El emisor que autoriza el CAF, tal como viene.
documentType
number | null
DA/TD — El tipo que autoriza el CAF.
range
{ readonly from: number; readonly to: number } | null
DA/RNG — Los folios que autoriza el CAF, inclusivo.
authorizationDate
string | null
DA/FA — Fecha de autorización tal como viene, AAAA-MM-DD en los CAF del SII.
mismatches
readonly CafMismatch[]
Lo que el CAF no cubre del documento: otro emisor, otro tipo, un folio fuera de su rango, o un CAF del otro ambiente que la opción environment.
siiSignature
VerificationStatus
La firma del SII sobre DA (FRMA): unchecked si no se conoce la llave del SII para keyId.
status
VerificationStatus
invalid si no se encontró, hay una diferencia o la FRMA falla; unchecked si solo la FRMA no se pudo chequear.
Los libros del SII: el libro de compras y ventas (IECV, LibroCompraVenta), el libro de guías (LibroGuia) y el reporte de consumo de folios (RCOF, ConsumoFolios). Cada uno tiene funciones create*, build*Xml, sign* y verify*Signature. Ver Libros.
// `TipoOperacion` — Lado del libro de compras y ventas, con su valor en el SII.const BOOK_OPERATIONS: { readonly sale: "VENTA"; readonly purchase: "COMPRA" }// `TipoLibro` — Tipo de libro de compras y ventas, con su valor en el SII.const BOOK_KINDS: { readonly monthly: "MENSUAL" readonly special: "ESPECIAL" readonly rectification: "RECTIFICA"}// `TipoEnvio` — Cómo llega un libro al SII: de una vez, por segmentos, el cierre de los segmentos// o un ajuste posterior.const BOOK_SUBMISSIONS: { readonly total: "TOTAL" readonly partial: "PARCIAL" readonly final: "FINAL" readonly adjustment: "AJUSTE"}// `TpoDoc` — Tipos de documento que admite el esquema del libro (`DoctoType` de// `LibroCV_v10.xsd`), electrónicos o no.const BOOK_DOCUMENT_TYPES: readonly [ 29, 30, 32, 33, 34, 35, 38, 39, 40, 41, 43, 45, 46, 48, 53, 55, 56, 60, 61, 101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112, 175, 180, 185, 500, 501, 900, 901, 902, 903, 904, 905, 906, 907, 909, 910, 911, 914, 918, 919, 920, 921, 922, 924]// Guarda de tipo para `BookDocumentType`.function isBookDocumentType(value: unknown): value is BookDocumentType// Tipos que el formato excluye del detalle: se informan en `summaryOnlyTotals` (boletas, ajustes// de tipo de cambio, pasajes sin factura, otros registros no documentados).const SUMMARY_ONLY_DOCUMENT_TYPES: readonly [35, 38, 39, 41, 48, 105, 500, 501, 919, 920, 922, 924]// `CodIVANoRec` — Por qué no se puede recuperar el IVA de una compra.const NON_RECOVERABLE_VAT_CODES: { readonly nonTaxableOperations: 1 readonly lateRegistration: 2 readonly rejectedExpenses: 3 readonly freeDeliveries: 4 readonly other: 9}// `TpoOper` — Operación de una línea del libro de guías. En el esquema `TpoOper` llega hasta 7,// así que los valores 8 y 9 de `IndTraslado` no se pueden informar en una línea.const GUIDE_TRANSFER_TYPES: { readonly sale: 1 readonly pendingSale: 2 readonly consignment: 3 readonly demonstration: 4 readonly internalTransfer: 5 readonly otherTransfer: 6 readonly returnGuide: 7}// `Anulado` — Por qué se marca una línea de guía: anulada antes de llegar al SII, anulada después// o productos recibidos en parte.const GUIDE_VOID_CODES: { readonly folio: 1; readonly guide: 2; readonly partialReceipt: 3 }
Tipo
Descripción
BookOperation
Unión de los lados del libro. Definido como keyof typeof BOOK_OPERATIONS.
BookKind
Unión de los tipos de libro. Definido como keyof typeof BOOK_KINDS.
BookSubmission
Unión de los tipos de envío. Definido como keyof typeof BOOK_SUBMISSIONS.
BookAdjustment
Operacion — Qué hace un ajuste con una línea: add es 1 (agrega), remove es 2 (elimina). Definido como 'add' | 'remove'.
BookDocumentType
Unión de los tipos de documento del libro. Definido como (typeof BOOK_DOCUMENT_TYPES)[number].
NonRecoverableVatCode
Unión de los códigos de IVA no recuperable.
GuideTransferType
Unión de las operaciones de una guía.
GuideVoidCode
Unión de los motivos de anulación de una guía. Definido como keyof typeof GUIDE_VOID_CODES.
Caratula — Campos comunes de la carátula del libro de compras y ventas y del libro de guías, tal como los entrega el llamador.
BookCover
Caratula — Campos comunes normalizados de la carátula del libro de compras y ventas y del libro de guías.
PurchaseSalesCoverInput
Caratula — Carátula de un libro de compras y ventas, tal como la entrega el llamador.
PurchaseSalesCover
Caratula — Carátula normalizada de un libro de compras y ventas.
BookNonRecoverableVat
IVANoRec — IVA no recuperable de una línea.
BookOtherTax
OtrosImp — Impuesto adicional, retención o recargo de una línea.
BookForeignReceiver
Extranjero — Receptor extranjero de un documento de exportación.
BookSettlementInput
Liquidaciones — Comisiones y otros cargos de una liquidación (40, 43, 103), tal como los entrega el llamador.
BookTaxKind
TpoImp — Tipo de impuesto de una línea: vat (IVA) es 1, freeZone (Ley 18.211) es 2. Definido como 'vat' | 'freeZone'.
BookEntryInput
Detalle — Una línea del libro de compras y ventas, tal como la entrega el llamador.
BookEntry
Detalle — Línea normalizada del libro de compras y ventas. Una línea anulada solo tiene type, folio, voided y adjustment.
BookTotalMismatch
Un total explícito de línea que difiere de la fórmula del SII. Se informa, no se lanza, salvo con strictTotals.
BookNonRecoverableVatTotal
TotIVANoRec — IVA no recuperable de un tipo de documento en un resumen.
BookOtherTaxTotal
TotOtrosImp — Impuesto adicional de un tipo de documento en un resumen.
BookSettlementTotals
TotLiquidaciones — Comisiones de liquidaciones de un tipo de documento en un resumen.
BookTotals
TotalesSegmento / TotalesPeriodo — Totales de un tipo de documento en un resumen. Es un valor JSON simple: se puede guardar book.periodTotals y devolverlo como previousTotals.
BookTotalsInput
Totales de un tipo de documento tal como los entrega el llamador: lo que falte cuenta como 0.
PurchaseSalesBookInput
Entrada de createPurchaseSalesBook.
PurchaseSalesBook
Un libro de compras y ventas normalizado, listo para renderizar y firmar.
GuideBookCoverInput
Caratula — Carátula de un libro de guías, tal como la entrega el llamador. El esquema solo admite TipoLibroESPECIAL y exige el folio de notificación.
GuideBookCover
Caratula — Carátula normalizada de un libro de guías.
GuideEntryInput
Detalle — Una línea del libro de guías, tal como la entrega el llamador.
GuideEntry
Detalle — Línea normalizada del libro de guías.
GuideTransferTotal
TotTraslado — Guías no venta de una operación en un resumen.
GuideTotals
ResumenSegmento / ResumenPeriodo — Resumen de un libro de guías. Es un valor JSON simple: se puede guardar book.periodTotals y devolverlo como previousTotals.
GuideBookInput
Entrada de createGuideBook.
GuideBook
Un libro de guías normalizado, listo para renderizar y firmar.
FolioConsumptionCoverInput
Caratula — Carátula de un reporte de consumo de folios, tal como la entrega el llamador.
FolioConsumptionCover
Caratula — Carátula normalizada de un reporte de consumo de folios.
FolioConsumptionType
TipoDocumento — Tipos de documento del reporte: 39 y 41, según el formato de 2020. Definido como 39 | 41.
FolioConsumptionEntry
Una boleta emitida.
VoidedFolio
Un folio anulado en el sistema antes de llegar al SII, no uno anulado con una nota de crédito.
FolioRange
RangoUtilizados / RangoAnulados — Un rango de folios consecutivos; un folio solo tiene from igual a to.
FolioConsumptionSummary
Resumen — Resumen de un tipo de documento en el reporte.
FolioConsumptionInput
Entrada de createFolioConsumption.
FolioConsumption
Un reporte de consumo de folios normalizado, listo para renderizar y firmar. Hoy se usa en la certificación de boletas; probablemente el SII ya no lo exige en producción.
// El `EnvioLibro` de un libro de compras y ventas con las etiquetas oficiales, en el orden del// esquema.function toSiiPurchaseSalesBook(book: PurchaseSalesBook): SiiEnvioLibro// El `EnvioLibro` de un libro de guías con las etiquetas oficiales, en el orden del esquema.function toSiiGuideBook(book: GuideBook): SiiEnvioLibroGuia// El `DocumentoConsumoFolios` de un reporte con las etiquetas oficiales, en el orden del esquema.function toSiiFolioConsumption(report: FolioConsumption): SiiDocumentoConsumoFolios// Suma resúmenes por tipo de documento y, dentro de cada tipo, suma IVA no recuperable y otros// impuestos por código. Las filas conservan el orden en que aparecen por primera vez, y una fila// presente en un solo lado se conserva.function accumulateBookTotals( base: readonly BookTotals[], delta: readonly BookTotals[],): readonly BookTotals[]
// Arma un libro de compras y ventas (IECV): valida la carátula y las zonas de su envío, normaliza// las líneas y calcula los resúmenes.function createPurchaseSalesBook(input: PurchaseSalesBookInput): PurchaseSalesBook// Renderiza el XML `LibroCompraVenta` sin firma.function buildPurchaseSalesBookXml(book: PurchaseSalesBook): string// Firma el `EnvioLibro` con el certificado de quien envía (XMLDSig envuelta, `URI="#ID"`).function signPurchaseSalesBook( book: PurchaseSalesBook, certificate: Certificate,): SignedPurchaseSalesBook// Verifica la firma de un XML `LibroCompraVenta`.function verifyPurchaseSalesBookSignature(xml: string): SignatureVerification
Tipo
Descripción
SignedPurchaseSalesBook
Un libro de compras y ventas con su XML firmado, listo para uploadBook.
// Arma un libro de guías: valida la carátula y las zonas de su envío, normaliza las líneas y// calcula los resúmenes. `TasaImp` e `IVA` se emiten siempre, en 0 si faltan.function createGuideBook(input: GuideBookInput): GuideBook// Renderiza el XML `LibroGuia` sin firma.function buildGuideBookXml(book: GuideBook): string// Firma el `EnvioLibro` con el certificado de quien envía (XMLDSig envuelta, `URI="#ID"`).function signGuideBook(book: GuideBook, certificate: Certificate): SignedGuideBook// Verifica la firma de un XML `LibroGuia`.function verifyGuideBookSignature(xml: string): SignatureVerification// Suma dos resúmenes de libro de guías, los traslados por operación. Sirve para arrastrar los// totales del período de envíos anteriores.function accumulateGuideTotals(base: GuideTotals, delta: GuideTotals): GuideTotals
Tipo
Descripción
SignedGuideBook
Un libro de guías con su XML firmado, listo para uploadBook.
// Arma un reporte de consumo de folios (RCOF, hoy Resumen de Ventas Diarias): un resumen por cada// tipo de boleta presente, primero el 39, o uno de tipo 39 en ceros para un día sin ventas.function createFolioConsumption(input: FolioConsumptionInput): FolioConsumption// Renderiza el XML `ConsumoFolios` sin firma.function buildFolioConsumptionXml(report: FolioConsumption): string// Firma el `DocumentoConsumoFolios` con el certificado de quien envía (XMLDSig envuelta,// `URI="#ID"`).function signFolioConsumption( report: FolioConsumption, certificate: Certificate,): SignedFolioConsumption// Verifica la firma de un XML `ConsumoFolios`.function verifyFolioConsumptionSignature(xml: string): SignatureVerification// Ordena folios y agrupa los consecutivos en rangos; un folio solo tiene `from` igual a `to`.function compactFolioRanges(folios: readonly number[]): readonly FolioRange[]
Tipo
Descripción
SignedFolioConsumption
Un reporte de consumo de folios con su XML firmado, listo para uploadFolioConsumption.
// Deriva una línea del libro desde un documento. La contraparte es el receptor si el dueño del// libro emitió el documento y el emisor en caso contrario, lo que cubre ventas, compras recibidas// y facturas de compra (46) en cualquier lado.function bookEntryFromDocument( document: Document, options: BookEntryFromDocumentOptions,): BookEntryInput// Deriva una línea del libro de guías desde una guía de despacho (52). El traslado es venta por// defecto, y el receptor y los montos viajan solo en ventas; una guía no venta informa únicamente// su total.function guideEntryFromDocument(document: Document): GuideEntryInput// Deriva una línea del reporte de consumo de folios desde una boleta (39 o 41).function folioConsumptionEntryFromDocument(document: Document): FolioConsumptionEntry
Tipo
Descripción
BookEntryFromDocumentOptions
Opciones de bookEntryFromDocument.
Campos de BookEntryFromDocumentOptions
Campo
Tipo
Descripción
bookRut
string
RUT del dueño del libro: decide quién es la contraparte.
operation
BookOperation
Lado del libro.
creditNoteSign?
'positive' | 'negative'
negative niega exento, neto, IVA y total de una nota de crédito (61). positive por defecto, como dice el formato.
createSiiClient devuelve un dato congelado; cada operación es una función libre que lo recibe como primer argumento. El último argumento de cada operación es un CallOverrides opcional (signal, timeoutMs, retry). El transporte, la caché de tokens, el logger, la captura y el archivo son puertos que puedes reemplazar. Ver Servicios web del SII.
// Hosts base de los web services DTE por ambiente: maullin (certificación) y palena (producción).const SII_HOSTS: Readonly<Record<Environment, string>> = { certification: 'maullin.sii.cl', production: 'palena.sii.cl',}// Endpoints SOAP / CGI por ambiente (semilla, token, DTEUpload, estados).const SOAP_ENDPOINTS: Readonly<Record<Environment, SoapEndpoints>>// Endpoints REST de boletas por ambiente (apicert/pangal en certificación, api/rahue en// producción).const REST_ENDPOINTS: Readonly<Record<Environment, RestEndpoints>>// URLs del servicio de Registro de Aceptación/Reclamo (WSRECLAMO v1.2); las llamadas SOAP se// envían por POST aquí.const CLAIM_WS_ENDPOINTS: Readonly<Record<Environment, string>>// WSDL del web service de Registro de Aceptación/Reclamo.const CLAIM_WSDL_ENDPOINTS: Readonly<Record<Environment, string>>// User-Agent que espera el CGI de subida del SII (rechaza cadenas de navegador modernas).const UPLOAD_USER_AGENT = 'Mozilla/4.0 ( compatible; PROG 1.0; Windows NT)'
Tipo
Descripción
SoapEndpoints
Endpoints SOAP / CGI de un ambiente.
RestEndpoints
Endpoints REST de la API de boletas de un ambiente.
// Clave de caché `${ambiente}:${canal}:${huella}`: dos empresas, dos ambientes o dos canales nunca// comparten token.function tokenCacheKey( environment: Environment, channel: TokenChannel, certificate: Pick<Certificate, "certificateBase64">,): string// Caché de tokens en memoria (por proceso).function createMemoryTokenCache(): TokenCache
Tipo
Descripción
TokenChannel
Canal de autenticación: soap (semilla/token DTEWS: DTEUpload, QueryEst*, WSRECLAMO) o rest (API de boletas). Definido como 'soap' | 'rest'.
CachedToken
Un token en caché con su instante de expiración (milisegundos epoch).
TokenCache
Puerto de caché de tokens. createDirectoryTokenCache de dte-sdk/node guarda los tokens en disco; impleméntalo sobre Redis para compartirlos entre máquinas.
// Valores por defecto medidos contra el SII: 6 intentos, 2 s creciendo ×1,8, tope 15 s, jitter ±20// %.const DEFAULT_RETRY_POLICY: RetryPolicy = { maxAttempts: 6, initialDelayMs: 2000, maxDelayMs: 15000, backoffMultiplier: 1.8, jitterRatio: 0.2,}// True para errores que conviene reintentar: fallas de transporte, timeouts, páginas ilegibles del// SII, errores de consulta de `QueryEst*`, HTTP 429/405/5xx y el estado de subida "sistema// bloqueado".function isRetryableError(error: unknown): boolean
Tipo
Descripción
RetryPolicy
Política de reintentos: backoff exponencial con jitter.
RetryOptions
Ganchos de withRetry: el sleep inyectable, el signal del llamador, el random del jitter, un retryOn por llamada y un observador onRetry.
Campos de RetryPolicy
Campo
Tipo
Descripción
maxAttempts
number
Intentos totales incluido el primero (1 = sin reintento).
initialDelayMs
number
Espera antes del segundo intento, ms.
maxDelayMs
number
Tope de cualquier espera, ms.
backoffMultiplier
number
Factor de crecimiento entre intentos.
jitterRatio
number
Jitter como fracción de la espera (0,2 → ±20 %).
retryOn?
(error: DteError) => boolean
Qué errores reintentar; por defecto isRetryableError.
// Transporte por defecto sobre `globalThis.fetch` (Node ≥ 20, Deno, Bun) o un `fetch` inyectado.// No sigue redirecciones: el SII nunca redirige una llamada bien formada y seguirla ocultaría una// página de error.function createFetchTransport(options?: { readonly fetch?: FetchLike; }): HttpTransport
Tipo
Descripción
HttpMethod
Métodos HTTP que usan los servicios del SII. Definido como 'GET' | 'POST'.
HttpRequest
Una petición HTTP tal como el cliente la entrega al transporte: bytes, nunca texto.
HttpResponse
Una respuesta HTTP: estado, cabeceras en minúsculas y bytes del cuerpo. Cualquier estado es una respuesta; solo las fallas de red, TLS, timeout y cancelación se lanzan.
HttpTransport
Puerto de transporte: fetch por defecto (createFetchTransport), https de Node como adaptador (createNodeHttpsTransport), o lo que inyecte el consumidor (los tests usan un falso por rutas). Definido como (request: HttpRequest) => Promise<HttpResponse>.
BodyEncoding
Charset de un cuerpo: latin1 para SOAP DTEWS y el CGI DTEUpload, utf8 para la API REST y WSRECLAMO. Definido como 'latin1' | 'utf8'.
FetchLike
La porción de fetch que usa el transporte, para que consumidores y tests inyecten la suya.
Campos de HttpRequest
Campo
Tipo
Descripción
method
HttpMethod
Método HTTP.
url
string
URL absoluta.
headers
Readonly<Record<string, string>>
Cabeceras tal como las espera el SII.
body?
Uint8Array
Bytes del cuerpo (solo POST).
timeoutMs
number
Timeout de la petición, ms.
signal?
AbortSignal
Cancelación del llamador.
Campos de HttpResponse
Campo
Tipo
Descripción
status
number
Estado HTTP; 4xx y 5xx se devuelven, no se lanzan.
headers
Readonly<Record<string, string>>
Nombres en minúsculas; cabeceras repetidas unidas con , .
// Tachado puro de un intercambio completo (URL, cabeceras, cuerpos y el motivo del error); el// cliente lo aplica antes de llamar al puerto y los adaptadores pueden reutilizarlo.function redactExchange(exchange: HttpExchange): HttpExchange// Captura en memoria: `exchanges()` devuelve una copia de lo capturado hasta ahora.function createMemoryCapture(): { readonly capture: HttpCapture; readonly exchanges: () => readonly HttpExchange[]; }
Tipo
Descripción
HttpChannel
Canal de un intercambio capturado: los dos canales con token de los web services, o el portal con certificado. Definido como TokenChannel | 'portal'.
HttpExchange
Un intento HTTP tal como se entrega al puerto capture, ya con los secretos tachados.
HttpExchangeRequest
La mitad "petición" de un intercambio capturado, con los cuerpos ya decodificados a texto.
HttpExchangeResponse
La mitad "respuesta" de un intercambio capturado.
HttpExchangeError
Por qué un intercambio no produjo respuesta.
HttpCapture
Puerto de captura: recibe cada intento. Sus fallas se registran y nunca hacen fallar la operación. Definido como (exchange: HttpExchange) => Promise<void>.
Campos de HttpExchange
Campo
Tipo
Descripción
operation
string
Nombre de la operación.
channel
HttpChannel
Canal de la llamada.
attempt
number
Número de intento dentro del ciclo de reintentos (desde 1).
// Archivo en memoria: `records()` devuelve una copia de lo archivado hasta ahora.function createMemoryUploadArchive(): { readonly archive: UploadArchive; readonly records: () => readonly UploadRecord[]; }
Tipo
Descripción
UploadKind
Qué se subió: EnvioDTE (dte), EnvioBOLETA (receipt), un libro (book) o el Reporte de Consumo de Folios (folioConsumption). Definido como 'dte' | 'receipt' | 'book' | 'folioConsumption'.
UploadRecord
Un envío que obtuvo respuesta del SII, tal como se entrega al puerto archive.
UploadArchive
Puerto de archivo de envíos. Definido como (record: UploadRecord) => Promise<void>.
Campos de UploadRecord
Campo
Tipo
Descripción
environment
Environment
Ambiente al que se subió el envío.
kind
UploadKind
Qué se subió: dte, receipt, book o folioConsumption.
// Valida y completa las opciones en un `SiiClient` congelado. Los RUT pasan por rut.ts; los// números deben ser positivos; el transporte por defecto es `fetch`, la caché por defecto en// memoria, el logger por defecto silencioso.function createSiiClient(options: SiiClientOptions): SiiClient
Tipo
Descripción
SiiClient
Un cliente SII configurado: dato congelado, sin métodos ni estado oculto. Se pasa como primer argumento de cada operación (uploadEnvelope(sii, …)).
SiiClientOptions
Opciones de createSiiClient.
SiiTimeouts
Timeouts por canal, en ms.
SiiEndpoints
Endpoints resueltos de un cliente.
CallOverrides
Sobreescrituras por llamada que acepta toda operación.
SleepFn
Espera inyectable entre reintentos y sondeos de estado. Definido como (ms: number, signal?: AbortSignal) => Promise<void>.
Campos de SiiClientOptions
Campo
Tipo
Descripción
environment
Environment
Ambiente: certification (maullin) o production (palena).
certificate
Certificate
Certificado que firma la semilla; su titular es el RutEnvia por defecto.
companyRut?
string
rutCompany / RutCompania — RUT de la empresa, salvo que la llamada indique otro.
senderRut?
string
rutSender — RUT de quien envía; por defecto el titular del certificado.
transport?
HttpTransport
Transporte HTTP; fetch por defecto.
tokenCache?
TokenCache
Caché de tokens; en memoria por defecto. createDirectoryTokenCache de dte-sdk/node los guarda en disco.
tokenTtlMs?
number
Vigencia del token en caché; 55 min por defecto.
retry?
Partial<RetryPolicy> | false
Ajustes de la política de reintentos, o false para desactivarlos.
timeouts?
Partial<SiiTimeouts>
Timeouts por canal.
receiptsChannel?
TokenChannel
Canal para EnvioBOLETA; rest en producción, soap (DTEUpload) en certificación.
// Arma un sobre SOAP 1.1 (texto UTF-8) con una operación rpc y sus parámetros como hijos sin// calificar.function buildSoapEnvelope(input: SoapEnvelopeInput): string// Interpreta una respuesta SOAP sin parseo XML completo: las respuestas del SII son planas y a// veces traen entidades sueltas.function parseSoapResponse(xml: string): SoapResponse// Bytes `multipart/form-data`: los campos en orden y luego la parte archivo, como los espera el// CGI de subida del SII.function buildMultipartBody(input: MultipartBodyInput): Uint8Array
Tipo
Descripción
SoapParam
Un parámetro rpc, en el orden que declara el WSDL (Axis los asocia por posición).
SoapEnvelopeInput
Entrada de buildSoapEnvelope.
SoapFault
Un fault SOAP 1.1.
SoapResponse
Lo que trajo una respuesta SOAP: un fault, el XML des-escapado dentro de <…Return> (DTEWS) o el XML interior de <return> (WSRECLAMO), sin prefijos.
MultipartField
Un campo multipart simple (rutSender, dvSender, rutCompany, dvCompany).
MultipartFile
La parte archivo (archivo): bytes ya codificados en el charset que declara el XML.
MultipartBodyInput
Entrada de buildMultipartBody.
Campos de SoapEnvelopeInput
Campo
Tipo
Descripción
method
string
Nombre de la operación.
params?
readonly SoapParam[]
Parámetros; el texto se escapa solo con &, < y >: las comillas y los apóstrofos viajan tal cual.
namespace?
string
Namespace de la operación (WSRECLAMO, prefijo ws); se omite en DTEWS, que acepta operaciones sin calificar.
Campos de MultipartFile
Campo
Tipo
Descripción
name
string
Nombre de la parte: archivo.
fileName
string
Nombre del archivo enviado, p. ej. EnvioDTE.xml.
contentType
string
Tipo de contenido de la parte: text/xml.
bytes
Uint8Array
Bytes del archivo, copiados sin cambios.
Campos de MultipartBodyInput
Campo
Tipo
Descripción
boundary
string
Separador; no debe aparecer en ningún campo ni en el archivo.
// Pide una semilla al SII por el canal indicado (SOAP `CrSeed` o REST// `boleta.electronica.semilla`). La semilla es un string de 12 dígitos vigente dos minutos; nunca// se cachea.function getSeed(sii: SiiClient, channel: TokenChannel, overrides?: CallOverrides): Promise<string>// Firma una semilla para `GetTokenFromSeed` / el endpoint REST de token: declaración XML, un salto// de línea y luego `<getToken><item><Semilla>…</Semilla></item><Signature…/></getToken>` sin salto// final (el endpoint REST es estricto con esta disposición).function signSeed( seed: string, certificate: Pick<Certificate, "privateKeyPem" | "publicKey" | "certificateBase64">,): string// Devuelve un token vigente para el canal: el de la caché mientras no venza, si no semilla →// semilla firmada → token, guardado en caché por `tokenTtlMs`. El token DTEWS y el token REST son// cosas distintas.function getToken(sii: SiiClient, channel: TokenChannel, overrides?: CallOverrides): Promise<string>// Olvida el token en caché de un canal (la próxima operación vuelve a autenticarse).function invalidateToken(sii: SiiClient, channel: TokenChannel): Promise<void>
// Sube un sobre firmado: `EnvioDTE` por `DTEUpload` (multipart ISO-8859-1), `EnvioBOLETA` por la// API REST de boletas en producción o `DTEUpload` en certificación (`channel` lo fuerza).function uploadEnvelope( sii: SiiClient, input: UploadEnvelopeInput, overrides?: CallOverrides,): Promise<UploadReceipt>// Sube un libro firmado por `DTEUpload`, como `LibroGuia.xml` si es un `LibroGuia` y como// `LibroCV.xml` en otro caso, salvo que `fileName` diga otra cosa; el XML debe declarar// ISO-8859-1, igual que en `uploadEnvelope` (si no, `INVALID_OPTION { field: 'xml' }`).function uploadBook( sii: SiiClient, input: UploadXmlInput, overrides?: CallOverrides,): Promise<UploadReceipt>// Sube un Reporte de Consumo de Folios firmado (`ConsumoFolios`) por `DTEUpload` como// `ConsumoFolios.xml`, salvo que `fileName` diga otra cosa; el XML debe declarar ISO-8859-1, igual// que en `uploadEnvelope` (si no, `INVALID_OPTION { field: 'xml' }`).function uploadFolioConsumption( sii: SiiClient, input: UploadXmlInput, overrides?: CallOverrides,): Promise<UploadReceipt>
Tipo
Descripción
UploadReceipt
Lo que devuelve el SII cuando recibe un archivo.
UploadableEnvelope
Un sobre firmado, o solo su tipo y XML (para XML generado en otra parte, que debe abrir con una declaración XML que nombre ISO-8859-1, como los sobres del propio SDK). Definido como SignedEnvelope | { readonly kind: EnvelopeKind; readonly xml: string }.
UploadEnvelopeInput
Entrada de uploadEnvelope.
UploadXmlInput
Entrada de uploadBook y uploadFolioConsumption: el XML firmado.
ReceptionOutcome
RECEPCIONDTE interpretado: received y duplicate siempre traen un TrackID de solo dígitos; los demás resultados no traen ninguno.
Campos de UploadReceipt
Campo
Tipo
Descripción
trackId
string
TRACKID / trackid — Identificador del envío en el SII (solo dígitos).
receivedAt
string
TIMESTAMP / fecha_recepcion — Marca de recepción del SII (reloj del cliente si el SII la omite).
kind
UploadKind
Qué se subió.
channel
TokenChannel
Canal usado.
fileName
string
FILE — Nombre del archivo enviado.
duplicate
boolean
true si el SII lo reportó como duplicado y devolvió el TrackID original.
raw
string
Respuesta cruda del SII, tal como llegó (el puerto de archivo recibe una copia con los secretos tachados).
Campos de UploadEnvelopeInput
Campo
Tipo
Descripción
envelope
UploadableEnvelope
EnvioDTE / EnvioBOLETA — El sobre a subir.
companyRut?
string
rutCompany — RUT de la empresa; por defecto el del cliente.
senderRut?
string
rutSender — RUT de quien envía; por defecto el del cliente.
channel?
TokenChannel
Forzar el canal de boletas (rest o soap); EnvioDTE siempre usa soap.
Campos de UploadXmlInput
Campo
Tipo
Descripción
xml
string
LibroCompraVenta / LibroGuia / ConsumoFolios — El documento XML firmado; debe abrir con una declaración XML que nombre ISO-8859-1 (se descarta el espacio inicial).
companyRut?
string
rutCompany — RUT de la empresa; por defecto el del cliente.
senderRut?
string
rutSender — RUT de quien envía; por defecto el del cliente.
fileName?
string
Nombre del archivo del multipart; letras, dígitos, _, . y -, terminado en .xml. Por defecto LibroGuia.xml en un libro de guías, LibroCV.xml en otro libro y ConsumoFolios.xml en un reporte.
// Estado de un envío por TrackID: `QueryEstUp` por el canal `soap` (por defecto) o el estado de// envío REST de boletas por `rest`.function queryUploadStatus( sii: SiiClient, input: QueryUploadStatusInput, overrides?: CallOverrides,): Promise<UploadStatus>// Sondea `queryUploadStatus` cada `intervalMs` hasta que el estado deje de ser `pending`, hasta// `timeoutMs`.function waitForUploadStatus( sii: SiiClient, input: WaitForUploadStatusInput, overrides?: CallOverrides,): Promise<UploadStatus>// Estado de un documento: `QueryEstDte` (SOAP, por defecto en todos los tipos salvo boletas) o el// endpoint REST por documento de boletas (por defecto en 39 y 41; la API REST responde unos diez// minutos después del envío).function queryDocumentStatus( sii: SiiClient, input: QueryDocumentStatusInput, overrides?: CallOverrides,): Promise<DocumentStatus>// Si el SII ya tiene un documento con este tipo y folio: `QueryEstDte` (siempre SOAP), consultando// como la propia empresa (`RutConsultante`), con el receptor consumidor final, la fecha de hoy en// Chile y monto 1, responde primero por existencia del folio.function folioReceived( sii: SiiClient, input: FolioReceivedInput, overrides?: CallOverrides,): Promise<boolean | null>
Tipo
Descripción
UploadStatus
Estado de un envío.
UploadStatusCounts
Cantidades de documentos de un envío.
UploadStatusDocument
Resultado por documento en el estado de envío REST (detalle_rep_rech).
UploadStatusDocumentError
Un error de un documento en el estado de envío REST (detalle_rep_rech/error).
QueryUploadStatusInput
Entrada de queryUploadStatus.
WaitForUploadStatusInput
Entrada de waitForUploadStatus.
DocumentStatus
Estado de un documento.
QueryDocumentStatusInput
Entrada de queryDocumentStatus.
FolioReceivedInput
Entrada de folioReceived.
Campos de UploadStatus
Campo
Tipo
Descripción
code
string
ESTADO / estado — Código de estado del envío.
status
UploadStatusClass
Clase de resultado del código en este canal.
message
string
GLOSA — Glosa del SII, si no la del catálogo.
trackId
string
TRACKID / trackid — Identificador del envío consultado.
channel
TokenChannel
Canal por el que respondió el SII.
counts
UploadStatusCounts | null
INFORMADOS … REPAROS — Cantidades cuando el SII las informa.
documentType
string | null
TIPO_DOCTO — Tipo de documento al que se refieren las cantidades (SOAP).
documents
readonly UploadStatusDocument[]
detalle_rep_rech — Detalle por documento (solo REST).
raw
string
Respuesta cruda del SII: el SII:RESPUESTA des-escapado (SOAP) o el texto JSON (REST).
Campos de UploadStatusCounts
Campo
Tipo
Descripción
reported
number
INFORMADOS / informados — Documentos informados.
accepted
number
ACEPTADOS / aceptados — Documentos aceptados.
rejected
number
RECHAZADOS / rechazados — Documentos rechazados.
objections
number
REPAROS / reparos — Documentos aceptados con reparos.
Campos de QueryUploadStatusInput
Campo
Tipo
Descripción
trackId
string
TrackId — Identificador del envío, solo dígitos.
companyRut?
string
RutCompania — RUT de la empresa; por defecto el del cliente.
channel?
TokenChannel
soap (por defecto) o rest (boletas subidas por la API REST).
Campos de WaitForUploadStatusInput
Campo
Tipo
Descripción
trackId
string
TrackId — Identificador del envío, solo dígitos.
companyRut?
string
RutCompania — RUT de la empresa; por defecto el del cliente.
channel?
TokenChannel
soap (por defecto) o rest (boletas subidas por la API REST).
intervalMs?
number
Intervalo de sondeo, ms (5 000).
timeoutMs?
number
Tiempo máximo de espera, ms (600 000).
Campos de DocumentStatus
Campo
Tipo
Descripción
code
string
ESTADO / codigo — Código de estado del documento.
status
DocumentStatusClass
Clase de resultado del código.
message
string
GLOSA_ESTADO / descripcion — Glosa del SII, si no la del catálogo.
raw
string
Respuesta cruda del SII: el SII:RESPUESTA des-escapado (SOAP) o el texto JSON (REST).
Campos de QueryDocumentStatusInput
Campo
Tipo
Descripción
companyRut?
string
RutCompania — RUT de la empresa emisora; por defecto el del cliente.
receiverRut
string
RutReceptor / rut_receptor — RUT del receptor.
consultantRut?
string
RutConsultante — RUT que consulta (solo SOAP); por defecto el remitente del cliente.
type
DocumentType
TipoDte / tipo — Tipo de documento.
folio
number
FolioDte / folio — Folio del documento.
issueDate
string
FechaEmisionDte / fechaEmision — Fecha de emisión AAAA-MM-DD.
totalAmount
number
MontoDte / monto — Monto total, redondeado a entero.
channel?
TokenChannel
soap (por defecto en facturas) o rest (por defecto en boletas).
Campos de FolioReceivedInput
Campo
Tipo
Descripción
companyRut?
string
RutCompania — RUT de la empresa emisora; por defecto el del cliente.
// Registra una acción sobre un documento recibido (`ingresarAceptacionReclamoDoc`): acepta// contenido, reclama contenido, otorga recibo de mercaderías, reclama falta parcial o total.function registerClaim( sii: SiiClient, input: RegisterClaimInput, overrides?: CallOverrides,): Promise<ClaimResult>// Eventos registrados sobre un documento (`listarEventosHistDoc`).function listClaimEvents( sii: SiiClient, input: ClaimDocumentInput, overrides?: CallOverrides,): Promise<ClaimEventsResult>// Si un documento es cedible (`consultarDocDteCedible`): `transferable` sigue los códigos 20–25,// null si indeterminado.function queryTransferable( sii: SiiClient, input: ClaimDocumentInput, overrides?: CallOverrides,): Promise<TransferabilityResult>// Cuándo recibió el SII un documento (`consultarFechaRecepcionSii`): el string que devolvió y ese// string en ISO cuando es una fecha (`DD-MM-AAAA HH:MM:SS`).function queryReceptionDate( sii: SiiClient, input: ClaimDocumentInput, overrides?: CallOverrides,): Promise<ReceptionDateResult>// Qué hizo el receptor, derivado del último evento de `listClaimEvents` (por fecha, si no por// posición): `accepted` (ACD), `goodsReceived` (ERM), `claimed` (RCD/RFP/RFT), `paidInCash` (PAG),// `none` (sin eventos, NCA/ENC), `unknown` en otro caso.function receiverStatus( sii: SiiClient, input: ClaimDocumentInput, overrides?: CallOverrides,): Promise<ReceiverStatusResult>// La respuesta del receptor desde los eventos de `listClaimEvents` y la fecha de recepción de// `queryReceptionDate`, sin ninguna petición: primero `NCA`, luego un reclamo (RCD/RFP/RFT), luego// `ACD`; luego `PAG`, un documento que el SII marcó pagado al contado, sobre el que el registro no// toma eventos, así que no tiene plazo; pasado el plazo (el día de la recepción más ocho,// Ley 19.983) sin ninguno de ellos el documento queda aceptado por ley, y antes de eso `ERM` es// recibo de mercaderías y cualquier otra cosa pendiente. `ENC` no cambia nada. Con el resultado// completo de `listClaimEvents`, sin eventos y con un `codResp` distinto de 15, 16 o 18 (los// códigos que listan eventos o dicen que no hay), la consulta falló y la respuesta es `unknown`,// nunca pendiente ni aceptada tácitamente, como lo lee `receiverStatus`; los eventos, cuando el SII// envió alguno, mandan sea cual sea el código. Solo sus eventos todavía sirven, pero no pueden decir// que la consulta falló. `receiverStatus` sigue leyendo solo el último evento. Lanza `INVALID_DATE`// si `today` no es una fecha.function receiverAnswer( listed: | readonly Pick<ClaimEvent, "code">[] | { readonly code: number; readonly events: readonly Pick<ClaimEvent, "code">[] }, receivedAt: string | null, today: string,): ReceiverAnswerResult
Tipo
Descripción
ClaimDocumentType
tipoDoc — Tipos de documento que acepta el registro: 33, 34 y 43, derivados de CLAIM_DOCUMENT_TYPES. Definido como (typeof CLAIM_DOCUMENT_TYPES)[number], es decir 33 | 34 | 43.
ClaimDocumentInput
Un documento recibido identificado para el registro.
RegisterClaimInput
Entrada de registerClaim.
ClaimResult
Resultado de una operación del registro. El SII responde situaciones de negocio con un código, no con un error.
ClaimEvent
Un evento registrado (listaEventosDoc). Su code es ACD, RCD, ERM, RFP, RFT, NCA, ENC o PAG.
ClaimEventsResult
Resultado de listClaimEvents (listarEventosHistDoc).
TransferabilityResult
Resultado de queryTransferable (consultarDocDteCedible).
ReceptionDateResult
Resultado de queryReceptionDate (consultarFechaRecepcionSii).
ReceiverStatus
Resumen de lo que hizo el receptor con un documento: aceptado, recibo de mercaderías, reclamado, pagado al contado (PAG, el registro no toma eventos sobre él), nada, desconocido. Definido como 'accepted' | 'goodsReceived' | 'claimed' | 'paidInCash' | 'none' | 'unknown'. Un switch exhaustivo sobre él necesita el caso paidInCash, nuevo en la 0.8.0.
ReceiverStatusResult
Resultado de receiverStatus.
ReceiverAnswer
La respuesta del receptor a un documento, con la Ley 19.983. Definido como 'annulled' | 'claimed' | 'accepted' | 'paidInCash' | 'tacitlyAccepted' | 'goodsReceived' | 'pending' | 'unknown'. Un switch exhaustivo sobre él necesita el caso unknown, nuevo en la 0.7.0, y el caso paidInCash, nuevo en la 0.8.0.
ReceiverAnswerResult
Resultado de receiverAnswer.
Campos de ClaimDocumentInput
Campo
Tipo
Descripción
issuerRut
string
rutEmisor-dvEmisor — RUT del emisor del documento (el proveedor).
type
ClaimDocumentType
tipoDoc — 33, 34 o 43.
folio
number
folio.
Campos de RegisterClaimInput
Campo
Tipo
Descripción
issuerRut
string
rutEmisor-dvEmisor — RUT del emisor del documento (el proveedor).
type
ClaimDocumentType
tipoDoc — 33, 34 o 43.
folio
number
folio.
action
ClaimAction
accionDoc — Acción a registrar.
Campos de ClaimResult
Campo
Tipo
Descripción
code
number
codResp — Código de respuesta del SII.
description
string
descResp — Descripción del SII.
ok
boolean
true si codResp es 0.
raw
string
XML interior de return.
Campos de ReceiverAnswerResult
Campo
Tipo
Descripción
answer
ReceiverAnswer
La respuesta: annulled (NCA), claimed (RCD, RFP, RFT), accepted (ACD), paidInCash (PAG: el SII lo marcó pagado al contado, y el registro rechaza cualquier evento sobre él con el código 27), tacitlyAccepted (pasado el plazo sin ninguno de esos), goodsReceived (ERM, con los ocho días aún corriendo) o pending, en ese orden de precedencia; unknown antes que todos ellos cuando la consulta de eventos falló (sin eventos y con un codResp distinto de 15, 16 o 18), lo que solo puede decir el resultado completo de listClaimEvents.
claimDeadline
string | null
Último día para reclamar, AAAA-MM-DD: el día de la recepción en el SII más ocho; null sin fecha de recepción, y para paidInCash, que no admite reclamo.
// Consulta al registro público de emisores electrónicos autorizados (`ee_empresa_rut`) por un RUT:// su razón social, la resolución que lo autoriza en este ambiente (el `NroResol` y el `FchResol`// de la carátula; número 0 en certificación) y los tipos de documento que puede emitir. No pide// certificado ni sesión, y no cambia nada, así que sigue la política de reintentos. Una etiqueta// que se movió deja su campo en null. Lanza `INVALID_RUT`; `SII_PORTAL_REJECTED` con// `rejection: 'companyNotAuthorized'` cuando el RUT no es emisor autorizado;// `SII_PORTAL_UNEXPECTED_PAGE` cuando la respuesta no trae ni nombre ni tipos de documento;// `SII_HTTP_ERROR` y los códigos de transporte.function queryAuthorizedIssuer( sii: IssuerRegistryClient, input: { readonly rut: string }, overrides?: CallOverrides,): Promise<AuthorizedIssuer>
Tipo
Descripción
IssuerRegistryClient
Lo que necesita queryAuthorizedIssuer: un ambiente y con qué enviar. Calza un SiiClient o un cliente del portal, y también un objeto simple, porque el registro no pide certificado. Definido como Pick<SiiClient, 'environment' | 'transport' | 'capture' | 'logger' | 'now' | 'retry' | 'sleep'>.
AuthorizedIssuer
Un emisor autorizado tal como lo lista el registro público: un IssuerRegistryEntry más el RUT consultado.
IssuerRegistryEntry
Lo que dice el registro de un emisor. Una etiqueta que no encuentra deja su campo en null en vez de adivinar.
AuthorizedDocumentType
Un tipo de documento que el registro lista para un emisor.
Campos de AuthorizedIssuer
Campo
Tipo
Descripción
rut
SiiRut
El RUT consultado.
(los campos de IssuerRegistryEntry)
Campos de IssuerRegistryEntry
Campo
Tipo
Descripción
businessName
string | null
Razón social.
resolutionNumber
number | null
Número de la resolución que autoriza al emisor en este ambiente, 0 en certificación: el NroResol de la carátula.
resolutionDate
string | null
Fecha de esa resolución, AAAA-MM-DD: el FchResol de la carátula.
regionalOffice
string | null
Dirección regional del SII, en números romanos; no es la dirección de la empresa.
documents
readonly AuthorizedDocumentType[]
Los tipos de documento listados, autorizados ahora o antes.
Campos de AuthorizedDocumentType
Campo
Tipo
Descripción
type
number
Tipo de documento del SII, 30 o más.
description
string
Nombre tal como lo muestra el registro.
authorizedFrom
string | null
Día en que se autorizó, AAAA-MM-DD, o null.
deauthorizedOn
string | null
Día en que dejó de estar autorizado, AAAA-MM-DD, o null mientras lo siga.
Catálogos que clasifican y explican lo que responde el SII a un envío, una consulta de estado o un reclamo. Los mensajes son la redacción del SII, en español.
TypeScript
// Clasifica un código de estado de envío. Los códigos negativos son errores del servicio de// consulta, no del envío.function classifyUploadStatus(code: string, channel?: UploadChannel): UploadStatusClass// Glosa en español de un código de estado de envío.function uploadStatusMessage(code: string, channel?: UploadChannel): string// True cuando el estado es un error transitorio de consulta (`-1` … `-14`) que conviene// reintentar.function isRetryableStatus(code: string): boolean// Clasifica un código de estado de `QueryEstDte` (DOK/DNK/FAU/FNA/EMP, notas que modifican o// anulan, errores negativos).function classifyDocumentStatus(code: string): DocumentStatusClass// Glosa en español de un código de estado de `QueryEstDte`.function documentStatusMessage(code: string): string// True cuando un estado de `QueryEstUp`/`QueryEstDte` significa token rechazado (renovar y// reintentar una vez).function isTokenErrorStatus(code: string): boolean// Códigos `STATUS` de `RECEPCIONDTE` del CGI `DTEUpload` con su glosa.const RECEPTION_STATUS: Readonly<Record<string, ReceptionEntry>>// Clasifica un código `STATUS` de `RECEPCIONDTE`.function classifyReceptionStatus(code: string): ReceptionStatusClass// Glosa en español de un código `STATUS` de `RECEPCIONDTE`.function receptionStatusMessage(code: string): string// `accionDoc` — Acciones del Registro de Aceptación/Reclamo: ACD acepta contenido, RCD reclama// contenido, ERM otorga recibo de mercaderías, RFP reclama falta parcial, RFT reclama falta total.const CLAIM_ACTIONS: { readonly acceptContent: "ACD" readonly claimContent: "RCD" readonly acknowledgeGoods: "ERM" readonly claimPartialShortfall: "RFP" readonly claimTotalShortfall: "RFT"}// `tipoDoc` — Tipos de documento que acepta el Registro de Aceptación/Reclamo: factura (33),// factura exenta (34) y liquidación factura (43). `ClaimDocumentType` se deriva de esta lista.const CLAIM_DOCUMENT_TYPES: readonly [33, 34, 43]// Guarda de tipo: true cuando `value` es un tipo de documento que acepta el registro, para filtrar// una lista de documentos por él.function isClaimDocumentType(value: unknown): value is ClaimDocumentType// `codEvento` — Códigos de evento del registro, incluidos los que no registra el receptor: los de// notas de crédito (`NCA`, `ENC`) y `PAG`, un pago al contado que registra el propio SII.const CLAIM_EVENT_CODES: Readonly<Record<string, string>>// `codResp` — Respuestas de las operaciones del registro (0 ok, 1–19 y 27 respuestas de negocio, -1// error interno). 27 es el SII rechazando un evento sobre un documento pagado al contado o// gratuito, visto en producción al aceptar uno con `PAG` en sus eventos.const CLAIM_RESPONSE_CODES: Readonly<Record<string, string>>// Glosa en español de un `codResp`.function claimResponseMessage(code: number): string// `codResp` de `consultarDocDteCedible` con la cedibilidad que implica cada uno (`null` =// indeterminada).const TRANSFERABILITY_CODES: Readonly< Record<string, { readonly message: string; readonly transferable: boolean | null }> >// Glosa en español de un código de `consultarDocDteCedible`; cae a los códigos de respuesta// genéricos.function transferabilityMessage(code: number): string
Tipo
Descripción
UploadStatusClass
Clase de resultado de un código de estado de envío: aceptado, aceptado con reparos, intermedio, rechazado, error de consulta o desconocido. Definido como | 'accepted' | 'acceptedWithObjections' | 'pending' | 'rejected' | 'queryError' | 'unknown'.
UploadChannel
Canal del estado: soap (QueryEstUp / DTEUpload) o rest (API de boletas). RLV es éxito en REST y rechazo en SOAP. Definido como 'soap' | 'rest'.
DocumentStatusClass
Clase de resultado del estado de un documento (QueryEstDte): recibido, recibido con datos distintos, no recibido, no autorizado, modificado por nota, anulado por nota, error de consulta o desconocido. Definido como | 'received' | 'receivedWithMismatch' | 'notReceived' | 'notAuthorized' | 'modified' | 'cancelled' | 'queryError' | 'unknown'.
ReceptionStatusClass
Clase de resultado del STATUS de RECEPCIONDTE (respuesta del DTEUpload): recibido, rechazado, no autenticado, esquema inválido (o duplicado: lo decide DETAIL), ya enviado o desconocido. Definido como | 'received' | 'rejected' | 'notAuthenticated' | 'schemaInvalid' | 'alreadyUploaded' | 'unknown'.
ClaimAction
Nombre en inglés de una acción del registro. Definido como keyof typeof CLAIM_ACTIONS.
ClaimActionCode
Código SII de una acción (ACD, RCD, ERM, RFP, RFT). Definido como (typeof CLAIM_ACTIONS)[ClaimAction].