Webhook-uri
Webhook-urile permit sistemelor tale să reacționeze la schimbările din Elido fără polling. Două tipuri de endpoint-uri:
- Endpoint-uri de evenimente - te abonezi la tipuri specifice de evenimente
(
link.created,member.invitedetc.) - Endpoint-uri SIEM - firehose: fiecare eveniment din workspace, plus
fluxul complet al jurnalului de audit ca payload-uri
audit.event
Crearea unui endpoint
Din Setări → Webhook-uri sau prin API:
curl -X POST https://api.elido.app/v1/webhooks/workspaces/1/webhooks \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.example.com/elido",
"events": ["link.created", "link.deleted"],
"kind": "event"
}'Răspunsul include un secret afișat o singură dată:
{
"endpoint": { "id": 7, "url": "...", "events": [...] },
"secret": "whsec_a1b2c3d4..."
}Salvează secretul acum - nu mai este returnat niciodată. Folosește-l pentru a verifica semnăturile livrărilor primite.
Verificarea semnăturilor
Fiecare livrare poartă:
X-Elido-Signature: v1=4f8a...
X-Webhook-Signature: v1=4f8a... # backward-compatible alias
X-Webhook-Timestamp: 1735689600
X-Webhook-Event: link.created
X-Webhook-Delivery: 12345Calculează HMAC-SHA256(secret, "{timestamp}.{raw_body}") și compară
cu valoarea de după v1= în timp constant. Respinge livrările
mai vechi de 5 minute (now - timestamp > 300).
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(secret: string, headers: Headers, rawBody: string) {
const sig = headers.get("X-Webhook-Signature")?.replace(/^v1=/, "");
const ts = headers.get("X-Webhook-Timestamp");
if (!sig || !ts) return false;
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const expected = createHmac("sha256", secret)
.update(`${ts}.${rawBody}`)
.digest("hex");
return timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}Reîncercări
Livrările eșuate (orice nu este 2xx) se reîncearcă cu backoff
exponențial: 1 minut, 5 minute, 15 minute. După 3 încercări
livrarea este marcată failed.
Poți rearma manual o încercare eșuată (sau deja livrată) din Webhooks → endpoint → Retry sau prin:
curl -X POST \
https://api.elido.app/v1/webhooks/workspaces/1/webhooks/7/deliveries/12345/retry \
-H "Authorization: Bearer $ELIDO_TOKEN"Modul SIEM
Un endpoint de tip SIEM primește fiecare eveniment din workspace,
indiferent de filtrul de abonare per eveniment. Asta include atât
evenimentele operaționale (link.created, member.invited, …), cât și
firehose-ul jurnalului de audit (audit.event).
Fiecare acțiune relevantă pentru audit (BAA semnat, rol de membru schimbat, cheie API
revocată, …) emite un plic audit.event:
{
"type": "audit.event",
"workspace_id": 1,
"data": {
"kind": "member.role_changed",
"target_type": "member",
"target_id": 42,
"actor_user_id": 7,
"ip": "1.2.3.4",
"user_agent": "...",
"metadata": { "from": "viewer", "to": "admin" },
"recorded_at": "2026-05-01T12:00:00Z"
},
"timestamp": "2026-05-01T12:00:00Z"
}Ingester-ul tău SIEM (Splunk HEC, Datadog Logs, relay personalizat) este responsabil de traducerea în formatul său nativ.
Tipuri de evenimente disponibile
| Eveniment | Când |
|---|---|
link.created | Se creează un link nou |
link.updated | Se schimbă destinația, slug-ul sau regulile unui link |
link.deleted | Un link este arhivat sau șters definitiv |
workspace.created | Se provizionează un workspace nou |
workspace.updated | Se schimbă setările workspace-ului |
member.invited | Cineva este invitat |
member.removed | Un membru este eliminat (sau pleacă) |
audit.event | Orice intrare din jurnalul de audit - vezi modul SIEM de mai sus |
Se mai trimit (vezi ghidul de webhook-uri din centrul de ajutor pentru
payload-uri): link.expired, link.cap_reached, link.broken,
member.role_changed, domain.verified, domain.ssl_failed,
invitation.created, invitation.accepted, subscription.* and
usage.threshold_80 / usage.threshold_100.
Planificate, netrimise astăzi: evenimente per click,
link.clicked.aggregated,conversion.recorded,threshold.exceeded,domain.tls_renewedșiqr.generated. Pentru a urmări activitatea de click-uri, folosește API-ul de analytics sau dashboardul.