Sixtyfour webhooks come in two directions: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.
- Incoming: your system POSTs into Sixtyfour to trigger a workflow run.
- Outgoing: Sixtyfour POSTs to your URL when an async job or workflow finishes.
Which direction do I need?
| You want to… | Use |
|---|---|
| Kick off a workflow when something happens in your CRM, scheduler, or app | Incoming — POST to /workflows/run with a webhook_payload |
| Get notified when an async enrichment job finishes (no polling) | Outgoing — set webhook_url on the async endpoint |
| Get the full result of a workflow delivered to your URL when it completes | Outgoing — add an outgoing_webhook block to the workflow |
| Both — trigger a workflow externally and have its results delivered back | Incoming + outgoing in the same workflow |
Incoming webhooks (trigger workflows)
Build a workflow whose first block is awebhook source block, then POST your payload to /workflows/run. Each row in the payload becomes one row in the workflow’s input dataset.
job_id you can use to track the run. A few rules to know:
- API key authentication only — JWT (dashboard) sessions are rejected.
- The source block must be
webhook— the API returns 400 otherwise. read_csvsource blocks are not API-triggerable — use awebhooksource block instead.
Outgoing webhooks (receive results)
Sixtyfour POSTs to your URL through one signed, retried HTTP pipeline regardless of source. The two sources are:- Async-job webhooks — pass
webhook_urlin the body of any async endpoint (/find-email-async,/people-intelligence-async, etc.). Payload is a single job-result envelope. - Workflow
outgoing_webhookblock — add the block to a workflow. Payload is a richer envelope withevent_id,run_id, inlineresults, and an optional signedresults_download_url.
End-to-end flow (async-job example)
Step 1: Send an async request with webhook_url
task_id. Store it — you’ll match it against the incoming webhook payload.
Step 2: Handle the webhook
When the job completes, Sixtyfour POSTs the result to yourwebhook_url. Your handler must return a 2xx status code within 10 seconds.
For the workflow outgoing_webhook block, the request shape and headers are identical — only the JSON envelope is different (richer, with workflow metadata and an optional results_download_url). See the Outgoing Webhooks reference for both payload shapes side by side, plus signing/verification code samples.
Signing secrets and verification
Once you generate a signing secret in Settings → API Keys → Webhooks, every outgoing delivery includes aSixtyfour-Signature header (HMAC-SHA256 over the raw body). The same secret signs both async-job webhooks and outgoing_webhook block deliveries.
See Signing Secrets & Verification for the full algorithm, working Python (Flask) and Node.js (Express) code samples, and rotation behavior.
Testing locally
Your local development server isn’t reachable from the internet. Use a tunneling tool to expose it:webhook_url value (or the outgoing_webhook block’s url).
Production checklist
- Track your tasks and runs by storing
task_id(async jobs) orrun_id(workflows) from each request, then validate incoming webhooks against your stored set. - Dedupe with
Sixtyfour-Event-Id— retries can deliver the same event more than once, so treat the event ID as your idempotency key. - Once signing is enabled, reject deliveries with a missing or invalid
Sixtyfour-Signatureheader. - Monitor delivery. If all 5 retry attempts fail, the webhook is marked as undelivered. Results remain available via
GET /job-status/{task_id}(async jobs) or the workflow result download endpoints — see Outgoing Webhooks → Retry behavior for the full retry schedule.