Zum Hauptinhalt springen
Pro Plan12 minutesFortgeschrittene

Webhooks

Konfigurieren Sie ausgehende Webhooks, um in Echtzeit Benachrichtigungen von Zenovay zu erhalten, sobald Plattformereignisse auftreten, und erfahren Sie, wie Zenovay eingehende Zahlungs-Webhooks intern verarbeitet.

webhooksapiintegrationnotificationsautomation
Zuletzt aktualisiert:
Pro Plan

Konfigurieren Sie ausgehende Webhooks, um in Echtzeit Benachrichtigungen von Zenovay zu erhalten, sobald Plattformereignisse auftreten, und erfahren Sie, wie Zenovay eingehende Zahlungs-Webhooks intern verarbeitet.

Ausgehende Webhooks

Zenovay unterstützt benutzerkonfigurierbare ausgehende Webhooks, sodass Ihre Dienste auf Plattformereignisse reagieren können, sobald sie eintreten, anstatt die API auf Änderungen abzufragen.

Plan-Verfügbarkeit

Das Verwalten ausgehender Webhooks über die API erfordert einen persönlichen API-Token, und API-Token sind ein kostenpflichtiges Feature. Sie sind auf Pro und höher verfügbar (Free-Pläne können keine API-Token erstellen). Erstellen Sie einen Token unter Settings → Account → Security & access (app.zenovay.com/settings/account/security). Webhooks sind auf das Team bezogen, dem dieser Token angehört.

Einen Webhook erstellen

Webhooks werden unter /v1/cli/mutate/webhooks in der Zenovay API verwaltet. Geben Sie die Ziel-url (muss https:// sein) und mindestens einen Ereignistyp an. Erstellen Sie einen mit einer POST-Anfrage:

curl -X POST https://api.zenovay.com/v1/cli/mutate/webhooks \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://yoursite.com/zenovay-hook","events":["traffic_spike"]}'

Die Antwort enthält die Webhook-id und ein Signatur-secret. Das secret wird nur bei der Erstellung zurückgegeben — speichern Sie es sofort an einem sicheren Ort. Wenn Sie es verlieren, rotieren Sie das secret (siehe unten); das ursprüngliche kann nicht wiederhergestellt werden.

Webhooks auflisten

curl https://api.zenovay.com/v1/cli/mutate/webhooks \
  -H "Authorization: Bearer YOUR_TOKEN"

Webhook-Signaturen verifizieren

Jede Webhook-Zustellung wird mit dem bei der Erstellung erhaltenen Signatur-secret HMAC-signiert. Verifizieren Sie die Signatur an Ihrem Endpunkt, bevor Sie der Payload vertrauen, und verwenden Sie einen zeitkonstanten Vergleich, damit die Verifizierung nicht anfällig für Timing-Angriffe ist:

import crypto from 'crypto';

function verifyZenovayWebhook(rawBody, signatureHeader, secret) {
  // The signature header value is prefixed with the algorithm,
  // e.g. "sha256=<hex>". Strip the prefix before comparing.
  const received = (signatureHeader || '').replace(/^sha256=/, '');

  const expected = crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');

  // timingSafeEqual throws if the buffers differ in length, so
  // length-check first, then compare in constant time.
  if (expected.length !== received.length) return false;
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(received)
  );
}

Validieren Sie immer den Roh-Anfragetext (die exakten empfangenen Bytes), nicht eine neu serialisierte Version, damit die von Ihnen berechnete Signatur mit der von Zenovay berechneten übereinstimmt.

Der genaue Header-Name, der die Signatur enthält, ist in der REST API-Referenz dokumentiert.

Einen Webhook testen

Senden Sie eine synthetische Test-Zustellung, um zu bestätigen, dass Ihr Endpunkt korrekt eingerichtet ist. Die Antwort enthält das Ergebnis des Zustellversuchs (HTTP-Status Ihres Endpunkts und Dauer):

curl -X POST https://api.zenovay.com/v1/cli/mutate/webhooks/{id}/test \
  -H "Authorization: Bearer YOUR_TOKEN"

Das Signatur-secret rotieren

Wenn ein secret durchsickert oder Sie es regelmäßig rotieren möchten, rotieren Sie es. Das neue secret wird in der Antwort nur einmal zurückgegeben:

curl -X POST https://api.zenovay.com/v1/cli/mutate/webhooks/{id}/rotate \
  -H "Authorization: Bearer YOUR_TOKEN"

Aktualisieren Sie nach der Rotation Ihren Endpunkt, damit er mit dem neuen secret verifiziert. Alte Signaturen werden sofort ungültig.

Einen Webhook widerrufen

curl -X DELETE https://api.zenovay.com/v1/cli/mutate/webhooks/{id} \
  -H "Authorization: Bearer YOUR_TOKEN"

Widerrufene Webhooks erhalten sofort keine Zustellungen mehr. Der Widerruf kann nicht rückgängig gemacht werden.

