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 hayactualizar-estado/: el ERP llama aemitir/hasta que el estado sea final.aceptadoyrechazadoresponden 400. El rechazado no se reemite: su detalle se lee conconsultar/, 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
Autenticación
Sección titulada «Autenticación»Cualquiera de estas credenciales:
- LlaveApi — Llave de API de una integración. El valor completo es
Api-Key <prefijo>.<secreto>, tal como lo imprimemanage.py crear_llave_api. La llave alcanza exactamente los mismos emisores que la persona a cuyo nombre se creó.
Parámetros
Sección titulada «Parámetros»| Nombre | En | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id | path | string (uuid) | sí | Un Cadena UUID que identifique este documento electrónico. |
Ejemplo
Sección titulada «Ejemplo»curl -X POST "https://api.rededoc.uk/api/documentos/documento/<id>/emitir/" \ -H "Authorization: <llaveapi>"Respuestas
Sección titulada «Respuestas»| Código | Descripción |
|---|---|
200 | |
400 | |
401 | Error |
404 | Error |
429 | Error |
502 |
200 — cuerpo
Sección titulada «200 — cuerpo»| Campo | Tipo | Descripción |
|---|---|---|
estado | string | Estado en el sistema tras la operación. |
es_valido | boolean | true si la DIAN lo dio por válido. |
codigo_estado | string | Código de estado de la DIAN (00 aceptado, 99 con errores…). |
descripcion | string | Descripción del estado según la DIAN. |
errores | array<string> | Reglas de rechazo y notificaciones, tal como las devuelve la DIAN. |
accion | string | Qué 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_id | string | ZipKey si salió al Set de Pruebas; identificador del envío si salió síncrono. |
fecha_validacion | string (date-time) | Cuándo lo validó la DIAN; nula mientras no. Admite null. |
cufe_cude | string | CUFE 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"}400 — cuerpo
Sección titulada «400 — cuerpo»| Campo | Tipo | Descripción |
|---|---|---|
detail | string | Mensaje para mostrar a la persona. |
errores | array<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" } ]}401 — cuerpo
Sección titulada «401 — cuerpo»| Campo | Tipo | Descripción |
|---|---|---|
detail | string | Mensaje para mostrar a la persona. |
errores | array<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" } ]}404 — cuerpo
Sección titulada «404 — cuerpo»| Campo | Tipo | Descripción |
|---|---|---|
detail | string | Mensaje para mostrar a la persona. |
errores | array<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" } ]}429 — cuerpo
Sección titulada «429 — cuerpo»| Campo | Tipo | Descripción |
|---|---|---|
detail | string | Mensaje para mostrar a la persona. |
errores | array<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" } ]}502 — cuerpo
Sección titulada «502 — cuerpo»| Campo | Tipo | Descripción |
|---|---|---|
detail | string | Mensaje para mostrar a la persona. |
errores | array<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.