Saltar a contenido

Paginación

La mayoría de endpoints que devuelven listas soportan paginación mediante los parámetros limit y offset.

Parámetros

Parámetro Tipo Default Descripción
limit integer varía Número máximo de resultados por página
offset integer 0 Número de registros a saltar

Límites por endpoint

Endpoint Mínimo Máximo Default
GET /dags/{dag_id}/runs 1 100 20
GET /phases/{phase}/logs 1 500 50
GET /phases/{phase}/data 1 500 50
GET /phases/{phase}/errors 1 500 50

Estructura de respuesta paginada

Todos los endpoints paginados incluyen estos campos:

{
  "items": [...],
  "total": 1500,
  "limit": 50,
  "offset": 0,
  "has_more": true
}
Campo Descripción
total Total de registros que coinciden con los filtros, independientemente de la página
has_more true si existen más resultados a partir de offset + limit

Ejemplo: recorrer todas las páginas

# Página 1
curl "http://<host>:<port>/api/v1/dags/my-dag/runs/2026-05-01/run-id/phases/extract/logs?limit=50&offset=0" \
  -H "Authorization: Bearer <token>"

# Página 2
curl "http://<host>:<port>/api/v1/dags/my-dag/runs/2026-05-01/run-id/phases/extract/logs?limit=50&offset=50" \
  -H "Authorization: Bearer <token>"
import requests

headers = {"Authorization": f"Bearer {token}"}
base_url = "http://<host>:<port>/api/v1/dags/my-dag/runs/2026-05-01/run-id/phases/extract/logs"
all_logs = []
offset = 0
limit = 50

while True:
    response = requests.get(
        base_url,
        params={"limit": limit, "offset": offset},
        headers=headers,
    )
    data = response.json()
    all_logs.extend(data["items"])

    if not data["has_more"]:
        break
    offset += limit
const headers = { Authorization: `Bearer ${token}` };
const allLogs = [];
let offset = 0;
const limit = 50;

while (true) {
  const res = await fetch(
    `/api/v1/dags/my-dag/runs/2026-05-01/run-id/phases/extract/logs?limit=${limit}&offset=${offset}`,
    { headers }
  );
  const data = await res.json();
  allLogs.push(...data.items);

  if (!data.has_more) break;
  offset += limit;
}

Alternativa: stream

Para obtener todos los logs de una fase sin gestionar páginas, el endpoint GET /phases/{phase}/logs soporta streaming en formato NDJSON (JSON Lines). Envía el header Accept: application/x-ndjson en la petición.

Datasets grandes

El stream no aplica ningún límite de resultados. Consúmelo de forma incremental para evitar problemas de memoria.

curl "http://<host>:<port>/api/v1/dags/my-dag/runs/2026-05-01/run-id/phases/extract/logs?level=ERROR" \
  -H "Authorization: Bearer <token>" \
  -H "Accept: application/x-ndjson" \
  | while IFS= read -r line; do
      echo "$line"
    done
import json, requests

with requests.get(
    "http://<host>:<port>/api/v1/dags/my-dag/runs/2026-05-01/run-id/phases/extract/logs",
    params={"level": "ERROR"},
    headers={
        "Authorization": f"Bearer {token}",
        "Accept": "application/x-ndjson",
    },
    stream=True,
) as r:
    for line in r.iter_lines():
        if line:
            log = json.loads(line)
            print(log)