> ## Documentation Index
> Fetch the complete documentation index at: https://docs.planewallet.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Pagination and limits

> Read operation history without skipping or duplicating records.

## Operation history

`GET /api/v1/operations` returns:

```json theme={null}
{"data":[],"nextCursor":null}
```

A page contains at most 100 operations, ordered newest first by creation time and ID. Pass a non-null `nextCursor` as the URL-encoded `cursor` query parameter for the next page. Treat it as opaque.

```javascript theme={null}
let cursor;
do {
  const url = new URL('/api/v1/operations', process.env.PLANE_API_BASE);
  if (cursor) url.searchParams.set('cursor', cursor);
  const response = await fetch(url, {
    headers: { Authorization: `Bearer ${process.env.PLANE_API_KEY}` }
  });
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
  const page = await response.json();
  for (const operation of page.data) await storeOperation(operation);
  cursor = page.nextCursor;
} while (cursor);
```

Make `storeOperation` idempotent by operation ID. New operations can arrive during pagination; restart from the first page during the next synchronization pass.

Other list endpoints currently return their documented `data` array without this cursor contract. Do not send invented `page`, `limit`, or `offset` parameters.

## Request limits

The current application limit is 180 authenticated requests per minute per API key or user, per application process. Edge protections can reject requests earlier; this is not a guaranteed throughput commitment. On HTTP 429, pause and retry with backoff rather than rotating keys.

Idempotency keys must be non-empty and at most 128 characters. Amounts are decimal strings with at most two decimal places. Respect product-specific minimums, maximums, and steps from the catalog.
