Local Testing with ngrok
ngrok creates a public HTTPS tunnel to your local server, letting Xquik deliver webhooks to your development machine.Testing with RequestBin
Use webhook.site to inspect webhook payloads without running a local server.Get a RequestBin URL
Visit webhook.site. A unique HTTPS URL is generated automatically:
RequestBin is useful for inspecting payload structure. For testing signature verification and handler logic, use ngrok with a local server instead.
Sending Test Payloads
Simulate a webhook delivery to your local handler without waiting for real events. This is useful for testing signature verification and event processing logic.eventType field: tweet.new, tweet.reply, tweet.quote, tweet.retweet.
Debugging Delivery Failures
Check Delivery Status
Query the deliveries endpoint to see delivery attempts and error details:Delivery Statuses
| Status | Description |
|---|---|
pending | Queued, waiting for next attempt |
delivered | Your endpoint returned 2xx. Complete. |
failed | Most recent attempt failed. Retrying with backoff. |
exhausted | All retry attempts used. No further retries. |
Common Failure Reasons
Timeout (>10 seconds)
Timeout (>10 seconds)
Your endpoint must respond within 10 seconds. If your handler is slow, return
200 immediately and process the event asynchronously using a background job queue.Non-2xx response
Non-2xx response
Any response outside the 200-299 range counts as a failure. Check your server logs for unhandled exceptions or validation errors in your handler. Common culprits: missing middleware (e.g.
express.raw()), JSON parse errors, or database connection failures.DNS resolution failure
DNS resolution failure
The webhook URL hostname could not be resolved. Verify your domain DNS records are correct. If using ngrok, confirm the tunnel is still running.
TLS/SSL errors
TLS/SSL errors
Webhook URLs must use HTTPS with a valid certificate. Self-signed certificates are rejected. Use a trusted CA (Let’s Encrypt, Cloudflare) or ngrok for local development.
Connection refused
Connection refused
The target server is not accepting connections. Verify your server is running and listening on the correct port. Check firewall rules if running on a cloud provider.
Signature verification failing
Signature verification failing
Compute the HMAC over the raw request body bytes, not a re-serialized JSON object. Re-serialization can alter whitespace or key ordering. Use
express.raw() in Node.js, request.get_data() in Flask, or io.ReadAll(r.Body) in Go.