# List deliveries

`GET https://api-vod-express.syncwords.com/v1/webhooks/{id}/deliveries`

List deliveries

The webhook’s deliveries of the past 7 days, newest first, a page at a time: each event, how many attempts it took, and what your server answered last. Follow `links.next` until it is null.

**Guide:** [Webhooks](/vod-express/guides/webhooks)

## Parameters

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | string | yes | The webhook’s `id`: `wh_…`. |
| `status` | query | enum: pending, delivered, failed | no | Only the deliveries in this state: `pending` (still being tried), `delivered`, or `failed` (given up). |
| `page` | query | integer | no | The page, from 1. |
| `perPage` | query | integer | no | Deliveries a page. |

## Responses

### 200

OK

Example:

```json
{
  "data": [
    {
      "eventId": "evt_01m3n2x5f1h2d9k7c3b8a6w4q0",
      "type": "file.done",
      "status": "delivered",
      "attempts": 2,
      "lastStatus": 200,
      "lastError": null,
      "lastAttemptAt": "2026-09-28T10:00:35.120Z",
      "nextAttemptAt": null,
      "deliveredAt": "2026-09-28T10:00:35.120Z",
      "createdAt": "2026-09-28T10:00:04.310Z"
    }
  ],
  "links": {
    "first": "https://api-vod-express.syncwords.com/v1/webhooks/wh_01m3n2t4k8b5x0c7d2e9f6g1h3/deliveries?page=1",
    "last": "https://api-vod-express.syncwords.com/v1/webhooks/wh_01m3n2t4k8b5x0c7d2e9f6g1h3/deliveries?page=1",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "per_page": 25,
    "to": 1,
    "total": 1
  }
}
```

Schema:

```json
{
  "$ref": "#/components/schemas/WebhookDeliveryPage"
}
```

### 401

No token, or an expired or unknown one: `unauthenticated`.

Example:

```json
{
  "message": "Unauthenticated.",
  "code": "unauthenticated"
}
```

Schema:

```json
{
  "$ref": "#/components/schemas/Error"
}
```

### 403

VOD Express is not available to the account: switched off for it (`vod_express_not_enabled`), or the account is restricted — its access revoked, its trial expired or used up (`account_restricted`, with the reason in `message`).

Example:

```json
{
  "message": [
    "VOD Express is not enabled for your account."
  ],
  "code": "vod_express_not_enabled"
}
```

Schema:

```json
{
  "$ref": "#/components/schemas/Error"
}
```

### 404

No such webhook in your account: `webhook_not_found`.

Example:

```json
{
  "message": "Webhook not found.",
  "code": "webhook_not_found"
}
```

Schema:

```json
{
  "$ref": "#/components/schemas/Error"
}
```

### 422

A bad filter: `validation_failed`.

Example:

```json
{
  "message": "The selected status is invalid.",
  "errors": {
    "status": [
      "The selected status is invalid."
    ]
  },
  "code": "validation_failed"
}
```

Schema:

```json
{
  "$ref": "#/components/schemas/Error"
}
```

### 429

Rate limited: `too_many_requests`. Wait the seconds `Retry-After` says, then repeat the call.

Example:

```json
{
  "message": [
    "Too Many Attempts."
  ],
  "code": "too_many_requests"
}
```

Schema:

```json
{
  "$ref": "#/components/schemas/Error"
}
```

## Schemas

### WebhookDeliveryPage

`#/components/schemas/WebhookDeliveryPage`

```json
{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WebhookDelivery"
      }
    },
    "links": {
      "type": "object",
      "properties": {
        "first": {
          "type": "string"
        },
        "last": {
          "type": "string"
        },
        "prev": {
          "type": [
            "string",
            "null"
          ]
        },
        "next": {
          "type": [
            "string",
            "null"
          ],
          "description": "Null on the last page."
        }
      }
    },
    "meta": {
      "type": "object",
      "properties": {
        "current_page": {
          "type": "integer"
        },
        "from": {
          "type": [
            "integer",
            "null"
          ]
        },
        "last_page": {
          "type": "integer"
        },
        "per_page": {
          "type": "integer"
        },
        "to": {
          "type": [
            "integer",
            "null"
          ]
        },
        "total": {
          "type": "integer"
        }
      }
    }
  }
}
```

### WebhookDelivery

`#/components/schemas/WebhookDelivery`

```json
{
  "type": "object",
  "required": [
    "eventId",
    "type",
    "status",
    "attempts",
    "createdAt"
  ],
  "properties": {
    "eventId": {
      "type": "string"
    },
    "type": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "delivered",
        "failed"
      ],
      "description": "`pending`: not delivered yet, and still tried. `failed`: given up, 24 hours after the event (or after `POST …/retry`)."
    },
    "attempts": {
      "type": "integer"
    },
    "lastStatus": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Your server’s last HTTP status; null when it could not be reached."
    },
    "lastError": {
      "type": [
        "string",
        "null"
      ],
      "description": "Why the last attempt failed."
    },
    "lastAttemptAt": {
      "type": [
        "string",
        "null"
      ]
    },
    "nextAttemptAt": {
      "type": [
        "string",
        "null"
      ],
      "description": "While `pending`: when it is tried next."
    },
    "deliveredAt": {
      "type": [
        "string",
        "null"
      ]
    },
    "createdAt": {
      "type": "string",
      "description": "When the event happened."
    }
  }
}
```

### Error

`#/components/schemas/Error`

```json
{
  "type": "object",
  "required": [
    "message",
    "code"
  ],
  "properties": {
    "message": {
      "description": "For people. A string, or an array of one string on some statuses: read it as `Array.isArray(m) ? m[0] : m`.",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ]
    },
    "code": {
      "description": "For programs: stable, one per situation. See the Errors guide.",
      "enum": [
        "bad_request",
        "invalid_output_path",
        "invalid_idempotency_key",
        "unauthenticated",
        "invalid_credentials",
        "forbidden",
        "vod_express_not_enabled",
        "account_restricted",
        "not_found",
        "project_not_found",
        "file_not_found",
        "file_meta_not_found",
        "output_not_found",
        "feed_not_found",
        "upload_not_found",
        "webhook_not_found",
        "webhook_delivery_not_found",
        "aws_access_not_provisioned",
        "storage_connection_not_found",
        "method_not_allowed",
        "conflict",
        "file_exists",
        "project_reads_feed",
        "project_reads_folder",
        "file_processing",
        "project_config_locked",
        "idempotency_in_progress",
        "storage_connection_in_use",
        "payload_too_large",
        "unsupported_media_type",
        "validation_failed",
        "service_start_failed",
        "idempotency_key_reused",
        "webhook_limit_reached",
        "storage_failed",
        "storage_connection_check_failed",
        "storage_connection_folder_only",
        "storage_prefix_taken",
        "build_without_storage_connections",
        "build_has_no_schema",
        "too_many_requests",
        "internal_error",
        "bad_gateway",
        "service_stop_failed",
        "aws_access_failed",
        "platform_unavailable",
        "service_unavailable",
        "build_list_unavailable"
      ]
    },
    "errors": {
      "type": "object",
      "description": "On a 422: each field’s messages, keyed by field name, or by JSON pointer inside `config`.",
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    }
  }
}
```
