Skip to main content
List endpoints return a page of results, not the whole set. Each response carries an opaque next_cursor and a has_more flag. To read everything, pass next_cursor back as the cursor query param and repeat until has_more is false.
This applies to every list endpoint: GET /clients, GET /clients/{id}/connections, GET /accounts, GET /accounts/{id}/transactions, GET /accounts/{id}/statements, GET /accounts/{id}/checks, and GET /webhooks/subscriptions.

The response envelope

Request params

The cursor is opaque — don’t parse or construct it. It is also scoped to the exact query it was minted for: reusing a cursor from one account (or a different date window / filter) against another returns 400 invalid_request.

Loop until done

Python

Ordering and stability

Transactions are returned most-recently-recorded first (by internal sequence), which is stable and complete for paging through the whole set. It is not a strict chronological sort — to bound results by transaction date, use the from and to query params (they combine with pagination).
A transaction can change after you first see it (for example, a pending charge later posts). If you re-page a set while it’s being refreshed, a changed row may appear again on a later pull. Always dedupe on the item id — it’s stable and unique, and cheap insurance for any sync loop.
The cursor uses keyset (seek) pagination, so it stays correct even as rows are added or removed between pages — you won’t skip or double-count the remaining items.