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

> ## Agent Instructions
> Reconify's API reference is read-only for customer data. Do not invent endpoints or authentication behavior beyond the OpenAPI contract.
> The public OpenAPI document contains only the documented external /v2 contract.

# TypeScript pagination

> Iterate events and issues without handling cursors yourself.

List operations return one page and an opaque cursor. Pass the cursor as `after`
to get the next page.

| Parameter     | Meaning                                           |
| ------------- | ------------------------------------------------- |
| `limit`       | Records per page, 1 to 100. Defaults to 50.       |
| `after`       | Opaque cursor from the previous response.         |
| `next_cursor` | Present in the response while more records exist. |

## Iterate every record

`iterateEvents` and `iterateIssues` are async generators that follow the cursor
for you and stop when `next_cursor` is absent.

```ts theme={"theme":{"light":"github-light","dark":"github-dark"}}
for await (const issue of client.issues.iterateIssues({
  query: { status: "open", limit: 100 },
})) {
  console.log(issue.id, issue.category, issue.severity, issue.message);
}
```

```ts theme={"theme":{"light":"github-light","dark":"github-dark"}}
for await (const event of client.events.iterateEvents({ query: { limit: 100 } })) {
  console.log(event.id, event.event_type, event.status);
}
```

The iterators accept the same argument object as the underlying list operation,
minus `query.after`. The iterator owns the cursor, so setting it yourself is a
type error.

<Warning>
  These iterators walk the whole collection. Break out of the loop, or filter with
  `query.status`, when you only need recent records.
</Warning>

## Handle one page at a time

Call the list operation directly when you store the cursor between runs, for
example in a scheduled job.

```ts theme={"theme":{"light":"github-light","dark":"github-dark"}}
let after: string | undefined = await loadCursor();

const page = await client.events.listEvents({
  query: { limit: 100, ...(after ? { after } : {}) },
});

for (const event of page.events) {
  await process(event);
}

if (page.next_cursor) {
  await saveCursor(page.next_cursor);
}
```

Treat the cursor as opaque. Do not parse it, build it, or assume it stays valid
across contract versions.

## Issue evidence

`listIssueEvents` returns the events behind one issue and takes the same
pagination parameters.

```ts theme={"theme":{"light":"github-light","dark":"github-dark"}}
const evidence = await client.events.listIssueEvents({
  path: { issue_id: "00000000-0000-7000-8000-000000000001" },
  query: { limit: 50 },
});
```

Notes are not paginated. `listIssueNotes` returns every note on the issue.

## Next

Handle failures in [Errors and retries](/sdks/typescript/errors-and-retries).
