Concepto del grupo

Facturación electrónica

Emisión de facturas de venta, documento soporte, notas crédito y débito, y notas de ajuste.

Esta página se lee antes de ejecutar: explica qué vas a enviar y qué se hace con ello. Al final están los enlaces a las funciones, en el orden en que conviene probarlas.

1 · Qué es un documento electrónico

Un documento electrónico es una factura —o la nota que la ajusta— que existe como un XML firmado y que la DIAN valida y almacena. El emisor no le manda un archivo a su cliente y ya: lo reporta a la DIAN, la DIAN lo valida y devuelve un identificador único con el que ese documento queda referenciado para siempre.

El Proveedor Tecnológico es quien hace ese trabajo por cuenta del emisor. Tu integración le entrega un JSON con los datos del negocio; el Proveedor Tecnológico calcula el identificador, verifica el documento, construye el XML en el estándar UBL 2.1, lo firma y lo reporta. Lo que recibes de vuelta es el identificador y el estado con el que la DIAN lo recibió.

Ese identificador se llama distinto según el documento —CUFE en las facturas, CUDE en las notas, CUDS en el documento soporte— pero cumple siempre la misma función: es la huella del documento. Se calcula a partir de los totales, de la identidad de las partes y, en las facturas, de la clave técnica de la resolución. Cambiar un centavo cambia la huella.

2 · Qué documentos existen

Son seis, y el campo que decide cuál estás emitiendo es tddocumentoelectronico. El mismo JSON y el mismo endpoint sirven para todos: lo que cambia es ese código y los bloques que ese código exige.

CódigoDocumentoRaíz del XMLIdentificadorCuándo se usa
01Factura electrónica de ventaInvoiceCUFELa venta de un bien o de un servicio en el país. Es el documento central: todo lo demás lo ajusta o lo referencia.
02Factura de venta — exportaciónInvoiceCUFELa venta a un cliente del exterior. Suele ir sin IVA, con moneda extranjera e incoterms.
05Documento soporte en adquisiciones a no obligados a facturarInvoiceCUDSLa compra a alguien que no está obligado a facturar electrónicamente. Lo emite el comprador: los papeles se invierten.
91Nota créditoCreditNoteCUDEDisminuir o anular el valor de una factura ya reportada. Una factura no se modifica ni se borra.
92Nota débitoDebitNoteCUDEAumentar el valor de una factura ya reportada: intereses de mora, gastos por cobrar.
95Nota de ajuste al documento soporteCreditNoteCUDSCorregir o anular un documento soporte ya reportado. Numera con la resolución del documento soporte, no con la de facturación.

Dos consecuencias prácticas que conviene tener claras antes de probar: en el documento soporte el emisor es quien compra y el receptor quien vende —es el error conceptual más común al integrarlo— y una nota nunca modifica la factura, la acompaña referenciándola.

3 · El ciclo de un documento

Entre tu JSON y la respuesta de la DIAN hay cinco pasos, y todos pueden fallar por razones distintas. Saber en cuál estás es la diferencia entre corregir el dato correcto y cambiar cosas al azar.

  1. 1 · JSON — Tu integración envía el documento con los datos del negocio.
  2. 2 · Verificación — El servidor aplica sus reglas y acumula todas las que se incumplan, no se detiene en la primera.
  3. 3 · XML UBL 2.1 — Se construye el documento en el estándar de la DIAN, con los totales redondeados a los decimales que pediste. Se genera en UTF-8 y el documento lo declara en su primera línea: leerlo con otra codificación convierte cada tilde en dos caracteres raros.
  4. 4 · Firma — Se firma con XAdES-BES. Aquí se sella el contenido: cualquier cambio posterior invalida la firma.
  5. 5 · Reporte a la DIAN — Se envía y se espera su respuesta. Es el paso más lento y el que no depende de ti.
Emisión de un documento a la DIAN

Lo primero que se mira es la numeración del documento. Si nunca se reportó, el documento sigue el proceso completo. Si ya se reportó, se compara con el que está guardado: llegando igual responde 200 con el estado del documento, su UUID y el documento adjunto, sin volver a reportarlo ni gastar otro consecutivo; llegando con datos distintos responde 409 con la regla 90 de la DIAN y entrega el XML del documento que sí quedó reportado. Para el documento nuevo siguen las validaciones: un incumplimiento responde 400 con una entrada por regla, cada una con su código de la DIAN, su código de InSoft y su mensaje. Solo cuando las pasa se construye el documento electrónico, se firma, se reporta a la DIAN y se espera su respuesta. Si la DIAN lo rechaza, el 400 trae sus mensajes; si no se pudo establecer conexión con ella, responde también 400 pidiendo reintentar más tarde, y en ese caso el documento no quedó reportado. Las validaciones van antes de construir, así que un documento que no va a ser aceptado se rechaza sin gastar un consecutivo.

Emisión de un documento a la DIANLo primero que se mira es la numeración del documento. Si nunca se reportó, el documento sigue el proceso completo. Si ya se reportó, se compara con el que está guardado: llegando igual responde 200 con el estado del documento, su UUID y el documento adjunto, sin volver a reportarlo ni gastar otro consecutivo; llegando con datos distintos responde 409 con la regla 90 de la DIAN y entrega el XML del documento que sí quedó reportado. Para el documento nuevo siguen las validaciones: un incumplimiento responde 400 con una entrada por regla, cada una con su código de la DIAN, su código de InSoft y su mensaje. Solo cuando las pasa se construye el documento electrónico, se firma, se reporta a la DIAN y se espera su respuesta. Si la DIAN lo rechaza, el 400 trae sus mensajes; si no se pudo establecer conexión con ella, responde también 400 pidiendo reintentar más tarde, y en ese caso el documento no quedó reportado. Las validaciones van antes de construir, así que un documento que no va a ser aceptado se rechaza sin gastar un consecutivo.SÍNOSÍNONOSÍNOSÍEl documento llega en JSON¿Ya se reportó esanumeración?¿Llega igualque antes?¿Cumple las reglas?200Estado, UUID y documentoadjunto, sin volvera reportarlo409Regla 90 · entrega el XMLdel documentoConstruye el documentoy lo firma, lo reportay espera a la DIAN400Una entrada por reglaincumplida, con su códigoDIAN y su código InSoft¿La DIAN lo aceptó?400El rechazo de la DIAN, o«intente más tarde» sino hubo conexión200Estado del documento, su UUIDy el documento adjuntoLEYENDAInicio y finPasoDecisiónError

Desliza el diagrama para verlo completo.

