Events
List Event Deliveries
Delivery attempts of an event across all webhook endpoints
GET
/
v1
/
events
/
{id}
/
deliveries
List deliveries for an event
curl --request GET \
--url https://billing.example.com/v1/events/{id}/deliveries \
--header 'Authorization: Bearer <token>'import requests
url = "https://billing.example.com/v1/events/{id}/deliveries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://billing.example.com/v1/events/{id}/deliveries', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://billing.example.com/v1/events/{id}/deliveries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://billing.example.com/v1/events/{id}/deliveries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://billing.example.com/v1/events/{id}/deliveries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://billing.example.com/v1/events/{id}/deliveries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"webhook_endpoint_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"endpoint_url": "<string>",
"status": "pending",
"attempts": 123,
"last_status_code": 123,
"last_error": "<string>",
"next_retry_at": "2023-11-07T05:31:56Z",
"delivered_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z"
}
]
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}Returns every delivery attempt of the event, one record per subscribed webhook endpoint, newest first. Use this to answer “did my endpoint receive event X, and if not, why?”
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | string (uuid) | The event ID |
Example Request
curl "https://api.recurso.dev/v1/events/evt_a1b2c3d4/deliveries" \
-H "Authorization: Bearer $API_KEY"
Response
{
"data": [
{
"id": "del_9f8e7d6c",
"event_id": "evt_a1b2c3d4",
"webhook_endpoint_id": "wh_abc123",
"endpoint_url": "https://yourapp.com/webhooks/recurso",
"status": "succeeded",
"attempts": 1,
"last_status_code": 200,
"delivered_at": "2026-07-06T10:30:05Z",
"created_at": "2026-07-06T10:30:00Z"
},
{
"id": "del_5b4a3c2d",
"event_id": "evt_a1b2c3d4",
"webhook_endpoint_id": "wh_def456",
"endpoint_url": "https://backup.yourapp.com/hooks",
"status": "pending",
"attempts": 2,
"last_status_code": 503,
"last_error": "HTTP 503: upstream unavailable",
"next_retry_at": "2026-07-06T10:32:00Z",
"created_at": "2026-07-06T10:30:00Z"
}
]
}
Delivery Status
status is derived from the stored delivery fields:
| Status | Meaning |
|---|---|
pending | Not terminal yet — queued for first attempt or awaiting a retry (next_retry_at) |
succeeded | The endpoint acknowledged with a 2xx response |
failed | Retries exhausted or the request could not be built; last_error holds the reason |
last_error is only present on non-succeeded deliveries and contains the transport error or HTTP <code>: <body> recorded by the delivery worker. Use POST /v1/events/{id}/redeliver to re-queue a failed event.⌘I
List deliveries for an event
curl --request GET \
--url https://billing.example.com/v1/events/{id}/deliveries \
--header 'Authorization: Bearer <token>'import requests
url = "https://billing.example.com/v1/events/{id}/deliveries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://billing.example.com/v1/events/{id}/deliveries', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://billing.example.com/v1/events/{id}/deliveries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://billing.example.com/v1/events/{id}/deliveries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://billing.example.com/v1/events/{id}/deliveries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://billing.example.com/v1/events/{id}/deliveries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"event_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"webhook_endpoint_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"endpoint_url": "<string>",
"status": "pending",
"attempts": 123,
"last_status_code": 123,
"last_error": "<string>",
"next_retry_at": "2023-11-07T05:31:56Z",
"delivered_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z"
}
]
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}