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

# GET /v1/subscriptions/:id/events/:eventId

> Retrieve a single event by ID. Returns the full delivery history, current status, and the exact webhook payload that was sent to your endpoint.

Use this endpoint to inspect any single event in a subscription's delivery history. The response includes the current status, attempt and delivery counts, the last HTTP response from your endpoint, and the complete Standard Webhooks payload. This is the most direct way to investigate a specific delivery failure.

## Request

```
GET /v1/subscriptions/:id/events/:eventId
```

### Path parameters

<ParamField path="id" type="string" required>
  The subscription ID (e.g. `sub_2QkP9aB7xN...`).
</ParamField>

<ParamField path="eventId" type="string" required>
  The event ID (e.g. `evt_8xN9kP2QbA...`).
</ParamField>

```bash theme={null}
curl https://api.offthehook.dev/v1/subscriptions/sub_2QkP9aB7xN.../events/evt_8xN9kP2QbA... \
  -H "Authorization: Bearer oth_YOUR_API_KEY"
```

## Response

**200 OK** — a single `EventView` object with the same shape as items in the [list events](/api/events/list) response.

```json theme={null}
{
  "id": "evt_8xN9kP2QbA...",
  "subscriptionId": "sub_2QkP9aB7xN...",
  "kind": "wallet.transfer.broadcasted",
  "chainId": "tron:mainnet",
  "status": "delivered",
  "attempts": 1,
  "deliveryCount": 1,
  "responseStatus": 200,
  "responseBody": "OK",
  "payload": {
    "id": "evt_8xN9kP2QbA...",
    "kind": "wallet.transfer.broadcasted",
    "date": "2026-05-08T12:34:56Z",
    "data": {}
  },
  "dateCreated": "2026-05-08T12:34:56Z"
}
```

<ResponseField name="id" type="string">
  Unique event ID. This value is sent in the `webhook-id` delivery header and is your idempotency key for deduplication.
</ResponseField>

<ResponseField name="subscriptionId" type="string">
  The subscription this event belongs to.
</ResponseField>

<ResponseField name="kind" type="string">
  The event type, e.g. `wallet.transfer.broadcasted` or `service.ping`.
</ResponseField>

<ResponseField name="chainId" type="string | null">
  CAIP-2 identifier for the chain this event originated on. `null` for service events like `service.ping`.
</ResponseField>

<ResponseField name="status" type="string">
  Current delivery status: `pending`, `delivered`, or `failed`.
</ResponseField>

<ResponseField name="attempts" type="integer">
  Number of delivery attempts in the current dispatch cycle. Resets to `0` on [retry](/api/events/retry).
</ResponseField>

<ResponseField name="deliveryCount" type="integer">
  Monotonic count of successful deliveries across all dispatch cycles.
</ResponseField>

<ResponseField name="responseStatus" type="integer | null">
  The HTTP status code from your endpoint on the last attempt. `null` if no HTTP response was received.
</ResponseField>

<ResponseField name="responseBody" type="string | null">
  Truncated response body from the last attempt. `null` if no body was received.
</ResponseField>

<ResponseField name="payload" type="object">
  The exact Standard Webhooks envelope sent to your endpoint.
</ResponseField>

<ResponseField name="dateCreated" type="string">
  ISO 8601 timestamp of when this event was created.
</ResponseField>

## Errors

| Code           | HTTP | Description                                                                                                                 |
| -------------- | ---- | --------------------------------------------------------------------------------------------------------------------------- |
| `not_found`    | 404  | The event ID does not exist, does not belong to the given subscription, or the subscription belongs to a different API key. |
| `unauthorized` | 401  | The `Authorization` header is missing or the key is invalid.                                                                |
