LoguDocs
Open Logu

Webhooks · getWebhookDelivery

Get a webhook delivery

GET /v1/webhooks/{id}/deliveries/{deliveryId}

One webhook delivery with the exact payload sent and every attempt (status code, duration, the first 1 KB of the response, or the error). Never the request's headers or the secret.

Who may call it
humans: Owners and up
Server
https://api.logu.dev

Parameters#

NameInTypeRequiredDescription
idpathstringrequiredThe webhook endpoint's id (whk_…). · e.g. whk_01K7DC5E7G9J1L3N5Q7S9U1W3Y
deliveryIdpathstringrequiredThe webhook delivery's id (whd_…, also its webhook-id header). · e.g. whd_01K7DQ3M2X1K3M5P7R9T1V3X5Z
Logu-WorkspaceheaderstringoptionalHumans only: the workspace to act in (default: your personal workspace). Agents always act in their API key's workspace. · e.g. wsp_01K7D7Y8Z0B2D4F6H8K0M2P4R6

Example#

curl -s "https://api.logu.dev/v1/webhooks/whk_01K7DC5E7G9J1L3N5Q7S9U1W3Y/deliveries/whd_01K7DQ3M2X1K3M5P7R9T1V3X5Z" \
  -H "Authorization: Bearer $LOGU_SESSION_TOKEN"

Responses#

200

The webhook delivery.

{
  "id": "whd_01K7DQ3M2X1K3M5P7R9T1V3X5Z",
  "endpointId": "whk_01K7DC5E7G9J1L3N5Q7S9U1W3Y",
  "type": "ask.settled",
  "status": "succeeded",
  "attemptCount": 2,
  "lastStatusCode": 200,
  "lastAttemptAt": "2026-10-12T14:05:48.000Z",
  "nextAttemptAt": null,
  "createdAt": "2026-10-12T14:05:42.000Z",
  "payload": {
    "type": "ask.settled",
    "timestamp": "2026-10-12T14:05:42.000Z",
    "data": {
      "ask": {
        "id": "ask_01K7DQ3M2V8H4N6R9T1W3Y5B7C",
        "project": "shop",
        "channel": null,
        "title": "Deploy v1.4 to production?",
        "body": "3 commits since v1.3. CI is green.",
        "icon": null,
        "url": "https://github.com/acme/shop/compare/v1.3...v1.4",
        "options": [
          {
            "id": "approve",
            "label": "Approve",
            "style": "primary"
          },
          {
            "id": "decline",
            "label": "Decline",
            "style": "danger"
          }
        ],
        "allowText": false,
        "status": "decided",
        "decision": {
          "optionId": "approve",
          "text": null,
          "decidedVia": "app",
          "decidedAt": "2026-10-12T14:05:42.000Z",
          "decidedBy": {
            "id": "Xq3bY7tLmN2pR8sV",
            "name": "Ana"
          }
        },
        "defaultOption": "decline",
        "expiresAt": "2026-10-12T15:03:11.000Z",
        "createdAt": "2026-10-12T14:03:11.000Z",
        "metadata": null,
        "agent": {
          "id": "agt_01K7D8F2H4K6M8P0R2T4V6X8Z0",
          "name": "deploy-bot"
        },
        "attachments": [
          {
            "id": "att_01K7DQ6C8E0G2J4L6N8Q0S2U4W",
            "url": "https://api.logu.dev/a/att_01K7DQ6C8E0G2J4L6N8Q0S2U4W?exp=1791824400&sig=q8Hk2mP0vX3nR5tY7wZ9bD1fG3jL5nQ7sU9wY1aC3eE",
            "contentType": "image/png",
            "size": 184320,
            "width": 1440,
            "height": 900,
            "name": "checkout-after.png"
          }
        ],
        "test": false
      }
    }
  },
  "attempts": [
    {
      "number": 1,
      "at": "2026-10-12T14:05:42.000Z",
      "statusCode": 503,
      "durationMs": 412,
      "response": "Service Unavailable",
      "error": null
    },
    {
      "number": 2,
      "at": "2026-10-12T14:05:48.000Z",
      "statusCode": 200,
      "durationMs": 87,
      "response": "{\"ok\":true}",
      "error": null
    }
  ]
}
Response fields
FieldTypeRequiredNotes
idstringrequired
endpointIdstringrequired
type"ask.created" | "ask.settled" | "event.created" | "metric.alert" | "webhook.test"required
status"pending" | "succeeded" | "failed"required
attemptCountintegerrequired
lastStatusCodeinteger | nullrequired
lastAttemptAtstring | nullrequireddate-time
nextAttemptAtstring | nullrequireddate-time
createdAtstringrequireddate-time
payloadanyoptional
attemptsWebhookAttempt[]required
attempts[].numberintegerrequired
attempts[].atstringrequireddate-time
attempts[].statusCodeinteger | nullrequired
attempts[].durationMsintegerrequired
attempts[].responsestring | nullrequired
attempts[].errorstring | nullrequired

Errors#

Every error is {"error":{"code","message","hint","docUrl","requestId"}}: branch on code. See Errors.

StatusCodeMeaning
401unauthorizedNo credentials, or the API key or session is invalid or revoked.
403forbiddenThe caller is authenticated but may not do this (wrong role, or an API key on a human-only endpoint).
404not_foundNo such route, or the resource doesn't exist in your workspace.
500internal_errorSomething went wrong on Logu's side.