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

# Paginate and filter PanoFlow lists

> Page through PanoFlow list endpoints with cursor pagination (limit, after, before), filter with query parameters, and request a total count.

PanoFlow list endpoints use cursor pagination and return the newest items first. You page forward by passing the previous page's `next_cursor` as `after`.

```bash theme={null}
curl "https://api.panoflow.io/v1/transfers?limit=25&status=completed&created_gte=2026-10-01T00:00:00Z" \
  -H "Authorization: Bearer pk_live_..."
```

```json theme={null}
{ "object": "list", "data": [ ... ], "has_more": true, "next_cursor": "trf_01J..." }
```

## Parameters

| Parameter | Meaning |
| - | - |
| `limit` | Page size, 1 to 100. Default 25. |
| `after` | The `next_cursor` from the previous page. Returns older items. |
| `before` | A cursor for the reverse direction. Returns newer items. |
| `include=total_count` | Adds `total_count` to the response, on endpoints that offer it. Totals are not returned by default. |

## Filters

* Filters are plain query parameters, for example `status=completed`.
* Ranges use the `_gte` and `_lte` suffixes, for example `created_gte` and `created_lte`.
* Multiple values are comma-separated, for example `status=failed,reversed`.
* Free-text search, where an endpoint offers it, is `q`.

Each endpoint's filters are listed in the [API reference](https://docs.panoflow.io/api-reference/transfers/list-transfers.md).

## Read every page

```javascript Node.js theme={null}
async function listAll(path, apiKey) {
  const items = [];
  let after;
  do {
    const url = new URL(`https://api.panoflow.io/v1${path}`);
    url.searchParams.set("limit", "100");
    if (after) url.searchParams.set("after", after);
    const res = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
    const page = await res.json();
    items.push(...page.data);
    after = page.has_more ? page.next_cursor : undefined;
  } while (after);
  return items;
}
```

```python Python theme={null}
import requests

def list_all(path, api_key):
    items, after = [], None
    while True:
        params = {"limit": 100}
        if after:
            params["after"] = after
        page = requests.get(
            f"https://api.panoflow.io/v1{path}",
            params=params,
            headers={"Authorization": f"Bearer {api_key}"},
        ).json()
        items.extend(page["data"])
        if not page["has_more"]:
            return items
        after = page["next_cursor"]
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.