---
title: "List webhook delivery logs"
method: GET
path: "/v1/webhooks/logs"
tags: ["Webhooks"]
---

# List webhook delivery logs

`GET /v1/webhooks/logs`

Retrieve recorded webhook delivery attempts for the authenticated user, most recent first.
Logs are retained for 30 days. Supports filtering by status, event type, webhook ID, and event ID,
plus offset-based pagination.

For a restricted (zrk_) API key, rows for events outside the key's resource
groups are omitted (`pagination.total` may over-count), and an `event` filter
naming such an event is rejected with 403. Events blocked by a subscription's
own `disabledResourceGroups` are dropped before delivery, so they produce no
log rows for anyone; the exception is the five-minute tail after a denylist
change, where an already-queued event can still be delivered and logged.

## Query parameters

- `limit` integer
- `skip` integer
- `status` 'success' | 'failed'
- `event` string
- `webhookId` string
- `eventId` string

## Response `200`

Webhook logs retrieved successfully

- object
  - `logs` WebhookLog[]
    - `userId` string — ID of the account owner the webhook belongs to
    - `webhookId` string — ID of the webhook configuration that produced this delivery
    - `webhookName` string — Name of the webhook configuration at delivery time
    - `eventId` string — Stable webhook event ID (correlates to the delivered payload)
    - `event` string — Event type that triggered the delivery (e.g. post.published)
    - `url` string, uri — Destination URL the webhook was delivered to
    - `status` 'success' | 'failed' — Delivery outcome
    - `statusCode` integer — HTTP status code returned by the destination endpoint
    - `requestPayload` object — The JSON payload sent to the destination endpoint
    - `responseBody` string — Response body returned by the destination endpoint
    - `errorMessage` string — Error message when delivery failed
    - `attemptNumber` integer — Delivery attempt number (increments on retries)
    - `responseTime` integer — Time taken by the destination endpoint to respond, in milliseconds
    - `createdAt` string, date-time — Timestamp the delivery was attempted
  - `pagination` object
    - `total` integer — Total number of matching logs
    - `limit` integer — Maximum number of logs returned per page
    - `skip` integer — Number of logs skipped
    - `pages` integer — Total number of pages
    - `hasMore` boolean — Whether more logs are available beyond this page

## Other responses

- `400` — Invalid query parameter
- `401` — Unauthorized
- `403` — The API key is a restricted key (zrk_ prefix) and may not perform this operation. Three cases. (1) The operation's resource group (see the operation's x-resource-group) is disabled on the key: fix it by creating a key with the group enabled in the dashboard API keys tab and revoking the old one. (2) The operation is admin-plane (x-resource-group admin-plane: API keys, invites, connected apps, member identity), which is never grantable to restricted keys; the error reads "Restricted API keys cannot manage API keys, invites, or member identity." and the fix is a full-access key or the dashboard, never a new restricted key. (3) On webhook subscription writes, delivery-log reads and replays, a named event maps to a resource group the key does not hold, so a restricted key can never create or edit a subscription broader than itself (a no-messages key cannot subscribe to, test-fire, redeliver or read logs for message.* events).

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/revisions/f81ca70ea6b9/schema)