Ver la fuente Mermaid del diagrama
flowchart TD
    A(["El documento llega en JSON"]) --> B{"¿Ya se reportó esa numeración?"}
    B -- Sí --> G{"¿Llega igual que antes?"}
    G -- Sí --> R0(["200 · estado, UUID y documento adjunto,<br/>sin volver a reportarlo"])
    G -- No --> R1(["409 · regla 90, entrega el XML del documento"])
    B -- No --> C{"¿Cumple las reglas?"}
    C -- No --> R2(["400 · una entrada por regla incumplida,<br/>con su código DIAN y su código InSoft"])
    C -- Sí --> D["Construye el documento y lo firma,<br/>lo reporta y espera a la DIAN"]
    D --> E{"¿La DIAN lo aceptó?"}
    E -- No --> R3(["400 · el rechazo de la DIAN, o «intente más tarde»<br/>si no hubo conexión"])
    E -- Sí --> H(["200 · estado del documento, su UUID<br/>y el documento adjunto"])

4 · Los códigos td… del nivel raíz

Casi todo campo que empieza por td es un código de catálogo de la DIAN, no un texto libre. El tipo de documento, el tipo de operación, la forma de pago, la clase de tributo, el motivo de una nota: todos se escriben con el código que la DIAN publica en su anexo técnico, y el nombre solo existe para que un humano lo lea.

Esto importa por cómo falla. Los enumerados son tolerantes: si el valor no pertenece al catálogo el servidor no rechaza la petición, asigna el valor vacío y la validación posterior lo reporta. Un tddocumento escrito como 3 en lugar de 31 no produce un error de formato: produce un rechazo por falta de tipo de documento, que es un mensaje que no apunta al verdadero problema.

Por eso en la consola de ejecución todo dato con catálogo se escoge en una lista, nunca se teclea, y la tabla Datos que recibe de cada ficha lista los valores admitidos con su código por delante.

CampoDónde vaQué decide
tddocumentoelectronico Nivel raíz

Qué documento es. Decide qué valida la DIAN, con qué resolución se numera y cómo se llama el identificador que devuelve.

Ver los 8 valores admitidos
  • 01 · Factura electrónica de venta
  • 02 · Factura electrónica de venta — exportación
  • 03 · Instrumento electrónico de transmisión
  • 04 · Factura electrónica de venta — tipo 04
  • 05 · Documento soporte en adquisiciones a no obligados a facturar
  • 91 · Nota crédito
  • 92 · Nota débito
  • 95 · Nota de ajuste del documento soporte
tdoperacionfe Nivel raíz

Régimen de la operación. Es lo que exige bloques adicionales dentro de cada ítem: mandante en mandatos, datostransporte en transporte.

Ver los 7 valores admitidos
  • 09 · AIU
  • 10 · Estándar
  • 11 · Mandatos — exige mandante en el ítem
  • 12 · Transporte — exige datostransporte en el ítem
  • 14 · Notarios
  • 15 · Compra de divisas
  • 16 · Venta de divisas
tdambiente En la ruta de las consultas, no en el cuerpo

Contra qué ambiente de la DIAN se resuelve. El sandbox lo fuerza a pruebas: la ruta lo recibe para que la URL que se integre hoy sea la misma de producción.

Ver los 2 valores admitidos
  • 1 · Producción
  • 2 · Pruebas — habilitación
tdprocedenciavendedor No se envíaNivel raíz

Si el vendedor reside en el país. Lo deduce el servidor —del país y del tipo de documento de las partes— y solo se emite en documento soporte y en su nota de ajuste.

Ver los 2 valores admitidos
  • 10 · Residente
  • 11 · No residente

Estos cuatro son los del nivel raíz: los que se resuelven antes de armar cualquier bloque, porque deciden qué documento es y qué le va a exigir el servidor. Los demás códigos viven dentro de un objeto —el del tercero, del medio de pago, del descuento, del ítem, del mandante, del transporte, del periodo del servicio y de la nota— y están en la tabla de ese objeto, en la sección siguiente.

5 · Anatomía del JSON

El cuerpo de la petición es un objeto llamado TDocumentoFE, y se lee por bloques: cada uno responde una pregunta del negocio. El detalle campo por campo está en las tablas que siguen.

  • Nivel raíz

    Qué documento es, cómo se numera y con cuántos decimales se calculan sus totales.

  • resolucion

    Con qué rango de numeración autorizado por la DIAN se emite.

  • emisor · receptor

    Quién factura y a quién. Los dos llevan la misma estructura.

  • items

    Qué se vendió: al menos una línea, con su cantidad, su precio y sus tributos.

  • tributos · resumentributos

    Los impuestos y las retenciones, por línea y consolidados.

  • mediosdepago

    Cómo se paga, y cuándo si es a crédito.

  • descuentoscargos · anticipos

    Lo que baja o sube el valor a pagar.

  • datosnota · docsreferencia

    Solo en las notas: el motivo del ajuste y el documento que corrige.

Cómo lee el servidor tu JSON
  • Los nombres no distinguen mayúsculas, y lo desconocido se ignora sin error. numerodocumento y NumeroDocumento son el mismo campo, y una clave que el servidor no lee —como fhcre en los ejemplos— no estorba.
  • Las fechas van en ISO 8601 con zona —"2026-08-06T10:30:00-05:00"— y el servidor opera en UTC-5. La del documento es opcional: sin fechadocumento se usa el momento en que se recibe, y por eso los ejemplos no la traen.
  • Todo valor se castea, nunca se rechaza por tipo. "100000" y 100000 son equivalentes, y un texto no numérico se convierte en cero. De ahí que un error de formato se manifieste como una regla de negocio incumplida y no como un error de lectura del JSON.

Los títulos que siguen son los objetos que se repiten a lo largo del documento. La columna «Tipo» de la tabla de datos de cualquier ficha enlaza aquí: es donde se dice qué va dentro de un TUbicacion o de un Array<TImpuesto>.

El asterisco marca lo que hay que enviar, igual que en la tabla de datos de cada ficha, y «no se envía» los que calcula el Proveedor Tecnológico: van en la respuesta y en el XML, pero mandarlos no cambia nada porque se recalculan siempre. Lo que depende de otro dato lo dice la explicación del atributo.

TResolucion

Dónde llega: resolucion del documento

La autorización de numeración que la DIAN le dio al emisor: qué prefijo usa, qué rango de consecutivos tiene y hasta cuándo. En el sandbox no se envía: el servicio asigna la que tiene registrada y descarta la que llegue.

AtributoTipoQué es
prefijo * string

