Webhook Tester

A webhook tester is a temporary public address that records every HTTP request sent to it, so you can see exactly what a webhook sender actually delivered. Create a hook below and you get a unique URL that lives for 30 minutes: point Stripe, GitHub, a payment provider, a monitoring service or your own code at it, trigger the event, and every delivery lands here — method, path and query, headers, body and source address — for you to inspect before you wire the real handler up.

Last updated:

What this service stores — and what it never does

Creating a hook stores, on the SysOSX checker server, only the hook id, its creation and expiry times and the address that created it. Each captured request stores the time it arrived, the method, the path with its query string, the headers exactly as sent, the body up to 256 KB (anything longer is truncated and flagged), and the sender’s address. A hook holds at most 50 requests; further deliveries are refused until it expires. Everything is deleted 30 minutes after the hook was created, or immediately when you press the delete button. The receiver only receives: it never fetches, follows or replays anything — a captured request triggers no outbound call of any kind. For the neighbouring debugging tool, see the HTTP status chain tracer, and for the full workflow read debug webhooks without the plumbing.

Why debugging webhooks is awkward without a receiver

A webhook is someone else’s server calling yours, on their schedule, in response to an event you do not control — a payment succeeding, a push landing, an alert firing. That shape is what makes webhooks painful to debug. The sender cannot reach your laptop, so local development needs a tunnel or a public staging box before you can see a single real delivery; the event may be hard to trigger twice, so the one delivery you do get had better be captured completely; and when something fails, the sender’s dashboard usually shows only a status code your endpoint returned, not what it actually sent. Was the signature header present? Was the body the JSON shape the docs promised, or form-encoded? Did the retry send the same event id? None of those questions can be answered from your handler’s logs alone if your handler rejected the request before logging it — which is precisely what happens with the signature and parsing bugs that dominate webhook debugging.

A temporary receiver removes the plumbing from that loop. Instead of deploying a half-written handler just to see what arrives, you create an address that accepts anything, records it faithfully, and shows it to you: headers in the order and casing they arrived, the raw body before any parser has had a chance to reject it, the query string senders sometimes hide parameters in, and the exact method — because some providers deliver with POST, some with PUT, and a few health-check with GET. With one real captured delivery on screen you can write your handler against the truth instead of the documentation, build a fixture for your tests from the actual payload, and compare a failing retry against the original side by side. Then you delete the hook, point the provider at your real endpoint, and trigger the event once more to watch your own handler answer it. Thirty minutes is deliberately short: long enough for a debugging session, short enough that a forgotten test address full of captured payloads does not linger on the internet.

Frequently asked questions

How long does a hook live, and how much can it capture?

A hook lives for 30 minutes from the moment you create it, then the hook and everything it captured are deleted automatically. It holds up to 50 requests; deliveries beyond that are refused with a 429 response until the hook expires. Each request body is stored up to 256 KB — a longer body is truncated, and the capture is flagged as truncated so you know you are not seeing all of it.

Who can see what my hook captures?

Anyone who has the hook URL. The id in the URL is the only credential: it authorises sending requests and reading the captures, with no account and no password on top. That is what makes the tool instant to use, and it is why you should treat the URL like a password — do not post it publicly, and never point production traffic carrying secrets or personal data at a shared viewer like this.

Does the receiver reply to the sender, follow links, or replay requests?

No. The receiver answers every accepted delivery with a small 200 JSON acknowledgement recording that it arrived, and does nothing else with it: it never fetches URLs found in a payload, never follows redirects, and offers no replay or forwarding. Receiving and inspecting is the whole service, which keeps a captured payload from turning into outbound traffic.

Which senders can I test with this?

Anything that can send an HTTP request to a public URL: Stripe, GitHub, Shopify, payment and form providers, monitoring and CI services, an IoT device, or your own code with curl. Create the hook, paste the URL into the provider’s webhook settings (or your script), trigger the event, and watch the delivery arrive here within seconds. Remember to remove the test URL from the provider afterwards, or point it at your real handler.