Local testing with ngrok
ngrok creates a public HTTPS tunnel to your local server, letting Xquik deliver webhooks to your development machine.Testing with webhook.site
Use webhook.site to inspect webhook payloads without running a local server.Get a webhook.site URL
Visit webhook.site. A unique HTTPS URL is generated automatically:
webhook.site 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, follower.gained, follower.lost.
Example follower event payload:
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
Slow response
Slow response
We recommend responding 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.Webhooks Overview
How webhooks work, delivery format, and retry policy.
Signature Verification
HMAC-SHA256 verification in Node.js, Python, and Go.
Deliveries API
Query delivery attempts and statuses.