Paginación
Las lecturas, el clima y los riegos vienen por páginas con un cursor opaco. Repite la misma consulta agregando el cursor hasta que venga null.
Cómo funciona
Las rutas paginadas (/lecturas, /estaciones/{estacionId}/clima y /campos/{campoId}/riegos) responden:
{
"data": [ … hasta `limite` filas … ],
"paginacion": { "siguienteCursor": "eyJwIjo1MDAs…" }
}
Para la página siguiente, repite exactamente la misma consulta (mismos parámetros) agregando cursor=<siguienteCursor>. Cuando siguienteCursor es null, no hay más filas.
GET /lecturas?sectorId=…&tipoSensor=Soil%20Moisture&desde=…&hasta=…&limite=1000
GET /lecturas?sectorId=…&tipoSensor=Soil%20Moisture&desde=…&hasta=…&limite=1000&cursor=eyJwIjo1MDAs…
Parámetros
| Parámetro | Valores | Notas |
|---|---|---|
limite | 1 a 1000 (500 por defecto) | Filas por página. Usa 1000 para gastar menos peticiones. |
cursor | el siguienteCursor de la página anterior | Opaco: no lo construyas ni lo modifiques. |
Reglas del cursor
- El cursor está firmado y atado a la consulta y a la llave: si cambias algún parámetro, lo usas con otra llave o lo alteras, la API responde
400 parametros_invalidos. Empieza de nuevo sin cursor. - Si pediste un
hastaen el futuro, las páginas siguientes mantienen el mismohastaefectivo (recortado al momento de la primera página), así todas las páginas ven el mismo conjunto de datos. - El orden es estable: lecturas y clima por fecha, hora, tipo de sensor y profundidad; riegos por inicio.
- Un cursor no caduca por tiempo, pero conviene recorrer todas las páginas seguidas: el resultado se calcula con los datos del momento.
Ejemplo completo (Python)
import requests
BASE = "https://api.cdtecif.cl/v1"
H = {"X-Api-Key": LLAVE}
params = {
"sectorId": sector_id, "tipoSensor": "Soil Moisture", "granularidad": "hora",
"desde": "2026-10-01T00:00:00-03:00", "hasta": "2026-10-08T00:00:00-03:00", "limite": 1000,
}
filas = []
while True:
r = requests.get(f"{BASE}/lecturas", headers=H, params=params, timeout=30)
r.raise_for_status()
cuerpo = r.json()
filas.extend(cuerpo["data"])
cursor = cuerpo.get("paginacion", {}).get("siguienteCursor")
if not cursor:
break
params["cursor"] = cursor
print(len(filas), "filas")