Webhooks-API

Webhooks ermöglichen es Ihrer Anwendung, Echtzeit-HTTP-Benachrichtigungen zu erhalten, wenn Ereignisse in Ihrem Mercozy-Shop auftreten. Anstatt die API abzufragen, registrieren Sie eine URL und Mercozy sendet die Ereignisdaten automatisch per POST.

Schnellstart

In 3 Schritten starten:

Schritt 1: Registrieren Sie Ihren Endpoint

Holen Sie sich Ihren API-Schlüssel unter Einstellungen > Integration > API-Schlüssel. Admin-Berechtigung erforderlich. Das Webhook-Signaturgeheimnis (whsec_xxx) wird automatisch beim Erstellen eines Endpoints generiert und nur einmal angezeigt.

bash
curl -X POST "https://api.mercozy.com/api/v1/external/webhooks" \
  -H "X-API-Key: mk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My ERP Integration",
    "url": "https://your-app.com/webhooks/mercozy",
    "events": ["order.created", "order.cancelled", "payment.received"]
  }'
Schritt 2: Verarbeiten Sie eingehende Ereignisse
javascript
app.post('/webhooks/mercozy', (req, res) => {
  // 1. Verify signature (see below)
  const signature = req.headers['x-webhook-signature'];
  if (!verifySignature(req.body, signature, WEBHOOK_SECRET)) {
    return res.status(401).send('Invalid signature');
  }

  // 2. Process the event
  const { type, data } = req.body;
  switch (type) {
    case 'order.created':
      syncOrderToERP(data);
      break;
    case 'payment.received':
      updateAccountingSystem(data);
      break;
  }

  // 3. Respond quickly with 200
  res.status(200).json({ received: true });
});
Schritt 3: Testen Sie Ihren Endpoint
bash
curl -X POST "https://api.mercozy.com/api/v1/external/webhooks/{id}/test" \
  -H "X-API-Key: mk_live_your_key_here"

Endpunkte

GET

/webhooks

webhooks:read

Listen Sie alle registrierten Webhook-Endpunkte auf.

POST

/webhooks

webhooks:write

Registrieren Sie einen neuen Webhook-Endpunkt fuer Ereignisbenachrichtigungen.

PUT

/webhooks/:id

webhooks:write

Aktualisieren Sie einen bestehenden Webhook-Endpunkt (URL, Ereignisse oder aktiver Status).

DELETE

/webhooks/:id

webhooks:write

Loeschen Sie einen Webhook-Endpunkt. Ereignisse werden nicht mehr zugestellt.

Feldreferenz
FeldTypErforderlichBeschreibung

id

string

Nein

Eindeutige Webhook-ID (schreibgeschuetzt)

name

string

Ja

Ein beschreibender Name für diesen Endpoint

url

string

Ja

HTTPS-Endpunkt-URL fuer Webhook-Ereignisse

events

string[]

Ja

Array von Ereignistypen zum Abonnieren

secret

string

Nein

Signaturgeheimnis zur Payload-Verifizierung (schreibgeschuetzt, bei Erstellung generiert)

isActive

boolean

Nein

Ob der Webhook aktiv ist (Standard: true)

createdAt

datetime

Nein

ISO 8601 Zeitstempel (schreibgeschuetzt)


Verfuegbare Ereignistypen

Mercozy unterstützt 18 Webhook-Ereignistypen in 6 Kategorien. Abonnieren Sie nur die Ereignisse, die Sie benötigen.

Bestellungen
  • order.created

    Wird ausgelöst, wenn eine neue Bestellung aufgegeben wird

  • order.updated

    Wird ausgelöst, wenn Bestelldetails geändert werden

  • order.cancelled

    Wird ausgelöst, wenn eine Bestellung storniert wird

  • order.completed

    Wird ausgelöst, wenn eine Bestellung als abgeschlossen markiert wird

  • order.status_changed

    Wird bei jeder Bestellstatusänderung ausgelöst