Prefijo autorizado —SETP, SETT—. Puede ir vacío, pero la clave tiene que existir. En las notas es lo único que se exige de todo el objeto.

numeroresolucion string

Número de la resolución. Obligatorio en facturas y documento soporte. Si llega solo este dato, el servidor consulta el resto y completa el objeto antes de calcular el identificador.

clavetecnica string

Clave que la DIAN entrega con la resolución y que entra en el cálculo del CUFE. Obligatoria en facturas; no se exige en documento soporte ni en el instrumento electrónico.

numeroinicial number

Inicio del rango autorizado. Obligatorio en facturas y documento soporte.

numerofinal number

Fin del rango autorizado.

fechainicial date-time

Inicio de vigencia. No puede ser posterior a la fecha del documento.

fechafinal date-time

Fin de vigencia. No puede ser anterior a la fecha del documento: es el rechazo más común al probar con una resolución vencida.

fecharesolucion date-time

Fecha en que se expidió la resolución.

  • En nota crédito, nota débito y nota de ajuste no se valida el número ni el rango ni la vigencia: basta el prefijo. Los ejemplos van con valores neutros.
  • El mismo objeto lo usa nómina, donde solo aporta el prefijo.

TItem

Dónde llega: items, una línea del documento por elemento

Una línea: qué se vendió, cuánto, a qué precio y con qué tributos. Al menos una, con cantidad mayor que cero. El número de línea no se envía: es la posición dentro del arreglo.

AtributoTipoQué es
nombre * Array<string>

Descripción de lo que se vende. Es un arreglo porque la DIAN admite hasta tres descripciones.

cantidad * number

Cantidad, mayor que cero. Admite decimales y se emite con cuatro.

unidad * string

Unidad de medida en el código UN/ECE del anexo —94 unidad, EA, KGM—. El catálogo completo tiene 1.094 códigos; la tabla de datos de la ficha publica los usados.

precio * number

Precio unitario.

tributos Array<TImpuesto>

Impuestos y retenciones de la línea. De su suma sale el consolidado del documento, que la DIAN compara.

descuentoscargos Array<TDescuentoCargo>

Descuentos y cargos de la línea. Restan del total bruto, y por eso bajan la base gravable.

totalbruto No se envíanumber

precio × cantidad menos los descuentos de la línea.

totalneto No se envíanumber

El bruto más los cargos y los impuestos de la línea.

codigopropio string

Código interno del producto. No se emite al XML.

codigoestandar string

Código del producto en un estándar reconocido.

tdcodigoestandar string

En qué estándar está el código anterior. Obligatorio cuando codigoestandar llega.

Ver los 4 valores admitidos
  • 001 · UNSPSC
  • 010 · GTIN
  • 020 · Partida arancelaria
  • 999 · Estándar de adopción del contribuyente
precioreferencia number

Precio de referencia. Obligatorio cuando no hay totalbruto, y si se informa tiene que ser mayor que cero, salvo en documento soporte y nota de ajuste.

tdprecioreferencia string

Qué representa ese precio. Acompaña al anterior.

Ver los 3 valores admitidos
  • 1 · Valor comercial
  • 2 · Valor en inventarios
  • 3 · Otro valor
notas Array<string>

Notas de la línea. En operación AIU el servidor las reescribe con el concepto del contrato.

marca · modelo Array<string>

Marca y modelo, hasta tres de cada uno.

codigovendedor · subespecificacionvendedor string

Código del vendedor y su especificación adicional.

undxcantidad number

Unidades por empaque.

bmuestragratis boolean

Marca de muestra gratis. No se emite al XML.

mandante TMandante

El tercero por cuenta de quien se factura. Obligatorio en mandatos —tdoperacionfe = 11—.

datostransporte TTransporteCarga

Datos de la remesa. Obligatorio en transporte de carga —tdoperacionfe = 12—.

periodoservicio TPeriodoItem

Periodo de la compra. Obligatorio en documento soporte —tddocumentoelectronico = 05—.

  • El precio, la cantidad y los tributos de cada línea son la base de todos los totales del documento y del identificador: un centavo de diferencia cambia el UUID y la DIAN rechaza.

TMandante

Dónde llega: items[].mandante, en operación de mandato

El tercero por cuenta de quien se factura la línea. Todo ítem lo exige cuando la operación es un mandato —tdoperacionfe = 11—.

AtributoTipoQué es
tdingreso * string

De quién es el ingreso de la línea.

Ver los 2 valores admitidos
  • 0 · Bien o servicio de ingreso propio
  • 1 · Bien o servicio de ingresos recibidos para terceros
nit * string

Identificación del mandante, sin dígito de verificación.

tddocumento * string

Tipo de documento de identidad del mandante; el mismo catálogo del tercero.

digchequeo No se envíastring

Dígito de verificación. No lo envíes: el servidor lo calcula a partir del nit cuando tddocumento es 31.

TTransporteCarga

Dónde llega: items[].datostransporte, en transporte de carga

La remesa que respalda la línea. Todo ítem lo exige cuando la operación es transporte de carga —tdoperacionfe = 12—.

AtributoTipoQué es
tdservicio * string

Qué clase de servicio es.

Ver los 2 valores admitidos
  • 0 · Servicio adicional
  • 1 · Remesa de transporte registrada en el RNDC
remesas * Array<object>

Propiedades adicionales de la línea, cada una con nombre, valor, cantidad y unidadmedida.

TPeriodoItem

Dónde llega: items[].periodoservicio, en documento soporte

Cuándo se hizo la compra que respalda la línea. Todo ítem del documento soporte lo exige.

AtributoTipoQué es
fechacompra * date-time

Fecha de la compra. Si el bloque no llega, el servidor lo crea con la fecha del documento.

tddescripcion string

Cómo se describe el periodo.

Ver los 2 valores admitidos
  • 1 · Por operación — valor por omisión
  • 2 · Acumulado semanal
descripcion No se envíastring

Se deriva de tddescripcion.

TTercero

Dónde llega: emisor y receptor del documento; en nómina es el empleador, que es el único tercero que ese documento lleva

Las dos partes del documento, con la misma estructura: quién es, cómo se identifica ante la DIAN, dónde está y a dónde se le notifica. En el documento soporte los papeles se invierten: el emisor es quien compra.

AtributoTipoQué es
tddocumento * string

Tipo de documento de identidad. En el emisor tiene que ser 31 NIT —si no llega se asume—; el receptor admite cualquiera del catálogo, incluidos los del exterior.

