Pagination
Walk every list endpoint with limit and cursor.
List endpoints return { data, has_more, next_cursor }. Pass limit for the page size, 25 by default and up to 100, and pass next_cursor back as cursor for the next page.
A cursor only works with the list and filters it came from. If it doesn't match, or isn't one the API gave you, the request returns 400 invalid_request with field: "cursor", so start again without it.
GET /links?limit=1200 OK
{ "data": [ { "id": "lnk_nt842tPNne3lf0ka", "kind": "link", "code": "v6e4mrczwg", "url": "https://checkout.402pay.co/checkout/v6e4mrczwg", "name": "Team plan, monthly", "description": "Everything in Pro for up to 10 people.", "amount": 19900, "currency": "USD", "success_url": null, "status": "active", "disabled_at": null, "payments_count": 0, "volume": { "amount": 0, "currency": "USD" }, "created_at": "2026-09-26T21:22:46.992Z", "updated_at": "2026-09-26T21:22:46.992Z" } ], "has_more": true, "next_cursor": "lnk_nt842tPNne3lf0ka"}Every pageNode.js
// Walks every page of a list, 100 at a time.async function* listAll(path) { let cursor = null; do { const url = new URL(`https://dash.402pay.co/api/v1${path}`); url.searchParams.set("limit", "100"); if (cursor) url.searchParams.set("cursor", cursor); const response = await fetch(url, { headers: { Authorization: `Bearer ${process.env.PAY402_SECRET_KEY}` }, }); const page = await response.json(); yield* page.data; cursor = page.has_more ? page.next_cursor : null; } while (cursor);} for await (const payment of listAll("/payments?status=succeeded")) { console.log(payment.id, payment.amount);}