Zahlungen
  • payment.received

    Wird ausgelöst, wenn die Zahlung erfasst oder per Nachnahme eingezogen wird

  • payment.refunded

    Wird ausgelöst, wenn eine Zahlung erstattet oder storniert wird

Produkte
  • product.created

    Wird ausgelöst, wenn ein neues Produkt hinzugefügt wird

  • product.updated

    Wird ausgelöst, wenn sich Produktdetails ändern

  • product.deleted

    Wird ausgelöst, wenn ein Produkt gelöscht wird

Bestand
  • stock.low

    Wird ausgelöst, wenn der Bestand unter den Schwellenwert fällt

  • stock.updated

    Wird ausgelöst, wenn sich die Bestandsmenge ändert

Kunden
  • customer.created

    Wird ausgelöst, wenn ein neuer Kunde registriert wird

  • customer.updated

    Wird ausgelöst, wenn Kundeninformationen aktualisiert werden

Lieferungen
  • delivery.batch_started

    Wird ausgelöst, wenn ein Lieferbatch versendet wird

  • delivery.batch_completed

    Wird ausgelöst, wenn alle Stopps eines Batches abgeschlossen sind

  • delivery.completed

    Wird ausgelöst, wenn eine einzelne Lieferung abgeschlossen ist

  • delivery.failed

    Wird ausgelöst, wenn ein Zustellversuch fehlschlägt


Webhook-Payload

Jede Webhook-Zustellung enthaelt den Ereignistyp, Zeitstempel und die relevanten Ressourcendaten.

Bestellereignis-Daten
json
{
  "id": "evt_clx1abc2def3",
  "type": "order.created",
  "timestamp": "2026-03-19T10:30:00Z",
  "data": {
    "id": "clx9order123",
    "orderNumber": "ORD-1042",
    "status": "PENDING",
    "total": 4999,
    "currency": "USD"
  }
}
Zahlungsereignis-Daten
json
{
  "id": "evt_clx2pay4ghi5",
  "type": "payment.received",
  "timestamp": "2026-03-19T10:35:00Z",
  "data": {
    "orderId": "clx9order123",
    "orderNumber": "ORD-1042",
    "amount": 4999,
    "currency": "USD",
    "paymentMethod": "CARD",
    "status": "CAPTURED"
  }
}
Produktereignis-Daten
json
{
  "id": "evt_clx3prod6jkl",
  "type": "product.created",
  "timestamp": "2026-03-19T11:00:00Z",
  "data": {
    "id": "clx9prod789",
    "name": "Organic Coffee Beans",
    "sku": "COF-001",
    "price": 1299,
    "status": "ACTIVE"
  }
}
Lieferereignis-Daten
json
{
  "id": "evt_clx4del7mno",
  "type": "delivery.completed",
  "timestamp": "2026-03-19T14:22:00Z",
  "data": {
    "orderId": "clx9order123",
    "orderNumber": "ORD-1042"
  }
}

HTTP-Header

Jede Webhook-Anfrage enthält die folgenden Header:

FeldTypErforderlichBeschreibung

Content-Type

string

Ja

application/json

X-Webhook-Signature

string

Ja

HMAC-SHA256-Signatur: sha256={Hex-Digest}

X-Webhook-Timestamp

string

Ja

Unix-Zeitstempel in Millisekunden

X-Webhook-ID

string

Ja

Eindeutige Ereignis-ID zur Deduplizierung

User-Agent

string

Ja

