Ir al contenido

DTE XML Format1 (AppOctava)

DTE XML Format1 — Compatibilidad AppOctava

Sección titulada «DTE XML Format1 — Compatibilidad AppOctava»

Este endpoint permite que sistemas que actualmente emiten DTEs usando el protocolo SOAP XML de AppOctava migren a Redcumbre sin modificar su código. El único cambio necesario es la URL del servicio y las credenciales de autenticación.

El endpoint acepta un request SOAP XML con la estructura ProcesaDte, procesa el DTE usando el pipeline de emisión estándar de Redcumbre, y responde en el mismo formato SOAP XML ProcesaDteResponse.


  • API Key configurada en tu tenant con rol FULL-API (o DTE_ROL_FULL / DTE_ROL_EMISOR)
  • Emisor DTE activo registrado en el tenant con el RUT que usarás en el XML
  • Content-Type del request configurado como application/xml o text/xml

La autenticación se realiza mediante API Key (JWT Bearer Token) en el header HTTP:

Authorization: Bearer <tu_api_key_jwt>

El acceso es por tenant: la URL incluye el {tenantSlug} para identificar la organización.

RequisitoValor
HeaderAuthorization: Bearer <jwt>
Rol requeridoFULL-API, DTE_ROL_FULL o DTE_ROL_EMISOR
TenantIdentificado por {tenantSlug} en la URL

El request usa un envelope SOAP estándar con el namespace de AppOctava:

<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:app="http://www.appoctava.cl">
<soapenv:Header/>
<soapenv:Body>
<app:ProcesaDte>
<STRINGXML><![CDATA[...DTE XML...]]></STRINGXML>
<STRINGXMLADICIONAL><![CDATA[...XML adicional...]]></STRINGXMLADICIONAL>
<TIPOIMPRESO>tpl_dte41_002</TIPOIMPRESO>
<ASIGNAFOLIO>False</ASIGNAFOLIO>
<AMBIENTE>1</AMBIENTE>
<TOKEN>...</TOKEN>
</app:ProcesaDte>
</soapenv:Body>
</soapenv:Envelope>
CampoTipoObligatorioDescripción
STRINGXMLCDATADTE XML estándar SII embebido en CDATA
STRINGXMLADICIONALCDATANoXML con campos adicionales (metadata personalizada)
TIPOIMPRESOStringNoID del template PDF (ej: tpl_dte41_002). Si no se envía o el ID no existe en el catálogo, usa el default del tenant
SHORTURLSStringNoSi es True, genera URLs cortas (<255 chars) para PDF/XML. Útil para BD legacy. Ver URLs Cortas
IdempotencyKeyStringNoClave de idempotencia (max 128 chars). Protege contra emisiones duplicadas por reintentos. Ver Idempotencia
ASIGNAFOLIOStringNoIGNORADO — el folio siempre se asigna internamente
AMBIENTEIntegerNoIGNORADO — el ambiente se determina por la configuración del emisor
TOKENStringNoIGNORADO — la autenticación es por API Key en header HTTP

Dentro de STRINGXML va el DTE XML con formato estándar SII. La estructura general es:

<DTE version="1.0">
<Documento ID="F1T33">
<Encabezado>
<IdDoc>...</IdDoc>
<Emisor>...</Emisor>
<Receptor>...</Receptor>
<Totales>...</Totales>
</Encabezado>
<Detalle>...</Detalle>
</Documento>
</DTE>
CampoTipoObligatorioDescripción
TipoDTEIntegerCódigo SII del tipo de documento (ver tabla de tipos)
FolioIntegerNoIGNORADO — el folio se asigna internamente por el SII
FchEmisStringNoFecha de emisión en formato YYYY-MM-DD. Si no se envía, usa la fecha actual
FchVencStringNoFecha de vencimiento en formato YYYY-MM-DD
IndServicioIntegerNoTipo de venta/servicio: 1 = Servicio periódico domiciliario, 2 = Otros servicios periódicos, 3 = Ventas y servicios, 4 = Espectáculo por cuenta de terceros
CampoTipoObligatorioDescripción
RUTEmisorStringRUT del emisor (ej: 76123456-7). Se usa para buscar el emisor activo en el tenant
RznSocEmisorStringNoRazón social del emisor (informativo, no se usa para la emisión)
CampoTipoObligatorioDescripción
RUTRecepStringRUT del receptor
RznSocRecepStringRazón social del receptor
GiroRecepStringNoGiro comercial del receptor
DirRecepStringNoDirección del receptor
CmnaRecepStringNoComuna del receptor
CiudadRecepStringNoCiudad del receptor
CorreoRecepStringNoEmail del receptor. Si se incluye, se envía automáticamente el PDF del documento por email al receptor después de la emisión exitosa

