ffacturifirma

Dokumentation

Webhooks

Erhalten Sie signierte HTTP-Benachrichtigungen in Ihren Systemen, sobald sich ein Dokument in facturifirma.ro ändert.

Webhook registrieren

In der App: Seite Webhooks (Admin-Menü) — Ziel-URL und Signaturgeheimnis hinzufügen. Das Geheimnis ist write-only und nach dem Speichern nicht mehr lesbar.

Über die API, mit einem Admin-API-Schlüssel:

curl -X POST https://app.facturifirma.ro/api/v1/webhooks \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/webhook", "secret": "<SIGNING_SECRET>"}'

Ereignisse

Derzeit wird ein einziger Ereignistyp gesendet:

document.changedjede Änderung eines Dokuments — Erstellen, Bearbeiten, Ausstellen, Zahlung, Storno, Abbruch oder Löschen, für jeden Dokumenttyp (Rechnung, Proforma, Quittung, Lieferschein, Bestellung, Gutschrift).

Neue Ereignistypen kommen mit der Zeit hinzu; behandeln Sie das Feld „event“ als erweiterbar und ignorieren Sie unbekannte Typen.

Payload

Jede Zustellung ist ein POST mit JSON-Body:

POST https://example.com/webhook

{
  "event": "document.changed",
  "documentId": "8b1f7c02-4c33-4a6e-9f0d-2f6f6f0a9d11",
  "at": "2026-07-15T09:30:00Z"
}

Header

Jeder Request trägt den Ereignistyp und die Body-Signatur:

Content-Type: application/json
X-Facturifirma-Event: document.changed
X-Facturifirma-Signature: sha256=<hex(HMAC-SHA256(secret, body))>

Signatur prüfen

Die Signatur ist HMAC-SHA256 über den rohen Request-Body mit Ihrem Signaturgeheimnis, im Format „sha256=<hex>“. In konstanter Zeit vergleichen:

import crypto from "node:crypto";

function verify(rawBody, signatureHeader, secret) {
  const expected = "sha256=" +
    crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signatureHeader), Buffer.from(expected));
}

Zustellung und Wiederholungen

Zustellungen laufen über eine Job-Queue mit automatischen Wiederholungen (At-least-once, keine Reihenfolgegarantie). Ihr Endpoint muss mit 2xx antworten; alles andere gilt als Fehler und wird wiederholt.

Sicherheit

Akzeptiert werden nur absolute http(s)-URLs, die auf öffentliche Adressen auflösen (SSRF-Schutz). Das Signaturgeheimnis ist at-rest verschlüsselt und wird von der API nie zurückgegeben.