Source: https://dinakar-pageloop-knowledge-base.docs-staging.pageloop.ai/api-reference/list-events

# List events

# List events

GET `/v1/events`

Returns events in reverse chronological order, newest first.

## Query parameters

#### type (query, string)

Exact event type, or a trailing-segment wildcard such as `invoice.*`.

#### streamKey (query, string)

Return only events published with this ordering key.

#### since (query, string)

RFC 3339 timestamp. Events created strictly after this instant.

#### until (query, string)

RFC 3339 timestamp. Events created at or before this instant.

#### limit (query, integer)

Between 1 and 100.

#### cursor (query, string)

Opaque cursor from a previous response's `nextCursor`.

## Pagination

Kestrel uses cursor pagination. Keep calling until `nextCursor` is `null`.

```js
let cursor = undefined;
const all = [];

do {
  const page = await kestrel.events.list({ type: 'invoice.*', limit: 100, cursor });
  all.push(...page.data);
  cursor = page.nextCursor;
} while (cursor);
```

> [!WARNING]
>
> Cursors expire after **1 hour**. A stale cursor returns `400 cursor_expired` — restart
> the walk from the beginning rather than retrying the same cursor.

## Response

```json
{
  "data": [
    {
      "id": "evt_01HZX9K2QW",
      "type": "invoice.paid",
      "streamKey": "customer_9f2a",
      "createdAt": "2026-08-24T09:14:22.481Z",
      "apiVersion": "2026-06-01",
      "payload": { "invoiceId": "in_1024", "amountCents": 4900, "currency": "usd" }
    }
  ],
  "nextCursor": "ZXZ0XzAxSFpYOUsyUVc",
  "hasMore": true
}
```

> [!INFO]
>
> Events outside your plan's retention window are not returned and are not counted in
> `hasMore`. See [Limits and quotas](/reference/limits-and-quotas).

## Rate limit

Read endpoints share a **600 requests per minute** budget, separate from the publish
budget. Exceeding it returns `429` with a `Retry-After` header in seconds.
