Skip to content
HookDeploy
On this page

Replay

Manually re-send captured webhooks to any HTTPS URL, with replay history and API support.

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 loads the stored captured representation
  4. HookDeploy sends an HTTP request to target_url with:
    • Captured method, stored headers (minus proxy headers), query string, and stored body
    • Added headers:
      x-hookdeploy-replay: 1
      x-hookdeploy-original-request-id: {request-id}
  5. The result is recorded 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 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 over the 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 stored captured representation. Header or body sanitization may mean it is not the byte-for-byte unsanitized request originally received. It can still contain sensitive data, so replay only to servers you trust.

Next steps