Davis
12/15/2025, 2:07 PMAI Evy
12/15/2025, 2:07 PMAI Evy
12/15/2025, 2:08 PMwebhook_url directly on each agent. When configured at the agent level, webhook events for that agent will be sent to the specified URL and will ignore the account-level webhook. [(1) ]() [(2) ]()
Global (Workspace-Level) Webhook:
There is also a workspace-level webhook setting. However, if you set a webhook at the agent level, it overrides the global one for that specific agent.
Best Practice for Debugging:
When troubleshooting webhook issues (like with your ngrok setup) , it's recommended to put the webhook at the agent level so you can see detailed logs for that agent's webhook calls. You can use the global webhook normally, but agent-level placement gives you better visibility into any errors. [(3) ]()
Key Points:
- Agent-level webhook: set via webhook_url on the agent — overrides global for that agent [(1) ]() [(2) ]()
- Setting webhook_url to null removes the agent-level webhook
- You can also configure webhook_timeout_ms (default 10000ms)
For your local ngrok testing, you can use either approach, but agent-level is easier to debug.AI Evy
12/15/2025, 2:08 PMAI Evy
12/15/2025, 2:08 PMDavis
12/15/2025, 2:09 PMDavis
12/15/2025, 2:10 PMAI Evy
12/15/2025, 2:10 PMAI Evy
12/15/2025, 2:10 PMwebhook_url parameter rather than through the global settings UI. [(2) ]()
2. Set via API: You can update your agent's webhook URL programmatically:
javascript
import Retell from 'retell-sdk';
const client = new Retell({
apiKey: 'YOUR_RETELL_API_KEY',
}) ;
const agentResponse = await client.agent.update('16b980523634a6dc504898cda492e939', { agent_name: 'Jarvis' }) ;
console.log(agentResponse.agent_id) ;
The API allows you to set webhook_url and webhook_timeout_ms (default 10000ms) on the agent. [(2) ]() [(3) ]()
3. Check for conflicts: If you're using a conversation flow agent, there may be conflicts between the phone number-level webhook and the agent-level webhook settings. [(1) ]()
This issue was reported to the Retell team and appeared to be resolved for at least one user. If the issue persists, I'd recommend reaching out via [Contact Sales]() or checking [) .AI Evy
12/15/2025, 2:10 PMAI Evy
12/15/2025, 2:10 PMDavis
12/15/2025, 2:24 PMAI Evy
12/15/2025, 2:24 PMAI Evy
12/15/2025, 2:24 PMx-retell-signature header, you use your Retell API Key (not a separate webhook secret) . [(1) ]()
Key point: Only the API key that has a webhook badge next to it in your dashboard can be used to verify webhooks.
Here's how to verify using the SDK:
javascript
// install the sdk: <https://docs.retellai.com/get-started/sdk>
import { Retell } from "retell-sdk";
import express, { Request, Response } from "express";
const app = express() ;
app.use(express.json() ) ;
app.post("/webhook", (req: Request, res: Response) => {
if (
!Retell.verify(
JSON.stringify(req.body) ,
process.env.RETELL_API_KEY,
req.headers["x-retell-signature"] as string,
)
) {
console.error("Invalid signature") ;
return;
}
const {event, call} = req.body;
// process the webhook
// Acknowledge the receipt of the event
res.status(204) .send() ;
}) ;
To get the correct key:
1. Go to your Retell dashboard
2. Look for the API key with the webhook badge next to it
3. Use that key as RETELL_API_KEY in your verification code
You can also allowlist Retell's IP address for additional security: 100.20.5.228
Since you're receiving webhook data via ngrok at the agent level, your setup is working—you just need to grab the correct API key (the one with the webhook badge) from your dashboard to verify signatures.AI Evy
12/15/2025, 2:24 PMAI Evy
12/15/2025, 2:24 PMAI Evy
12/15/2025, 2:31 PM