Best Practices

  • Antworten Sie so schnell wie möglich mit einem 2xx. Bestätigen Sie zuerst, und verarbeiten Sie das Ereignis dann in einem Hintergrundjob.
  • Seien Sie idempotent. Netzwerkwiederholungen können dazu führen, dass dasselbe Ereignis mehr als einmal eintrifft — basieren Sie Ihren Handler auf der Ereignis-id, nicht auf der Empfangszeit.
  • Verifizieren, bevor Sie vertrauen. Lehnen Sie jede Anfrage ab, deren HMAC nicht validiert, und lehnen Sie Anfragen ab, deren Zeitstempel weit außerhalb eines akzeptablen Zeitfensters liegt.
  • Rotieren Sie secrets, wenn jemand außerhalb des Teams Zugriff auf Ihre Webhook-Konfiguration oder -Logs hatte.

Eingehende Zahlungs-Webhooks

Zenovay verarbeitet außerdem eingehende Webhooks von externen Diensten zur Verwaltung von Abonnements und Infrastruktur. Diese laufen innerhalb der Zenovay-Plattform und erfordern keine Konfiguration durch Sie.

Quellen eingehender Webhooks

QuelleZweck
StripeAbonnementverwaltung, Zahlungsabwicklung, Checkout-Abschluss
Uptime-MonitoringHealth-Check-Trigger von externen Überwachungsdiensten

Polling-Alternativen

Wenn ausgehende Webhooks für Ihren Anwendungsfall nicht passen (zum Beispiel benötigen Sie zeitpunktbezogene Aggregate statt eines Ereignisstroms), können Sie Echtzeit-Integrationen weiterhin durch Polling der External API erstellen.

Die External API ist auch ein kostenpflichtiges Feature — es erfordert einen API-Schlüssel, und Free-Pläne haben keinen API-Zugriff. Die folgenden Endpunkte geben die Standard-{ success, data, timestamp }-Umhülung zurück, daher befindet sich Ihre Payload unter data.

Polling mit der External API

const API_KEY = process.env.ZENOVAY_API_KEY;
const WEBSITE_ID = process.env.ZENOVAY_WEBSITE_ID;

async function checkAnalytics() {
  const response = await fetch(
    `https://api.zenovay.com/api/external/v1/analytics/${WEBSITE_ID}?range=24h`,
    {
      headers: { 'X-API-Key': API_KEY }
    }
  );

  const { data } = await response.json();

  if (data.summary.total_visitors > threshold) {
    await sendSlackNotification(data);
  }
}

// Poll every 5 minutes
setInterval(checkAnalytics, 5 * 60 * 1000);

Der range-Parameter akzeptiert 24h, 7d, 30d, 90d oder 1y (Standard ist 7d).

Live-Besucherzählung

Verwenden Sie den öffentlichen Live-Endpunkt, um die aktuelle Besucherzahl ohne API-Schlüssel abzurufen:

async function getLiveVisitors(trackingCode) {
  const response = await fetch(
    `https://api.zenovay.com/e/live/${trackingCode}`
  );
  return await response.json();
}

Beispiel: Slack-Integration

Erstellen Sie einen geplanten Bericht, der an Slack gesendet wird:

async function sendDailyReport() {
  const response = await fetch(
    `https://api.zenovay.com/api/external/v1/analytics/${WEBSITE_ID}?range=24h`,
    {
      headers: { 'X-API-Key': API_KEY }
    }
  );

  const { data } = await response.json();
  const { summary } = data;

  await fetch(SLACK_WEBHOOK_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      text: `Daily Analytics Report:\n` +
            `Visitors: ${summary.total_visitors}\n` +
            `Unique Visitors: ${summary.unique_visitors}\n` +
            `Page Views: ${summary.total_page_views}`
    })
  });
}

Beispiel: CRM-Integration

Synchronisieren Sie Analysedaten planmäßig mit Ihrem CRM:

async function syncToCRM() {
  const response = await fetch(
    `https://api.zenovay.com/api/external/v1/analytics/${WEBSITE_ID}/visitors`,
    {
      headers: { 'X-API-Key': API_KEY }
    }
  );

  const { data } = await response.json();

  for (const visitor of data.visitors) {
    await crm.contacts.update({
      country: visitor.country_name,
      city: visitor.city,
      last_seen: visitor.visited_at
    });
  }
}

Rate Limits für Polling

Beachten Sie beim Erstellen von Polling-Integrationen die Rate Limits der External API:

PlanAnfragen/MinuteMonatliches Limit
Free101.000
Pro3010.000
Scale60100.000
Enterprise1201.000.000

Best Practices für Polling

  • Speichern Sie API-Antworten lokal zwischen, um die Anfragehäufigkeit zu reduzieren
  • Verwenden Sie angemessene Polling-Intervalle (mindestens 5 Minuten empfohlen)
  • Überwachen Sie den X-RateLimit-Remaining-Header, um Limits nicht zu überschreiten
  • Implementieren Sie exponentielles Backoff, wenn Sie 429-Antworten erhalten

Nächste Schritte

War dieser Artikel hilfreich?