GET /v1/routines/{routine}/hooks/{hook_id}/deliveries
The hook's delivery log, newest first: every request that reached a known hook in the last 7 days, the GET verifications included, whatever the answer (a run started, a duplicate, `if` false, a handshake, a 401 with its `reason`, a 422, a 503). An entry is listed within a second of the answer. Each entry has the status, the error `code`, `reason` and `detail`, the run, the size of the body and a fixed set of headers (`content-type`, `content-length`, `user-agent`, `idempotency-key`, `traceparent`, `x-github-event`, `x-github-delivery`, `x-github-hook-id`, `x-slack-retry-num`, `x-slack-retry-reason`, `webhook-id`, `webhook-timestamp`); no body, signature, cookie, credential or infrastructure header is stored. At most the newest 10,000 entries per hook are kept, and at most 1,200 POST and 60 GET requests per hook and minute are written: requests past that are answered as usual but not listed.

Authentication

Bearer Token (b3os_sk_ API key or b3os_pat_ token)

Path Parameters

routine string required path
A routine ID (`rtn_…`) or name. Names are unique per project; `runs`, `hooks`, `validate` and `import` are reserved and cannot be routine names.
Example: "nightly-digest"
hook_id string required path
The hook ID (`hk_…`).
Example: "hk_01m5t3r2qwz23751t0x74bhahz"

Query Parameters

limit integer optional query
Page size, from 1 to 100.
cursor string optional query
Opaque cursor from the previous page's `next_cursor`. Omit it for the first page.

Responses

200 A page of deliveries.
application/json
object string REQUIRED
Enum: list
data object[] REQUIRED
Array of:
object string REQUIRED
Enum: hook_delivery_entry
hook_id string REQUIRED
received_at string (date-time) REQUIRED
method string REQUIRED
Enum: POST, GET
source string REQUIRED
`edge_replay`: replayed from the edge's queue after the node was down; `test`: `POST …/test`.
Enum: provider, edge_replay, test
status integer REQUIRED
The HTTP status the hook answered.
outcome string REQUIRED
`not_started`: accepted without a run (`if` was false, or the routine is paused); `rejected`: a 4xx; `unavailable`: a 5xx (the edge retries).
Enum: started, deduplicated, not_started, handshake, rejected, unavailable
code string | null REQUIRED
The error code of a 4xx or 5xx.
reason string | null REQUIRED
The `reason` of a `webhook_signature_invalid` (`signature` or `timestamp`).
detail string | null REQUIRED
The error's detail (at most 500 characters).
run_id string | null REQUIRED
delivery_id string | null REQUIRED
deduplicated boolean REQUIRED
handshake string | null REQUIRED
Enum: slack_url_verification, slack_ssl_check, github_ping, get_challenge, null
size integer REQUIRED
Body bytes (the body itself is not kept).
headers object REQUIRED
The allowlisted request headers it had (values up to 256 characters).
next_cursor string | null REQUIRED
400 The request failed validation (`invalid_request`, `invalid_url`).
401 Missing, malformed, expired or revoked credentials (`unauthorized`).
403 Authenticated but not allowed (`forbidden`, `egress_denied`).
404 No such hook (`hook_not_found`).
429 A rate, concurrency or quota limit applies (`rate_limited`, `concurrency_limited`, `quota_exceeded`).
500 Something failed inside B3OS (`internal`). Retry with backoff.
503 The node or the product is not available right now (`node_unavailable`, `product_unavailable`, `capacity_unavailable`).
curl -X GET 'https://beta-api.b3os.org/v1/routines/nightly-digest/hooks/hk_01m5t3r2qwz23751t0x74bhahz/deliveries' \  -H 'Authorization: Bearer YOUR_API_TOKEN'
const response = await fetch('https://beta-api.b3os.org/v1/routines/nightly-digest/hooks/hk_01m5t3r2qwz23751t0x74bhahz/deliveries', {  method: 'GET',  headers: {      "Authorization": "Bearer YOUR_API_TOKEN"  }});const data = await response.json();console.log(data);
import requestsheaders = {    'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.get('https://beta-api.b3os.org/v1/routines/nightly-digest/hooks/hk_01m5t3r2qwz23751t0x74bhahz/deliveries', headers=headers)print(response.json())
200 Response
{  "object": "list",  "data": [    {      "object": "hook_delivery_entry",      "hook_id": "hk_01m5t3r2qwz23751t0x74bhahz",      "received_at": "2026-10-30T18:20:00.120Z",      "method": "POST",      "source": "provider",      "status": 202,      "outcome": "started",      "code": null,      "reason": null,      "detail": null,      "run_id": "run_01m5t40dnvfxq40j1zrjj42gpg",      "delivery_id": "72d3162e-cc78-11e3-81ab-4c9367dc0958",      "deduplicated": false,      "handshake": null,      "size": 1834,      "headers": {        "content-type": "application/json",        "user-agent": "GitHub-Hookshot/7b1c2f4",        "x-github-event": "pull_request",        "x-github-delivery": "72d3162e-cc78-11e3-81ab-4c9367dc0958"      }    },    {      "object": "hook_delivery_entry",      "hook_id": "hk_01m5t3r2qwz23751t0x74bhahz",      "received_at": "2026-10-30T18:19:41.002Z",      "method": "POST",      "source": "provider",      "status": 401,      "outcome": "rejected",      "code": "webhook_signature_invalid",      "reason": "signature",      "detail": "X-Hub-Signature-256 does not match",      "run_id": null,      "delivery_id": null,      "deduplicated": false,      "handshake": null,      "size": 1834,      "headers": {        "content-type": "application/json",        "x-github-event": "pull_request"      }    }  ],  "next_cursor": null}
Ask a question... ⌘I