Test any webhook.
Byte for byte.
Point Stripe, GitHub or Slack at a throwaway URL and read exactly what they sent. Forward it to your real endpoint while you watch, so nothing breaks.
Paste this into Stripe, GitHub, Slack, or whatever is calling you, in place of your own server’s address.
-
Step 1
Get a URL
Press the button above. You get a capture address like
addshit.com/w/a1b2c3d4, plus a private link to watch it. No account, nothing to install. -
Step 2
Give that URL to the sender
In Stripe, GitHub, Slack or whatever is calling you, paste it where your own server’s address would normally go. They will now send their requests to us instead.
-
Step 3
Trigger it and watch
Do the thing that fires the webhook. Within a second it appears on your page, showing every header and the exact body they sent, unchanged.
| Stripe-Signature | t=1788504301,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77 |
|---|---|
| User-Agent | Stripe/1.0 (+https://stripe.com/docs/webhooks) |
| Content-Type | application/json |
{"id":"evt_3PqL9x2eZvKYlo2C","type":"payment_intent.succeeded",
"data":{"object":{"amount":1234567.89,"currency":"usd"}}}
Optional: keep your own server running too
Normally the sender talks to us instead of you, so your app sees nothing.
If you would rather keep it working while you look, add an
X-Forward-Url header. We record the request, pass it straight
on to your real endpoint, and give the sender back whatever status code
your endpoint returned, so nothing downstream notices.
curl -X POST \
-H "X-Forward-Url: https://your-app.example/stripe" \
-d '{"type":"invoice.paid"}' \
https://addshit.com/w/YOUR_NAME
- Every method, not just
POST - Last
100requests, kept3days - Forwarding refuses private, loopback and link-local addresses
Anyone holding the URL reads everything it caught, headers included. Use test keys.
Also here: a test endpoint
The other way round to this page. Paste a response body, pick a status code, and get a URL that answers with exactly that, for building against an API that does not exist yet. Same lack of signup.