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:
| 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.
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)