List Webhook Deliveries
curl --request GET \
--url https://api.signa.so/v1/webhooks/{id}/deliveries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/webhooks/{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://api.signa.so/v1/webhooks/{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://api.signa.so/v1/webhooks/{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://api.signa.so/v1/webhooks/{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://api.signa.so/v1/webhooks/{id}/deliveries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/webhooks/{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{
"object": "list",
"data": [
{
"id": "018f9b2e-0000-7000-8000-000000000010",
"object": "webhook_delivery",
"endpoint_id": "whk_2mR8vNkT",
"alert_id": "alt_4tYpL2Qn",
"event_id": "018f9b2e-0000-7000-8000-000000000011",
"event_type": "alert.created",
"attempt": 1,
"delivery_attempt_id": "018f9b2e-0000-7000-8000-000000000012",
"status": "delivered",
"http_status": 200,
"response_body": "ok",
"signature_timestamp": "2026-07-05T09:12:31.000Z",
"next_retry_at": null,
"delivered_at": "2026-07-05T09:12:31.500Z",
"created_at": "2026-07-05T09:12:31.000Z"
}
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_8mQ2vXpL"
}
Webhooks
List Webhook Deliveries
Audit log of delivery attempts for an endpoint
GET
/
v1
/
webhooks
/
{id}
/
deliveries
List Webhook Deliveries
curl --request GET \
--url https://api.signa.so/v1/webhooks/{id}/deliveries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.signa.so/v1/webhooks/{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://api.signa.so/v1/webhooks/{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://api.signa.so/v1/webhooks/{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://api.signa.so/v1/webhooks/{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://api.signa.so/v1/webhooks/{id}/deliveries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signa.so/v1/webhooks/{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{
"object": "list",
"data": [
{
"id": "018f9b2e-0000-7000-8000-000000000010",
"object": "webhook_delivery",
"endpoint_id": "whk_2mR8vNkT",
"alert_id": "alt_4tYpL2Qn",
"event_id": "018f9b2e-0000-7000-8000-000000000011",
"event_type": "alert.created",
"attempt": 1,
"delivery_attempt_id": "018f9b2e-0000-7000-8000-000000000012",
"status": "delivered",
"http_status": 200,
"response_body": "ok",
"signature_timestamp": "2026-07-05T09:12:31.000Z",
"next_retry_at": null,
"delivered_at": "2026-07-05T09:12:31.500Z",
"created_at": "2026-07-05T09:12:31.000Z"
}
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_8mQ2vXpL"
}
Overview
Requires theportfolios:manage scope.
Path Parameters
string
required
Endpoint ID (
whk_*).Query Parameters
integer
default:"20"
Page size (1-100).
string
Opaque cursor.
string
ISO 8601 timestamp. Only deliveries with
created_at >= since are returned. Useful for
incremental polling: set since to the last created_at you saw and walk pages until
exhausted. Composes cleanly with cursor.Response
string
Always
"list".object[]
Array of
WebhookDelivery rows.Show WebhookDelivery
Show WebhookDelivery
string
Raw UUID of the attempt row.
string
Always
"webhook_delivery".string
Source endpoint (
whk_*).string | null
Source alert (
alt_*), when applicable.string
Stable event identifier, same value as the
webhook-id header on the delivery.string
Event type (e.g.
alert.created).integer
Retry attempt number (1-indexed).
string
UUID of this specific attempt.
string
One of
pending, delivered, failed, or exhausted. exhausted is the terminal state after all retry attempts have failed.integer | null
Response code from your endpoint.
string | null
First 1KB of the response body, truncated.
string
ISO timestamp embedded in the
webhook-timestamp header.string | null
ISO timestamp of the next scheduled retry.
string | null
When the delivery succeeded.
string
When the attempt was scheduled.
boolean
Whether more pages exist.
object
Cursor envelope.
string
Request identifier.
since values older than that return an
empty list rather than an error. For alert history beyond 30 days, use
List Alerts.
Errors
| Status | type | When |
|---|---|---|
| 400 | validation_error | since is not a valid ISO 8601 timestamp |
| 404 | not_found | Endpoint doesn’t exist or belongs to another org |
Code Examples
curl "https://api.signa.so/v1/webhooks/whk_2mR8vNkT/deliveries?since=2026-06-01T00:00:00Z" \
-H "Authorization: Bearer sig_YOUR_KEY"
import { Signa } from "@signa-so/sdk";
const signa = new Signa({ api_key: process.env.SIGNA_API_KEY });
const deliveries = await signa.webhooks.listDeliveries("whk_2mR8vNkT", {
since: "2026-06-01T00:00:00Z",
});
{
"object": "list",
"data": [
{
"id": "018f9b2e-0000-7000-8000-000000000010",
"object": "webhook_delivery",
"endpoint_id": "whk_2mR8vNkT",
"alert_id": "alt_4tYpL2Qn",
"event_id": "018f9b2e-0000-7000-8000-000000000011",
"event_type": "alert.created",
"attempt": 1,
"delivery_attempt_id": "018f9b2e-0000-7000-8000-000000000012",
"status": "delivered",
"http_status": 200,
"response_body": "ok",
"signature_timestamp": "2026-07-05T09:12:31.000Z",
"next_retry_at": null,
"delivered_at": "2026-07-05T09:12:31.500Z",
"created_at": "2026-07-05T09:12:31.000Z"
}
],
"has_more": false,
"pagination": { "cursor": null },
"request_id": "req_8mQ2vXpL"
}
Related Endpoints
- Retrieve Webhook Delivery - fetch a single delivery attempt
- Redeliver Webhook - manually re-attempt a delivery
- Watch Diagnostics - cross-reference
alert_idagainst why an alert fired
⌘I