Colas vía API
Las colas son el mecanismo de NORA para alimentar a tus robots con unidades de trabajo (items). Esta página documenta los endpoints públicos que te permiten encolar y consultar items de una cola desde tus sistemas (ERP, backend, scripts) usando una API Key, sin necesidad del token de un agente.
Si buscas la guía conceptual de colas, revisa Colas.
Autenticación y prefijo
Sección titulada «Autenticación y prefijo»- URL base de producción:
https://nora.valisoftconsulting.com - Prefijo de la API:
/api/v1 - Autenticación: cabecera
X-API-Key: nora_ak_...
Cada endpoint exige un scope concreto en la API Key. Consulta cómo crear y limitar claves en autenticación.
| Acción | Scope requerido |
|---|---|
| Encolar item(s) | queues:write (o una clave sin restricción de scopes) |
| Listar items | queues:read (o una clave sin restricción de scopes) |
Envoltura de respuesta
Sección titulada «Envoltura de respuesta»Todas las respuestas van envueltas. Las operaciones simples usan SuccessResponse:
{ "success": true, "data": { }}Los listados usan PaginatedResponse, que añade meta:
{ "success": true, "data": [ ], "meta": { "page": 1, "limit": 20, "total": 0, "pages": 0 }}Estados de un item de cola
Sección titulada «Estados de un item de cola»El campo status de cada item evoluciona durante su ciclo de vida. Los valores posibles son:
| Estado | Significado |
|---|---|
new | Recién encolado, aún sin tomar. Es el valor por defecto al crear. |
pending | En espera para ser procesado. |
processing | Tomado por un job en ejecución. |
completed | Procesado con éxito (con result opcional). |
failed | Falló su procesamiento (ver error_message, retry_count). |
review | Marcado para revisión humana. |
abandoned | Descartado sin completar. |
flowchart TD new --> pending --> processing processing --> completed processing --> failed processing --> review failed --> abandoned review --> completed
El número máximo de reintentos se define a nivel de cola (max_retries, entre 0 y 10; por defecto 3).
Encolar un item
Sección titulada «Encolar un item»POST /api/v1/queues/by-name/{name}/items- Scope:
queues:write - Límite de tasa: 60 solicitudes/minuto (por API Key, o por IP).
Cuerpo de la petición (AddQueueItemRequest):
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
data | objeto | Sí | Carga de negocio del item (JSON libre). |
priority | entero | No (3) | 1 = baja, 3 = normal, 5 = urgente. |
reference | string | null | No | Clave de negocio del productor; es buscable y se muestra en la lista. |
deadline | fecha-hora ISO 8601 | null | No | SLA: los items con deadline más cercano se despachan primero. |
postpone | fecha-hora ISO 8601 | null | No | El agente omite el item hasta que pase este momento. |
Ejemplo con curl:
curl -X POST \ "https://nora-api.valisoftconsulting.com/api/v1/queues/by-name/facturas/items" \ -H "X-API-Key: nora_ak_xxxxxxxxxxxxxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "data": { "factura_id": "F-2026-0042", "monto": 1280.50 }, "priority": 5, "reference": "F-2026-0042", "deadline": "2026-06-30T23:59:00Z" }'Respuesta 200:
{ "success": true, "data": { "id": "5b1c0a3e-2f4d-4a91-9c10-7e2f8c4d1a22", "queue_id": "0a9f7b2c-1d3e-4f56-8a7b-9c0d1e2f3a4b", "status": "new", "priority": 5, "reference": "F-2026-0042", "deadline": "2026-06-30T23:59:00Z", "postpone": null, "data": { "factura_id": "F-2026-0042", "monto": 1280.50 }, "result": null, "retry_count": 0, "error_message": null, "processed_by": null, "created_at": "2026-06-19T14:00:00Z", "processed_at": null, "reviewed_by": null, "reviewed_at": null }}Encolar items en lote (bulk)
Sección titulada «Encolar items en lote (bulk)»POST /api/v1/queues/by-name/{name}/items/bulk- Scope:
queues:write - Límite de tasa: 20 solicitudes/minuto (por API Key, o por IP).
- Máximo 1000 items por solicitud.
Cuerpo de la petición (BulkAddQueueItemsRequest):
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
items | lista de objetos | Sí | Cada objeto es la carga de negocio (data) de un item. |
Ejemplo con curl:
curl -X POST \ "https://nora-api.valisoftconsulting.com/api/v1/queues/by-name/facturas/items/bulk" \ -H "X-API-Key: nora_ak_xxxxxxxxxxxxxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "items": [ { "factura_id": "F-2026-0043", "monto": 90.00 }, { "factura_id": "F-2026-0044", "monto": 410.75 } ] }'Respuesta 200 (devuelve cuántos items se añadieron):
{ "success": true, "data": { "added": 2 }}Listar items de una cola
Sección titulada «Listar items de una cola»GET /api/v1/queues/by-name/{name}/items- Scope:
queues:read - Límite de tasa: 60 solicitudes/minuto (por API Key, o por IP).
Parámetros de consulta:
| Parámetro | Tipo | Por defecto | Restricciones |
|---|---|---|---|
page | entero | 1 | entre 1 y 500 |
limit | entero | 20 | entre 1 y 100 |
status | string | (todos) | uno de: new, pending, processing, completed, failed, review, abandoned |
Los items se devuelven ordenados por fecha de creación descendente (más recientes primero).
Ejemplo con curl (filtrando por estado):
curl -G \ "https://nora-api.valisoftconsulting.com/api/v1/queues/by-name/facturas/items" \ -H "X-API-Key: nora_ak_xxxxxxxxxxxxxxxxxxxxxxxx" \ --data-urlencode "status=completed" \ --data-urlencode "page=1" \ --data-urlencode "limit=50"Respuesta 200:
{ "success": true, "data": [ { "id": "5b1c0a3e-2f4d-4a91-9c10-7e2f8c4d1a22", "queue_id": "0a9f7b2c-1d3e-4f56-8a7b-9c0d1e2f3a4b", "status": "completed", "priority": 5, "reference": "F-2026-0042", "deadline": "2026-06-30T23:59:00Z", "postpone": null, "data": { "factura_id": "F-2026-0042", "monto": 1280.50 }, "result": { "estado": "registrada" }, "retry_count": 0, "error_message": null, "processed_by": "9d8c7b6a-5e4f-4321-8a90-0b1c2d3e4f5a", "created_at": "2026-06-19T14:00:00Z", "processed_at": "2026-06-19T14:05:00Z", "reviewed_by": null, "reviewed_at": null } ], "meta": { "page": 1, "limit": 50, "total": 1, "pages": 1 }}Ejemplo en Python
Sección titulada «Ejemplo en Python»import requests
BASE = "https://nora-api.valisoftconsulting.com/api/v1"HEADERS = {"X-API-Key": "nora_ak_xxxxxxxxxxxxxxxxxxxxxxxx"}
# Encolar un item con prioridad altaresp = requests.post( f"{BASE}/queues/by-name/facturas/items", headers=HEADERS, json={ "data": {"factura_id": "F-2026-0045", "monto": 75.0}, "priority": 5, "reference": "F-2026-0045", },)resp.raise_for_status()item = resp.json()["data"]print(item["id"], item["status"]) # ... new
# Listar los items pendientesresp = requests.get( f"{BASE}/queues/by-name/facturas/items", headers=HEADERS, params={"status": "pending", "limit": 100},)resp.raise_for_status()payload = resp.json()print(payload["meta"]["total"], "items pendientes")for it in payload["data"]: print(it["reference"], it["status"])Errores comunes
Sección titulada «Errores comunes»| Código | Causa |
|---|---|
401 | Falta la cabecera X-API-Key o la clave es inválida. |
403 | La clave no tiene el scope requerido (queues:read / queues:write). |
404 | No existe una cola con ese name en tu organización. |
422 | Cuerpo inválido (p. ej. más de 1000 items en bulk, o status no permitido). |
429 | Se superó el límite de tasa del endpoint. |
Siguientes pasos
Sección titulada «Siguientes pasos»- Consulta cómo procesan los robots estos items en Colas.
- Revisa scopes y gestión de claves en autenticación.