Generar el XML sin reportarlo

Construye y firma el XML de un documento de nómina o de su nota de ajuste, sin enviarlo a la DIAN.

PATCH /api/xmlNE

Es la ruta de la función, y no cambia entre ambientes. La URL base con la que la ejecutas aquí es la del sandbox. Es la URL del sandbox y no corresponde a la etapa productiva de la integración. La URL base de producción se te entrega al adquirir el servicio.

¿Es tu primer contacto con esta parte de la plataforma? Empieza por Nómina electrónica, donde se explica qué documentos existen, cómo se arma el JSON y qué valida el servidor antes de que ejecutes nada.

Genera el documento de nómina firmado y se detiene antes de reportarlo. La respuesta es el XML, con Content-Type: application/xml.

Es por donde conviene empezar a integrar nómina: no gasta consecutivos y no deja nada registrado en la DIAN, así que se puede repetir cuantas veces haga falta para comparar el XML propio con el que arma el PT, y para ver el CUNE que tendría el documento. Atiende los tres documentos del grupo — el tddocumentoelectronico, junto con el tdnota en las notas, decide cuál se genera.

Cómo resuelve el sandbox esta función

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"])

Datos que recibe

Encabezado

DatoTipoDescripción
Authorization*string

Credencial de la petición, con el prefijo Bearer. En el sandbox la pone el portal por ti y la renueva antes de cada ejecución; en producción la controlas tú, con el JWT que genera tu integración a partir de sus credenciales — ver Credenciales y JWT.

Ejemplo:Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6...

Cuerpo

DatoTipoDescripción
resolucion*TResolucion

Resolución con la que se numera. Aquí es obligatoria —al menos su prefijo—, a diferencia del envío, donde el sandbox asigna la suya. La DIAN no exige resolución de nómina en habilitación, así que el prefijo puede ser el tuyo.

Ejemplo:NEX

tddocumentoelectronico*string

Tipo de documento de nómina.

Ver los 2 valores admitidos
  • 102 · Documento soporte de pago de nómina electrónica
  • 103 · Nota de ajuste de nómina electrónica
numerodocumento*string

Número completo del documento: prefijo de la resolución más consecutivo. Aquí es obligatorio y no hay numeración automática, porque esta función no numera: el consecutivo lo pone el desarrollador y el PT lo deriva del número menos el prefijo.

Ejemplo:NEX1

fechadocumentodate-time

Fecha y hora de generación del documento. Es opcional: si no la envías, el PT le asigna la de ahora, el momento en que recibe el documento, y es lo que hacen los ejemplos. Si la envías, va en ISO 8601 con zona (2026-08-31T18:00:00-05:00).

Ejemplo:2026-08-31T18:00:00-05:00

empleador*TTercero

Empresa que paga la nómina. En el sandbox su identidad se reemplaza por la de la empresa de pruebas.

trabajador*TTrabajador

Empleado al que se le paga. El sandbox no lo reemplaza: es el dato que se controla por completo en la prueba.

trabajador.tdtrabajador*string

Tipo de trabajador según el catálogo de la DIAN.

Ver los 6 valores admitidos
  • 01 · Dependiente
  • 02 · Servicio domestico
  • 04 · Madre comunitaria
  • 12 · Aprendiz del SENA en etapa lectiva
  • 19 · Aprendiz del SENA en etapa productiva
  • 51 · Trabajador de tiempo parcial
trabajador.tdcontrato*number

Tipo de contrato laboral.

Ver los 5 valores admitidos
  • 1 · Termino fijo
  • 2 · Termino indefinido
  • 3 · Obra o labor
  • 4 · Aprendizaje
  • 5 · Practicas o pasantias
trabajador.baltoriesgoboolean

Indica si el trabajador está afiliado a pensión de alto riesgo.

trabajador.bsalariointegralboolean

Indica si devenga salario integral. Cambia la base de aportes que valida la DIAN.

