MailLandDocs
Webhooks

Webhooks – Übersicht

Erhalten Sie Echtzeit-Benachrichtigungen über E-Mail-Ereignisse per Webhooks

Webhooks senden Ihrem Server HTTP-Benachrichtigungen in Echtzeit, wenn E-Mail-Ereignisse eintreten, Zustellungen, Bounces, Beschwerden und mehr. Anstatt den Status periodisch abzufragen, überträgt MailLand Ereignisse sofort bei ihrem Eintreten an Ihren Endpoint.

Funktionsweise von Webhooks

Einen Webhook konfigurieren

Registrieren Sie Ihre Endpoint-URL und wählen Sie aus, welche Ereignisse Sie empfangen möchten.

Mail.Land sendet Ereignisse

Wenn ein Ereignis eintritt (z. B. eine E-Mail zugestellt wird), sendet MailLand einen signierten HTTP POST an Ihren Endpoint mit den Ereignisdaten.

Ihr Server antwortet

Geben Sie einen 2xx-Statuscode zurück, um den Empfang zu bestätigen. Antworten ohne 2xx lösen automatische Wiederholungsversuche aus.

Einen Webhook erstellen

POST https://api.mail.land/v1/webhooks
Create a webhook
curl -X POST https://api.mail.land/v1/webhooks \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "includeFutureEvents": true,
    "scope": "all_domains"
  }'

Anforderungsfelder

FeldTypErforderlichBeschreibung
namestringNeinLesbarer Name für diesen Webhook
webhookUrlstringJaHTTPS-Endpoint-URL zum Empfangen von Ereignissen
productsarrayNeinProduktfilter: transactional, marketing, inbound, system
eventsarrayNeinSpezifische Ereignisse zum Abonnieren (siehe Ereignisse)
includeFutureEventsbooleanNeinNeue Ereignisse erhalten, die abonnierten Produkten hinzugefügt werden (Standard: true)
scopestringNeinall_domains (Standard) oder selected_domains
domainIdsarrayNeinDomain-IDs zum Filtern (erforderlich, wenn scope selected_domains ist)

Antwort

Status: 201 Created

Webhook created response
{
  "webhook": {
    "id": "k3m9x2p7qw4rtz",
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "includeFutureEvents": true,
    "scope": "all_domains",
    "domainIds": [],
    "isActive": true,
    "createdAt": "2026-02-17T10:00:00Z",
    "successCount": 0,
    "failureCount": 0,
    "consecutiveFailures": 0,
    "pauseThreshold": 10
  },
  "secret": "whsec_a1b2c3d4e5f6g7h8i9j0..."
}

Das secret wird nur einmal bei der Erstellung des Webhooks angezeigt. Bewahren Sie es sicher auf: Sie benötigen es zur Überprüfung von Webhook-Signaturen. Falls Sie es verlieren, können Sie es neu generieren, wodurch das alte Secret sofort ungültig wird.

Webhook-URLs müssen HTTPS verwenden. MailLand validiert URLs gegen SSRF-Angriffe: private Netzwerkadressen (127.0.0.1, 10.x, 192.168.x usw.) werden abgelehnt. Die Zustellung erfolgt nur über HTTPS auf Port 443; eine URL auf einem anderen Port oder mit Verweis auf eigene Server oder Hostnamen von MailLand wird mit 400 WEBHOOK_DESTINATION_NOT_ALLOWED abgelehnt. Ein anderer TLS-Port erfordert eine ausdrückliche Freigabe durch den MailLand-Support.

Webhooks auflisten

GET https://api.mail.land/v1/webhooks
List webhooks
curl -X GET https://api.mail.land/v1/webhooks \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
List response
[
  {
    "id": "k3m9x2p7qw4rtz",
    "name": "Production Events",
    "webhookUrl": "https://your-app.com/webhooks/mailland",
    "products": ["transactional", "marketing"],
    "events": ["message.delivered", "message.bounced"],
    "isActive": true,
    "lastTriggeredAt": "2026-02-17T12:30:00Z",
    "lastSuccessAt": "2026-02-17T12:30:00Z",
    "successCount": 1542,
    "failureCount": 3,
    "consecutiveFailures": 0,
    "createdAt": "2026-02-10T08:00:00Z"
  }
]

Gibt bis zu 100 Webhooks sortiert nach Erstellungsdatum zurück (neueste zuerst).

Webhook-Details abrufen

GET https://api.mail.land/v1/webhooks/{id}
Get webhook detail
curl -X GET https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Gibt die vollständige Webhook-Konfiguration sowie die 50 neuesten Zustellungsprotokolle zurück. Einzelheiten zu Zustellungsprotokollen finden Sie unter Retry-Logik.

Einen Webhook aktualisieren

PUT https://api.mail.land/v1/webhooks/{id}
Update webhook
curl -X PUT https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "All Events",
    "events": ["message.delivered", "message.bounced", "message.deferred", "message.complained"],
    "isActive": true
  }'

Alle Felder sind optional: geben Sie nur die Felder an, die Sie ändern möchten.

Einen Webhook testen

Senden Sie ein Testereignis, um zu überprüfen, ob Ihr Endpoint funktioniert:

POST https://api.mail.land/v1/webhooks/{id}/test
Test a webhook
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/test \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Test result
{
  "success": true,
  "statusCode": 200,
  "statusText": "OK",
  "durationMs": 145,
  "responseBody": "{\"received\": true}",
  "headersSent": {
    "X-MLND-Signature": "t=1708171200,v1=abc123...",
    "X-MLND-Event-Id": "evt_test_abc123",
    "X-MLND-Event-Version": "1",
    "X-MLND-Event": "webhook.test",
    "X-MLND-Webhook-Id": "k3m9x2p7qw4rtz",
    "X-MLND-Attempt": "1"
  },
  "wouldReceiveRealEvents": true,
  "liveEvents": ["message.delivered", "message.bounced"],
  "dormantEvents": {},
  "subscriptionWarning": null
}

Der Testversand nutzt dieselbe Signierung und denselben Zustellweg wie ein echtes Ereignis. Ein Erfolg beweist daher Ihre URL, Ihr TLS und Ihre Signaturprüfung.

Er beweist nicht Ihr Abonnement: Ein Test wird auf Anforderung gesendet und nicht über Ihre Ereignisauswahl geroutet. Die letzten vier Felder beantworten das getrennt:

FeldBedeutung
wouldReceiveRealEventsOb überhaupt ein echtes Ereignis diesen Endpoint erreichen kann
liveEventsAbonnierte Ereignisse, die denselben Filter wie der Dispatcher passieren
dormantEventsAbonnierte Ereignisse, die nie ankommen werden, jeweils mit Begründung
subscriptionWarningGesetzt, wenn der Endpoint erreichbar, aber dauerhaft untätig ist

Ein "success": true zusammen mit "wouldReceiveRealEvents": false ist der wichtige Fall: Der Endpoint funktioniert, hat aber nichts abonniert, was zugestellt werden kann.

Schlägt der Test fehl, gibt das Feld errorType den Grund an: ssrf_blocked (die URL oder eine Weiterleitung von ihr zeigte auf ein Ziel, an das die Plattform nicht sendet) oder network_error (Timeout, TLS-Fehler, Verbindung abgelehnt; errorMessage enthält die Details).

Secret neu generieren

Falls Sie Ihr Webhook-Secret verloren haben oder es rotieren müssen:

POST https://api.mail.land/v1/webhooks/{id}/regenerate-secret
Regenerate webhook secret
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/regenerate-secret \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
New secret
{
  "secretKey": "whsec_x9y8z7w6v5u4..."
}

Die Neugenerierung des Secrets macht das alte Secret sofort ungültig. Aktualisieren Sie den Verifikationscode Ihres Servers vor der nächsten Webhook-Zustellung, sonst werden gültige Ereignisse abgelehnt.

Domain-Bereich

Standardmäßig empfangen Webhooks Ereignisse für alle Domains in Ihrem Workspace. Um einen Webhook auf bestimmte Domains zu beschränken:

Domain-scoped webhook
{
  "webhookUrl": "https://your-app.com/webhooks/mailland",
  "scope": "selected_domains",
  "domainIds": ["d4n8q1zt5wm3xc", "b7r2mv9k0jy4pw"]
}

Nur Ereignisse, die sich auf diese Domains beziehen, lösen den Webhook aus.

Automatische Pausierung bei Fehlern

MailLand pausiert Webhooks automatisch nach 10 aufeinanderfolgenden Zustellungsfehlern (pro Webhook über pauseThreshold konfigurierbar). Dies verhindert die Verschwendung von Ressourcen bei ausgefallenen Endpoints.

Wenn ein Webhook pausiert wird:

  • Der Zeitstempel pausedAt wird gesetzt
  • pausedReason beschreibt den Grund der Pausierung
  • Ein account.webhook_paused-Ereignis wird an Ihre anderen aktiven Webhooks gesendet
  • Eine In-App-Benachrichtigung wird erstellt

Einen pausierten Webhook fortsetzen

Nehmen Sie nach der Behebung des Problems die Zustellung wieder auf:

POST https://api.mail.land/v1/webhooks/{id}/resume
Resume a paused webhook
curl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/resume \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Diese Aktion löscht den Pausierungsstatus, setzt den Zähler für aufeinanderfolgende Fehler zurück und reaktiviert den Webhook (isActive wird wieder true), sodass zukünftige Ereignisse wieder normal zugestellt werden.

Einen Webhook löschen

DELETE https://api.mail.land/v1/webhooks/{id}
Delete a webhook
curl -X DELETE https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

Gibt 204 No Content zurück. Wenn der Webhook von eingehenden E-Mail-Routen verwendet wird, werden diese Routen automatisch aktualisiert oder deaktiviert.

Fehlerantworten

StatusCodeBeschreibung
400INVALID_REQUESTUngültige URL, Ereignisse oder Bereichskonfiguration
403PLAN_LIMIT_REACHEDMaximale Webhook-Anzahl für Ihren Tarif erreicht
404(leerer Body)Webhook-ID existiert nicht: bei Get, Update, Delete, Regenerate-Secret und Resume
404RESOURCE_NOT_FOUNDWebhook-ID existiert nicht: nur bei /test

Nächste Schritte

Auf dieser Seite