Ir al contenido

POST /api/nomina/nomina/{id}/emitir/

POST /api/nomina/nomina/{id}/emitir/

Lleva la nómina a su estado final ante la DIAN.

Antes eran dos acciones, emitir (firmar) y enviar, igual que en documentos; nadie firmaba sin enviar a continuación, y la segunda llamada solo sumaba un viaje.

El envío va al Set de Pruebas (SendTestSetAsync) mientras el emisor esté en habilitación de nómina, y por SendNominaSync después; lo decide el servicio, no el llamador.

Son dos transacciones, y a propósito. La firma se confirma antes de enviar: si el envío falla por red —o la DIAN recibe la nómina y la respuesta se pierde—, la nómina queda firmado con su CUNE, y el reintento manda ese mismo CUNE. En una sola transacción la firma se desharía con el fallo y el reintento firmaría con otra HoraGen y otro CUNE para el mismo número. Por eso un 502 aquí no pierde nada: se vuelve a llamar.

Según el estado:

  • borrador: se firma y se envía.
  • firmado —un intento anterior que no llegó a enviar—: solo se envía.
  • enviado —se envió sin veredicto, como en el Set de Pruebas—: se consulta y se aplica el resultado, sin reenviar. Pregunta por el ZipKey si salió al Set y por el CUNE si salió síncrona.
  • aceptado y rechazado responden 400. Un aceptado se corrige con una nota de ajuste; un rechazado —la nómina no se edita— se lee con consultar/, y se borra y se crea de nuevo corregido.

La consulta va con el mismo bloqueo que el envío, para que dos llamadas a la vez no apliquen el resultado dos veces.

operationId: nomina_nomina_emitir_create

Cualquiera de estas credenciales:

  • LlaveApi — Llave de API de una integración. El valor completo es Api-Key <prefijo>.<secreto>, tal como lo imprime manage.py crear_llave_api. La llave alcanza exactamente los mismos emisores que la persona a cuyo nombre se creó.
NombreEnTipoObligatorioDescripción
idpathstring (uuid)Un Cadena UUID que identifique este nómina electrónica.
Ventana de terminal
curl -X POST "https://api.rededoc.uk/api/nomina/nomina/<id>/emitir/" \
-H "Authorization: <llaveapi>"
CódigoDescripción
200
400
401Error
404Error
429Error
502
CampoTipoDescripción
estadostringEstado en el sistema tras la operación.
es_validobooleantrue si la DIAN lo dio por válido.
codigo_estadostringCódigo de estado de la DIAN (00 aceptado, 99 con errores…).
descripcionstringDescripción del estado según la DIAN.
erroresarray<string>Reglas de rechazo y notificaciones, tal como las devuelve la DIAN.
accionstringQué hizo esta llamada: enviado (firmó si hacía falta y envió) o consultado (estaba enviado sin veredicto: consultó y aplicó el resultado, sin reenviar).
track_idstringZipKey si salió al Set de Pruebas; identificador del envío si salió síncrono.
fecha_validacionstring (date-time)Cuándo lo validó la DIAN; nula mientras no. Admite null.
cunestringCUNE de la nómina firmada.
{
"estado": "texto",
"es_valido": true,
"codigo_estado": "texto",
"descripcion": "texto",
"errores": [
"texto"
],
"accion": "texto",
"track_id": "texto",
"fecha_validacion": "2026-01-31T10:00:00-05:00",
"cune": "texto"
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}

RedEDoc es un servicio de Semántica Digital S.A.S.