HookDeploy

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

  1. Select a captured request in the dashboard (or reference it via API)
  2. Provide a target_url — must be HTTPS
  3. HookDeploy fetches the original body from R2
  4. HookDeploy sends an HTTP request to target_url with:
    • Original method, headers (minus proxy headers), query string, and body
    • Added headers:
      x-hookdeploy-replay: 1
      x-hookdeploy-original-request-id: {request-id}
  5. Results are stored in the replays table 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

  1. Open an endpoint and click a request in the stream
  2. Click Replay
  3. Enter your target URL, e.g. https://abc123.ngrok.io/webhooks/stripe
  4. 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"
  }
}
FieldDescription
status_codeHTTP status from your target server, or null on connection failure
response_time_msRound-trip time to your target
successtrue if your server returned 2xx
errorError 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

ForwardingReplay
TriggerAutomatic on every webhookManual, one request at a time
TargetFixed per endpointAny URL per replay action
Adds replay headersNoYes
Sender waitsNoN/A (sender already got 200)
Use caseContinuous proxy to stagingDebug 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