Zum Inhalt springen

Webhooks

Webhooks senden HTTP POST-Requests an deine URL, wenn in deinem Workspace Ereignisse auftreten. Nutze sie mit n8n, Zapier, Make oder eigenen Servern.

  • Zugriff Einstellungen → Entwickler (Capability Webhooks oder Team-Admin)
  • Ein öffentlich erreichbarer HTTPS-Endpunkt (localhost funktioniert nur mit einem Tunnel wie ngrok)
  • Server-Env: PUBLISHING_ENCRYPTION_KEY muss gesetzt sein (siehe Installation)
  1. Gehe zu Einstellungen → Entwickler → Webhooks
  2. Klicke auf Webhook hinzufügen
  3. Gib einen Namen und eine URL ein (HTTPS empfohlen)
  4. Wähle die zu abonnierenden Events (oder alle)
  5. Speichern — das Signatur-Geheimnis wird einmal angezeigt. Bewahre es sicher auf.
EventWird ausgelöst bei
document.createdNeues Dokument
document.updatedDokument-Inhalt oder -Metadaten geändert
document.deletedDokument entfernt
document.publishedDokument in einen Kanal veröffentlicht
collection.createdNeue Collection
collection.updatedCollection umbenannt oder verschoben
collection.deletedCollection entfernt
notification.createdIn-App-Benachrichtigung erstellt (pro Empfänger)

Jede Zustellung ist JSON:

{
"id": "delivery-uuid",
"createdAt": "2026-05-22T10:00:00.000Z",
"event": "document.updated",
"payload": {
"id": "document-uuid",
"model": {}
}
}

Das model-Objekt enthält einen bereinigten Snapshot der betroffenen Ressource.

Jeder Request enthält:

HeaderWert
Content-Typeapplication/json
X-Orimora-EventEvent-Name (z. B. document.updated)
X-Orimora-Signaturet=<unix_seconds>,v=<hex_hmac>
User-AgentOrimora-Webhooks/1.0

Die Signatur ist HMAC-SHA256 über den String "<timestamp>.<raw_body>" mit deinem Webhook-Secret.

Prüfschritte:

  1. Lies den rohen Request-Body (vor dem JSON-Parsing)
  2. Parse X-Orimora-Signature — extrahiere t und v
  3. Ablehnen, wenn t zu alt ist (Replay-Schutz — z. B. ±5 Minuten)
  4. Berechne HMAC-SHA256(secret, t + "." + body) als Hex
  5. Vergleiche mit v über einen timing-sicheren Vergleich
import { createHmac, timingSafeEqual } from 'crypto';
function verifyOrimoraWebhook(secret, signatureHeader, rawBody, maxAgeSec = 300) {
const parts = Object.fromEntries(signatureHeader.split(',').map((p) => p.split('=')));
const t = Number(parts.t);
const v = parts.v;
if (!t || !v || Math.abs(Date.now() / 1000 - t) > maxAgeSec) return false;
const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
try {
return timingSafeEqual(Buffer.from(v, 'hex'), Buffer.from(expected, 'hex'));
} catch {
return false;
}
}
  • Zustellungen laufen asynchron über eine Hintergrund-Queue
  • Fehlgeschlagene Zustellungen werden mit Backoff erneut versucht
  • Webhooks mit hoher Fehlerrate werden automatisch deaktiviert (konfigurierbar über WEBHOOK_FAILURE_*-Env-Vars)
  • Zustellungsprotokolle werden zum Debuggen aufbewahrt (siehe Einstellungs-UI)

URLs dürfen nicht auf private IPs oder Cloud-Metadaten-Endpunkte zeigen (SSRF-Schutz).

Orimora bringt einen n8n-Community-Node mit (packages/n8n-nodes-orimora). Alternativ kannst du einen n8n-Webhook-Trigger-Node verwenden und die Test-URL beim Anlegen des Orimora-Webhooks einfügen.