v1 · vista previa

Prueba con webhook firma, alert.created, location_withheld o 429.

↑ ↓ moverseIntro abrirEsc cerrar

Funcionamiento

Paginación

Las listas se recorren con limit y un cursor opaco: la respuesta trae next_cursor y se pasa como cursor.

En esta página

Las listas de la API (/v1/alerts, /v1/musters, /v1/workers, /v1/devices, /v1/events) se recorren con un cursor.

Cómo funciona

ParámetroQué es
limitElementos por página, de 1 a 500. Por defecto, 100.
cursorEl next_cursor de la página anterior. En la primera página, no se manda.

Cada respuesta trae la página en data y un next_cursor:

Respuesta
{
  "data": [ … ],
  "next_cursor": "eyJ0IjoiMjAyNi0wOS0yNFQxMTowNDoxMloifQ"
}

Para la página siguiente, repite la misma petición con los mismos filtros y cursor=<next_cursor>. Cuando next_cursor es null, no hay más.

Recorrer una lista entera

async function* todas(ruta, filtros = {}) {
  let cursor = null;
  do {
    const url = new URL(`https://sandbox.api.safeonuba.com${ruta}`);
    for (const [k, v] of Object.entries(filtros)) url.searchParams.set(k, v);
    url.searchParams.set('limit', '100');
    if (cursor) url.searchParams.set('cursor', cursor);

    const res = await fetch(url, { headers: { Authorization: `Bearer ${await tokenSafeOnuba()}` } });
    if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
    const pagina = await res.json();
    yield* pagina.data;
    cursor = pagina.next_cursor;
  } while (cursor);
}

for await (const alerta of todas('/v1/alerts', { status: 'unacknowledged' })) {
  console.log(alerta.id, alerta.title);
}

Orden de cada lista

  • /v1/alerts: de la más reciente a la más antigua.
  • /v1/events: del más antiguo al más reciente, en orden de publicación. Así se reproduce en el mismo orden en que se envió.

Lo que cuesta una página

Una página de 500 elementos cuenta más para tu límite de tiempo de consulta que una de 50 (ver Límites de uso). Pide lo que vas a usar.

Las listas cortas que no se paginan (/v1/sites, /v1/sites/{id}/zones, /v1/musters/{id}/missing, /v1/positions/latest, /v1/webhooks) devuelven todo en data, sin next_cursor.