> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nudj.cx/llms.txt
> Use this file to discover all available pages before exploring further.

# Delivery Logs & Retries

> Inspect webhook delivery attempts, debug failures, and manually retry failed events.

Every webhook Nudj sends — successful or not — is persisted to a dedicated log collection. You can query the log via the Admin API, or inspect it in the admin panel and re-trigger failed deliveries with one click.

<Info>
  Delivery logs are organisation-scoped. You need an Admin-tier API token to read them.
</Info>

## When are logs written?

Nudj writes a log record each time it **attempts** to deliver a webhook:

* On the initial attempt, whether the endpoint returns `2xx` or not.
* On each automatic retry (up to your configured `maxRetries`).
* On any manual retry triggered from the admin panel or API.

## Log record shape

```json theme={null}
{
  "id": "652f8a3c1e4f7d0012a3b4c5",
  "webhookConfigId": "650c9e1a...",
  "organisationId": "5f7d1e2a...",
  "eventSubCategory": "challenge-completion",
  "url": "https://your-app.com/webhooks/nudj",
  "httpMethod": "POST",
  "requestHeaders": { "Authorization": "Bearer ***", "X-Webhook-Source": "nudj-platform" },
  "requestBody": { "id": "...", "eventCategory": "challenge", "userId": "...", "payload": { /* ... */ } },
  "responseStatus": 500,
  "responseHeaders": { "content-type": "text/plain" },
  "responseBody": "Internal Server Error",
  "attempt": 2,
  "success": false,
  "errorMessage": "HTTP 500: Internal Server Error",
  "createdAt": "2026-03-14T10:21:45.102Z"
}
```

Secret values in `requestHeaders` are redacted in the stored record.

## Query logs via the API

Use the Admin API endpoint to page through recent delivery attempts:

```bash theme={null}
curl -X GET "https://{subdomain}.nudj.cx/api/v2/admin/webhooks/logs?limit=50" \
  -H "x-api-token: YOUR_ADMIN_API_TOKEN"
```

See [`GET /webhooks/logs`](/api-reference/admin/get-webhooks-logs) for filter options (by `eventSubCategory`, `success`, date range, etc.).

## Retry a failed delivery

In the admin panel, navigate to **Settings → Organisation → Webhooks → Delivery Logs** and click the **Retry** icon next to any failed row. Nudj will resend the exact same payload to your endpoint and write a fresh log entry with `attempt: N+1`.

<Warning>
  Manual retries do not count against your configured `maxRetries`. Don't loop retries programmatically — fix the root cause first, then retry.
</Warning>

## Use cases

* **Debugging a broken handler**: compare `requestBody` to what your handler received. Check if a reverse proxy, payload size limit, or JSON parser is stripping fields.
* **Replaying events after downtime**: your endpoint was down for 10 minutes? Filter logs by `success: false` and retry each one.
* **Auditing**: prove to internal stakeholders that a specific event was delivered with the exact payload and response.

## Retry semantics

Automatic retries use a fixed 5-second delay and stop after the webhook's `maxRetries` value (default 3). There is no exponential backoff today — if your endpoint is flapping, use the manual retry flow once the root cause is fixed instead of relying on auto-retry.

Every retry attempt — automatic or manual — gets its own log entry, so you can trace the exact delivery timeline per event.

## Related

<CardGroup cols={2}>
  <Card title="Troubleshooting" icon="wrench" href="/developer/webhooks/troubleshooting">
    Diagnose common delivery failures.
  </Card>

  <Card title="Implementation Guide" icon="code" href="/developer/webhooks/implementation">
    Build a compliant handler from scratch.
  </Card>
</CardGroup>
