dcitelly.Art-Intel
02/18/2026, 7:40 PM${timestamp}.${raw_body})
HMAC_SHA256(RETELL_API_KEY, timestamp + raw_body)
HMAC_SHA256(RETELL_API_KEY, JSON.stringify(parsedBody))
None match the received signature.
Confirmed:
- Using the API key with the webhook badge
- Using full key with key_ prefix
- Using raw body from req.text()
- Using hex digest
Question:
Is Retell signing webhooks with a different secret than RETELL_API_KEY?
Is there a separate internal signing key?
Can you confirm definitively that the webhook signature secret is exactly the webhook-badge API key and nothing else?
As of Feb 2026, what is the exact signing construction used in production?Colin - Integrations @ Retell AI
02/18/2026, 7:40 PMColin - Integrations @ Retell AI
02/18/2026, 7:40 PMColin - Integrations @ Retell AI
02/18/2026, 7:41 PMdcitelly.Art-Intel
02/18/2026, 7:42 PMColin - Integrations @ Retell AI
02/18/2026, 7:43 PMjs
// 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();
});Omar Ashraf | Community Lead
02/18/2026, 7:43 PMdcitelly.Art-Intel
02/18/2026, 8:30 PMColin - Integrations @ Retell AI
02/18/2026, 9:04 PMdcitelly.Art-Intel
02/18/2026, 9:27 PMColin - Integrations @ Retell AI
02/18/2026, 9:30 PMrezzkin
02/18/2026, 11:39 PMColin - Integrations @ Retell AI
02/18/2026, 11:47 PMrezzkin
02/18/2026, 11:51 PMColin - Integrations @ Retell AI
02/18/2026, 11:52 PMrezzkin
02/19/2026, 12:57 AMOmar Ashraf | Community Lead
02/19/2026, 6:34 PMdcitelly.Art-Intel
02/19/2026, 11:42 PM