Mercozy-Webhook/1.0 (+https://www.mercozy.com/docs/webhooks)


Signaturverifizierung

Jeder Webhook enthält einen X-Webhook-Signature-Header mit einer HMAC-SHA256-Signatur. Überprüfen Sie diese Signatur immer, bevor Sie das Ereignis verarbeiten, um sicherzustellen, dass die Anfrage von Mercozy stammt.

Node.js
javascript
const crypto = require('crypto');

function verifyWebhook(rawBody, signature, timestamp, secret) {
  // Signature is computed over "timestamp.body"
  const message = timestamp + '.' + rawBody;
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(message)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// Express middleware
app.post('/webhooks', express.raw({ type: 'application/json' }), (req, res) => {
  const sig = req.headers['x-webhook-signature'];
  const ts = req.headers['x-webhook-timestamp'];
  if (!verifyWebhook(req.body, sig, ts, process.env.WEBHOOK_SECRET)) {
    return res.status(401).send('Invalid signature');
  }
  const event = JSON.parse(req.body);
  // Process event...
  res.status(200).json({ received: true });
});
Python
python
import hmac
import hashlib

def verify_webhook(payload: bytes, signature: str, timestamp: str, secret: str) -> bool:
    # Signature is computed over "timestamp.body"
    message = (timestamp + '.').encode() + payload
    expected = 'sha256=' + hmac.new(
        secret.encode(),
        message,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(signature, expected)

# Flask example
@app.route('/webhooks', methods=['POST'])
def handle_webhook():
    sig = request.headers.get('X-Webhook-Signature')
    ts = request.headers.get('X-Webhook-Timestamp')
    if not verify_webhook(request.data, sig, ts, WEBHOOK_SECRET):
        return 'Invalid signature', 401
    event = request.get_json()
    # Process event...
    return {'received': True}, 200
PHP
php
<?php
function verifyWebhook(string $payload, string $signature, string $timestamp, string $secret): bool {
    // Signature is computed over "timestamp.body"
    $message = $timestamp . '.' . $payload;
    $expected = 'sha256=' . hash_hmac('sha256', $message, $secret);
    return hash_equals($expected, $signature);
}

$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$timestamp = $_SERVER['HTTP_X_WEBHOOK_TIMESTAMP'] ?? '';
if (!verifyWebhook($payload, $signature, $timestamp, $webhookSecret)) {
    http_response_code(401);
    exit('Invalid signature');
}
$event = json_decode($payload, true);
// Process event...
http_response_code(200);
echo json_encode(['received' => true]);

Wiederholungsrichtlinie

Wenn Ihr Endpoint einen Nicht-2xx-Statuscode zurückgibt oder das Zeitlimit überschreitet (10 Sekunden), wird Mercozy die Zustellung mit exponentiellem Backoff erneut versuchen:

FeldTypErforderlichBeschreibung

Versuch 1

Nein

Sofort

Versuch 2

Nein

Nach ~1s

Versuch 3

Nein

Nach ~4s

Nach 3 fehlgeschlagenen Versuchen wird die Zustellung als fehlgeschlagen markiert. Sie können fehlgeschlagene Zustellungen manuell über das Dashboard oder die API erneut versuchen.


Best Practices

  • Innerhalb von 5 Sekunden antwortenGeben Sie sofort einen 200-Status zurück und verarbeiten Sie das Ereignis asynchron. Das Zeitlimit von Mercozy beträgt 10 Sekunden.

  • Signaturen immer verifizierenÜberprüfen Sie den X-Webhook-Signature-Header, bevor Sie ein Ereignis verarbeiten, um gefälschte Anfragen zu verhindern.

  • Duplikate behandeln (Idempotenz)Verwenden Sie den X-Webhook-ID-Header zur Deduplizierung. Speichern Sie verarbeitete Ereignis-IDs und überspringen Sie bereits behandelte.

  • HTTPS-Endpoints verwendenMercozy erfordert HTTPS-URLs in der Produktion, um Webhook-Daten während der Übertragung zu schützen.

  • Protokollieren und überwachenProtokollieren Sie alle eingehenden Webhooks und überwachen Sie Fehler. Verwenden Sie die Zustellprotokoll-API, um den Zustellstatus zu überprüfen.