Ver los 12 valores admitidos
  • 11 · Registro civil
  • 12 · Tarjeta de identidad
  • 13 · Cédula de ciudadanía
  • 21 · Tarjeta de extranjería
  • 22 · Cédula de extranjería
  • 31 · NIT — exige dígito de verificación
  • 41 · Pasaporte
  • 42 · Documento de identificación extranjero
  • 47 · PEP — Permiso Especial de Permanencia
  • 48 · PPT — Permiso por Protección Temporal
  • 50 · NIT de otro país
  • 91 · NUIP — solo para el adquirente
nit * string

Identificación sin el dígito de verificación.

digchequeo No se envíastring

Dígito de verificación. No lo envíes: el servidor lo calcula a partir del nit cuando tddocumento es 31, y descarta el que venga en el JSON.

razonsocial * string

Nombre o razón social. Si falta en el receptor, el servidor intenta obtenerlo de la DIAN.

tdpersona * string

Si la parte es una empresa o una persona.

Ver los 2 valores admitidos
  • 1 · Persona jurídica y asimiladas
  • 2 · Persona natural y asimiladas
tdresponsabilidadfiscales Array<string>

Responsabilidades fiscales del RUT. Obligatorio en el emisor; del receptor no se emiten. Van varias, y el servidor las emite separadas por ;.

Ver los 5 valores admitidos
  • O-13 · Gran contribuyente
  • O-15 · Autorretenedor
  • O-23 · Agente de retención de IVA
  • O-47 · Régimen simple de tributación
  • R-99-PN · No aplica — otros
tributoresponsable string

Tributo del que la parte es responsable. Admite lista separada por ; y el servidor toma el de mayor cobertura; en el receptor, si no llega se asigna ZZ.

Ver los 4 valores admitidos
  • 01 · IVA
  • 02 · INC
  • ZA · IVA e INC
  • ZZ · No aplica
actividadeconomica Array<string>

Códigos CIIU del emisor. Los del receptor no se emiten.

matriculamercantil string

Matrícula mercantil del emisor.

ubicacion * TUbicacion

Dirección física.

ubicacionfiscal TUbicacion

Dirección fiscal, solo del emisor. Si no se envía se usa ubicacion. No aplica al documento soporte ni a su nota de ajuste.

contacto.email * string

Correo de notificación. Es el único campo obligatorio del bloque de contacto, en las dos partes; si falta en el receptor, el servidor intenta obtenerlo de la DIAN.

contacto.nombre string

Nombre del contacto. Vacío, se usa la razón social.

contacto.telefono string

Teléfono. El bloque admite además fax y observaciones.

  • El emisor es colombiano: el país de sus dos ubicaciones tiene que ser CO y su documento un NIT. En documento soporte y nota de ajuste la exigencia solo aplica con tdoperacionfe = 10, donde el emisor puede ser un no residente.
  • El receptor no: admite terceros del exterior con cualquier codigopais.

TUbicacion

Dónde llega: emisor.ubicacion, emisor.ubicacionfiscal, las dos del receptor y entrega

Una dirección con la codificación que exige el anexo técnico de la DIAN: el municipio y el departamento van por su código, no por su nombre. El listado de municipios de Colombia que adopta ese anexo es el que fija esos códigos.

AtributoTipoQué es
codigociudad * string

Código del municipio —17001 es Manizales—. Es el único que hace falta enviar: de él salen los otros tres nombres.

codigodepto string

Código del departamento —17—. Si no se envía se resuelve desde codigociudad.

nombreciudad string

Nombre del municipio. Si no se envía se resuelve desde codigociudad.

nombredepto string

Nombre del departamento. Si no se envía se resuelve desde codigodepto.

direccion * string

Dirección en texto libre.

codigopais string

País en ISO 3166-1 alfa-2. Por omisión CO, y en el emisor tiene que ser CO.

codigopostal string

Código postal. Obligatorio en el emisor de documento soporte y de nota de ajuste con tdoperacionfe = 10.

codigolenguaje string

ISO 639-1. Por omisión es, y en el emisor de documento soporte y nota de ajuste estándar tiene que ser es.

nombrepais No se envíastring

Se deriva de codigopais.

TImpuesto

Dónde llega: items[].tributos y resumentributos

Un tributo: su clase, su base, su valor y si se calcula por tarifa o por unidad. El servidor separa solo los impuestos de las retenciones —05 ReteIVA, 06 ReteRenta, 07 ReteICA— y los agrupa por clase.

AtributoTipoQué es
clase * string

Código del tributo. Es lo que decide si el valor suma al total con impuestos o se separa como retención.

Ver los 22 valores admitidos
  • 01 · Impuesto · IVA
  • 02 · Impuesto · IC — impuesto al consumo; sin base en el XML
  • 03 · Impuesto · ICA
  • 04 · Impuesto · INC
  • 05 · Retención · ReteIVA
  • 06 · Retención · ReteRenta
  • 07 · Retención · ReteICA — porcentaje con 3 decimales
  • 08 · Impuesto · IC porcentual
  • 20 · Impuesto · Fondo de fomento hortícola
  • 21 · Impuesto · Timbre — exige precio en el ítem
  • 22 · Impuesto · INC bolsas — exige precio; sin base
  • 23 · Impuesto · INCarbono — exige precio
  • 24 · Impuesto · INCombustibles — exige precio
  • 25 · Impuesto · Sobretasa a combustibles
  • 26 · Impuesto · Sordicom
  • 30 · Impuesto · IC de datos
  • 32 · Impuesto · ICL — consumo de licores
  • 33 · Impuesto · INPP
  • 34 · Impuesto · IBUA — bebidas azucaradas; sin base y por mililitros
  • 35 · Impuesto · ICUI — comestibles ultraprocesados
  • 36 · Impuesto · ADV
  • ZZ · Impuesto · Otra figura tributaria
valorbase * number

Base gravable. No se emite para 02 IC, 22 INC bolsas ni 34 IBUA.

valor * number

Valor del impuesto. Un exento se declara con valor en 0 y valorbase diligenciado, no omitiendo el tributo.

bporcentaje * boolean

true el tributo va por tarifa, false por unidad. Es lo que decide cuál de los dos siguientes hace falta.

porcentaje number

Tarifa. Obligatorio con bporcentaje = true.

cantidad number

Unidades gravadas. Va con bporcentaje = false, a nivel de línea.

precio number

Valor por unidad. Obligatorio a nivel de ítem en 21 timbre, 22 INC bolsas, 23 INCarbono y 24 INCombustibles.

nombre No se envíastring

Se deriva de clase.

  • resumentributos tiene que ser la suma por clase de los tributos de los ítems. De ahí salen el total con impuestos, el UUID y el QR: si no cuadra, la DIAN rechaza el documento.
  • Las retenciones no se emiten en nota crédito, nota débito ni nota de ajuste.

