Skip to main content
GET
/
webhooks
/
{id}
/
deliveries
List deliveries
curl --request GET \
  --url https://xquik.com/api/v1/webhooks/{id}/deliveries \
  --header 'x-api-key: <api-key>'

Documentation Index

Fetch the complete documentation index at: https://docs.xquik.com/llms.txt

Use this file to discover all available pages before exploring further.

Free - does not consume credits
curl https://xquik.com/api/v1/webhooks/15/deliveries \
  -H "x-api-key: xq_YOUR_KEY_HERE" \
  | jq '[.deliveries[] | {
    delivery_id: .id,
    stream_event_id: .streamEventId,
    status,
    attempts,
    receiver_status: (.lastStatusCode // null),
    last_error: (.lastError // null),
    queued_at: .createdAt,
    delivered_at: (.deliveredAt // null),
    action: (
      if .status == "exhausted" then "page"
      elif .status == "failed" and .attempts >= 3 then "warn"
      else "track"
      end
    )
  }]'

Path parameters

id
string
required
The webhook ID to retrieve deliveries for.

Headers

x-api-key
string
required
Your API key.

Operational handoff

Use this endpoint when your queue, CRM, warehouse, or alerting system needs to reconcile webhook delivery health. It returns the 100 most recent delivery records for one webhook, newest first. Map each delivery into a small incident row before sending it downstream. Keep id, streamEventId, status, attempts, receiver status, timestamps, and the chosen action; avoid dumping the full response into logs. This endpoint returns delivery attempt metadata only. It does not return the webhook URL, event type filter, signing secret, raw payload body, raw signature, or full request headers. Do not depend on a nextRetryAt field. The response does not expose one; route incidents from status, attempts, lastStatusCode, lastError, createdAt, and deliveredAt. Store these fields for support and retry triage:

Delivery ID

Store id for delivery-level idempotency and support lookup.

Event Join

Store streamEventId to join back to the stored monitor event with GET /events/{id}.

Status Route

Use status to route pending, failed, and exhausted deliveries to the right queue.

Attempt Count

Use attempts to decide whether a failed delivery is early, repeated, or at the retry cap.

Receiver Result

Use lastStatusCode to separate receiver errors such as 500 from unreachable endpoints with status 0.

Failure Reason

Show lastError as the most recent failure reason for the operator.

Timing

Compare createdAt and deliveredAt to measure delivery latency and recovery time.

Incident response handoff

Use one compact handoff row when a delivery needs receiver-owner action. Route delivered rows out of the incident path, track pending, warn on repeated failed, and page on exhausted.
{
  "record_type": "webhook_delivery_incident_handoff",
  "webhook_id": "15",
  "delivery_id": "503",
  "stream_event_id": "9003",
  "status": "exhausted",
  "attempts": 1,
  "receiver_status": 410,
  "last_error": "HTTP 410",
  "terminal_reason": "receiver_returned_410",
  "event_join": "GET /api/v1/events/9003",
  "verification_check": "POST /api/v1/webhooks/15/test",
  "action": "page_receiver_owner",
  "handoff_state": "fix_receiver_then_send_signed_test"
}

Repeated failure

Warn after repeated failed rows. Include attempts, lastStatusCode, and lastError so the receiver owner can separate code errors from reachability failures.

Terminal delivery

Page when status is exhausted. This means retryable failures reached the 10-attempt cap, or the receiver returned 410 Gone.

Event join

Store streamEventId and link GET /api/v1/events/{id} so support can inspect the monitor event that triggered the delivery.

Receiver proof

After fixing the endpoint, send POST /webhooks/{id}/test and attach the signed test result to the incident before waiting for the next event.
Failures retry up to 10 attempts with exponential backoff, starting at 1 second and capped at 60 seconds. A 410 Gone response marks the delivery exhausted immediately. Other non-2xx responses and network failures stay failed until they are delivered or exhaust all attempts. For incident response, page on exhausted, warn on repeated failed, and ignore delivered. Fix the receiving endpoint, then use POST /webhooks/{id}/test to confirm it accepts signed requests before waiting for the next production event.

Receiver backfill handoff

This endpoint returns the latest 100 delivery rows for one webhook. Use those rows to identify receiver failures, then use stored event pages to rebuild your own downstream queue after the receiver is fixed.
{
  "record_type": "webhook_delivery_backfill_handoff",
  "delivery_source": "GET /api/v1/webhooks/15/deliveries",
  "event_source": "GET /api/v1/events?limit=100&after={nextCursor}",
  "source_filter": "monitorId for account monitors, keywordMonitorId for keyword monitors",
  "join_key": "delivery.streamEventId == event.id",
  "store": [
    "deliveryId",
    "streamEventId",
    "status",
    "attempts",
    "eventId",
    "nextCursor"
  ],
  "stop_when": "hasMore is false",
  "handoff_state": "receiver_fixed_backfill_events_then_resume_webhooks"
}
Store nextCursor after every event page. Continue GET /api/v1/events?limit=100&after={nextCursor} until hasMore is false, then compare each event id with delivery streamEventId values before replaying your own downstream work. Add monitorId when replaying one account monitor, or keywordMonitorId when replaying one keyword monitor.

Response

deliveries
array
List of delivery attempts, most recent first. Returns up to 100 deliveries.
{
  "deliveries": [
    {
      "id": "501",
      "streamEventId": "9001",
      "status": "delivered",
      "attempts": 1,
      "lastStatusCode": 200,
      "createdAt": "2026-02-24T14:22:01.000Z",
      "deliveredAt": "2026-02-24T14:22:02.000Z"
    },
    {
      "id": "502",
      "streamEventId": "9002",
      "status": "failed",
      "attempts": 3,
      "lastStatusCode": 500,
      "lastError": "HTTP 500",
      "createdAt": "2026-02-24T14:25:00.000Z"
    },
    {
      "id": "503",
      "streamEventId": "9003",
      "status": "exhausted",
      "attempts": 10,
      "lastStatusCode": 503,
      "lastError": "HTTP 503",
      "createdAt": "2026-02-24T14:30:00.000Z"
    },
    {
      "id": "504",
      "streamEventId": "9004",
      "status": "pending",
      "attempts": 0,
      "createdAt": "2026-02-24T14:35:00.000Z"
    }
  ]
}

Delivery statuses

pending

Delivery is queued and waiting for the next attempt.

delivered

Your endpoint returned 2xx. Delivery is complete.

failed

The most recent attempt failed because the endpoint returned non-2xx or the network request failed. Xquik retries with exponential backoff.

exhausted

All retry attempts have been used. Xquik will not retry this delivery. Check the receiver endpoint and create a new webhook if needed.
Deliveries follow an exponential backoff retry schedule. After each failed attempt, the wait time increases. Once all retries are exhausted, the status transitions to exhausted and no further attempts are made.
Last modified on May 24, 2026