Skip to main content
All list endpoints return the same envelope:
Request the next page by passing next_cursor back as cursor. When has_more is false, next_cursor is null and you have everything.
/accounts is the one list that does not page. It returns every account in one response and accepts neither limit nor cursor, but keeps the envelope above with has_more set to false, so code written for the paged endpoints works on it unchanged.

Parameters

Keep the filters identical between pages. A cursor is only valid for the query that produced it, and reusing it with different filters returns 400 invalid_cursor.

Ordering

Each resource has one fixed order. There is no sort parameter. Categories are the exception. They come back as the product’s own category screen reads: inflows before outflows, each root immediately followed by its children, siblings in position order. Keep the rows in the order you received them and the tree renders correctly without sorting.

Why cursors

Bank syncs insert transactions while you page. Offset pagination would skip or repeat rows in that case. The cursor is anchored to the last row you received, so a page never overlaps the previous one.

Counts

There is no total_count in the envelope. To count rows, page to the end. For aggregates, use the reporting features of ThinkOut itself.