TMedioPago

Dónde llega: mediosdepago, un elemento por medio

Cómo se paga el documento. El Proveedor Tecnológico lo exige en todo documento de facturación —factura, documento soporte y sus notas—: sin él responde la regla AN01.

AtributoTipoQué es
tdformapago * string

Si el documento se paga de una vez o queda a plazo. Es lo que decide si fechapago hace falta.

Ver los 2 valores admitidos
  • 1 · Contado
  • 2 · Crédito — exige fechapago
tdmediopago string

Con qué se paga. Si no llega, o llega con un código que no está en el catálogo, el servidor asume 1 — Instrumento no definido, de modo que el documento no se rechaza por este campo. Estos son los 76 códigos del catálogo de la DIAN.

Ver los 76 valores admitidos
  • 1 · Instrumento no definido
  • 2 · Crédito ACH
  • 3 · Débito ACH
  • 4 · Reversión débito de demanda ACH
  • 5 · Reversión crédito de demanda ACH
  • 6 · Crédito de demanda ACH
  • 7 · Débito de demanda ACH
  • 9 · Clearing nacional o regional
  • 10 · Efectivo
  • 11 · Reversión crédito ahorro
  • 12 · Reversión débito ahorro
  • 13 · Crédito ahorro
  • 14 · Débito ahorro
  • 15 · Bookentry crédito
  • 16 · Bookentry débito
  • 17 · Desembolso crédito (CCD)
  • 18 · Desembolso débito (CCD)
  • 19 · Crédito pago negocio corporativo (CTP)
  • 20 · Cheque
  • 21 · Proyecto bancario
  • 22 · Proyecto bancario certificado
  • 23 · Cheque bancario de gerencia
  • 24 · Nota cambiaria esperando aceptación
  • 25 · Cheque certificado
  • 26 · Cheque local
  • 27 · Débito pago negocio corporativo (CTP)
  • 28 · Crédito negocio intercambio corporativo (CTX)
  • 29 · Débito negocio intercambio corporativo (CTX)
  • 30 · Transferencia crédito
  • 31 · Transferencia débito
  • 32 · Desembolso crédito plus (CCD+)
  • 33 · Desembolso débito plus (CCD+)
  • 34 · Pago y depósito preacordado (PPD)
  • 35 · Desembolso crédito (CCD)
  • 36 · Desembolso débito (CCD)
  • 37 · Pago negocio corporativo ahorros crédito (CTP)
  • 38 · Pago negocio corporativo ahorros débito (CTP)
  • 39 · Crédito intercambio corporativo (CTX)
  • 40 · Débito intercambio corporativo (CTX)
  • 41 · Desembolso crédito plus (CCD+)
  • 42 · Consignación bancaria
  • 43 · Desembolso débito plus (CCD+)
  • 44 · Nota cambiaria
  • 45 · Transferencia crédito bancario
  • 46 · Transferencia débito interbancario
  • 47 · Transferencia débito bancaria
  • 48 · Tarjeta crédito
  • 49 · Tarjeta débito
  • 50 · Postgiro
  • 51 · Telex estándar bancario
  • 52 · Pago comercial urgente
  • 53 · Pago tesorería urgente
  • 60 · Nota promisoria
  • 61 · Nota promisoria firmada por el acreedor
  • 62 · Nota promisoria firmada por el acreedor, avalada por el banco
  • 63 · Nota promisoria firmada por el acreedor, avalada por un tercero
  • 64 · Nota promisoria firmada por el banco
  • 65 · Nota promisoria firmada por un banco avalada por otro banco
  • 66 · Nota promisoria firmada
  • 67 · Nota promisoria firmada por un tercero avalada por un banco
  • 70 · Retiro de nota por el acreedor
  • 71 · Bonos
  • 72 · Vales
  • 74 · Retiro de nota por el acreedor sobre un banco
  • 75 · Retiro de nota por el acreedor, avalada por otro banco
  • 76 · Retiro de nota por el acreedor, sobre un banco avalada por un tercero
  • 77 · Retiro de una nota por el acreedor sobre un tercero
  • 78 · Retiro de una nota por el acreedor sobre un tercero avalada por un banco
  • 91 · Nota bancaria transferible
  • 92 · Cheque local transferible
  • 93 · Giro referenciado
  • 94 · Giro urgente
  • 95 · Giro formato abierto
  • 96 · Método de pago solicitado no usado
  • 97 · Clearing entre partners
  • ZZZ · Otro
fechapago date-time

Vencimiento del pago. Obligatoria con tdformapago = 2, y va en ISO 8601 como toda fecha del documento.

valor number

Valor pagado por este medio.

idtransaccion Array<string>

Identificadores de la transacción.

cuentabeneficiario TCuentaBeneficiario

Cuenta a la que se abona el pago. El bloque entero solo llega al XML si se envía.

TCuentaBeneficiario

Dónde llega: mediosdepago[].cuentabeneficiario

La cuenta a la que se abona el pago, cuando el medio lo tiene: una transferencia o una consignación. Todo el bloque es opcional, y va dentro del medio de pago, no del documento.

AtributoTipoQué es
numerocuenta string

Número de la cuenta del beneficiario.

tdcuenta string

Tipo de cuenta. Viaja como código y el anexo técnico no fija una lista cerrada aquí: se emite tal como llegue.

codigobanco string

Código de la entidad financiera donde está la cuenta.

codigopais string

País de la cuenta, en ISO 3166-1 alfa-2. A diferencia de la ubicación, aquí no hay valor por omisión.

notas string

Nota del pago; acompaña a la cuenta en el XML.

  • Cada campo se emite solo si llega, y ninguno es obligatorio: una cuenta con solo el número es válida. Lo que decide si el bloque existe en el XML es que cuentabeneficiario venga en el medio de pago.

TDescuentoCargo

Dónde llega: descuentoscargos del documento y items[].descuentoscargos

Un descuento o un recargo. El mismo objeto sirve en los dos niveles, y el nivel cambia el efecto: el de la línea reduce la base gravable, el del documento no.

AtributoTipoQué es
bcargo * boolean

false descuento, true cargo o recargo.

valorbase * number

Base sobre la que se calcula.

porcentaje * number

Porcentaje aplicado, entre 0 y 100.

valor * number

Valor del descuento o del cargo. No puede superar valorbase.

nombre string

Motivo. Obligatorio a nivel de documento; vacío, se deriva de tddescuento.

tddescuento string

