Ask Bill!

Webhook events

Recover webhooks your endpoint missed

=*=*=*=

/beta/webhook_events/list

List webhook events

/beta/webhook_events/list returns the webhooks Plaid sent to your account in the last 7 days, including webhooks that weren't delivered. Use it to recover webhooks your endpoint missed. Events are returned oldest first.

TRANSACTIONS webhooks are not included. To recover Transactions updates, use /transactions/sync.

To page through events, omit cursor on your first request, then pass the previous response's next_cursor on each later request. Store next_cursor even when has_more is false, so your next poll returns only newer events.

Filters are optional. An event matches a filter if it matches any of the filter's values, and must match every filter you provide.

Events older than 7 days are not retained. If your cursor or start_time is older than that, the request fails with WEBHOOK_EVENTS_CURSOR_EXPIRED or WEBHOOK_EVENTS_START_TIME_OUT_OF_RANGE.

This endpoint is in beta and may change in backwards-incompatible ways. Send feedback to building@plaid.com.

/beta/webhook_events/list

Request fields

client_id
stringstring

Your Plaid API client_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.

secret
stringstring

Your Plaid API secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.

cursor
stringstring

The next_cursor from a previous /beta/webhook_events/list response. Omit on your first request. If provided, start_time is ignored.

Max length: 512
start_time
stringstring

Return events sent at or after this time, in ISO 8601 format. Must be within the last 7 days. Ignored if cursor is provided. If you omit both cursor and start_time, results start with the oldest retained event.

Format: date-time
count
integerinteger

The maximum number of webhook events to return. Fewer events may be returned even when more are available; use has_more to determine whether to request another page.

Minimum: 1
Maximum: 100
Default: 100
webhook_types
[string][string]

Return only events with these webhook types, for example ITEM. Case-sensitive.

webhook_codes
[string][string]

Return only events with these webhook codes, for example ERROR. Case-sensitive.

item_ids
[string][string]

Return only events for these Items.

delivery_statuses
[string][string]

Return only events with these delivery statuses.

Possible values: PENDING, DELIVERED, FAILED
/beta/webhook_events/list
// Provide a cursor you've previously stored, or leave it
// undefined on the first call.
let cursor = loadSavedCursor();
let hasMore = true;

while (hasMore) {
  const request: BetaWebhookEventsListRequest = {
    cursor: cursor,
    count: 100,
  };
  const response = await plaidClient.betaWebhookEventsList(request);
  const data = response.data;

  for (const event of data.webhook_events) {
    if (!alreadyProcessed(event.webhook_message_id)) {
      handleWebhookEvent(event);
    }
  }

  hasMore = data.has_more;

  // Persist next_cursor even when has_more is false, then reuse
  // it on the next poll so you only receive newer events.
  cursor = data.next_cursor;
  saveCursor(cursor);
}
/beta/webhook_events/list

Response fields

webhook_events
[object][object]

Webhook events for your account.

webhook_message_id
stringstring

The ID of this webhook event. It stays the same across requests, so you can use it to skip events you've already handled. Include it when contacting Support.

webhook_type
stringstring

The webhook type.

webhook_code
stringstring

The webhook code.

item_id
nullablestringnullable, string

The Item ID associated with the webhook, if any.

sent_time
stringstring

The time Plaid sent the webhook.

Format: date-time
payload
objectobject

The JSON body Plaid sent to the webhook destination.

destination_url
stringstring

The destination URL Plaid sent the webhook to.

delivery_status
stringstring

The current delivery status of the webhook.

PENDING: Plaid hasn't recorded a successful delivery and may retry. The webhook may have been delivered even if its status is PENDING.

DELIVERED: Your endpoint returned a 2xx response.

FAILED: Plaid stopped retrying without receiving a 2xx response.

Possible values: PENDING, DELIVERED, FAILED
last_http_status_code
nullableintegernullable, integer

The most recent HTTP status code returned by the destination, if any.

attempt_count
integerinteger

Number of delivery attempts Plaid has made for this webhook.

last_attempt_time
nullablestringnullable, string

The time of the most recent delivery attempt. Null if Plaid hasn't attempted delivery yet.

Format: date-time
has_more
booleanboolean

Indicates whether another page of webhook events is available.

next_cursor
stringstring

The cursor to send as cursor in your next request. Store it even when has_more is false.

request_id
stringstring

A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.

Response Object
{
  "webhook_events": [
    {
      "webhook_message_id": "whmsg_4tQ9pNzL2vBxYK",
      "webhook_type": "ITEM",
      "webhook_code": "PENDING_EXPIRATION",
      "item_id": "abc123",
      "sent_time": "2026-07-21T14:32:00Z",
      "payload": {
        "webhook_type": "ITEM",
        "webhook_code": "PENDING_EXPIRATION"
      },
      "destination_url": "https://client.example.com/webhook",
      "delivery_status": "DELIVERED",
      "last_http_status_code": 200,
      "attempt_count": 1,
      "last_attempt_time": "2026-07-21T14:32:01Z"
    }
  ],
  "has_more": true,
  "next_cursor": "eyJzZW50X3RpbWUiOiIyMDI2LTA3LTIxVDE0OjMyOjAwWiIsIndlYmhvb2tfbWVzc2FnZV9pZCI6IndobXNnXzR0UTlwTnpMMnZCeFlLIn0",
  "request_id": "4zlKapIkTm8p5KM"
}