Webhooks
Alync POSTs signed JSON to your endpoint the moment something happens — no polling. This is the backbone of the n8n, Make, and Zapier integrations.
Events
| Event | Fires when |
|---|---|
lead_promoted | Sourcing promotes new lead(s); payload carries campaign_id, promoted, and lead_ids |
enrichment_finished | An enrichment pass settles, with enriched / no-contact / failed counts |
campaign_finished | A sourcing pass completes |
new_high_intent_leads | High-scoring leads land |
budget_exceeded | A plan quota or billing state blocked a run |
provider_outage | A data provider circuit opens/recovers |
Creating an endpoint
curl -X POST https://api.alync.co/v1/notifications/channels \
-H "X-API-Key: $ALYNC_KEY" -H "Content-Type: application/json" \
-d '{
"type": "webhook",
"name": "My automation",
"destination": "https://example.com/hooks/alync",
"events": ["lead_promoted", "enrichment_finished"]
}'The response includes signing_secret (whsec_…) exactly once — store it like a password. Destinations must be public HTTPS URLs; private/internal addresses are rejected. Slack and Discord destinations are supported natively with type: "slack" / "discord".
Verifying signatures
Every delivery carries X-Alync-Signature: t=<unix>,v1=<hex> where v1 is HMAC-SHA256 of "<t>.<raw body>" keyed with your signing secret. Reject mismatches and timestamps older than 5 minutes:
import crypto from "crypto";
function verifyAlyncSignature(secret, rawBody, header) {
const parts = Object.fromEntries(header.split(",").map((p) => p.trim().split("=")));
const age = Math.abs(Date.now() / 1000 - Number(parts.t));
if (!parts.t || !parts.v1 || age > 300) return false;
const expected = crypto.createHmac("sha256", secret)
.update(`${parts.t}.${rawBody}`).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}Delivery semantics
- Answer with any
2xxwithin 10 seconds — do heavy work asynchronously. - Failed deliveries retry with exponential backoff (up to 5 attempts) before being dead-lettered.
- Deliveries can arrive out of order and, rarely, more than once — key your processing on the payload contents (e.g.
lead_ids).
Example payload
{
"event_type": "lead_promoted",
"message": "3 new lead(s) promoted",
"occurred_at": "2026-07-10T14:03:22.000Z",
"campaign_id": "0b2f6e5e-...",
"promoted": 3,
"lead_ids": ["8c9d...", "91ab...", "77fe..."]
}On lead_promoted, fetch full lead objects with GET /v1/campaigns/:id/leads.
Last updated July 10, 2026 · Alync (alync.co)