Quick Start
5 Minutes to Your First Webhook
Instant webhook debugging in real time. No sign-up required — generate a URL, send a payload, inspect the result.
Step 1 — Grab a Listening URL
Open the WebhookLab dashboard and create a new channel. You'll receive a unique endpoint like https://wklb.io/eh/7f3a9c2d that forwards every incoming HTTP request to your browser in real time.
Channels auto-expire after 24 hours of inactivity. You can pin a custom path (e.g., /eh/payments-callback) for persistent integration testing.
Step 2 — Send a Test Payload
Use any HTTP client. Below are ready-to-run examples for curl, Python, and Node.js that hit your listening URL with a realistic Stripe-style event.
curl
curl -X POST https://wklb.io/eh/7f3a9c2d \
-H "Content-Type: application/json" \
-H "X-Webhook-Signature: sha256=a1b2c3d4e5f6" \
-d '{
"id": "evt_1NqR3kL2mP4xYz",
"type": "payment_intent.succeeded",
"data": {
"object": {
"amount": 4999,
"currency": "usd",
"status": "succeeded"
}
}
}'
Python 3.9+
import requests
payload = {
"id": "evt_1NqR3kL2mP4xYz",
"type": "payment_intent.succeeded",
"data": {
"object": {
"amount": 4999,
"currency": "usd",
"status": "succeeded"
}
}
}
headers = {
"Content-Type": "application/json",
"X-Webhook-Signature": "sha256=a1b2c3d4e5f6"
}
resp = requests.post(
"https://wklb.io/eh/7f3a9c2d",
json=payload,
headers=headers
)
print(resp.status_code) # 200
Node.js 18+
const fetch = require("node-fetch");
const payload = {
id: "evt_1NqR3kL2mP4xYz",
type: "payment_intent.succeeded",
data: {
object: { amount: 4999, currency: "usd", status: "succeeded" }
}
};
const res = await fetch("https://wklb.io/eh/7f3a9c2d", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Webhook-Signature": "sha256=a1b2c3d4e5f6"
},
body: JSON.stringify(payload)
});
console.log(res.status); // 200
Each example sends a JSON body with a custom X-Webhook-Signature header so you can verify signature validation in your own handler later. WebhookLab echoes back the full request — method, headers, body, and response status — in the live inspector.
Step 3 — Inspect in the Terminal
Open your WebhookLab channel page. Every request appears instantly with full metadata. Here's what you'll see in the built-in terminal view after running the curl command above:
Terminal Output
$ wklb listen 7f3a9c2d
▶ Listening on https://wklb.io/eh/7f3a9c2d
──────────────────────────────────────────────
[14:32:07] POST /eh/7f3a9c2d
Status: 200 OK
Content-Type: application/json
X-Webhook-Signature: sha256=a1b2c3d4e5f6
Body (48 bytes):
{
"id": "evt_1NqR3kL2mP4xYz",
"type": "payment_intent.succeeded",
"data": {
"object": {
"amount": 4999,
"currency": "usd",
"status": "succeeded"
}
}
}
──────────────────────────────────────────────
Click any request to expand raw headers, view the response you sent back (if your handler replied), and replay the exact payload for regression testing. The replay feature preserves the original timestamp and signature header so you can validate idempotency logic without touching your production systems.
What You Can Do Next
Signature Verification
Copy the X-Webhook-Signature header and the raw body into WebhookLab's signature checker. Paste your secret key (e.g., whsec_mK8vR2pL9xQ4nY7w) and confirm the HMAC-SHA256 matches before trusting the payload.
Mock Responses
Configure WebhookLab to reply with a custom status code and JSON body. Useful for testing how your service handles 500 errors, 401 unauthorized, or delayed responses when integrating with providers like GitHub, Stripe, or Twilio.
Export & Share
Download the full request log as a HAR file or a JSON array. Share a read-only link with your team so everyone sees the same webhook events without needing access to your production logs.
Need a permanent URL for CI/CD pipelines?
Create Account Read the Docs