# Cursor-Based Pagination

## What is Cursor-Based Pagination?

Cursor-based pagination is a method to paginate large datasets by using a **cursor**, which serves as a reference point for fetching the next set of results.
Unlike offset-based pagination (which uses numeric indexes), cursor-based pagination ensures stable and consistent results, especially for datasets that might change frequently.

## How It Works in Our API

Our API uses a `cursor` parameter to represent the position in the dataset. You’ll pass this cursor to retrieve the next
set of results.

### Response format

Each paginated response includes:

- `data`: The actual results for the current page. Note that the name of this property is not fixed and can be named
differently according to the context (e.g.: `employees`, `orders`, `plannings`, ...)
- `cursors`: an object containing a cursor which can be used in subsequent calls.
  - `next`: The cursor for the next page. This cursor is not present when fetching data for the last page.


Example response body:

```json
{
  "data": [
    ...
  ],
  "cursors": {
    "next": "bmV4dF9fcGFnZQ"
  }
}
```

Older endpoints might still support more than the `next` cursor.
The `cursors` for their responses will contain:

- `self`: The cursor for this page. This cursor is not present when there are no items returned for the initial GET.
- `prev`: The cursor for the previous page. This cursor is not present when fetching data for the first page.
- `next`: The cursor for the next page. This cursor is not present when fetching data for the last page.


Example response body:

```json
{
  "data": [
    ...
  ],
  "cursors": {
    "self": "c2VsZl9fcGFnZQ",
    "prev": "cHJldmlvdXNfX3BhZ2U",
    "next": "bmV4dF9fcGFnZQ"
  }
}
```

### Passing the cursor

A cursor can be provided in subsequent calls via the `cursor` request parameter:

```http
GET /items?cursor=bmV4dF9fcGFnZQ
```

#### Examples

##### Fetching the first page

To fetch the first page of a collection of items, you don't need to provide any cursor.

```http
GET /items
```

##### Fetching the Next Page

To fetch the next page of results, use the `next` cursor from the response in your next request.

```http
GET /items?cursor=bmV4dF9fcGFnZQ
```

##### Fetching the Previous Page

To navigate back to the previous page, use the `prev` cursor (if provided).

```http
GET /items?cursor=cHJldmlvdXNfX3BhZ2U
```