Concepto del descuento o del recargo. Si no se envía lo asigna el servidor según el nivel: condicionado en el documento, no condicionado en la línea.

Ver los 4 valores admitidos
  • 00 · Descuento no condicionado — por omisión en la línea
  • 01 · Descuento condicionado — por omisión en el documento
  • 02 · Recargo no condicionado — por omisión en la línea
  • 03 · Recargo condicionado — por omisión en el documento
  • El descuento de una línea se resta de su total bruto, y por eso baja la base gravable. El del documento no toca el bruto: se refleja en el valor a pagar.
  • El total de descuentos del documento no puede superar su total bruto.

TAnticipo

Dónde llega: anticipos

Un pago recibido antes de emitir el documento. Su total se resta del valor a pagar.

AtributoTipoQué es
valor * number

Valor del anticipo.

fecharecibido date-time

Fecha en que se recibió. Si no se envía se usa fechapago.

fechapago date-time

Fecha de pago. Si no se informa, el XML no lleva la fecha ni la hora de pago.

  • No se emiten en nota crédito ni en nota de ajuste.

TNota

Dónde llega: datosnota, y solo en las notas

Qué clase de nota es y por qué se ajusta el documento. Es obligatorio en nota crédito, nota débito y nota de ajuste: es lo que convierte el documento en la corrección de algo concreto.

AtributoTipoQué es
tddocumentonota string

Qué clase de nota es, y si referencia una factura electrónica. Sin referencia, el periodo de facturación pasa a ser obligatorio. Es obligatorio en la nota crédito y en la débito, y no se envía en la nota de ajuste: su catálogo es de la factura, no llega al XML del ajuste y lo único que hace ahí es cambiar el catálogo con el que se lee el motivo.

Ver los 4 valores admitidos
  • 20 · Nota crédito que referencia una factura electrónica
  • 22 · Nota crédito sin referencia a una factura electrónica
  • 30 · Nota débito que referencia una factura electrónica
  • 32 · Nota débito sin referencia a una factura electrónica
tdmotivonota * string

Por qué se ajusta. El catálogo depende de la clase de nota, de modo que el motivo se interpreta contra el que ya tenga tddocumentonota: 30 o 32 lo leen con el catálogo de la nota débito, 20 o 22 con el de la crédito, y cualquier otro valor —incluido no enviarlo, que es el caso de la nota de ajuste— con el del ajuste.

Ver los 15 valores admitidos
  • 1 · Nota crédito · Devolución parcial de bienes o no aceptación parcial del servicio
  • 2 · Nota crédito · Anulación de factura electrónica
  • 3 · Nota crédito · Rebaja o descuento parcial o total
  • 4 · Nota crédito · Ajuste de precio
  • 5 · Nota crédito · Descuento comercial por pronto pago
  • 6 · Nota crédito · Descuento comercial por volumen de ventas
  • 1 · Nota débito · Intereses
  • 2 · Nota débito · Gastos por cobrar
  • 3 · Nota débito · Cambio del valor
  • 4 · Nota débito · Otros
  • 1 · Nota de ajuste · Devolución parcial de los bienes o no aceptación parcial del servicio
  • 2 · Nota de ajuste · Anulación del documento soporte en adquisiciones efectuadas a sujetos no obligados a expedir factura de venta o documento equivalente
  • 3 · Nota de ajuste · Rebaja o descuento parcial o total
  • 4 · Nota de ajuste · Ajuste de precio
  • 5 · Nota de ajuste · Otros
motivonota No se envíastring

Descripción del motivo; se deriva de tdmotivonota.

  • En la nota crédito y en la débito, envía siempre tddocumentonota: es contra su valor que el servidor resuelve el catálogo del motivo. El orden de las claves en el objeto no importa; que esté, sí.
  • En la nota de ajuste, déjalo fuera. El ajuste es el caso por defecto: sin tddocumentonota el motivo se lee con el catálogo del ajuste, que es el que le corresponde. Enviar 20 ahí no rompe el XML —el campo no llega a él—, pero hace que el código del motivo signifique otra cosa.

TDocumentoElectronico

Dónde llega: docsreferencia y docsadicionales de las notas, y la referencia de la nota de ajuste de nómina y del evento

Un documento ya reportado al que este se refiere. No es el documento que se emite: es la identificación del que se corrige o del que se acepta.

AtributoTipoQué es
uuid string

CUFE, CUDE o CUDS del documento afectado. Obligatorio si la nota no trae periodo de facturación.

numerodocumento string

Número del documento afectado, con la misma condición que el anterior.

fechadocumento * date-time

Fecha del documento afectado. No puede ser posterior a la del documento que se emite.

tddocumentoelectronico string

Tipo del documento afectado. Es lo que decide con qué nombre se emite el identificador —CUFE-SHA384, CUDE-SHA384, CUDS-SHA384—.

  • Cuando la nota no referencia un documento —22 y 32—, este bloque va vacío y el periodo de facturación pasa a ser obligatorio.

TMoneda

Dónde llega: moneda del documento

La divisa en la que se factura. El XML siempre se expresa en pesos: con este bloque el servidor agrega además los totales convertidos, y solo en facturas.

AtributoTipoQué es
codigo * string

Código ISO 4217 de la divisa —USD, EUR—.

tasacambio * number

Tasa de cambio a pesos. Distinta de cero.

fechatasacambio date-time

Fecha de la tasa. Si no llega, el servidor asume la fecha del documento.

  • En notas y en documento soporte el bloque se acepta pero no se emiten los totales convertidos: esa extensión es solo de las facturas.

6 · Qué valida el servidor

Antes de construir el XML, el servidor recorre el documento y aplica más de 140 reglas. No se detiene en la primera que falla: acumula todas y responde 400 con la lista completa. Es deliberado, y es lo que hace que valga la pena leer la respuesta entera en lugar de corregir de a un campo.

Cada regla incumplida llega con dos códigos y un mensaje:

  • codigodian — el código de la regla en el anexo técnico de la DIAN. Es el que se cita cuando hay que consultar la norma.
  • codigoinsoft — el código propio de InSoft. Cuando una sola regla de la DIAN cubre varias verificaciones distintas, este las diferencia con sufijos _1 y _2. Es el que te dice exactamente que verificación fallo.
  • mensaje — que hay que corregir, en español.

Las reglas se agrupan por bloque del documento y el prefijo del código lo delata: AB son las de la resolución, AD las generales del documento, y así con el resto. Un grupo entero de rechazos con el mismo prefijo casi siempre significa que falta un bloque completo, no que haya diez errores distintos.

