The vapi listen command provides a local webhook forwarding service that receives events and forwards them to your local development server. This helps you debug webhook integrations during development.
Important: vapi listen does NOT provide a public URL or tunnel. You’ll need to use a separate tunneling solution like ngrok to expose your local server to the internet.
In this guide, you’ll learn to:
No automatic tunneling: The vapi listen command is a local forwarder only. It does not create a public URL or tunnel to the internet. You must use a separate tunneling service (like ngrok) and configure your Vapi webhook URLs manually.
Use a tunneling service like ngrok to create a public URL:
Note the public URL provided by your tunneling service (e.g., https://abc123.ngrok.io)
Current implementation: The vapi listen command acts as a local webhook forwarder only. It receives webhook events on a local port (default 4242) and forwards them to your specified endpoint. To receive events from Vapi, you must:
Forward to your local development server:
Use a different port for the webhook listener:
For development with self-signed certificates:
Only use --skip-verify in development. Never in production.
When you run vapi listen, you’ll see:
The listener forwards all Vapi webhook events:
call-started - Call initiatedcall-ended - Call completedcall-failed - Call encountered an errorspeech-update - Real-time transcriptiontranscript - Final transcriptionvoice-input - User speaking detectedfunction-call - Tool/function invokedassistant-message - Assistant responseconversation-update - Conversation state changeerror - Error occurredrecording-ready - Call recording availableanalysis-ready - Call analysis completeThe listener adds helpful headers to forwarded requests:
Your server receives the exact webhook payload from Vapi with these additional headers for debugging.
Pro tip: Some tunneling services offer static URLs (like ngrok with a paid plan), which means you won’t need to update your Vapi webhook configuration every time you restart development.
Filter specific event types (coming soon):
The listener expects standard HTTP responses:
Data flow: Vapi sends webhooks → Ngrok tunnel (public URL) → vapi listen (port 4242) → Your local server (port 3000)
Test error handling in your webhook:
Test with multiple concurrent calls:
Filter logs by call ID:
The vapi listen command is designed for development only. In production, use proper webhook endpoints with authentication.
For production, configure webhooks in the Vapi dashboard:
If you see “connection refused”:
For timeout issues:
If events aren’t appearing:
vapi auth whoamiFor HTTPS endpoints:
Now that you can test webhooks locally:
Pro tip: Keep vapi listen running while developing - you’ll see all events in real-time and can iterate quickly on your webhook handlers without deployment delays!