> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.anthropod.in/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.anthropod.in/_mcp/server.

# Pagination

> Fetch a collection in bounded pages using an opaque cursor.

List endpoints return one page at a time. A cursor tells the API where to continue the same query. You get it from the response; you do not create it or pass a page number.

| Field                    | How to use it                                                                                                  |
| ------------------------ | -------------------------------------------------------------------------------------------------------------- |
| `limit`                  | Maximum records requested per page: 1–50, default 20.                                                          |
| `cursor`                 | Omit on the first request. On later requests, send the previous response's `pagination.next_cursor` unchanged. |
| `pagination.has_more`    | `true` means another page is available. Stop when it is `false`.                                               |
| `pagination.next_cursor` | The continuation token for the next request, or `null` when there are no more pages.                           |

## 1. Request the first page

Set `ANTHROPOD_API_KEY` to your private API key and replace `svc_demo_support` with your service ID. These examples select 1 September 2026 UTC. Use your required dates and keep them unchanged for subsequent pages.

```bash
curl --get 'https://anthropod.in/api/v2/conversation-analytics/conversations' \
  --header "Authorization: Bearer $ANTHROPOD_API_KEY" \
  --data-urlencode 'service_id=svc_demo_support' \
  --data-urlencode 'start_time=1788220800' \
  --data-urlencode 'end_time=1788307200' \
  --data-urlencode 'sort_order=desc' \
  --data-urlencode 'limit=20'
```

Read the records in `data`. When `pagination.has_more` is `true`, copy the complete string in `pagination.next_cursor`.

## 2. Request the next page

Replace the placeholder below with that actual token. Repeat the same endpoint, API key, filters, dates, and sort order, adding only `cursor`. `--data-urlencode` safely encodes the token in the URL.

```bash
NEXT_CURSOR='paste-the-pagination.next_cursor-value-here'

curl --get 'https://anthropod.in/api/v2/conversation-analytics/conversations' \
  --header "Authorization: Bearer $ANTHROPOD_API_KEY" \
  --data-urlencode 'service_id=svc_demo_support' \
  --data-urlencode 'start_time=1788220800' \
  --data-urlencode 'end_time=1788307200' \
  --data-urlencode 'sort_order=desc' \
  --data-urlencode 'limit=20' \
  --data-urlencode "cursor=$NEXT_CURSOR"
```

## 3. Continue until the last page

After each response, use its new `pagination.next_cursor` for the following request. Do not keep sending the token from the first response: that would fetch the same page again.

Stop when the response contains this pagination object (the final `data` array can still contain records):

```json
{
  "pagination": {
    "has_more": false,
    "next_cursor": null
  }
}
```

For a large CSV download, use [Exports](/v0/api-reference/exports/create-export) instead of collecting pages yourself.

## Date filters

Supply `start_time` and `end_time` as Unix epoch seconds. The start is inclusive and the end is exclusive; the range must be nonempty and no longer than 31 days. `time_field` is optional and defaults to the timestamp listed below for the requested resource. The same values apply inside `filters` when creating an export; export timestamps must be JSON integers.

Use the timestamp listed for each resource. `created_at`, `updated_at`, and `analysis_completed_at` are not supported filter values.

Earlier timestamp filters such as `conversation_time[gte]` / `conversation_time[lt]` remain accepted for compatibility, as do their corresponding export JSON objects. Do not combine those filters with `time_field`, `start_time`, or `end_time` in one request.

## Stable order

The four resource list GETs accept `sort_order=asc|desc`. The default is `desc` (newest first); `asc` returns oldest first. The timestamp used for ordering is also the timestamp used by the date-range filter.

| List                                 | Allowed `time_field` and default |
| ------------------------------------ | -------------------------------- |
| Conversation Analytics conversations | `conversation_time`              |
| Customer conversations               | `conversation_time`              |
| Customers                            | `last_interaction_at`            |
| Voice Agent conversations            | `conversation_time`              |

Records with equal timestamps are ordered by ID in the same direction. For example, ascending order uses `(timestamp ASC, id ASC)`.

```http
GET /api/v2/conversation-analytics/conversations?service_id=svc_demo_support&time_field=conversation_time&start_time=1788220800&end_time=1788307200&sort_order=asc&limit=20
```

Continue with the same `sort_order`, date range, and other filters. Switching direction with an existing cursor returns `400 INVALID_CURSOR`; omit the cursor to start a new query. Omitting `sort_order` is equivalent to sending `desc`.

Single-record GETs do not use pagination or accept sorting.

Treat a cursor as an opaque continuation value, not a page number or permanent synchronization checkpoint. It remains subject to authorization. A cursor from one query cannot be used with another query. Cursors expire after 15 minutes and are bound to the key, permissions, endpoint, filters, and sort order. An invalid or expired cursor returns 400 with `INVALID_CURSOR`; restart that bounded query.

## Changing data

Pagination is not a historical snapshot. New analysis and updated customer profiles can affect results while you read them. Persist records by ID, tolerate repeated records, and use bounded overlapping reads for reconciliation. These endpoints do not provide a complete update feed.