Asana's webhook creation is a two-request dance that fails in ways no other provider
prepares you for. When you call POST /webhooks, Asana — before your
create call returns — sends a POST to your target URL carrying an
X-Hook-Secret request header. Your endpoint must echo that exact value back
as a response header (with a 200 or 204) or the create call fails.
Not in the body. Not later. A response header, right now.
POST /webhooks with a resource gid and your
target URL.X-Hook-Secret: <random value> and an empty-ish body.200 with response header
X-Hook-Secret: <the same value>.201.A Hookden bin can complete the handshake without any code of yours, because bins support templated custom response headers. In your bin's settings, add one response-header line:
X-Hook-Secret: {{header.x-hook-secret}}
That echoes whatever X-Hook-Secret value arrives straight back as a
response header — the handshake passes, the webhook is created, and the handshake
request (secret included) sits captured in your dashboard so you can
store the secret before it's gone forever. From there,
relay deliveries to localhost while you build the real handler.
Every later delivery carries X-Hook-Signature: bare hex
HMAC-SHA256 of the raw body, keyed with the handshake secret. No
sha256= prefix, no timestamp. Set your bin's scheme to
generic with header x-hook-signature for live ✓/✗ badges,
or use the signature debugger. A realistic
payload to poke at: Asana task-changed
example (its signature verifies).
events array — not a bug) every 8 hours. No successful
response for 24 hours = the webhook is silently
deleted, not paused. This is the #1 cause of "my Asana webhook stopped
firing weeks later".410 Gone
intentionally deletes the webhook — don't let a misconfigured proxy emit 410s.GET /webhooks/{gid} exposes
last_failure_at, last_failure_content (your endpoint's actual
error response) and delivery_retry_count.Related: Slack URL verification, Zoom CRC and Meta's hub.challenge — the other setup-handshake families (Asana is the only one that answers in a response header) — and the retry-schedule comparison.
No signup needed. Or from your terminal: curl https://hookden.pages.dev/new
← All guides · Signature debugger · Payload examples · Docs · Hookden vs webhook.site