# Pagination

Paginated fields return a Relay-style **connection**. Every connection in the Archive API follows the same shape, so it is documented once here instead of on each field.

## Requesting pages

Pass `first` to set the page size and `after` with a cursor to fetch the next page. Read `pageInfo.hasNextPage` to know when to stop and `pageInfo.endCursor` as the next `after` value.

> **Rate limits** — The weighted rate-limit cost of a paginated field scales with the requested page size (`first`). Request only the page size you need.

## Connection fields

Select `nodes` for the records directly, or `edges` when you need the per-node `cursor`. The types below are shown for one representative connection; every connection substitutes its own node and edge types.

| Name | Type | Description |
| --- | --- | --- |
| `edges` | `[CampaignEdge!]!` | List of edges with cursors. |
| `nodes` | `[Campaign!]!` | List of campaigns. |
| `pageInfo` | `PageInfo!` | Pagination information. |
| `totalCount` | `Int` | Total number of items available. |

## PageInfo

| Name | Type | Description |
| --- | --- | --- |
| `endCursor` | `String` | Cursor for the last node in this page. |
| `hasNextPage` | `Boolean!` | Whether there are more results after this page. |
| `hasPreviousPage` | `Boolean!` | Whether there are results before this page. |
| `startCursor` | `String` | Cursor for the first node in this page. |

For a step-by-step walkthrough of the cursor loop, page bounds, and cost, see the [Pagination guide](/api/v2/docs/guides/pagination).
