Webhooks
Webhooks sturen een HTTP POST naar jouw server zodra er iets met een e-mail gebeurt: bezorging, bounce, open of spamklacht. Zo hoef je niet te pollen en reageer je direct.
Webhook aanmaken
POST
https://api.wesender.nl/webhooks | Veld | Type | Vereist | Beschrijving |
|---|---|---|---|
| url | string | Ja | HTTPS-eindpunt dat de POST-verzoeken ontvangt. |
| events | string[] | Ja | Lijst van te ontvangen event-types. Zie hieronder. |
| secret | string | Nee | Geheim voor handtekeningverificatie. Wij genereren er één als je het weglaat. |
Event types
| Event | Wanneer |
|---|---|
| email.delivered | De ontvangende mailserver heeft de e-mail geaccepteerd. |
| email.bounced | Bezorging definitief mislukt (hard bounce) of tijdelijk mislukt (soft bounce). |
| email.opened | Ontvanger heeft de e-mail geopend (vereist open-tracking). |
| email.clicked | Ontvanger heeft op een link geklikt (vereist click-tracking). |
| email.complained | Ontvanger heeft de e-mail als spam gemarkeerd. |
Payload: email.delivered
POST jouw endpoint
{
"event": "email.delivered",
"created_at":"2026-06-08T14:23:11Z",
"data": {
"email_id": "em_01hwxxxxxxxxxxxxxx",
"from": "noreply@joudomein.nl",
"to": "klant@voorbeeld.nl",
"subject": "Je bestelling is verzonden",
"tags": { "flow": "checkout" }
}
} Payload: email.bounced
Het bounce_type veld is hard (permanent, automatisch gesupprimeerd) of soft (tijdelijk).
POST jouw endpoint
{
"event": "email.bounced",
"created_at":"2026-06-08T14:25:03Z",
"data": {
"email_id": "em_01hwxxxxxxxxxxxxxx",
"from": "noreply@joudomein.nl",
"to": "ongeldig@voorbeeld.nl",
"bounce_type": "hard",
"reason": "550 5.1.1 The email account does not exist"
}
} Handtekeningverificatie
Elk webhook-verzoek bevat een x-wesender-signature header: een HMAC-SHA256 hash van de ruwe request body, ondertekend met jouw webhook secret. Controleer dit altijd om nep-verzoeken te voorkomen.
Compleet handler voorbeeld
Herlevering en fouttolerantie
- Je endpoint moet binnen 10 seconden antwoorden met HTTP 2xx.
- Bij een timeout of non-2xx proberen wij het tot 5 keer opnieuw, met exponentieel wachten.
- Na 5 pogingen wordt het event gedropt en gelogd als mislukt in je dashboard.
- Verwerk events asynchroon: antwoord snel, verwerk daarna.