La función que te deja ver esa lista sin gastar nada es la generación del XML: recorre la verificación completa y devuelve las reglas incumplidas sin reportar el documento a la DIAN.

Generación de XML sin reportar

Recorre el mismo camino de la emisión pero se detiene antes de la DIAN. Con el documento en JSON calcula el UUID que tendría —CUFE, CUDE o CUDS— y lo valida contra las reglas: si alguna se incumple responde 400 con una entrada por regla, cada una con su código y su mensaje. Si las cumple, construye el documento electrónico, lo firma y devuelve el XML como application/xml, no como JSON: la respuesta es el documento mismo y no un objeto que lo envuelva. El documento no se reporta, así que no gasta consecutivos y la prueba se puede repetir sin costo. A diferencia de la emisión, aquí solo se fuerza el ambiente: no se reemplazan emisor, receptor ni resolución, y la contrapartida es que el CUFE obtenido es el real solo si la resolución y su clave técnica son las verdaderas del emisor.

Generación de XML sin reportarRecorre el mismo camino de la emisión pero se detiene antes de la DIAN. Con el documento en JSON calcula el UUID que tendría —CUFE, CUDE o CUDS— y lo valida contra las reglas: si alguna se incumple responde 400 con una entrada por regla, cada una con su código y su mensaje. Si las cumple, construye el documento electrónico, lo firma y devuelve el XML como application/xml, no como JSON: la respuesta es el documento mismo y no un objeto que lo envuelva. El documento no se reporta, así que no gasta consecutivos y la prueba se puede repetir sin costo. A diferencia de la emisión, aquí solo se fuerza el ambiente: no se reemplazan emisor, receptor ni resolución, y la contrapartida es que el CUFE obtenido es el real solo si la resolución y su clave técnica son las verdaderas del emisor.NOSÍEl documento llega en JSONCalcula el UUID del documentoCUFE · CUDE · CUDS¿Cumple las reglas?400Una entrada por reglaincumplida, con su códigoDIAN y su código InSoftConstruye el documentoelectrónico y lo firma200El XML firmadono se reporta a la DIANapplication/xmlLEYENDAInicio y finPasoDecisiónError

Desliza el diagrama para verlo completo.

Ver la fuente Mermaid del diagrama
flowchart TD
    A(["El documento llega en JSON"]) --> D["Calcula el UUID del documento<br/>CUFE · CUDE · CUDS"]
    D --> F{"¿Cumple las reglas?"}
    F -- No --> G(["400 · una entrada por regla incumplida,<br/>con su código DIAN y su código InSoft"])
    F -- Sí --> H["Construye el documento electrónico<br/>y lo firma"]
    H --> J(["200 · el XML firmado, no se reporta a la DIAN<br/>application/xml"])

7 · Y que hace el sandbox con esto

Tres procesos son iguales para todas las funciones del portal, así que se explican una sola vez, aquí. El primero contesta por qué el documento que recibes de vuelta no es idéntico al que enviaste; el segundo, por qué un reenvío puede responder 409 con la regla 90 de la DIAN —y por qué ese 409 no es un fracaso, porque trae el documento adjunto—; el tercero, por qué una función puede responder 401 aunque tu JSON esté perfecto.

Lo que el sandbox fuerza sobre el documento

El ambiente es siempre el de habilitación. La identidad del emisor y del receptor pasa a ser la de la empresa de pruebas, mientras se conservan la ubicación, las responsabilidades fiscales y los datos de contacto, porque son el caso de prueba del desarrollador. La resolución se reemplaza siempre por la del sandbox —en una nota, por su prefijo de nota—, sin conservar nada de la que llegue. La numeración la asigna el sandbox solo cuando el número llega con el valor `<auto>`; cualquier otro valor viaja tal como se escribió. Todo lo demás viaja tal como se envió —ítems, tributos, descuentos, anticipos y totales— y con eso se reporta a la DIAN. La respuesta corta es una línea: se reemplaza quién emite, no qué se factura.

Lo que el sandbox fuerza sobre el documentoEl ambiente es siempre el de habilitación. La identidad del emisor y del receptor pasa a ser la de la empresa de pruebas, mientras se conservan la ubicación, las responsabilidades fiscales y los datos de contacto, porque son el caso de prueba del desarrollador. La resolución se reemplaza siempre por la del sandbox —en una nota, por su prefijo de nota—, sin conservar nada de la que llegue. La numeración la asigna el sandbox solo cuando el número llega con el valor `<auto>`; cualquier otro valor viaja tal como se escribió. Todo lo demás viaja tal como se envió —ítems, tributos, descuentos, anticipos y totales— y con eso se reporta a la DIAN. La respuesta corta es una línea: se reemplaza quién emite, no qué se factura.Documento que envíael desarrolladorAmbiente: siempre habilitaciónIdentidad del emisor y delreceptor: la de la empresade pruebasSe conservan ubicación,responsabilidades fiscalesy datos de contactoResolución y numeración:las del sandbox, si estánregistradasTodo lo demás viaja comose envió: ítems, tributos,descuentos y totalesSe reporta a la DIANLEYENDAInicio y finPaso
Ver la fuente Mermaid del diagrama
flowchart TD
    J(["Documento que envía el desarrollador"]) --> A["Ambiente: siempre habilitación"]
    A --> B["Identidad del emisor y del receptor:<br/>la de la empresa de pruebas"]
    B --> C["Se conservan ubicación, responsabilidades<br/>fiscales y datos de contacto"]
    C --> D["Resolución y numeración:<br/>las del sandbox, si están registradas"]
    D --> E["Todo lo demás viaja como se envió:<br/>ítems, tributos, descuentos y totales"]
    E --> F(["Se reporta a la DIAN"])
El documento ya reportado y la regla 90

La numeración es la llave: un documento se identifica por el emisor, el tipo, el ambiente y su número. Si esa numeración no se ha reportado, el envío sigue su curso normal. Si ya se reportó, se vuelve a calcular el UUID del documento —el CUFE, el CUDE o el CUDS— y se compara con el del que está guardado: si coincide, el documento es el mismo y la respuesta es 200 con el que ya se había reportado, sin duplicarlo ni gastar otro consecutivo. Si no coincide, es decir si cambió cualquier dato que entra en el UUID, la respuesta es 409 con la regla 90 de la DIAN: rechazo porque el documento ya había sido enviado previamente. El 409 no es un callejón sin salida: trae el documento adjunto en base64, que es la forma de recuperar lo que ya se emitió. La misma regla 90 la puede aplicar la DIAN por su cuenta, aunque el Proveedor Tecnológico no tenga registro del documento, y la respuesta es la misma. Dos casos que conviene anticipar: la nota de ajuste de nómina responde 409 en todo reenvío, y en el sandbox enviar el número en «auto» evita el choque, porque cada envío toma un consecutivo nuevo.

