hookdeck/webhook-skills

retell-webhooks

Receive and verify Retell AI webhooks. Use when setting up Retell webhook handlers, debugging X-Retell-Signature verification, or handling voice call events like call_started, call_ended, call_analyzed, and transcript_updated.

First seen Jul 24, 2026

Installation

$ npx skills add hookdeck/webhook-skills --skill retell-webhooks

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from hookdeck/webhook-skills · top by installs.

npx skills add hookdeck/webhook-skills

Browse all from hookdeck/webhook-skills

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 84
License LICENSE
Default branch main
Open issues 6
Status Active

Skill metadata

Parsed from SKILL.md frontmatter.

Version0.1.0
LicenseMIT
More metadata
author
hookdeck
version
0.1.0
repository
https://github.com/hookdeck/webhook-skills

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 7,648 B
  • docs SUMMARY.md 249 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 19 installs

SKILL.md

Retell AI Webhooks

When to Use This Skill

  • How do I receive Retell AI webhooks?
  • How do I verify Retell webhook signatures (X-Retell-Signature)?
  • How do I handle callended or callanalyzed events?
  • Why is my Retell webhook signature verification failing?
  • How do I handle transcript, transfer, and chat events from Retell?

Verification (core)

Retell signs each webhook with HMAC-SHA256 using your Retell API key as the secret (only an API key with the webhook badge in the dashboard works). The signature arrives in the X-Retell-Signature header formatted as v={unixmstimestamp},d={hex_digest}, where the digest is computed over the raw request body concatenated with the timestamp. Always verify against the raw body, never a re-serialized JSON string.

The Python SDK ships a verify helper (client.verify(body, api_key, signature) — positional params, so the keyword form used in the FastAPI example also works). The Node SDK has no verify helper, so Node handlers verify manually.

Verified against retell-sdk 5.56.0 (PyPI) and 5.46.0 (npm): the Python
package exposes retell.lib.webhook_auth.verify, re-exported as client.verify;
the npm package has no webhook/verify export. Check your installed version — the
helper's presence and argument order have moved between releases.

const crypto = require('crypto');

// Reject signatures older than 5 minutes to prevent replay attacks
const FIVE_MINUTES_MS = 5 * 60 * 1000;

function verifyRetellSignature(rawBody, signatureHeader, apiKey) {
  const match = /^v=(\d+),d=(.*)$/.exec(signatureHeader || '');
  if (!match) return false;
  const [, timestamp, digest] = match;
  if (Math.abs(Date.now() - Number(timestamp)) > FIVE_MINUTES_MS) return false;

  const expected = crypto
    .createHmac('sha256', apiKey)
    .update(rawBody + timestamp) // raw body + timestamp, in that order
    .digest('hex');
  try {
    return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(digest));
  } catch {
    return false; // length mismatch = invalid
  }
}

Python (FastAPI) uses the official SDK instead:

from retell import Retell

client = Retell(api_key=os.environ["RETELL_API_KEY"])
# client.verify enforces the ~5 min timestamp window and returns a bool
is_valid = client.verify(raw_body.decode("utf-8"),
                         api_key=os.environ["RETELL_API_KEY"],
                         signature=signature_header)

For complete handlers with tests, see [examples/express/](examples/express/), [examples/nextjs/](examples/nextjs/), [examples/fastapi/](examples/fastapi/).

Common Event Types

Event Triggered When Common Use Cases
call_started A call begins Track live calls, update dashboards
call_ended A call finishes (audio done) Persist call record, trigger follow-ups
call_analyzed Post-call analysis completes Store transcript, sentiment, summary
transcript_updated Transcript changes mid-call Live captions, real-time monitoring
transfer_started An agent transfer begins Log routing, notify agents
transfer_bridged Transfer connected Update call state
transfer_cancelled Transfer cancelled Revert routing state
transfer_ended Transfer completed Reconcile call legs
chat_started A chat session begins Track chat sessions
chat_ended A chat session ends Persist chat record
chat_analyzed Post-chat analysis completes Store chat summary, sentiment

Payloads carry an event field plus a call object (voice/transfer events) or a chat object (chat events). Dedupe on event + call.callid (or chat.chatid) — Retell retries up to 3 times if it doesn't get a 2xx within 10 seconds.

See [references/overview.md](references/overview.md) for full payload structure.

Environment Variables

# The Retell API key (must have the webhook badge). Used as the HMAC secret.
RETELL_API_KEY=key_xxxxxxxxxxxxxxxxxxxxxxxx
PORT=3000

Local Development

For local webhook testing, run the Hookdeck CLI via npx — no install required:

npx hookdeck-cli listen 3000 retell --path /webhooks/retell

No account required — the CLI creates a guest account on first run and provides a local tunnel + web UI for inspecting requests.

Resources

  • [Overview](references/overview.md) - What Retell webhooks are, event types, payloads
  • [Setup](references/setup.md) - Configure account-level and agent-level webhooks
  • [Verification](references/verification.md) - Signature verification details and gotchas
  • [Express Example](examples/express/) - Complete Express.js implementation
  • [Next.js Example](examples/nextjs/) - Next.js App Router implementation
  • [FastAPI Example](examples/fastapi/) - Python FastAPI implementation (uses the Retell SDK)

Recommended: webhook-handler-patterns

We recommend installing the webhook-handler-patterns skill alongside this one for handler sequence, idempotency, error handling, and retry logic. Key references (open on GitHub):

Related Skills