Cada <Detalle> representa una línea del documento. Puede haber múltiples elementos <Detalle>.

CampoTipoObligatorioDescripción
NroLinDetIntegerNoNúmero de línea (informativo)
NmbItemStringNombre del ítem o servicio
QtyItemDecimalCantidad
PrcItemDecimalPrecio unitario
MontoItemDecimalSubtotal de la línea (cantidad × precio)
IndExeIntegerNoSi es 1, la línea está exenta de IVA

Opcionalmente se puede enviar metadata adicional dentro de STRINGXMLADICIONAL. Esta información se almacena como JSON en el campo metadataAdicional del DTE y queda disponible para templates PDF personalizados.

<Adicional>
<Uno>valor1</Uno>
<Dos>valor2</Dos>
<Tres>valor3</Tres>
<!-- ... hasta Veintiocho -->
</Adicional>

Los campos son numerados del Uno al Veintiocho. Todos son opcionales y de tipo string. Los campos vacíos se preservan como strings vacíos.


Código SIITipo de Documento
33Factura Afecta
34Factura Exenta
39Boleta Afecta
41Boleta Exenta
43Liquidación Factura
46Factura de Compra
52Guía de Despacho
56Nota de Débito
61Nota de Crédito

La respuesta siempre es un SOAP XML con la estructura ProcesaDteResponse.

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:ProcesaDteResponse xmlns:ns1="http://www.appoctava.cl">
<return>
<item>
<DescripcionResultado>TVAL</DescripcionResultado>
<IdResultadoFE>0</IdResultadoFE>
<ResultadoFE>DTE procesado correctamente.</ResultadoFE>
<UrlPdf>https://api.redcumbre.cl/public/documentos/{token}/pdf</UrlPdf>
<UrlXmlSii>https://api.redcumbre.cl/public/documentos/{token}/xml</UrlXmlSii>
<UrlXmlReceptor>https://api.redcumbre.cl/public/documentos/{token}/xml</UrlXmlReceptor>
<FolioAsignado>37898</FolioAsignado>
<IdDte>cm8x1y2z3abc456def789</IdDte>
<TiempoEjecucion>0.96504092</TiempoEjecucion>
</item>
</return>
</ns1:ProcesaDteResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:ProcesaDteResponse xmlns:ns1="http://www.appoctava.cl">
<return>
<item>
<DescripcionResultado>ERROR</DescripcionResultado>
<IdResultadoFE>1</IdResultadoFE>
<ResultadoFE>No se encontró un emisor DTE activo con RUT 99999999-9 en el tenant</ResultadoFE>
<UrlPdf></UrlPdf>
<UrlXmlSii></UrlXmlSii>
<UrlXmlReceptor></UrlXmlReceptor>
<FolioAsignado>0</FolioAsignado>
<IdDte></IdDte>
<TiempoEjecucion>0.12345000</TiempoEjecucion>
</item>
</return>
</ns1:ProcesaDteResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
CampoTipoÉxitoErrorDescripción
DescripcionResultadoStringTVALERRORCódigo de resultado
IdResultadoFEInteger010 = éxito, otro valor = error
ResultadoFEStringMensaje de éxitoMensaje descriptivo del errorDescripción del resultado
UrlPdfURLURL del PDFvacíoURL pública para descargar el PDF del DTE. Formato depende de dteTokenMode del tenant (ver URLs Cortas)
UrlXmlSiiURLURL del XMLvacíoURL pública para descargar el XML del DTE. Mismo formato que UrlPdf
UrlXmlReceptorURLURL del XMLvacíoURL pública del XML del DTE (misma que UrlXmlSii)
FolioAsignadoIntegerFolio real0Folio asignado por el SII
IdDteStringCUIDvacíoIdentificador único del DTE generado en el sistema
TiempoEjecucionDecimalSegundosSegundosTiempo de procesamiento en segundos

Campos Ignorados y Comportamiento Automático

