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

# Collections and pagination

> Response envelope, cursor pagination, and data conventions for the canonical API

## Response envelope

Canonical collection endpoints return a standard envelope:

```json theme={null}
{
  "organizationId": "org_example",
  "filters": {
    "active": true
  },
  "data": [],
  "pagination": {
    "limit": 100,
    "hasMore": false,
    "nextCursor": null
  }
}
```

* **`organizationId`** — the organization bound to your API key. You cannot supply or override it.
* **`filters`** — the filter values the server applied, including nulls for filters you did not pass.
* **`data`** — the page of results.
* **`pagination`** — paging state for the next request.

## Cursor pagination

`limit` defaults to `100` and is capped at `500` (the links collection is capped at `100`). Invalid limit values fall back to `100`.

When `pagination.hasMore` is `true`, pass `pagination.nextCursor` back as the `cursor` query parameter to fetch the next page:

```bash theme={null}
curl --get "https://app.nautilus.co/api/v1/products" \
  --header "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "cursor=eyJpZCI6..."
```

Cursors are opaque and bound to the endpoint that issued them. Nested-resource and sorted-link cursors are additionally bound to their parent resource or sort order. Reusing a cursor on another endpoint returns `400`.

## Data conventions

* **Timestamps** are UTC ISO 8601 values. Timestamp filters such as `createdAfter` require an explicit offset, for example `2026-07-01T00:00:00Z`.
* **Money** fields ending in `Cents` are integer cents.
* **Codes** — voucher and purchase fulfillment codes are excluded by default because they grant value. Pass `includeCodes=true` to include them.
* **Purchase IDs** are stable encrypted public identifiers. They never contain the underlying payment-processor identifier.

## Errors

Errors use a stable JSON body:

```json theme={null}
{
  "error": "Not found"
}
```

| Status | Meaning                                                                                           |
| ------ | ------------------------------------------------------------------------------------------------- |
| `400`  | Invalid filter, cursor, or limit, or the resource is unavailable for your organization's provider |
| `401`  | Missing or invalid API key                                                                        |
| `404`  | Missing, unsupported, or cross-tenant detail resource                                             |
| `500`  | Internal failure; no internal exception data is exposed                                           |
| `502`  | Required upstream service unavailable (currently used by link resources)                          |

Detail endpoints return `404` for both missing and cross-tenant IDs, so resource existence is never disclosed across organizations.
