Respuestas y estados
Esta página describe la semántica completa del response de los endpoints de emisión y consulta. Léela junto con Retry e idempotencia y Contingencia — los tres documentos forman el modelo mental del API.
Estructura general del response
Toda respuesta del API (HTTP 200) incluye estos campos maestros en el body:
{
"success": true,
"dte_success": true,
"contingency": false,
"rejected": false,
"posted": true,
"is_duplicate": false,
"document_id": "a1b2c3d4-1234-5678-9abc-def012345678",
"external_ref": "VENTA-2026-000042",
"control_number": "DTE-01-M001P001-000000000000123",
"generation_code": "A1B2C3D4-1234-5678-9ABC-DEF012345678",
"reception_stamp": "20260421154532...",
"dte_state": "",
"dte_message": "",
"observaciones": [],
"codigo_msg": "",
"ticket_url": "https://ocote.io/api/connect/file/...",
"invoice_url": "https://ocote.io/api/connect/file/...",
"json_url": "https://ocote.io/api/connect/file/..."
}
Los campos se agrupan en tres bloques:
- Flags de decisión — booleanos que indican qué pasó. Los usas para ramificar tu lógica.
- Identificadores — lo que necesitas para guardar el documento en tu sistema.
- Diagnóstico — información textual relevante solo cuando algo no salió perfecto.
Los seis flags que importan
success
La operación quedó registrada en Ocote. Esto incluye los casos felices (sello MH recibido) y los casos de contingencia (MH no respondió, pero el documento existe y se revalidará).
success: true significa que puedes marcar el documento como emitido desde tu lado. No significa necesariamente que el MH ya selló — para eso está dte_success.
dte_success
El MH devolvió sello de recepción. Esta es la única condición que garantiza validez fiscal inmediata.
dte_success: true implica success: true siempre. Lo contrario no.
contingency
El MH no respondió (timeout, caído, rechazó con error de infraestructura). El documento sí se creó en Ocote con correlativo asignado y sí se revalidará automáticamente cuando el MH vuelva.
Cuando contingency: true, también success: true y dte_success: false. Ver Contingencia.
rejected
El MH recibió el documento y lo rechazó por datos del receptor (email mal formado, NIT inválido, actividad económica inexistente, etc.). El documento existe en Ocote con correlativo asignado pero no tiene sello MH.
Cuando rejected: true, también success: false, dte_success: false, y observaciones contiene la lista de errores del MH. Debes corregir los datos y reintentar con el mismo external_ref.
posted
El documento tiene correlativo fiscal (control_number) asignado. Una vez posted: true, el control_number nunca cambia, aunque el documento se rechace y se reintente.
is_duplicate
El external_ref que enviaste ya existía y el documento anterior estaba en estado exitoso. El API te devuelve el documento ya emitido sin intentar reemitir.
is_duplicate: true es una señal de seguridad: tu retry llegó, todo está bien, el reception_stamp es el original. Ver Retry e idempotencia.
Tabla maestra: endpoints de emisión
Aplica a POST /invoice, POST /credit-memo y POST /suex.
| Escenario | HTTP | success | dte_success | contingency | rejected | dte_state | observaciones | Qué hacer |
|---|---|---|---|---|---|---|---|---|
| MH aceptó con sello | 200 | true | true | false | false | "" | [] | Éxito. Guardar y seguir. |
| MH no respondió | 200 | true | false | true | false | "" | [] | Guardar. Esperar revalidación automática. |
| MH rechazó por datos | 200 | false | false | false | true | "RECHAZADO" | [...] | Corregir datos, reintentar con mismo external_ref. |
| Duplicado devuelto | 200 | true | true | false | false | "" | [] | Idem primer caso. is_duplicate: true. |
| Validación local falló | 400 | — | — |