periodoliquidar*TPeriodo

Rango del periodo liquidado, con fechainicial y fechafinal en ISO 8601.

periodocontrato*TPeriodo

Vigencia del contrato, en ISO 8601. fechainicial es obligatoria; fechafinal es la fecha de retiro, y en el XML sale como FechaRetiro. Los ejemplos publican un contrato vigente con una fecha lejana (2099-01-01), de modo que cubra todo el periodo que liquidan; si el trabajador sigue activo también puedes omitirla, y entonces el documento va sin fecha de retiro.

qdiaslaborados*number

Días efectivamente laborados en el periodo.

Ejemplo:30

tdperiodo*number

Periodicidad del pago.

Ver los 6 valores admitidos
  • 1 · Semanal
  • 2 · Decenal
  • 3 · Catorcenal
  • 4 · Quincenal
  • 5 · Mensual
  • 6 · Otro
lugargeneracion*TUbicacion

Municipio donde se genera el documento, con su código de municipio (17001) y de departamento (17).

pago*TPago

Forma y medio de pago, cuenta destino y las fechas en que se paga.

devengos*TDevengos

Conceptos que suman al pago. Cada concepto es un arreglo, porque puede ocurrir varias veces en el periodo. basico es obligatorio. Las siete clases de hora extra y recargo llevan el bloque horario: fechainicial y fechafinal, en ISO 8601 con zona, que en el XML salen como HoraInicio y HoraFin de cada HED, HEN, HRN, HEDDF, HRDDF, HENDF y HRNDF. Lo mismo vale para las novedades que ocupan un rango —licencias, incapacidades y vacaciones—.

Ver los 9 valores admitidos
  • basico · Salario del periodo — `cantidad` en días y `valor`
  • auxiliotransporte · Auxilio de transporte
  • hed / hen / hrn · Horas extra diurnas, nocturnas y recargo nocturno — cada bloque con `fechainicial` y `fechafinal`
  • heddf / hrddf / hendf / hrndf · Horas extra y recargos en dominical o festivo — también con `fechainicial` y `fechafinal`
  • vacacionescomunes / vacacionescompensadas · Vacaciones disfrutadas y compensadas
  • primas / cesantias / interesescesantias · Prestaciones sociales
  • incapacidades / licenciamp / licenciar / licencianr · Novedades del periodo
  • bonificacions / bonificacionns · Bonificaciones salariales y no salariales
  • conceptos / conceptons · Conceptos libres, salariales y no salariales
deducciones*TDeducciones

Conceptos que se descuentan del pago. Misma estructura de arreglos por concepto.

Ver los 7 valores admitidos
  • salud · Aporte a salud — `porcentaje` y `valor`
  • fondopension · Aporte a pensión
  • fondossolidaridad / fondossubsistencia · Fondo de solidaridad pensional
  • retencionfuente · Retención en la fuente
  • libranzas / anticipos / deuda · Descuentos autorizados por el trabajador
  • sindicatos / cooperativa / afc · Aportes voluntarios
  • otrasdeducciones · Otras deducciones
notasArray<string>

Observaciones libres del documento.

tdnotanumber

Tipo de ajuste que se reporta sobre el documento referenciado.

Ver los 2 valores admitidos
  • 1 · Reemplazar — corrige el documento con la liquidación correcta
  • 2 · Eliminar — anula el documento sin reemplazarlo
docreferenciaTDocumentoElectronico

Documento de nómina al que aplica la nota, con su numerodocumento, su fechadocumento —en ISO 8601— y su uuid. El uuid es el CUNE que la DIAN calculó al reportar ese documento, no un dato que se escriba: lo entrega la respuesta del envío. Por eso el ejemplo no trae uno: lleva un marcador que hay que reemplazar. Primero envía una nómina electrónica, copia el CUNE de su respuesta y pégalo aquí.

Lo que el sandbox fuerza

