Skip to Content
Elido is in closed beta — APIs are stable but rate-limits and quotas may change before GA. Request access →
Webhook-uri

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.invited etc.)
  • 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: 12345

Calculează 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

EvenimentCând
link.createdSe creează un link nou
link.updatedSe schimbă destinația, slug-ul sau regulile unui link
link.deletedUn link este arhivat sau șters definitiv
workspace.createdSe provizionează un workspace nou
workspace.updatedSe schimbă setările workspace-ului
member.invitedCineva este invitat
member.removedUn membru este eliminat (sau pleacă)
audit.eventOrice 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 și qr.generated. Pentru a urmări activitatea de click-uri, folosește API-ul de analytics sau dashboardul.