---
title: "Re-send a logged delivery"
method: POST
path: "/v1/webhooks/{id}/logs/{logId}/retry"
tags: ["Webhooks"]
---

# Re-send a logged delivery

`POST /v1/webhooks/{id}/logs/{logId}/retry`

## Request

- Base URL: `https://api.kawaa.com`
- URL: `https://api.kawaa.com/v1/webhooks/{id}/logs/{logId}/retry`
- Auth: one of:
  - API key in header `X-Api-Key`
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.kawaa.com/oauth/authorize`, token URL `https://api.kawaa.com/oauth/token`, scopes: `webhooks:write`)

Sends the logged entry's `request_body` again, byte for byte, to the endpoint's CURRENT URL, signed with its current secret. The re-send carries a fresh `X-Kawaa-Timestamp` header, an `X-Kawaa-Retry: true` header and an `X-Kawaa-Signature-V2` whose `t` is the time of the re-send, so it passes a receiver's 300-second window however old the original is; the body, including its own `timestamp` field, is the original's. Check freshness against that `t`, never against the body's `timestamp`. It is made once, with a 10-second timeout, and recorded as a NEW log entry with `delivery_type: "retry"`; the original entry keeps its outcome. Any entry still in the log can be re-sent, a successful one included. No request body is read.

A scoped key may re-send only an entry whose payload it may read (the same rule the log listing applies); otherwise the answer is 403 and nothing is sent.

## Path parameters

- `id` string, required
- `logId` string, required

## Response `200`

The re-send was ATTEMPTED. **200 does not mean it worked**: branch on `data.success`.

- object
  - `success` unknown, required
  - `data` object, required
    - `success` boolean, required: Whether the endpoint accepted the re-send (a 2xx). False for a non-2xx, a timeout, a connection failure, and a URL refused as unsafe or missing, all of which still answer HTTP 200 here.
    - `status_code` integer, required: What the endpoint answered. `0` when nothing was reached.
    - `message` string, required: What happened, in prose, e.g. `Retry successful`, `Retry failed with status 500`, or why the URL was refused.

## Other responses

- `401`: No credential, or one that is not accepted. `code` distinguishes `API_KEY_SUSPENDED` (subscription ended; restartable) from `API_KEY_REVOKED`, `SESSION_EXPIRED` and `OAUTH_TOKEN_EXPIRED` (a connected app's one-hour access token lapsed: refresh it and retry, or sign in again if no refresh token was issued or the refresh is refused).
- `403`: Refused, and **the code says which of three problems it is**, and they need different remedies: - `INSUFFICIENT_SCOPE`: the credential is valid but not scoped for this route. With an API key, issue one that carries the scope named in the message. With an OAuth access token, connect the app again asking for that scope as well as the ones it has, unless the message says a connected app can never be given it; then use an API key with every scope the message names, or have the account owner do it in the dashboard. - `PLAN_UPGRADE_REQUIRED`: the account's plan does not include the feature. **No key of any scope reaches it**, so issuing another is wasted work; the remedy is a plan change. Returned by the verification routes for `options.enrich`, and by the finder, the monitors, the audit log, auto-clean and the white-label routes. - `PLAN_LIMIT_EXCEEDED`: the plan includes the feature and the account is at its ceiling (webhook endpoints, team seats, integrations, auto-clean lists). Delete one or upgrade. - `FORBIDDEN`: refused for a reason none of the above covers. `ErrorCode` is an open set, so branch on the code with a default rather than exhaustively.
- `404`: Nothing was sent. `Webhook not found` for an endpoint id that is not this account's; `Log entry not found` for a `logId` that does not exist, belongs to another endpoint, or has passed its retention.
- `409`: `CONFLICT`: nothing was sent. Kawaa switched the endpoint off because an API key or connected app that created it, or that changed its URL or events or turned it on, was revoked or disconnected, or the delivery check found such an end. Check where it sends and turn it back on before resending deliveries to it.
- `429`: Too many requests. When the server knows how long to wait, `Retry-After` says so and `error.retry_after_seconds` carries the same number; the `X-RateLimit-*` headers say where you stand.
- `503`: The log entry could not be read at that moment, so nothing was sent. Retrying this operation is safe. Also when the credentials the endpoint records could not be checked: nothing was sent.
- `default`: Any status this operation does not list. Kawaa's own errors carry the error envelope. The gateway in front of the API can answer any operation with its own bare body (`GatewayError`): a `503` after about 29 seconds, when the request may still have run and been charged, a `413` for a body over about 6 MB, or a `400` for a path with malformed percent-encoding.

---

[API](https://skmtc.dev/kawaa/apis/kawaa-api.md) · [All operations](https://skmtc.dev/kawaa/apis/kawaa-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kawaa/apis/kawaa-api/revisions/d27c9c33f6ba?raw)
