HeyGen webhook secret shown once: rotation vs Sume's reveal
HeyGen shows its webhook secret once and drops the old one on rotate. Sume lets you re-read it and signs with both secrets while rotating (read 2026-10-10).

HeyGen shows a webhook signing secret only when you create an endpoint or rotate its secret, and the old secret stops working the moment you rotate. Sume lets you read the workspace signing secret again from the dashboard or from GET /v1/webhooks/signing-secret, and during a rotation its signature header carries one entry per live secret, so a receiver that accepts either one never drops a delivery.
HeyGen's behavior is from its Create Webhook Endpoint and Webhooks pages (read 2026-10-10). Sume's is from Webhooks.
Two models of a secret
The practical difference is whether a lost secret is a re-read or a re-issue.
| Question | HeyGen | Sume |
|---|---|---|
| Where the secret appears | Response of create and of rotate-secret only | Dashboard Webhooks tab (Reveal), or GET /v1/webhooks/signing-secret |
| Can you read it later | No: list calls return secret: null | Yes |
| Scope of a secret | Per endpoint (endpoints are created with a url, optional events, optional entity_id) | Per workspace, shared by job webhooks and run webhooks |
| On rotation | Old secret invalidated immediately | Header carries both: sume-v1=<new>,sume-v1=<previous> |
| Receiver rule | Verify with the new secret at once | Accept when any sume-v1= entry matches |
| Debug aid | Not described on the pages read | x-sume-webhook-secret-fingerprint header, same value as signing_secret_fingerprint on the receipt |
What immediate invalidation costs you
With HeyGen, a rotation is a cut-over. Between the moment you rotate and the moment your receiver loads the new secret, deliveries signed with the new secret fail your old check,. The safe sequence is to store the new secret first, deploy, and only then treat old-secret failures as bugs.
HeyGen's page does not describe an overlap period, so plan the cut-over as a short, deliberate event: rotate during a quiet hour, and check the endpoint's recent deliveries afterwards.
Sume's overlap removes that window. While two secrets are live, every delivery carries both signatures, newest first, comma separated. Your verifier loops over the entries and compares each one in constant time, so timing does not reveal which entry matched. The Sume docs include a TypeScript verifier that does exactly this.
The fingerprint trick
When a signature will not verify, you do not need to paste a secret anywhere to find out why. Every Sume delivery carries x-sume-webhook-secret-fingerprint, and the dashboard shows the fingerprint next to the secret. If the two differ, your receiver holds a stale secret. If they match, look at the body instead: a framework that re-serializes JSON changes the bytes and breaks an HMAC over the raw body.
HeyGen's page makes the same raw-body point: verify against the raw body bytes, not a re-serialized object, and compare in constant time.
Checklist for either vendor
- Keep the secret in an environment variable or a secret manager, never in a repository, and refuse to run the verifier with an empty value.
- Test the verifier with a known-good body and a deliberately wrong secret, so you see both a pass and a fail before the first real event.
- Write down who can rotate it and what the rollout order is before you need it.
- Verify the signature before parsing or acting on the payload.
- Deduplicate on the job or video id, because both vendors can deliver the same event more than once.
- For avatar clips, keep polling
GET /v1/jobs/{id}/statusas a backup path, as the Sume page advises.
Using it with Sume avatar jobs
An avatar video submitted with mode: "webhook" signs its terminal event with the workspace secret, the same one that Run webhooks use, so a single verifier and a single rotation procedure cover both. The delivery also carries x-sume-webhook-timestamp, and the docs suggest rejecting anything outside a five-minute window.
Sources
Related posts
More in Comparisons
- How long do Sume webhooks retry? About three hours vs Stripe
Sume makes up to 10 delivery attempts with exponential backoff capped at an hour, about three hours in all. Stripe retries for up to three days in live mode.
- Longest single shot per request: Vidu, Veo, Grok, Wan, Seedance
How long one request can run: Vidu Q4 16 s, Veo 8 s, Grok 15 s, Wan 3.0 and Seedance 2.5 30 s. Sume's matching row for each and the longest-shot cost.
- Luma Ray 2 5-second keyframes: Sume rows with start and end frames
Luma's API makes Ray 2 clips up to 5 s from start and end keyframes. Sume has no Luma row; these Sume rows accept both frames and cover a 5-second clip.
- MAI-Voice-2.1 clones from seconds of audio: what Sume's API takes
Microsoft says MAI-Voice-2.1 clones a voice from seconds of audio. Sume does not carry it, and voice cloning on Sume is app-only; the API takes voice ids.
Written by Sume