Guías
Paginación y polling
Paginar con cursor
GET /tasks devuelve las tareas por páginas. Cada respuesta trae nextCursor; pásalo en la
siguiente petición para obtener la página que sigue:
curl -s "https://system.secretar-ia.org/api/v1/tasks?limit=50" \
-H "Authorization: Bearer $SECRETARIA_API_KEY"
# → { "data": [...], "nextCursor": "1765804800000:abc…" }
curl -s "https://system.secretar-ia.org/api/v1/tasks?limit=50&cursor=1765804800000:abc…" \
-H "Authorization: Bearer $SECRETARIA_API_KEY"limitva de 1 a 100; por defecto, 50.nextCursor: nullsignifica que no hay más páginas.- Trata el cursor como opaco: pásalo tal cual y no lo construyas tú.
- El orden es estable, por fecha de creación ascendente, y el cursor sigue siendo válido aunque se creen o borren tareas entre una página y otra.
Puedes combinar la paginación con los filtros status y projectId.
En Node, el recorrido completo queda así:
const base = 'https://system.secretar-ia.org/api/v1';
const headers = { Authorization: `Bearer ${process.env.SECRETARIA_API_KEY}` };
const tareas = [];
let cursor = null;
do {
const url = new URL(`${base}/tasks`);
url.searchParams.set('limit', '100');
if (cursor) url.searchParams.set('cursor', cursor);
const respuesta = await fetch(url, { headers });
if (!respuesta.ok) throw new Error(`HTTP ${respuesta.status}`);
const pagina = await respuesta.json();
tareas.push(...pagina.data);
cursor = pagina.nextCursor;
} while (cursor);Qué tareas aparecen
El listado incluye tus tareas y las de los proyectos compartidos en los que eres miembro. Las
operaciones por id (GET, PATCH y DELETE de /tasks/{id}) trabajan sobre esas mismas tareas.
GET /projects no pagina, porque la lista de proyectos de una persona es corta: su respuesta no lleva
nextCursor.
Polling con updatedAfter
Para sincronizar una integración (Zapier, Make, un cron), pide solo lo que cambió desde tu última
pasada con updatedAfter, un timestamp en milisegundos:
curl -s "https://system.secretar-ia.org/api/v1/tasks?updatedAfter=1765804800000" \
-H "Authorization: Bearer $SECRETARIA_API_KEY"El filtro es estricto (updatedAt > updatedAfter). Guarda el updatedAt más alto que hayas visto y
pásalo tal cual en la siguiente pasada: no le sumes ni le restes nada.
import os
import requests
BASE = "https://system.secretar-ia.org/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SECRETARIA_API_KEY']}"}
def cambios_desde(ultimo_updated_at):
cambios, cursor = [], None
while True:
params = {"updatedAfter": ultimo_updated_at, "limit": 100}
if cursor:
params["cursor"] = cursor
respuesta = requests.get(f"{BASE}/tasks", headers=HEADERS, params=params, timeout=10)
respuesta.raise_for_status()
pagina = respuesta.json()
cambios.extend(pagina["data"])
cursor = pagina["nextCursor"]
if not cursor:
break
nuevo = max((t["updatedAt"] for t in cambios), default=ultimo_updated_at)
return cambios, nuevoNota
No hay webhooks por ahora: el polling con updatedAfter es la forma de enterarte de los cambios.
Ajusta la frecuencia a los límites de uso.
Cuidado
Las tareas borradas desaparecen del listado: el polling no te avisa de los borrados. Si necesitas detectarlos, compara de vez en cuando el listado completo con lo que tienes guardado.