The Debugging Problem
You're integrating a webhook. Stripe, GitHub, Shopify — the provider says "we'll POST to your endpoint." But what exactly do they send? What headers? What content type? What does the payload look like?
Usually you'd spin up ngrok, write a quick Express server, or use webhook.site (which has a 2-day retention limit). We built something simpler: a free HTTP echo API that mirrors any request back as JSON. Part of WebhookVault.
Echo API: Mirror Any Request
curl -X POST https://webhookvault.anethoth.com/api/v1/echo \
-H "Content-Type: application/json" \
-H "X-Custom-Header: test-value" \
-d '{"event": "payment.completed", "amount": 4999}'
{
"method": "POST",
"url": "/api/v1/echo",
"headers": {
"content-type": "application/json",
"x-custom-header": "test-value",
"host": "webhookvault.anethoth.com",
"user-agent": "curl/8.1.2",
"accept": "*/*",
"content-length": "45"
},
"body": "{"event": "payment.completed", "amount": 4999}",
"client_ip": "203.0.113.42",
"timestamp": "2026-04-19T12:00:00Z"
}
Any HTTP method works: GET, POST, PUT, PATCH, DELETE, OPTIONS. You can also append custom paths: /api/v1/echo/my/custom/path — the path is included in the response.
Headers Inspector
Sometimes you just want to see what headers a proxy, CDN, or load balancer adds to your requests:
curl https://webhookvault.anethoth.com/api/v1/headers
{
"headers": {
"host": "webhookvault.anethoth.com",
"user-agent": "curl/8.1.2",
"accept": "*/*",
"cf-connecting-ip": "203.0.113.42",
"cf-ray": "8abc123def456-IAD",
"x-forwarded-for": "203.0.113.42",
"x-forwarded-proto": "https"
},
"count": 7,
"analysis": {
"auth_type": "none",
"proxy_detected": true,
"cors_origin": null
}
}
The analysis field automatically detects: authentication type (Bearer, Basic, API key), proxy/CDN headers (X-Forwarded-For, CF-Connecting-IP), and CORS origin headers. Useful for debugging authentication issues and proxy configurations.
Real-World Use Cases
1. Verify Stripe Webhook Payloads
Before writing your webhook handler, see exactly what Stripe sends:
# Set your Stripe CLI to forward to the echo endpoint
stripe listen --forward-to https://webhookvault.anethoth.com/api/v1/echo
# Trigger a test event
stripe trigger payment_intent.succeeded
The echo response shows you the exact headers (including stripe-signature) and payload structure.
2. Debug HTTP Client Libraries
Verify that your HTTP client sends the right headers and body:
import requests
resp = requests.post(
"https://webhookvault.anethoth.com/api/v1/echo",
json={"test": True},
headers={"Authorization": "Bearer sk_test_xxx"}
)
print(resp.json()["headers"]["authorization"])
# "Bearer sk_test_xxx" — confirmed it's sent correctly
3. Test CORS Preflight
Check what your browser sends in a CORS preflight:
fetch("https://webhookvault.anethoth.com/api/v1/echo", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ test: true })
}).then(r => r.json()).then(console.log);
4. Load Balancer Health Check Verification
Verify what your load balancer sends to backend health checks:
curl https://webhookvault.anethoth.com/api/v1/echo/health \
-H "User-Agent: ELB-HealthChecker/2.0"
CORS Enabled
Both endpoints support CORS from any origin, so you can call them from browser-based tools, CodePen experiments, or frontend debugging sessions.
Limits
- Rate limit: 30 requests/minute per IP
- No authentication required
- No data stored — echo responses are generated on the fly, nothing is saved
- Max body size: 1MB
Need More?
The echo API is stateless — it doesn't store requests. If you need to capture, inspect, replay, and forward webhook requests with a persistent endpoint, check out WebhookVault. The free tier includes 3 endpoints with 24-hour request retention. Or try the interactive Webhook Tester to create a temporary capture endpoint in your browser.
Try WebhookVault free
A free HTTP echo API that mirrors any request back as JSON — method, headers, body, IP. Get started with our free tier — no credit card required.
Get started free →