Documentation Index
Fetch the complete documentation index at: https://docs.sixtyfour.ai/llms.txt
Use this file to discover all available pages before exploring further.
Use Case
Every outgoing webhook from Sixtyfour can be signed with HMAC-SHA256 so you can verify it actually came from us. One signing secret per organization covers all outgoing webhook traffic: async-job webhooks (receive results) and the workflowoutgoing_webhook block.
Until you create a signing secret, deliveries are sent unsigned for backward compatibility. Once you create one, all subsequent deliveries are signed.
Generate a signing secret
Generate a signing secret in the dashboard at Settings → API Keys → Webhooks.Headers on signed deliveries
When signing is enabled, every outgoing webhook includes:| Header | Value |
|---|---|
Sixtyfour-Signature | t=<unix_seconds>,v1=<hex>[,v1=<hex>] |
Sixtyfour-Event-Id | UUID per delivery — use as your dedupe key |
Sixtyfour-Event-Type | Routing hint (e.g., find_email, outgoing_webhook.completed) |
Sixtyfour-Delivery-Attempt | Attempt counter starting at 1; increments on each retry |
Verifying signatures
The signature isHMAC_SHA256(secret_utf8_bytes, f"{t}.{raw_body}"). To verify:
- Parse
t=(timestamp) and everyv1=(signature) from theSixtyfour-Signatureheader. - Reject if
|now - t| > 300(5-minute clock-skew tolerance). - Recompute the HMAC against the raw bytes you received.
- Accept if any
v1=matches.
Example Webhook Verification
Rotation
Rotate from the dashboard. The default overlap window is 24 hours: during the window we dual-sign every delivery with both old and new secrets so you can deploy your new secret without dropping events. Set the overlap to 0 for an immediate cut-over (e.g. suspected compromise). Two rotation rules to remember in your verification code:- The
Sixtyfour-Signatureheader carries multiplev1=segments during overlap. You should iterate every segment — accept the delivery if any one matches. See the code examples above for reference. - You should not parse the header into a dictionary keyed by name — that silently drops the second
v1=.
Fail-closed behavior
If signing is configured but we cannot load your secret at delivery time we abort delivery rather than silently downgrade to unsigned. Once you opt into signing, every payload is signed or none are. If deliveries unexpectedly stop after enabling signing, results remain retrievable through the polling fallbacks:- Async jobs:
GET /job-status/{task_id} - Workflow runs: see Workflow Execution