Consultar estado
El API expone cinco endpoints de consulta de solo lectura, uno por tipo de documento. Todos aceptan el identificador como UUID o external_ref y no tienen efectos secundarios (no cuentan como reintento ni disparan operaciones MH).
| Endpoint | Para consultar |
|---|---|
GET /status/{id_or_ref} | Facturas (01), CCF (03), Exportación (11), NC (05) |
GET /credit-memo/status/{id_or_ref} | Alias específico para NC (05) — devuelve info adicional del CCF ajustado |
GET /suex/status/{id_or_ref} | Sujeto Excluido (14) |
GET /invalidate/status/{id_or_ref} | Estado de invalidación de venta/CCF |
GET /invalidate/suex/status/{id_or_ref} | Estado de invalidación de SUEX |
Endpoint principal: /status/{id_or_ref}
El más usado. Sirve para cualquier documento de venta (incluyendo NC, aunque para NC el endpoint dedicado /credit-memo/status trae metadatos extra).
Detalles técnicos
| Método | GET |
| URL | https://ocote.io/api/connect/status/{id_or_ref} |
| Query params | include_dte (bool, default false) |
| Autenticación | Header Authorization: Bearer odt_... |
Query param include_dte
Por defecto el response no incluye el DTE firmado completo ni la respuesta cruda de MH — esos campos pueden ser varios KB y la mayoría de consultas (polling, conciliación) no los necesitan. Agrégalos explícitamente solo cuando los necesites:
GET /api/connect/status/VENTA-2026-0042?include_dte=1
Con include_dte=1, el response incluye dos campos adicionales:
schema(object) — el JSON firmado completo del DTE.response(object) — la respuesta cruda del MH (sello o estructura de rechazo).
Ejemplo
curl "https://ocote.io/api/connect/status/VENTA-2026-0042" \
-H "Authorization: Bearer odt_xxx"
const { data } = await axios.get(
'https://ocote.io/api/connect/status/VENTA-2026-0042',
{ headers: { Authorization: `Bearer ${process.env.OCOTE_API_KEY}` } }
);
r = requests.get(
"https://ocote.io/api/connect/status/VENTA-2026-0042",
headers={"Authorization": f"Bearer {API_KEY}"},
)
Response
{
"document_id": "a1b2c3d4-1234-5678-9abc-def012345678",
"external_ref": "VENTA-2026-0042",
"doc_type": "01",
"control_number": "DTE-01-M001P001-000000000000123",
"reception_stamp": "20260421154532...",
"success": true,
"posted": true,
"invalidated": false,
"customer_name": "Juan Pérez",
"created": "2026-04-21T10:42:00-06:00",
"posted_date": "2026-04-21T10:42:15-06:00",
"amount_taxable": 7.96,
"amount_vat": 1.04,
"amount_gross": 9.00,
"amount_retention": 0.00,
"amount_total": 9.00,
"amount": 9.00,
"amount_ret": 0.00,
"ticket_url": "https://ocote.io/api/connect/file/a1b2c3d4-.../...?type=ticket&key=odt_xxx",
"json_url": "https://ocote.io/api/connect/file/a1b2c3d4-.../...?type=json&key=odt_xxx",
"dte_success": true,
"contingency": false,
"rejected": false,
"dte_state": "",
"dte_message": "",
"observaciones": [],
"codigo_msg": ""
}
Ver Respuestas y estados para la semántica completa de cada flag.
Campos deprecados
amount y amount_ret son alias de amount_total y amount_retention respectivamente. Mantenidos por compatibilidad hacia atrás para clientes que ya consumen el endpoint. Para integraciones nuevas usa los nombres canónicos.
/credit-memo/status/{id_or_ref}
Dedicado a Notas de Crédito. El response incluye referencias al CCF que esta NC ajustó:
{
"document_id": "63e82935-9d98-43db-b2b8-bc669364885c",
"external_ref": "NC-ENLACES-TEST-001",
"doc_type": "05",
"control_number": "DTE-05-M001P002-000000000000001",
"reception_stamp": "20260421145823...",
"success": true,
"posted": true,
"ccf_document_id": "a1b2c3d4-1234-5678-9abc-def012345678",
"ccf_external_ref": "CCF-ENLACES-TEST-001",
"ccf_control_number": "DTE-03-M001P002-000000000000008",
"ccf_adjusted_amount": 339.00,
"ccf_fully_adjusted": false,
"amount_taxable": 300.00,
"amount_vat": 39.00,
"amount_gross": 339.00,
"amount_retention": 0.00,
"amount_total": 339.00,
"dte_success": true,
"contingency": false,
"rejected": false
}
Si consultas un CCF o una factura con /credit-memo/status/..., el API responde 404. El endpoint es específico para NC.
/suex/status/{id_or_ref}
Dedicado a Sujeto Excluido. Los campos de montos son distintos:
{
"document_id": "b2c3d4e5-...",
"external_ref": "SUEX-2026-0015",
"doc_type": "14",
"control_number": "DTE-14-M001P001-000000000000015",
"success": true,
"posted": true,
"invalidated": false,
"amount": 1500.00,
"amount_irs": 150.00,
"total_pay": 1350.00,
"suex_name": "Ana María González Rodríguez",
"created": "2026-04-21T10:42:15-06:00",
"posted_date": "2026-04-21T10:42:18-06:00",
"invoice_url": "https://ocote.io/api/v2/suex-history/b2c3d4e5-.../file?type=invoice",
"json_url": "https://ocote.io/api/v2/suex-history/b2c3d4e5-.../file?type=json",
"dte_success": true,
"contingency": false,
"rejected": false
}
Ver Sujeto Excluido (14) para el detalle de amount_irs (retención renta 10%) y total_pay (neto a transferir al sujeto).
Endpoints de estado de invalidación
Tras invalidar un documento, puedes consultar el estado de esa operación específica (distinta del estado general del documento).
/invalidate/status/{id_or_ref} (ventas)
Devuelve si la invalidación fue exitosa, si generó NC automática, y el estado MH de la invalidación.
curl "https://ocote.io/api/connect/invalidate/status/VENTA-2026-0042" \
-H "Authorization: Bearer odt_xxx"
Campos relevantes del response:
| Campo | Descripción |
|---|---|
invalidated | true si el documento fue marcado como invalidado. |
created_credit_memo | true si se generó NC automática (caso CCF fuera de ventana). |
credit_memo_id, credit_memo_control_number | IDs de la NC generada. |
dte_success | El MH aceptó la invalidación. |
contingency, rejected | Estado de la invalidación en MH. |
/invalidate/suex/status/{id_or_ref} (SUEX)
Misma estructura, sin el bloque de credit_memo_* (SUEX no usa NC).
Uso recomendado
- Tras emitir un documento exitosamente, no necesitas consultar — el response del POST ya trae todo.
- Para documentos en contingencia, polling cada hora es suficiente. Ver Contingencia > Polling responsable.
- Para conciliar documentos en tu BD contra Ocote, itera sobre tus
external_refy consulta cada uno — no hay endpoint batch. - No uses
/statuscomo reemplazo de tu BD. Persiste losdocument_id/external_reflocalmente; el API está para consultas puntuales, no para ser tu fuente de verdad primaria.
Ver también
- Respuestas y estados — flags maestros.
- Contingencia — patrón de polling para docs pendientes.
- Rate limits — las consultas cuentan contra el límite.
- Descargar archivos — para obtener ticket PDF y JSON firmado.