El sandbox firma con las credenciales de habilitación, compartidas por todos los desarrolladores. Lo que envíes en estos campos no se usa: se sustituye antes de construir el documento. Todo lo demás viaja tal como lo dejes.

  • tdambiente
    2 — Pruebas (habilitación)

    El XML se firma con las credenciales de habilitación del sandbox. Un documento marcado como de producción firmado con esas credenciales sería inválido, de modo que el ambiente se fuerza antes de construirlo.

Ejecutar la función

Ambiente de habilitación de la DIAN · el XML se firma pero no se reporta, no gasta consecutivos

Lo que se envía

El mismo documento del envío, con la numeración que esta función exige: al generar el XML el empleador y el trabajador viajan tal como los envíes, sin reemplazo.

Documento que se envía — editalo para armar tu caso de prueba
Se enviara PATCH https://proveedortecnologico-sandbox.azurewebsites.net/api/xmlNE

Es la URL del sandbox y no corresponde a la etapa productiva de la integración. La URL base de producción se te entrega al adquirir el servicio. Lo que si es igual en los dos es la ruta.

Respuesta

Aquí queda tu ejecución: la ruta que viajó, el cuerpo que enviaste, el código con el que respondió el sandbox y el tiempo discriminado. Un error también queda: es lo que se necesita junto al cuerpo que lo produjo.

Exportar a Postman

Descarga esta función como colección de Postman, con los valores que tienes ahora en la barra y tu credencial vigente: se importa y se envía sin configurar nada.

Respuestas

  • 200 El cuerpo es el XML firmado del documento, con Content-Type: application/xml. No viene envuelto en la estructura estándar del PT.
  • 400 El documento no paso la verificación. En respuesta.errores viaja un elemento por regla incumplida, con codigodian, codigoinsoft y mensaje.
  • 401 La credencial no llegó, ya venció, o la cuenta no tiene perfil registrado en el sandbox. En producción es además el código con el que se rechaza un emisor que la credencial no tiene autorizado — ver Credenciales y JWT.
  • 500 Falla al firmar el documento.

Errores frecuentes

  • 400 El documento electrónico no ha pasado el proceso de verificación

    Es la respuesta de toda regla incumplida. A diferencia del envío, aquí el detalle viene desglosado: cada error trae el código de la regla de la DIAN, el código interno de InSoft y la descripción de que corregir.

  • 401 El desarrollador autenticado no tiene un perfil registrado en el sandbox

    La cuenta se autenticó pero nunca completó el registro de desarrollador. Se resuelve diligenciando el perfil desde el portal.

Ten en cuenta

  • Esta función no reemplaza nada del documento salvo el ambiente. El empleador viaja tal como lo envíes, a diferencia del envío, que lo sustituye por la empresa de pruebas. Es lo que la hace útil para comparar tu XML con el del Proveedor Tecnológico.
  • El XML se firma con las credenciales de habilitación del sandbox, comunes a todos los desarrolladores. En producción se firma con las del empleador real, que administra el Proveedor Tecnológico.
  • En producción la ruta es una sola, PATCH /api/xml. El tipo de documento del cuerpo es el que decide qué se genera, igual que aquí.
  • El XML se genera en UTF-8, y así lo declara el propio documento en su primera línea. Léelo y guárdalo con esa codificación: interpretado con otra, cada tilde y cada ñ se convierten en dos caracteres raros y la firma deja de validar.
  • El trabajador no se reemplaza. Es una persona natural que define el desarrollador como parte de su caso de prueba, y la DIAN no lo valida contra la empresa habilitada.
  • La resolución de nómina tampoco se fuerza: la DIAN no la exige en el ambiente de habilitación.
  • Los devengos y las deducciones viajan sin modificación. Ahí es donde se prueba de verdad la liquidación.
  • El sandbox emite con una integración compartida por todos los desarrolladores. El token con el que se reporta a la DIAN lo abre el propio servicio y nunca sale hacia el navegador.