Every byte, one place
Method, path, query, headers, raw body and size. JSON gets pretty-printed, forms get decoded, binaries get sized — all without touching your server.
Peekhook gives you an instant URL for every provider. Inspect the full request, replay it to your own machine, and return exactly the response they expect — without deploying a thing.
// Send a webhook and it will appear here.
/h/demo
Every request is captured in full — no more “it worked on my machine” with a side of guesswork.
Method, path, query, headers, raw body and size. JSON gets pretty-printed, forms get decoded, binaries get sized — all without touching your server.
Send any captured request to your local dev server or staging URL with one click, headers and body intact. Stop waiting for the provider to retry.
Return a custom status, body and delay so a provider gets the exact response it wants while you fix the handler behind it. No more retry storms.
Thirty days of searchable captures on Pro. Filter by provider, status or text, and share a read-only permalink with the teammate who broke it.
One click gives you a unique HTTPS URL. No tunnel, no port forwarding, no “works on my machine” dance.
https://your-app.dev/h/8f2kq9Paste the URL into Stripe, GitHub, Shopify, Slack — anything that speaks webhooks. The first delivery lands instantly.
stripe webhook_endpoints create \
--url https://your-app.dev/h/8f2kq9Read the request, replay it locally, return the response the provider expects. Your integration gets fixed instead of retried.
200 OK · captured in 42ms
replayed to localhost:3000 ✓The panel above is a live Peekhook feed, not a screenshot. Fire the request below and watch it land — then try replaying it or setting a custom response in the dashboard.
curl -X POST http://localhost:8080/h/demo \
-H 'content-type: application/json' \
-d '{"hello":"peekhook"}'
Pro pays for itself the first time a webhook fails silently and you find out before your customers do.
For side projects, first integrations and “is this thing on?” moments.
Create a free endpointBilled monthly. Cancel anytime from the Stripe billing portal.
Prices in USD. Card required for the trial; cancel before day 7 and you pay nothing. Payments run in Stripe test mode in this demo.
Your endpoints require a random URL and your dashboard requires a session. Captures are only readable by the endpoint owner. The public demo endpoint on this page is intentionally open. On paid plans, share links are opt-in and expire after seven days.
Stripe charges the card on file for the plan you picked — $12/month or $115/year. Cancel or switch plans any time from the billing portal; access stays active until the end of the period you paid for.
Not directly, and that is deliberate: replay blocks private and loopback addresses so the feature cannot be used to probe your internal network. Expose your local server with a tunnel (ngrok, cloudflared, Tailscale Funnel) and replay to that public URL instead.
On Pro, each endpoint can return a status code between 200 and 599, a custom body up to 8 KB, and an optional delay up to 5 seconds. Providers see a successful delivery, so retries stop while you fix the real handler.
Headers are captured verbatim because signature debugging needs them. That can include provider signatures and, rarely, authorization headers. Keep endpoint URLs private, and delete captures you no longer need. Retention is 24 hours on Free and 30 days on Pro.
Yes — this build ships with a Docker Compose stack (app + Postgres), migrations, seeded demo data and Stripe test-mode wiring. The README has the full runbook.
Create your first endpoint in under ten seconds. Two endpoints free, no credit card, no deploy required.