Sección titulada «Campos Ignorados y Comportamiento Automático»

Tu Sistema Redcumbre
│ │
│── POST /{tenantSlug}/dte_xml_format1 ──▶│
│ Headers: │
│ - Authorization: Bearer <jwt> │
│ - Content-Type: application/xml │
│ Body: SOAP XML (ProcesaDte) │
│ │
│ │── Parsea SOAP envelope
│ │── Extrae DTE XML de STRINGXML
│ │── Resuelve emisor por RUT
│ │── Emite DTE via SII
│ │── Genera PDF y XML
│ │
│◀── SOAP XML (ProcesaDteResponse) ─│
│ - FolioAsignado │
│ - UrlPdf │
│ - UrlXmlSii │

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:app="http://www.appoctava.cl">
<soapenv:Header/>
<soapenv:Body>
<app:ProcesaDte>
<STRINGXML><![CDATA[<DTE version="1.0">
<Documento ID="F1T41">
<Encabezado>
<IdDoc>
<TipoDTE>41</TipoDTE>
<Folio>0</Folio>
<FchEmis>2026-02-26</FchEmis>
<IndServicio>1</IndServicio>
<FchVenc>2026-03-26</FchVenc>
</IdDoc>
<Emisor>
<RUTEmisor>76123456-7</RUTEmisor>
<RznSocEmisor>MI EMPRESA SPA</RznSocEmisor>
</Emisor>
<Receptor>
<RUTRecep>12345678-5</RUTRecep>
<RznSocRecep>JUAN PEREZ GONZALEZ</RznSocRecep>
<DirRecep>AV. PRINCIPAL 1234</DirRecep>
<CmnaRecep>SANTIAGO</CmnaRecep>
<CiudadRecep>SANTIAGO</CiudadRecep>
<CorreoRecep>juan.perez@ejemplo.cl</CorreoRecep>
</Receptor>
<Totales>
<MntExe>15000</MntExe>
<MntTotal>15000</MntTotal>
</Totales>
</Encabezado>
<Detalle>
<NroLinDet>1</NroLinDet>
<IndExe>1</IndExe>
<NmbItem>Servicio de Agua Potable - Enero 2026</NmbItem>
<QtyItem>1</QtyItem>
<PrcItem>15000</PrcItem>
<MontoItem>15000</MontoItem>
</Detalle>
</Documento>
</DTE>]]></STRINGXML>
<STRINGXMLADICIONAL><![CDATA[<Adicional>
<Uno>1001</Uno>
<Dos>Enero 2026</Dos>
<Tres></Tres>
</Adicional>]]></STRINGXMLADICIONAL>
<TIPOIMPRESO>tpl_dte41_002</TIPOIMPRESO>
<IdempotencyKey>servicio-agua-enero-2026</IdempotencyKey>
<ASIGNAFOLIO>False</ASIGNAFOLIO>
<AMBIENTE>1</AMBIENTE>
<TOKEN></TOKEN>
</app:ProcesaDte>
</soapenv:Body>
</soapenv:Envelope>
Ventana de terminal
curl -X POST "https://api.redcumbre.cl/{tenantSlug}/dte_xml_format1" \
-H "Authorization: Bearer <tu_api_key_jwt>" \
-H "Content-Type: application/xml" \
-d @request.xml

Donde request.xml contiene el SOAP envelope completo del ejemplo anterior.


Si tu sistema almacena las URLs de documentos (PDF, XML) en campos con límite de 255 caracteres, las URLs estándar con JWT (~260 chars) pueden exceder ese límite.

Agrega el campo <SHORTURLS>True</SHORTURLS> dentro de <app:ProcesaDte> en tu request SOAP XML. Las URLs en la respuesta usarán el formato corto automáticamente.

Para la API REST (POST /{tenantSlug}/dte), usa "shortUrl": true en el body JSON.

Una vez emitido un DTE con URLs cortas, los emails posteriores (re-envíos) mantienen el formato corto automáticamente.

ModoFormatoLongitud aprox.
STANDARD (default)/public/documentos/{jwt_token}/{pdf|xml|pdf-sii}~260 chars
SHORT/public/d/{dteId}/{shortToken}/{pdf|xml|pdf-sii}~89 chars

En el response SOAP XML, las URLs se ven así:

