Replay lets you re-send a captured request to any target URL — typically your local dev server or a staging environment.
When to use replay
- Your local server wasn’t running when the webhook arrived
- You need to test the same payload multiple times
- A teammate captured a webhook and you want to process it locally
- Auto-forward failed and you need to retry manually
Replay is on-demand. Unlike auto-forwarding, nothing is re-sent unless you explicitly trigger it.
How replay works
- Select a captured request in the dashboard (or reference it via API)
- Provide a
target_url— must be HTTPS - HookDeploy fetches the original body from R2
- HookDeploy sends an HTTP request to
target_urlwith:- Original method, headers (minus proxy headers), query string, and body
- Added headers:
x-hookdeploy-replay: 1 x-hookdeploy-original-request-id: {request-id}
- Results are stored in the
replaystable and returned to you
Your target server can detect replays via the x-hookdeploy-replay header and skip side effects if needed (e.g. don’t double-charge a customer).
Replay from the dashboard
- Open an endpoint and click a request in the stream
- Click Replay
- Enter your target URL, e.g.
https://abc123.ngrok.io/webhooks/stripe - Click Send
The result panel shows HTTP status code, response time, and any error.
Replay via the API
curl -s -X POST \
"https://api.hookdeploy.dev/v1/endpoints/ENDPOINT_ID/requests/REQUEST_ID/replay" \
-H "Authorization: Bearer hd_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"target_url": "https://abc123.ngrok.io/webhooks/stripe"}'
Response:
{
"data": {
"status_code": 200,
"response_time_ms": 142,
"success": true,
"error": null
}
}
On failure:
{
"data": {
"status_code": null,
"response_time_ms": null,
"success": false,
"error": "Connection refused"
}
}
| Field | Description |
|---|---|
status_code | HTTP status from your target server, or null on connection failure |
response_time_ms | Round-trip time to your target |
success | true if your server returned 2xx |
error | Error message if the connection failed entirely |
Requires the requests.replay permission — held by super admin, admin, developer, and viewer roles.
Replay history
Every replay is recorded in the replays table with the target URL, status, timing, and timestamp. Replay history is visible in the dashboard on the request detail page.
There is no limit on replays per request — you can replay the same webhook to different targets as many times as you need. Replays do not count toward your monthly request ingestion limit (that limit applies to incoming webhooks only).
Target URL requirements
- Must start with
https:// - Must be reachable from HookDeploy’s API Worker (public internet)
- localhost URLs won’t work directly — use ngrok, Cloudflare Tunnel, or similar
# This works (via ngrok)
{"target_url": "https://abc123.ngrok.io/webhooks"}
# This fails (not reachable)
{"target_url": "https://localhost:3000/webhooks"}
Replay vs forwarding
| Forwarding | Replay | |
|---|---|---|
| Trigger | Automatic on every webhook | Manual, one request at a time |
| Target | Fixed per endpoint | Any URL per replay action |
| Adds replay headers | No | Yes |
| Sender waits | No | N/A (sender already got 200) |
| Use case | Continuous proxy to staging | Debug a specific event locally |
Many teams use both: forward to staging for continuous integration testing, replay to localhost for active development.
Security note
Replay sends the exact original payload including any auth tokens or secrets that were in the original request headers. Only replay to servers you trust, and avoid replaying production webhooks containing live credentials to unsecured tunnels.
Next steps
- Replay API — Full API reference
- Forwarding — Automatic proxy setup
- API keys — Authenticate replay requests via API