Docs
WebhookEnv is API-first: everything the dashboard does is a plain HTTP call. The capture sink accepts anything you throw at it.
1. Create a bin
curl -s -X POST http://localhost:8101/api/bins \
-d '{"forward_url":"http://localhost:3000/hooks/stripe"}'
# → {"id":"890d9ce8afe0","token":"…","capture_url":"/w/890d9ce8afe0"} The token is shown once - store it. It authorizes reads, replays and bin management.
2. Send webhooks at it
curl -X POST http://localhost:8101/w/890d9ce8afe0/stripe/evt_123 \
-H "Stripe-Signature: t=1,v1=abc…" -d '{"type":"payment.succeeded"}' Any method, any path suffix, query strings included. Everything is captured and (if set) forwarded to your URL with original headers.
3. Inspect
curl -s http://localhost:8101/api/bins/890d9ce8afe0/requests \
-H "Authorization: Bearer $TOKEN" | jq '.requests[0]' Newest first: method, path, query, decoded headers, base64 body, size, timing, source IP.
4. Replay with edits
curl -s -X POST http://localhost:8101/api/requests/$REQ_ID/replay \
-H "Authorization: Bearer $TOKEN" \
-d '{"body":"{\"amount\":999}"}' Re-issues to the forward URL (or an explicit url override). Replays are tagged in history so you never confuse them with live traffic.
Plan limits
| Resource | Free | Pro $12/mo | Team $39/mo |
|---|---|---|---|
| Bins | 1 | 10 | Unlimited |
| Retained requests / month | 50 | 20,000 | 100,000 |
| History window | 24 hours | 30 days | 30 days |
| Max body size | 256 KB | 1 MB | 1 MB |
| Replay & edit | - | ✓ | ✓ |
| Forwarding | ✓ | ✓ | ✓ |
| Shared team bins | - | - | ✓ (5 seats) |
Local development note: this site talks to the Go service at http://localhost:8101.
Set APP_URL accordingly when deploying.