Ir al contenido

POST /api/documentos/documento/{id}/emitir/

POST /api/documentos/documento/{id}/emitir/

Lleva el documento a su estado final ante la DIAN.

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

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 el documento y la respuesta se pierde—, el documento queda firmado con su CUFE, y el reintento manda ese mismo CUFE. En una sola transacción la firma se desharía con el fallo, el reintento firmaría con otra hora y otro CUFE para el mismo número, y la DIAN, que ya tenía el primero, lo rechazaría. 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. Por eso no hay actualizar-estado/: el ERP llama a emitir/ hasta que el estado sea final.
  • aceptado y rechazado responden 400. El rechazado no se reemite: su detalle se lee con consultar/, y se borra y se crea 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: documentos_documento_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 documento electrónico.
Ventana de terminal
curl -X POST "https://api.rededoc.uk/api/documentos/documento/<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.
cufe_cudestringCUFE o CUDE del documento firmado.
{
"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",
"cufe_cude": "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.