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

# Pagination

> Collections are cursor paginated. Follow meta.next_cursor rather than counting pages.

Every endpoint that returns a list is paginated with a cursor. There are no page numbers, and asking for "page 3" is not something the API can answer.

## Reading a page

A collection response looks like this:

```json theme={null}
{
  "data": [
    { "id": "019fdf11-4bb2-7039-92c3-9e7f1ee711a1", "title": "Fall Festival" }
  ],
  "meta": {
    "next_cursor": "eyJpZCI6IjAxOWZkZjExIn0"
  }
}
```

`meta.next_cursor` is the whole mechanism. Pass it back as the `cursor` query parameter to get the next page:

```bash theme={null}
curl "https://api.signupbreeze.com/v1/events?cursor=eyJpZCI6IjAxOWZkZjExIn0" \
  --header "Authorization: Bearer YOUR_API_TOKEN"
```

When `next_cursor` is `null`, you have reached the end. That is the only reliable stop condition — a short page is not one.

## Fetching everything

```javascript theme={null}
async function allEvents(token) {
  const events = [];
  let cursor = null;

  do {
    const url = new URL("https://api.signupbreeze.com/v1/events");
    if (cursor) url.searchParams.set("cursor", cursor);

    const response = await fetch(url, {
      headers: { Authorization: `Bearer ${token}`, Accept: "application/json" },
    });
    const page = await response.json();

    events.push(...page.data);
    cursor = page.meta.next_cursor;
  } while (cursor);

  return events;
}
```

## Page size

Pages hold 25 records by default. Ask for fewer with `per_page`:

```
GET /v1/events?per_page=10
```

The maximum is 100. Ask for more and you get 100 — an integration that wants everything at once should follow cursors, not request a page large enough to time out.

## Why cursors

Cursor pagination stays correct while the data underneath is changing. With numbered pages, an event created while you are paging shifts every later record down one, and you either see something twice or miss it entirely. A cursor points at a position in the list rather than counting from the start, so that cannot happen.

The tradeoff is that you cannot jump to an arbitrary page or know the total count in advance. For the things this API returns, that has never been the useful question.

<Note>Treat a cursor as opaque. It is a token describing a position, not a record ID, and its format may change.</Note>