<UrlPdf>https://api.redcumbre.cl/public/d/cm1abc2def3g/A1b2C3d4E5f6/pdf</UrlPdf>
<UrlXmlSii>https://api.redcumbre.cl/public/d/cm1abc2def3g/A1b2C3d4E5f6/xml</UrlXmlSii>
<UrlXmlReceptor>https://api.redcumbre.cl/public/d/cm1abc2def3g/A1b2C3d4E5f6/xml</UrlXmlReceptor>
  • El shortToken se genera automáticamente la primera vez y se reutiliza en llamadas posteriores para el mismo DTE.
  • Las URLs son permanentes en ambos modos (STANDARD y SHORT) — no expiran nunca.
  • La seguridad se mantiene: el acceso requiere conocer tanto el dteId como el shortToken.
  • No es necesario cambiar código de integración — solo cambia el formato de las URLs recibidas.

Si tu sistema puede reintentar requests (por timeout, error de red, o doble-click), podés usar el tag <IdempotencyKey> para proteger contra emisiones duplicadas.

La idempotencia garantiza que un mismo request enviado múltiples veces produzca el mismo resultado: solo se emite un DTE, y los reintentos retornan el DTE original sin crear uno nuevo ni consumir folio.

Agregá el tag <IdempotencyKey> dentro de <app:ProcesaDte> con un valor único por operación:

<app:ProcesaDte>
<STRINGXML><![CDATA[...DTE XML...]]></STRINGXML>
<IdempotencyKey>order-12345-factura</IdempotencyKey>
</app:ProcesaDte>

Reglas:

  • Máximo 128 caracteres
  • El scope de unicidad es: emisor + tipo de DTE + key. Esto significa que podés usar la misma key para diferentes emisores o diferentes tipos de DTE sin colisión
  • La key es permanente — no expira. Un DTE emitido con una key siempre retornará el mismo resultado ante reintentos
  • Solo DTEs con estado EMITIDO se consideran para idempotencia. Si la primera emisión falló, podés reintentar con la misma key y se creará un DTE nuevo
  • El campo es opcional. Si no se envía, el comportamiento no cambia
<app:ProcesaDte>
<STRINGXML><![CDATA[<DTE version="1.0">
<Documento ID="F1T33">
<Encabezado>
<IdDoc>
<TipoDTE>33</TipoDTE>
<FchEmis>2026-03-03</FchEmis>
</IdDoc>
<Emisor>
<RUTEmisor>76123456-7</RUTEmisor>
</Emisor>
<Receptor>
<RUTRecep>77438768-4</RUTRecep>
<RznSocRecep>EMPRESA EJEMPLO SPA</RznSocRecep>
<GiroRecep>VENTA AL POR MENOR</GiroRecep>
<DirRecep>AV PROVIDENCIA 1234</DirRecep>
<CmnaRecep>PROVIDENCIA</CmnaRecep>
</Receptor>
</Encabezado>
<Detalle>
<NmbItem>Servicio de consultoría</NmbItem>
<QtyItem>1</QtyItem>
<PrcItem>100000</PrcItem>
<MontoItem>100000</MontoItem>
</Detalle>
</Documento>
</DTE>]]></STRINGXML>
<IdempotencyKey>order-12345-factura</IdempotencyKey>
</app:ProcesaDte>
SituaciónResultado
Primera emisión con keyDTE se emite normalmente, key se guarda
Reintento con misma key (DTE ya emitido)Retorna el DTE original sin crear nuevo
Misma key pero diferente emisor o tipo DTESe emite un DTE nuevo (scope diferente)
Misma key pero DTE original en estado ERRORSe emite un DTE nuevo (solo EMITIDO cuenta)

ErrorCausaSolución
Request body vacío o no es XMLContent-Type incorrecto o body vacíoVerificar que Content-Type sea application/xml o text/xml
SOAP Envelope no encontradoXML no tiene estructura SOAPVerificar el namespace soapenv y la estructura del envelope
Campo STRINGXML es obligatorioNo se incluyó el campo STRINGXMLAgregar el campo con el DTE XML en CDATA
TipoDTE no es un número válidoCódigo de tipo no reconocidoUsar uno de los códigos soportados (33, 34, 39, 41, etc.)
No se encontró un emisor DTE activo con RUT XEl RUT no tiene emisor activo en el tenantVerificar que el RUT del emisor esté registrado y activo