# List webhook deliveries

List webhook delivery attempts.

Returns delivery rows newest first, without payloads. Pagination is returned next to data, not nested inside it. Filter by status, event type, destination, or created-at range.

This route is console / Firebase only for now. Tenant API keys are not accepted.

## See also

- [Webhooks](https://www.invunion.com/knowledge-base/api/webhooks/). Events you can subscribe to and the JSON posted to your URL.

- HTTP method: `GET`
- Path: `/api/v1/webhook-deliveries`
- URL: `https://api.invunion.com/api/v1/webhook-deliveries`
- Required scope: `none — Firebase console only`
- HTML docs: https://www.invunion.com/knowledge-base/api/list-webhooks/
- Markdown docs: https://www.invunion.com/knowledge-base/api/list-webhooks.md


## Query parameters

| Name | Type | Required | Description | Allowed values | Example |
| --- | --- | --- | --- | --- | --- |
| `page` | integer | optional | Page number. Default 1. |  | `1` |
| `pageSize` | integer | optional | Page size. Default 25, maximum 100. |  | `25` |
| `status` | string, no maximum | optional | Filter by delivery status. | `pending`, `delivering`, `success`, `failed`, `exhausted` |  |
| `eventType` | string, max 120 | optional | Filter by event type. | `transaction.created`, `invoice.created`, `invoice.updated`, `invoice.paid`, `invoice.partially_paid`, `match.created`, `match.suggested`, `match.confirmed`, `match.rejected`, `match.cancelled`, `bank.connected`, `bank.disconnected`, `sync.completed`, `sync.failed` |  |
| `endpointId` | string, no maximum | optional | Filter by destination UUID. |  | `4e2deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d` |
| `dateFrom` | string, no maximum | optional | Inclusive start of created_at. |  | `2026-09-01` |
| `dateTo` | string, no maximum | optional | Inclusive end of created_at. |  | `2026-09-30` |


## Errors

| Error | HTTP code | Description |
| --- | --- | --- |
| `Missing Bearer token` | `401` | The Authorization header is missing or is not a Bearer token. |
| `Invalid token` | `401` | Webhook destinations and deliveries are console-only. Send a Firebase ID token. Tenant API keys are not accepted on these routes. |
| `Too many requests, please try again later` | `429` | Wait and retry. The Retry-After header is the number of seconds to wait. |
| `Invalid query parameters` | `400` | A query value failed validation. details lists field and message. |
| `Tenant context required` | `400` | The authenticated credential is not bound to a tenant. |
| `Internal server error` | `500` | Unexpected server error. The JSON body includes correlationId. Retry with backoff. |

## Request (curl)

```bash
curl --request GET \
  --url https://api.invunion.com/api/v1/webhook-deliveries?page=1&pageSize=25&status=failed \
  --header 'accept: application/json' \
  --header 'authorization: Bearer FIREBASE_ID_TOKEN'
```

## Request (Python)

```python
import requests

url = "https://api.invunion.com/api/v1/webhook-deliveries?page=1&pageSize=25&status=failed"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer FIREBASE_ID_TOKEN",
}
response = requests.get(url, headers=headers)
print(response.json())
```

## Request (Ruby)

```ruby
require 'net/http'
require 'json'
require 'uri'

uri = URI("https://api.invunion.com/api/v1/webhook-deliveries?page=1&pageSize=25&status=failed")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Accept'] = 'application/json'
request['Authorization'] = 'Bearer FIREBASE_ID_TOKEN'
response = http.request(request)
puts response.body
```

## Request (JavaScript)

```javascript
const response = await fetch("https://api.invunion.com/api/v1/webhook-deliveries?page=1&pageSize=25&status=failed", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer FIREBASE_ID_TOKEN"
  },
});
const data = await response.json();
```

## Request (Go)

```go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, err := http.NewRequest("GET", "https://api.invunion.com/api/v1/webhook-deliveries?page=1&pageSize=25&status=failed", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer FIREBASE_ID_TOKEN")
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
```

## Request (Node)

```javascript
const response = await fetch("https://api.invunion.com/api/v1/webhook-deliveries?page=1&pageSize=25&status=failed", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer FIREBASE_ID_TOKEN"
  },
});
console.log(await response.json());
```

## Success (200)

```json
{
  "success": true,
  "data": [
    {
      "id": "5f3deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
      "endpointId": "4e2deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
      "endpointUrl": "https://hooks.leonescars.example/invunion",
      "eventId": "7b5deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
      "eventType": "invoice.paid",
      "status": "success",
      "attemptCount": 1,
      "maxAttempts": 8,
      "nextRetryAt": null,
      "responseStatus": 200,
      "lastError": null,
      "durationMs": 84,
      "deliveredAt": "2026-09-12T09:00:04.000Z",
      "createdAt": "2026-09-12T09:00:03.000Z"
    },
    {
      "id": "b1d05728-7e4a-43c5-0e47-54831f61d907",
      "endpointId": "4e2deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
      "endpointUrl": "https://hooks.leonescars.example/invunion",
      "eventId": "8c6deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
      "eventType": "match.created",
      "status": "success",
      "attemptCount": 1,
      "maxAttempts": 8,
      "nextRetryAt": null,
      "responseStatus": 200,
      "lastError": null,
      "durationMs": 61,
      "deliveredAt": "2026-09-12T09:00:05.000Z",
      "createdAt": "2026-09-12T09:00:04.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 25,
    "total": 2,
    "totalPages": 1
  }
}
```
