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.

  1. 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.

  2. 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.

  3. 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.

Every request lands on your dashboard like this, as it happens.
POST 02:48:37 · 201 B · application/json · 54.187.174.169 forwarded 200 in 71ms
Stripe-Signaturet=1788504301,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77
User-AgentStripe/1.0 (+https://stripe.com/docs/webhooks)
Content-Typeapplication/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

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.

Create a test endpoint