El documento ya reportado y la regla 90La numeración es la llave: un documento se identifica por el emisor, el tipo, el ambiente y su número. Si esa numeración no se ha reportado, el envío sigue su curso normal. Si ya se reportó, se vuelve a calcular el UUID del documento —el CUFE, el CUDE o el CUDS— y se compara con el del que está guardado: si coincide, el documento es el mismo y la respuesta es 200 con el que ya se había reportado, sin duplicarlo ni gastar otro consecutivo. Si no coincide, es decir si cambió cualquier dato que entra en el UUID, la respuesta es 409 con la regla 90 de la DIAN: rechazo porque el documento ya había sido enviado previamente. El 409 no es un callejón sin salida: trae el documento adjunto en base64, que es la forma de recuperar lo que ya se emitió. La misma regla 90 la puede aplicar la DIAN por su cuenta, aunque el Proveedor Tecnológico no tenga registro del documento, y la respuesta es la misma. Dos casos que conviene anticipar: la nota de ajuste de nómina responde 409 en todo reenvío, y en el sandbox enviar el número en «auto» evita el choque, porque cada envío toma un consecutivo nuevo.NOSÍSÍNOSe envía un documentocon una numeración¿Esa numeraciónya se reportó?Sigue el procesonormal de emisión¿El documento siguesiendo el mismo?200Devuelve el que ya sereportó, sin duplicarlo409Regla 90 · rechazo, yentrega el XML del documentoLEYENDAInicio y finDecisiónError

Desliza el diagrama para verlo completo.

Ver la fuente Mermaid del diagrama
flowchart TD
    A(["Se envía un documento<br/>con una numeración"]) --> B{"¿Esa numeración ya se reportó?"}
    B -- No --> S(["Sigue el proceso normal de emisión"])
    B -- Sí --> C{"¿El documento sigue siendo el mismo?"}
    C -- Sí --> D(["200 · devuelve el que ya se reportó,<br/>sin duplicarlo"])
    C -- No --> E(["409 · regla 90, rechazo, y entrega<br/>el XML del documento"])
Compuerta de autorización

Toda función del sandbox pasa por la misma verificación. Si no llega el encabezado Authorization responde 400. Si llega pero el token no es válido, responde 401. Con el token válido comprueba que el desarrollador tenga perfil registrado y activo: si no lo tiene responde 401, y el mensaje distingue las tres causas —cuenta sin correo, perfil inexistente y perfil suspendido— para que no haya que adivinar cuál es. Lo observable es que un token válido no alcanza: la identidad sale siempre del token, y nada de lo que se envíe en la ruta o en el cuerpo cambia de qué desarrollador se trata. En la etapa productiva la compuerta comprueba además dos cosas contra el documento que se envía, y las dos responden 401: que el NIT del emisor sea el autorizado en la credencial, y que el tipo de documento electrónico corresponda al servicio autorizado —facturación no emite nómina, y al revés—. En el sandbox esas dos no se alcanzan a ver, porque el emisor lo fuerza el propio sandbox.

Compuerta de autorizaciónToda función del sandbox pasa por la misma verificación. Si no llega el encabezado Authorization responde 400. Si llega pero el token no es válido, responde 401. Con el token válido comprueba que el desarrollador tenga perfil registrado y activo: si no lo tiene responde 401, y el mensaje distingue las tres causas —cuenta sin correo, perfil inexistente y perfil suspendido— para que no haya que adivinar cuál es. Lo observable es que un token válido no alcanza: la identidad sale siempre del token, y nada de lo que se envíe en la ruta o en el cuerpo cambia de qué desarrollador se trata. En la etapa productiva la compuerta comprueba además dos cosas contra el documento que se envía, y las dos responden 401: que el NIT del emisor sea el autorizado en la credencial, y que el tipo de documento electrónico corresponda al servicio autorizado —facturación no emite nómina, y al revés—. En el sandbox esas dos no se alcanzan a ver, porque el emisor lo fuerza el propio sandbox.NOSÍNOSÍNOSÍPetición del desarrolladorAuthorization: Bearer idToken¿Viene el token?400No se especificó el tokende autenticación¿El token es válido?401Token de autenticaciónno válido¿Perfil registradoy activo?401Perfil no registradoo suspendido, con el motivoen el mensaje200Autorizadocontinúa la operaciónLEYENDAInicio y finDecisiónError

Desliza el diagrama para verlo completo.

Ver la fuente Mermaid del diagrama
flowchart TD
    R(["Petición del desarrollador<br/>Authorization: Bearer idToken"]) --> T{"¿Viene el token?"}
    T -- No --> E1(["400 · No se especificó el token<br/>de autenticación"])
    T -- Sí --> F{"¿El token es válido?"}
    F -- No --> E2(["401 · Token de autenticación no válido"])
    F -- Sí --> Q{"¿Perfil registrado y activo?"}
    Q -- No --> E4(["401 · Perfil no registrado o suspendido,<br/>con el motivo en el mensaje"])
    Q -- Sí --> OK(["200 · Autorizado, continúa la operación"])

8 · Ahora si, a probar

El orden importa, y no por pedagogía: importa porque equivocarse cuesta distinto en cada función.

  1. Antes que nada: consultar las resoluciones del emisor → Es una lectura: no gasta consecutivos ni emite nada. Devuelve los rangos que la DIAN tiene autorizados con su prefijo, su vigencia y la clavetecnica, que es el dato con el que se calcula el CUFE. Sin él la generación del XML no se puede completar. Si ya sabes con cuál vas a numerar, la consulta puntual te refresca su vigencia y su clave.
  2. Después: generar el XML sin reportarlo → No gasta consecutivos, no llega a la DIAN y se puede repetir cuantas veces quieras. Devuelve las reglas incumplidas una por una y el XML firmado, para compararlo nodo por nodo con el que arma tu integración. Es donde sale barato equivocarse. Ojo: aquí la resolución completa y el consecutivo son obligatorios, porque esta función no numera ni registra resolución.
  3. Por último: enviar una factura electrónica de venta → Aquí el documento se reporta de verdad al ambiente de habilitación y la DIAN devuelve el CUFE. El sandbox pone la identidad de la empresa de pruebas, su resolución y el consecutivo, de modo que basta con dejar numerodocumento en <auto>. Con el CUFE que devuelva ya puedes probar las notas y los eventos.