See recent deliveries
Overview
See recent delivery attempts to a subscription: what was sent, when, the response your endpoint gave, and any retries.
Use this to debug an endpoint that isn't receiving events, or to confirm a test worked.
You'll need the subscription id.
Returns attempts, newest first: 50 by default, up to 100 with limit. Filter by status, event and since, and pass the last entry's id as before_id to page back through older attempts.
Each event is tried up to 6 times: immediately, then 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours after each failed attempt. Use status=dropped to list the events given up after their last attempt.
Prerequisites
- A Partner bearer token. See Authentication.
- The subscription's id, from List your webhooks.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
GET /api/v1/partner/webhooks/{webhookSubscriptionId}/deliveries
Authentication
Partner token
- Only partner users can call it; other tokens get
403. - Only your own partner's subscriptions: any other id, including another partner's, gets
404.
Rate limit
This endpoint has no rate limit.
Request parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
webhookSubscriptionId | path | integer | Yes | The subscription's id, from List your webhooks. |
limit | query | integer | No | How many attempts to return, 10–100. Default 50. Values below 10 are raised to 10; above 100 returns 422. |
status | query | string | No | succeeded: attempts your endpoint accepted with a 2xx. failed: every attempt without a 2xx, including ones that were retried. dropped: the last attempt of each event that was given up, with no retry left. |
event | query | string | No | Only attempts for this event, e.g. response_post_failed or cache_invalidation. |
since | query | string | No | Only attempts made at or after this time, e.g. 2026-10-01T00:00:00Z. |
before_id | query | integer | No | Only attempts with an id lower than this. Pass the last entry's id to get the next, older page. |
Request body
None.
Request payload
None.
Response body
The payload is inside data.
| Field | Type | Description |
|---|---|---|
data | array of objects | Delivery attempts, newest first. Each retry is its own entry. |
data[].id | integer | The attempt's id. |
data[].event | string | The event name sent, e.g. webhook.test or review_pull_connected. |
data[].event_id | string | The event's id, the same on every retry of it (sent as the X-SAU-Delivery header). Use it to ignore duplicates. |
data[].review_history_id | integer or null | The review history entry behind the event, or null (e.g. for a test). |
data[].store_id | integer or null | The location the event is about, or null. |
data[].attempt_number | integer | 1 for the first try, then up for each retry. |
data[].http_status | integer or null | The HTTP status your endpoint returned, or null when it couldn't be reached. |
data[].payload_json | object or null | The exact body that was sent, so you can check the signature yourself. |
data[].error_message | string or null | Why the attempt failed, or null. Starts with Not sent: when deliveries were paused because your endpoint failed 5 attempts in a row; the attempt wasn't sent. |
data[].response_body_snippet | string or null | The start of your endpoint's response body, or null. |
data[].signature | string | The X-SAU-Signature header sent: sha256= and the HMAC-SHA256 of the body. |
data[].attempted_at | string or null | When it was sent (ISO 8601). |
data[].delivered_at | string or null | When your endpoint accepted it (ISO 8601), or null. |
data[].next_retry_at | string or null | When the next retry is due (ISO 8601), or null when there won't be one. |
Response payload
{
"data": {
"data": [
{
"id": 7,
"event": "webhook.test",
"event_id": "01KV7ZHF5KYNK2Q2AXN8KQFS5R",
"review_history_id": null,
"store_id": null,
"attempt_number": 3,
"http_status": null,
"payload_json": {
"event": "webhook.test",
"event_id": "01KV7ZHF5KYNK2Q2AXN8KQFS5R",
"occurred_at": "2026-06-16T10:27:25+00:00",
"delivered_at": "2026-06-16T10:27:25+00:00",
"partner": {
"id": 5
},
"payload_mode": "full",
"actor": null,
"review": null,
"metadata": []
},
"error_message": "cURL error 6: Could not resolve host: dummy.url",
"response_body_snippet": null,
"signature": "sha256=0000000000000000000000000000000000000000000000000000000000000000",
"attempted_at": "2026-06-16T10:27:30+00:00",
"delivered_at": null,
"next_retry_at": null
}
]
}
}Examples
Success payload
See Response payload.
Error payload
403 Not a Partner token
{
"message": "Only partner-admin users can manage webhook subscriptions.",
"status": "error",
"errors": []
}404 Subscription not found
{
"message": "Subscription not found.",
"status": "error",
"errors": []
}422 limit over 100
{
"message": "The limit field must not be greater than 100.",
"errors": {
"limit": [
"The limit field must not be greater than 100."
]
}
}422 Invalid filter
{
"message": "The selected status is invalid. (and 1 more error)",
"errors": {
"status": [
"The selected status is invalid."
],
"since": [
"The since field must be a valid date."
]
}
}500 Server error
{
"message": "Server Error"
}| Status | Meaning |
|---|---|
200 | The delivery attempts. Empty when there are none. |
401 | The token is missing, expired or invalid. |
403 | The token isn't a Partner token. |
404 | No subscription with this id belongs to your partner. |
422 | limit is over 100, or status, since or before_id is invalid. |
500 | Unexpected server error. |
Example request
curl --request GET \
--url "https://production-api.shoutaboutus.com/api/v1/partner/webhooks/3/deliveries?limit=10" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json'Updated 11 days ago
