Paginación
Dos endpoints de listado, y los dos paginan igual: cursor opaco. Mismos query params, misma shape de respuesta, mismo loop — así que un solo helper compartido te sirve para ambos.
| Endpoint | Query params | limit por defecto |
|---|---|---|
GET /orders | cursor, limit | 20 |
GET /me/wallets/{currency}/transactions/{type} | cursor, limit | 10 |
En los dos, limit tiene un tope de 100.
El loop
Omites cursor en la primera llamada:
GET /orders?limit=20
{
"data": [ { "id": "0190f9b2-...", "status": "PENDING" } ],
"pagination": {
"next_cursor": "eyJjcmVhdGVkQXQiOiIyMDI2LTA4...",
"has_more": true,
"limit": 20,
"total": 359
}
}
Después pasas de vuelta el next_cursor anterior hasta que has_more sea
false. Cuando no queda nada, next_cursor viene en null.
GET /orders?limit=20&cursor=eyJpZCI6IjAxOTBmO...
Las transacciones de la wallet tienen exactamente la misma forma:
GET /me/wallets/USDR/transactions/top_up?limit=10
GET /me/wallets/USDR/transactions/top_up?cursor=eyJpZCI6IjAxOTBmO...
Cuatro reglas que impone el cursor
Trátalo como opaco. No lo parsees, no lo construyas, no lo guardes como
bookmark de larga vida. Su contenido es interno y puede cambiar sin aviso. Un
cursor ilegible o adulterado responde 400.
Un ?cursor= vacío NO es "empezar de nuevo". Es un cursor inválido y
responde 400. Para la primera página, omite el parámetro por completo.
El limit queda fijado en la primera llamada. Mientras mandas cursor,
cambiar el limit a mitad de camino saltaría o duplicaría filas, así que se
ignora. Decide el tamaño de página antes de arrancar.
Solo se avanza. No hay índice al que saltar, solo el cursor siguiente. Si
quieres ofrecer un "atrás", guarda los cursores que ya recorriste. total te da
el "de N" cuando viene, pero es nullable, así que no construyas una UI que se caiga
sin él.
Filtros
GET /orders también acepta status, type, idempotency_key, created_from
y created_to (fechas como 2026-07-01). status acepta una lista separada
por comas; type (tipo de transacción, ej. WALLET_TO_POG) acepta un
solo valor. Mantén los filtros idénticos en todas las llamadas del loop —
cambiarlos a mitad de camino invalida los supuestos del cursor, y de todos
modos idempotency_key es tan preciso que hace innecesario paginar (ver
idempotencia).
Firma
Los dos endpoints exigen request firmada, en modo query — y el cursor forma parte del query string que firmas, así que construye el mensaje con la URL que estás por enviar, no con la de la página anterior.