---
title: "Replay events to an endpoint"
url: https://docs.light-ai.app/api-reference/webhooks/replay-webhook-deliveries.md
canonical_url: https://docs.light-ai.app/api-reference/webhooks/replay-webhook-deliveries
last_updated: 2026-10-13
summary: "POST /v1/webhook_endpoints/{endpoint_id}/replay: Re-queues events of a time range (at most 30 days back, at most 5000 events)."
api_status: beta
related:
  - https://docs.light-ai.app/api-reference/webhooks
---

# Replay events to an endpoint

> POST /v1/webhook_endpoints/{endpoint_id}/replay: Re-queues events of a time range (at most 30 days back, at most 5000 events).

`POST /v1/webhook_endpoints/{endpoint_id}/replay`

Re-queues events of a time range (at most 30 days back, at most 5000 events). By default only events not yet delivered successfully, including events missed while the endpoint was disabled. Replays reuse the original `webhook-id`. Test-mode replays count toward the organization's 500 test deliveries a day: a replay that would pass it queues nothing and answers 429 (Retry-After until midnight UTC).

|   |   |
| --- | --- |
| Scope | `webhooks:manage` |
| Credential | API key: `Authorization: Bearer lai_live_…` (or `lai_test_…`). Partner keys add `Light-AI-Organization`. |
| Test mode | Works with test keys (test objects only). |
| Idempotency | `Idempotency-Key` supported. See [Idempotency](https://docs.light-ai.app/idempotency). |

## Path parameters

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `endpoint_id` | string | yes | The endpoint id (`we_…`). Id prefix `we_`. |

## Headers

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `Light-AI-Organization` | string |  | Partner keys: the connected organization to act for (`org_…`). Organization keys may omit it. Id prefix `org_`. |
| `Light-AI-Version` | string |  | Pin a dated API version (defaults to the key's version). One of: `2026-11-01`. |
| `Idempotency-Key` | string |  | Retry-safe writes: the same key and body replay the first response for 24 hours (`Idempotent-Replayed: true`). 8–128 characters. |

## Request body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `created_after` | timestamp | yes | Start of the range (at most 30 days ago). |
| `created_before` | timestamp |  | RFC 3339 date-time with offset. |
| `types` | string[] |  | One of: `lead.created`, `lead.touched`, `lead.updated`, `lead.mockup_ready`, `client.created`, `client.updated`, `client.deleted`, `project.created`, `project.stage_changed`, `quote.published`, `quote.viewed`, `quote.external_link_clicked`, `quote.change_requested`, `quote.approved`, `quote.declined`, `quote.expired`, `quote.link_disabled`, `quote.link_enabled`, `quote.superseded`, `mockup.completed`, `mockup.failed`, `organization.entitlement_changed`, `grant.created`, `grant.revoked`, `api_key.expiring`, `webhook_endpoint.disabled`. 1–40 items. |
| `only_failed` | boolean |  | Default true: only events not yet delivered successfully. |

## Response 200

How many events were queued.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | Always `webhook_replay`. |
| `queued` | integer | yes |  |

## Errors

| Status | Meaning |
| --- | --- |
| `400` | Bad request. [`bad_request`](https://docs.light-ai.app/errors#bad_request), [`test_mode_mismatch`](https://docs.light-ai.app/errors#test_mode_mismatch), [`test_mode_unsupported`](https://docs.light-ai.app/errors#test_mode_unsupported), [`unsupported_api_version`](https://docs.light-ai.app/errors#unsupported_api_version) |
| `401` | Missing or invalid credential. [`authentication_required`](https://docs.light-ai.app/errors#authentication_required), [`invalid_api_key`](https://docs.light-ai.app/errors#invalid_api_key), [`api_key_revoked`](https://docs.light-ai.app/errors#api_key_revoked), [`api_key_expired`](https://docs.light-ai.app/errors#api_key_expired), [`api_key_suspended`](https://docs.light-ai.app/errors#api_key_suspended) |
| `403` | Not allowed. [`insufficient_scope`](https://docs.light-ai.app/errors#insufficient_scope), [`plan_upgrade_required`](https://docs.light-ai.app/errors#plan_upgrade_required), [`organization_paused`](https://docs.light-ai.app/errors#organization_paused), [`organization_off_season`](https://docs.light-ai.app/errors#organization_off_season), [`api_disabled`](https://docs.light-ai.app/errors#api_disabled), [`api_access_not_enabled`](https://docs.light-ai.app/errors#api_access_not_enabled), [`ip_not_allowed`](https://docs.light-ai.app/errors#ip_not_allowed), [`forbidden`](https://docs.light-ai.app/errors#forbidden) |
| `404` | Not found (also for objects of other organizations and for organizations without an active grant). |
| `409` | Conflict. [`stale_state`](https://docs.light-ai.app/errors#stale_state), [`conflict`](https://docs.light-ai.app/errors#conflict), [`idempotency_in_progress`](https://docs.light-ai.app/errors#idempotency_in_progress), [`idempotency_scope_mismatch`](https://docs.light-ai.app/errors#idempotency_scope_mismatch), [`quote_already_decided`](https://docs.light-ai.app/errors#quote_already_decided), [`quote_not_current`](https://docs.light-ai.app/errors#quote_not_current), [`billing_review_required`](https://docs.light-ai.app/errors#billing_review_required) |
| `413` | Request bodies are limited to 256 KB. |
| `415` | The body is not JSON: send Content-Type: application/json. [`unsupported_media_type`](https://docs.light-ai.app/errors#unsupported_media_type) |
| `422` | Validation failed. [`idempotency_key_reused`](https://docs.light-ai.app/errors#idempotency_key_reused) |
| `429` | Rate limited or daily cap reached. See Retry-After and the RateLimit headers. [`rate_limited`](https://docs.light-ai.app/errors#rate_limited), [`daily_cap_reached`](https://docs.light-ai.app/errors#daily_cap_reached) |
| `500` | Unexpected server error. Safe to retry with exponential backoff; quote the Request-Id to support. [`internal_error`](https://docs.light-ai.app/errors#internal_error) |
| `503` | Temporarily unavailable. Retry with exponential backoff. [`service_unavailable`](https://docs.light-ai.app/errors#service_unavailable) |

## Examples

**Request**

curl:

```bash
curl -X POST "https://api.light-ai.app/v1/webhook_endpoints/{endpoint_id}/replay" \
  -H "Authorization: Bearer $LIGHT_AI_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "created_after": "2026-10-10T00:00:00Z",
  "types": [
    "lead.created"
  ],
  "only_failed": true
}'
```

JavaScript:

```javascript
const response = await fetch('https://api.light-ai.app/v1/webhook_endpoints/{endpoint_id}/replay', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.LIGHT_AI_API_KEY}`,
    'Idempotency-Key': crypto.randomUUID(),
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "created_after": "2026-10-10T00:00:00Z",
    "types": [
      "lead.created"
    ],
    "only_failed": true
  }),
});
const data = await response.json();
```

Python:

```python
import os, uuid, requests

response = requests.post(
    "https://api.light-ai.app/v1/webhook_endpoints/{endpoint_id}/replay",
    headers={
        "Authorization": f"Bearer {os.environ['LIGHT_AI_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
      "created_after": "2026-10-10T00:00:00Z",
      "types": [
        "lead.created"
      ],
      "only_failed": True
    },
    timeout=30,
)
data = response.json()
```

**Response 200**

```json
{
  "object": "webhook_replay",
  "queued": 0
}
```
