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/webhookscurl -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
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | Nein | Lesbarer Name für diesen Webhook |
webhookUrl | string | Ja | HTTPS-Endpoint-URL zum Empfangen von Ereignissen |
products | array | Nein | Produktfilter: transactional, marketing, inbound, system |
events | array | Nein | Spezifische Ereignisse zum Abonnieren (siehe Ereignisse) |
includeFutureEvents | boolean | Nein | Neue Ereignisse erhalten, die abonnierten Produkten hinzugefügt werden (Standard: true) |
scope | string | Nein | all_domains (Standard) oder selected_domains |
domainIds | array | Nein | Domain-IDs zum Filtern (erforderlich, wenn scope selected_domains ist) |
Antwort
Status: 201 Created
{
"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/webhookscurl -X GET https://api.mail.land/v1/webhooks \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."[
{
"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}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}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}/testcurl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/test \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"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:
| Feld | Bedeutung |
|---|---|
wouldReceiveRealEvents | Ob überhaupt ein echtes Ereignis diesen Endpoint erreichen kann |
liveEvents | Abonnierte Ereignisse, die denselben Filter wie der Dispatcher passieren |
dormantEvents | Abonnierte Ereignisse, die nie ankommen werden, jeweils mit Begründung |
subscriptionWarning | Gesetzt, 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-secretcurl -X POST https://api.mail.land/v1/webhooks/k3m9x2p7qw4rtz/regenerate-secret \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"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:
{
"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
pausedAtwird gesetzt pausedReasonbeschreibt 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}/resumecurl -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}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
| Status | Code | Beschreibung |
|---|---|---|
400 | INVALID_REQUEST | Ungültige URL, Ereignisse oder Bereichskonfiguration |
403 | PLAN_LIMIT_REACHED | Maximale Webhook-Anzahl für Ihren Tarif erreicht |
404 | (leerer Body) | Webhook-ID existiert nicht: bei Get, Update, Delete, Regenerate-Secret und Resume |
404 | RESOURCE_NOT_FOUND | Webhook-ID existiert nicht: nur bei /test |
Nächste Schritte
- Ereignisse: vollständige Referenz aller Ereignistypen und Payloads
- Signaturverifizierung: Webhook-Authentizität überprüfen
- Retry-Logik: Wiederholungsverhalten und Fehlerbehandlung verstehen