bost88
12/15/2025, 2:16 AMbost88
12/15/2025, 8:27 PMAI Evy
12/15/2025, 8:27 PMAI Evy
12/15/2025, 8:27 PMAI Evy
12/15/2025, 8:27 PMAI Evy
12/15/2025, 8:27 PMbost88
12/15/2025, 9:00 PMAI Evy
12/15/2025, 9:00 PMAI Evy
12/15/2025, 9:00 PMx-retell-signature header together with your Retell API Key. [(1) ]()
Key points:
- Only the API key that has a webhook badge next to it can be used to verify the webhook.
- You can also allowlist Retell's IP address: 100.20.5.228.
Signature format:
The X-Retell-Signature header follows this format: v=<timestamp>,d=<signature> [(2) ]()
- v= contains the timestamp (in milliseconds)
- d= contains the HMAC-SHA256 digest
How to compute the signature:
Based on the Ruby example provided by Retell support, the signed message is constructed as:
message = "#{timestamp}.#{raw_body}"
expected_digest = OpenSSL::HMAC.hexdigest("sha256", secret, message)
Important notes for implementation:
1. Use the full API key as the secret — don't remove the "key_" prefix
2. The timestamp in the signature is in milliseconds
3. The raw request body should be used exactly as received
Recommended approach:
Retell provides verify functions in their official SDKs (Node.js and Python) . The Node.js example: [(1) ]()
javascript
import { Retell } from "retell-sdk";
if (
!Retell.verify(
JSON.stringify(req.body) ,
process.env.RETELL_API_KEY,
req.headers["x-retell-signature"] as string,
)
) {
console.error("Invalid signature") ;
return;
}AI Evy
12/15/2025, 9:00 PMhash_hmac('sha256', $message, $apiKey) where $message is "{timestamp}.{rawBody}". However, some users have reported difficulties getting custom implementations to match. [(3) ]() , [(2) ]()
For the most reliable PHP implementation, I'd suggest reviewing the official SDK source code on GitHub or reaching out for support.AI Evy
12/15/2025, 9:00 PMAI Evy
12/15/2025, 9:00 PMbost88
12/15/2025, 9:01 PM