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

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://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

ParameterInTypeRequiredDescription
webhookSubscriptionIdpathintegerYesThe subscription's id, from List your webhooks.
limitqueryintegerNoHow many attempts to return, 10–100. Default 50. Values below 10 are raised to 10; above 100 returns 422.
statusquerystringNosucceeded: 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.
eventquerystringNoOnly attempts for this event, e.g. response_post_failed or cache_invalidation.
sincequerystringNoOnly attempts made at or after this time, e.g. 2026-10-01T00:00:00Z.
before_idqueryintegerNoOnly 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.

FieldTypeDescription
dataarray of objectsDelivery attempts, newest first. Each retry is its own entry.
data[].idintegerThe attempt's id.
data[].eventstringThe event name sent, e.g. webhook.test or review_pull_connected.
data[].event_idstringThe 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_idinteger or nullThe review history entry behind the event, or null (e.g. for a test).
data[].store_idinteger or nullThe location the event is about, or null.
data[].attempt_numberinteger1 for the first try, then up for each retry.
data[].http_statusinteger or nullThe HTTP status your endpoint returned, or null when it couldn't be reached.
data[].payload_jsonobject or nullThe exact body that was sent, so you can check the signature yourself.
data[].error_messagestring or nullWhy 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_snippetstring or nullThe start of your endpoint's response body, or null.
data[].signaturestringThe X-SAU-Signature header sent: sha256= and the HMAC-SHA256 of the body.
data[].attempted_atstring or nullWhen it was sent (ISO 8601).
data[].delivered_atstring or nullWhen your endpoint accepted it (ISO 8601), or null.
data[].next_retry_atstring or nullWhen 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"
}
StatusMeaning
200The delivery attempts. Empty when there are none.
401The token is missing, expired or invalid.
403The token isn't a Partner token.
404No subscription with this id belongs to your partner.
422limit is over 100, or status, since or before_id is invalid.
500Unexpected 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'

Did this page help you?