# List a connection's webhook events

> The processor_connections.events.list operation: GET /api/v1/processor_connections/{id}/events in the REST API and the processor_connections_events_list tool in the MCP server.

Lists the verified webhook events a processor connection received, newest first: the processor's event ID and
type, what Ownrecord made of it (`normalizedKind`), its status (`pending`, `processed`, `failed` with the
error) and the handlers that ran. Events with a bad signature are refused at the door and never listed. The
processor's payload isn't returned. Paginate with `limit` and `starting_after`.

## At a glance

- **REST:** `GET /api/v1/processor_connections/{id}/events`
- **MCP tool:** `processor_connections_events_list`
- **Operation ID:** `processor_connections.events.list`
- **Scope:** Legal entity
- **Permission:** `processors:read`
- **Risk tier:** `read`
- **Dry run:** Not supported
- **Idempotency:** Not needed (read only)
- **Modes:** Test and live
- **Pagination:** `limit` (at most 100) and `starting_after`
- **Authentication:** API key with the `processors:read` scope
- **Since:** M4

## Request

### Path parameters

| Field | Type        | Description |
| ----- | ----------- | ----------- |
| `id`  | `pcon_…` ID |             |

### Query parameters

| Field            | Type               | Required | Description |
| ---------------- | ------------------ | -------- | ----------- |
| `limit`          | integer (1 to 100) | No       |             |
| `starting_after` | `pevt_…` ID        | No       |             |

## Response

`200 OK` with a JSON object, a page of the list (newest first):

| Field                    | Type                                    | Description |
| ------------------------ | --------------------------------------- | ----------- |
| `object`                 | `"list"`                                |             |
| `data`                   | array of object                         |             |
| `data[].id`              | `pevt_…` ID                             |             |
| `data[].object`          | `"processor_event"`                     |             |
| `data[].connectionId`    | `pcon_…` ID                             |             |
| `data[].processor`       | one of `stripe`, `mollie`, `fake`       |             |
| `data[].externalEventId` | string                                  |             |
| `data[].type`            | string                                  |             |
| `data[].normalizedKind`  | string or null                          |             |
| `data[].status`          | one of `pending`, `processed`, `failed` |             |
| `data[].attempts`        | integer (at least 0)                    |             |
| `data[].handlers`        | array of string                         |             |
| `data[].error`           | object or null                          |             |
| `data[].receivedAt`      | date-time                               |             |
| `data[].processedAt`     | date-time or null                       |             |
| `has_more`               | boolean                                 |             |
| `next_cursor`            | `pevt_…` ID or null                     |             |

## Examples

### Recent events

```http
GET /api/v1/processor_connections/pcon_01m4vyt4mxe0s9zzk90373z6p6/events?limit=20
Authorization: Bearer or_test_…
```

Response (`200`):

```json
{
  "object": "list",
  "data": [
    {
      "id": "pevt_01m4vyt4mxe0s9zzk90373z6p8",
      "object": "processor_event",
      "connectionId": "pcon_01m4vyt4mxe0s9zzk90373z6p6",
      "processor": "stripe",
      "externalEventId": "evt_3ExampleEvent0001",
      "type": "payment_intent.succeeded",
      "normalizedKind": "payment.succeeded",
      "status": "processed",
      "attempts": 1,
      "handlers": [],
      "error": null,
      "receivedAt": "2026-10-14T12:05:00.000Z",
      "processedAt": "2026-10-14T12:05:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
```

## Errors

| Code                                                                                     | HTTP status | When                                             | What to do                                                                                                                                         |
| ---------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`resource_not_found`](https://ownrecord.io/docs/reference/errors.md#resource_not_found) | 404         | No such connection for this entity in this mode. | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.                                               |
| [`validation_failed`](https://ownrecord.io/docs/reference/errors.md#validation_failed)   | 400         | A pagination value is invalid.                   | Fix the fields listed in `details.issues` and send the request again.                                                                              |
| [`scope_required`](https://ownrecord.io/docs/reference/errors.md#scope_required)         | 400         | The request names no legal entity.               | Call the operation with credentials or a target at its level: an organization, a legal entity, a brand or the platform (`details.required_scope`). |
| [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied)   | 403         | You can't see processor connections here.        | Ask an organization owner or admin for a role or scope that allows this action.                                                                    |

It can also return these [common errors](https://ownrecord.io/docs/reference.md#common-errors): [`api_version_unsupported`](https://ownrecord.io/docs/reference/errors.md#api_version_unsupported), [`authentication_required`](https://ownrecord.io/docs/reference/errors.md#authentication_required), [`api_key_invalid`](https://ownrecord.io/docs/reference/errors.md#api_key_invalid), [`dry_run_not_supported`](https://ownrecord.io/docs/reference/errors.md#dry_run_not_supported), [`rate_limited`](https://ownrecord.io/docs/reference/errors.md#rate_limited), [`internal_error`](https://ownrecord.io/docs/reference/errors.md#internal_error).
