WEBHOOKS

Webhaken

Ontvang real-time gebeurtenissen van Superroute — orders, statuswijzigingen, tracking-updates. Met ondertekende payloads, automatische pogingen en ingebouwde debugger.

Webhook Integratie Gids
Ontwikkelaarscentrum Thuis

Webhook Integratie Gids

Wat zijn webhooks?

Een webhook is een HTTP POST die Superroute naar een door u geconfigureerde URL stuurt zodra er iets gebeurt — een order wordt aangemaakt, een levering voltooid, een tracking-event vastgelegd. U bouwt een ontvangstpunt, wij leveren het event daar af.

Hoe levering werkt

Events worden in de wachtrij geplaatst en asynchroon verzonden. Elk verzoek bevat een HMAC-SHA256 handtekening waarmee u de herkomst kunt verifiëren. Mislukte leveringen (geen 2xx of timeout) worden tot 5 keer opnieuw geprobeerd met exponentiële backoff.

Beveiligingsmodel

U configureert een gedeeld geheim op de instellingenpagina. Elke uitgaande webhook wordt daarmee ondertekend. Uw ontvanger herberekent de handtekening en vergelijkt — bij match is de payload echt en onveranderd.

Eventcatalogus

Er zijn acht uitgaande eventtypen beschikbaar. Elk heeft een eigen URL-veld op de instellingenpagina — abonneer u op elke gewenste subset.

bestelling.gemaakt

Vuurt bij aanmaak van een lokale bezorgorder (Delivery / Pickup / P2P) via elke route — webformulier, REST/GraphQL API, e-commerce platform sync, automatische regels, importregels, enz. Label-service en andere niet-bezorg ordertypes worden uitgesloten. Wordt in batch-flow overgeslagen wanneer voor dezelfde ontvanger ook order_create_async_postback_url is geconfigureerd. Configureer via order_create_webhook_url.

Payload-voorbeelden
order.status_change

Vuurt bij elke statusovergang — opgehaald, onderweg, bezorgd, uitzondering, geannuleerd. Configureer via order_status_change_webhook_url.

Payload-voorbeelden
tracking.gebeurtenis

Vuurt bij elk tracking-lifecycle event van een pakket (info ingediend, levering gestart, succesvol bezorgd, niet bezorgd, enz.). Configureer via tracking_event_webhook_url. Bezorg- en ophaalgebeurtenissen bevatten ook het afleverbewijs: proof_files en proof_files_detail (file_id, type, url, full_url, ondertekende download-URL). Foto’s die na de gebeurtenis worden geüpload, komen binnen als pod.files_updated. Elk bestand bevat ook de context van zijn gebeurtenis: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) en service_status (1 = success / 2 = failed); voor oude bestanden zonder vastgelegde gebeurtenis zijn ze null.

Payload-voorbeelden
order.create_async

Vuurt eenmaal nadat een batch-import is verwerkt. Payload bevat de resultaten per regel. Configureer via order_create_async_postback_url.

Payload-voorbeelden
POD-bestanden bijgewerkt

Wordt geactiveerd wanneer een bezorgfoto of handtekening wordt toegevoegd, vervangen of verwijderd (action: added / updated / removed) — één levering per bestand, geen polling van bijlagen meer. Inschakelen via pod_files_webhook_url. Elk bestand bevat ook de context van zijn gebeurtenis: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) en service_status (1 = success / 2 = failed); voor oude bestanden zonder vastgelegde gebeurtenis zijn ze null.

Payload-voorbeelden
Order verwijderd

Wordt geactiveerd wanneer een order permanent wordt verwijderd, zodat uw systeem de verwijdering kan spiegelen. Inschakelen via order_deleted_webhook_url.

Payload-voorbeelden
Annulering van order mislukt

Wordt geactiveerd wanneer een annuleringspoging wordt geweigerd (bijvoorbeeld omdat de order al onderweg is), zodat uw operationele processen mislukte annuleringen kunnen bewaken zonder de API te pollen. Inschakelen via order_cancel_failed_webhook_url.

Payload-voorbeelden
Routebord-plaats gewijzigd

Wordt verzonden wanneer een plaats op het routebord van houder wisselt of het bord van status verandert — het veld action zegt wat er gebeurde (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Alleen op bedrijfsniveau. Opt-in via route_board_webhook_url.

Payload-voorbeelden

Aanbiederlocker-gebeurtenissen

Een apart webhookkanaal voor externe bezorgaanbieders die met slimme lockers integreren. Gebeurtenissen worden bezorgd op het endpoint dat voor uw aanbiederaccount is geconfigureerd; elk endpoint kan zich op elke subset van gebeurtenistypen abonneren.

partner_locker.delivery.doors_opened

Deuren Geopend — Wordt geactiveerd zodra de vakdeuren opengaan voor een bezorgpoging — of de koerier nu de toegangscode op het scherm van de kluis invoerde of de remote-open-API gebruikte — inclusief heropeningen na hertoewijzing. Het opening-blok toont elk geopend vak met grid_id, hardware-deurnummer compartment_number en pickup_locker_number (volgnummer voor weergave, per kolom van boven naar beneden geteld en daarna van links naar rechts). Elk vak bevat ook pickup_locker_code — het label "{shelf_code}-{pickup_locker_number}" waar de ontvanger naartoe wordt gestuurd; null als het vak geen afhaalnummer heeft. De payload bevat ook pickup_code — de afhaalcode van de ontvanger, toegewezen op het moment dat de deuren opengaan; die blijft dezelfde code nadat de koerier het deponeren bevestigt en kan pas na die bevestiging voor afhalen worden gebruikt.

Payload-voorbeelden
partner_locker.delivery.delivered

Bezorgd in kluis — Wordt geactiveerd wanneer een aflevering is bevestigd en de pakketten in de locker liggen. De payload bevat de ophaalcode van de ontvanger. Elk vak bevat ook pickup_locker_code — het label "{shelf_code}-{pickup_locker_number}" waar de ontvanger naartoe wordt gestuurd; null als het vak geen afhaalnummer heeft. Voor deuren die via de API voor openen op afstand zijn geopend, wikkelt het platform de aflevering zelf af zodra de locker meldt dat alle geopende deuren weer dicht zijn; het event wordt dan zonder confirm-aanroep verstuurd. confirmed_by geeft de afwikkelingsroute aan: courier_terminal, partner_api, door_close, timeout_door_closed of console.

Payload-voorbeelden
partner_locker.pickup.completed

Opgehaald — Wordt geactiveerd wanneer de ontvanger de gedeponeerde pakketten heeft opgehaald.

Payload-voorbeelden
partner_locker.delivery.failed

Bezorging mislukt — Wordt geactiveerd wanneer een bezorging mislukt; foutcodes per pakket zijn inbegrepen.

Payload-voorbeelden
partner_locker.delivery.expired

Verlopen — Wordt geactiveerd wanneer een ongebruikte bezorgcode of een niet-opgehaalde deponering de vervaltijd overschrijdt.

Payload-voorbeelden
partner_locker.delivery.cancelled

Geannuleerd — Wordt geactiveerd wanneer een bezorging vóór voltooiing wordt geannuleerd.

Payload-voorbeelden
partner_locker.delivery.correction_reopened

Correctie-heropening — Wordt geactiveerd wanneer de gebruikte vakken binnen het correctievenster opnieuw worden geopend om een verkeerde plaatsing te herstellen — via het lockerscherm of via de API. Het correction-blok vermeldt de heropende vakken. Elk vak bevat ook pickup_locker_code — het label "{shelf_code}-{pickup_locker_number}" waar de ontvanger naartoe wordt gestuurd; null als het vak geen afhaalnummer heeft.

Payload-voorbeelden
partner_locker.delivery.code_rotated

partner_locker_delivery.event_type_code_rotated — Wordt geactiveerd wanneer de partner de bezorgcode of afhaalcode van een bezorging vernieuwt. Het rotation-blok vermeldt welke code is vervangen, wanneer, en of de ontvangermelding opnieuw is verzonden — de nieuwe code zelf reist nooit mee in een webhook; die wordt alleen onthuld in het directe antwoord van de vernieuwings-API.

Payload-voorbeelden

Handtekening & Verificatie: Aanbiederlocker-webhooks gebruiken een eigen ondertekeningsschema: X-Webhook-Signature is base64(HMAC-SHA256(geheim, tijdstempel + "\n" + bezorgings-id + "\n" + ruwe body)), waarbij de tijdstempel en bezorgings-id uit de headers X-Webhook-Timestamp en X-Webhook-Delivery-Id komen. Controleer ook X-Webhook-Content-Digest (SHA-256 van de body) en weiger verouderde tijdstempels. X-Webhook-Id blijft stabiel over nieuwe pogingen — gebruik deze voor idempotentie.

Hoe configureren: Endpoints beheert u onder Externe bezorging → Aanbiederlocker → Instellingen, één endpoint per aanbieder, met een selecteerbare gebeurtenislijst. Mislukte bezorgingen worden met exponentiële backoff tot 7 keer opnieuw geprobeerd voordat ze in de dead letter belanden; dead-lettergebeurtenissen kunnen handmatig opnieuw worden verzonden vanaf de gebeurtenissenpagina.

Sandbox-gebeurtenissen (mock-kluizen): Bezorgingen op mock-kluizen genereren dezelfde webhook-gebeurtenissen als productie, ondertekend met hetzelfde secret, zodat u met realistisch verkeer kunt ontwikkelen. Sandbox-gebeurtenissen zijn op drie manieren gemarkeerd: de payload bevat "livemode": false, de event_id begint met PLE-MOCK- en het verzoek draagt de header X-Webhook-Test: 1. Als op het endpoint een sandbox-URL is geconfigureerd, gaan sandbox-gebeurtenissen daarheen in plaats van naar de productie-URL; anders vallen ze terug op de productie-URL, nog steeds gemarkeerd. De schakelaar "Sandbox-gebeurtenissen bezorgen" stopt de sandbox-bezorging volledig.

Externe bezorging-gebeurtenissen

Pakketbezorging-webhooks die naar externe bezorgaanbieders (koeriers) worden gepusht. Ze dekken de levenscyclus van bezorgtoewijzingen, zodat een koerier niet meer hoeft te pollen naar nieuwe opdrachten. Deze categorie staat los van de onderstaande slimme locker-gebeurtenissen: elke aanbieder configureert per categorie een eigen endpoint, ondertekeningsgeheim en gebeurtenisabonnement — in zijn eigen aanbiedersportaal of via de platformbeheerder.

delivery.assignment.created

Toewijzing aangemaakt — Wordt geactiveerd wanneer een order aan de aanbieder wordt toegewezen — via een automatische regel of handmatig. De payload bevat het toewijzingsnummer, de order-ID's en de trackingnummers van de pakketten.

Payload-voorbeelden
delivery.assignment.handed_over

Pakketten overgedragen — Wordt geactiveerd wanneer het magazijn alle pakketten van de toewijzing fysiek aan de aanbieder heeft overgedragen.

Payload-voorbeelden
delivery.assignment.cancelled

Toewijzing geannuleerd — Wordt geactiveerd wanneer het platform een toewijzing bij de aanbieder intrekt. Het veld reason maakt onderscheid tussen cancelled (de toewijzing is bij de vervoerder geannuleerd), fallback_to_self_delivery (het platform heeft de order teruggenomen voor eigen bezorging) en reassigned (de order is naar een andere aanbieder verplaatst).

Payload-voorbeelden
delivery.assignment.partial_delivered

Gedeeltelijk bezorgd — Wordt geactiveerd wanneer een deel van een zending is bezorgd terwijl andere pakketten nog onderweg zijn. De array packages bevat het resultaat per pakket en legs somt de bij de vervoerder geboekte externe orders op — één per pakket als de vervoerder geen multi-collo zendingen accepteert.

Payload-voorbeelden

Handtekening & Verificatie: Webhooks voor externe bezorging gebruiken hetzelfde ondertekeningsschema als aanbiederlocker-webhooks: X-Webhook-Signature is base64(HMAC-SHA256(secret, timestamp + "\n" + delivery id + "\n" + raw body)), waarbij de timestamp en delivery id uit de headers X-Webhook-Timestamp en X-Webhook-Delivery-Id komen. Controleer ook X-Webhook-Content-Digest (SHA-256 van de body) en weiger verouderde tijdstempels. X-Webhook-Id blijft stabiel over nieuwe pogingen — gebruik deze voor idempotentie.

Hoe configureren: Aanbieders configureren dit endpoint zelf in het aanbiedersportaal (Webhook-instellingen), of de platformbeheerder doet dit onder Externe bezorging → Aanbieders → Webhooks. Eén endpoint per aanbieder met een selecteerbare gebeurtenislijst. Het ondertekeningsgeheim kan automatisch worden gegenereerd of op een eigen waarde worden ingesteld, en is te bekijken op de instellingenpagina. Mislukte bezorgingen worden met exponentiële backoff tot 7 keer opnieuw geprobeerd voordat ze in de dead letter belanden; dead-lettergebeurtenissen kunnen handmatig opnieuw worden verzonden. Vanaf de instellingenpagina kan op elk moment een ondertekende test- (mock-)gebeurtenis worden verzonden — testverzoeken dragen de header X-Webhook-Test: 1 en bevatten "test": true in de payload-data.

Levenscyclusgebeurtenissen van orders

Fijnmazige, opt-in gebeurtenissen naast de klassieke order.status_change-webhook (die ongewijzigd blijft): wie is toegewezen, of de chauffeur heeft geaccepteerd, wanneer het pakket is opgehaald, onderweg is, bezorgd is of mislukt is, plus wijzigingen in de chauffeursdienst en gedoseerde chauffeursposities. Er wordt niets verzonden totdat u de onderstaande URL's configureert.

order.assigned

Er is een chauffeur aan de order toegewezen (handmatig, via ritplanning of via automatische toewijzing). data.source = auto_assign wanneer de orchestrator dit deed.

Payload-voorbeelden
order.unassigned

De order is zijn chauffeur kwijtgeraakt (overdracht, intrekking, weigering, time-out). data.previous_driver_id geeft aan wie hem had.

Payload-voorbeelden
order.accepted

De chauffeur heeft een automatisch toegewezen order in de app geaccepteerd (chauffeursdienst met verplichte acceptatie).

Payload-voorbeelden
order.rejected

De chauffeur heeft een toegewezen order geweigerd; data.reason bevat de optionele reden in vrije tekst.

Payload-voorbeelden
order.pickup_started

De chauffeur is met ophalen begonnen (status Ophalen gestart / Onderweg voor ophalen).

Payload-voorbeelden
order.picked_up

Het pakket is opgehaald (status Al opgehaald).

Payload-voorbeelden
order.on_the_way

Het pakket is onderweg naar de ontvanger (status Bezorging gestart / Onderweg voor bezorging).

Payload-voorbeelden
order.completed

De bezorging is geslaagd (status Succesvol).

Payload-voorbeelden
order.failed

De bezorgpoging is mislukt (Later opnieuw bezorgen, Opnieuw plannen, Afgewezen door ontvanger).

Payload-voorbeelden
order.cancelled

De order is geannuleerd.

Payload-voorbeelden
order.ready

Een medewerker (of een chauffeur, indien toegestaan) heeft de order als gereed voor ophalen gemarkeerd (Dispatchopties → gereed voor ophalen).

Payload-voorbeelden
driver.on_duty_changed

Een chauffeur is in de app in of uit dienst gegaan (optie chauffeursdienst).

Payload-voorbeelden
driver.location_update

Een chauffeurspositie uit de app of tracker, per chauffeur gedoseerd via driver_location_min_interval_sec (standaard 60 s). Wordt alleen naar driver_location_webhook_url verzonden.

Payload-voorbeelden

Hoe configureren: Instellingen → Webhooks (of GET/PUT /api/v1/webhook-settings, GraphQL webhookSettingsUpdate): order_lifecycle_webhook_url ontvangt elke order.*-gebeurtenis en driver.on_duty_changed; order_lifecycle_events beperkt dat tot een door komma's gescheiden lijst; driver_location_webhook_url en driver_location_min_interval_sec regelen driver.location_update. Meerdere URL's kunnen door komma's worden gescheiden. Verzendingen verschijnen in het webhook-bezorglogboek met reference_type order / driver.

Handtekening & Verificatie: Ondertekend precies zoals elke andere uitgaande webhook van uw account: legacy Signature-header plus X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 met uw webhook_sign_secret. Nieuwe pogingen hergebruiken dezelfde event_id – dedupliceer daarop.

Apparaatorder-gebeurtenissen

Optionele gebeurtenissen voor pakketten die door uw slimme kluizen, kiosken en smart drops worden verwerkt: een pakket opgeslagen in een automaat, opgehaald, door medewerkers eruit gehaald of over de ophaaltermijn heen, en problemen die daarover zijn geopend of opgelost. Uitsluitend aanvullend — geen bestaande webhook verandert en er wordt niets verzonden totdat u device_order_webhook_url instelt.

device_order.stored

Een pakket is in de automaat geplaatst en wacht op de volgende persoon (ontvanger, koerier of beheerder, zie data.device_order.next_actor). due_at is de uiterste ophaaldatum.

Payload-voorbeelden
device_order.collected

Het pakket is eruit gehaald door de persoon op wie het wachtte — de ontvanger, de koerier of medewerkers die een smart drop legen.

Payload-voorbeelden
device_order.removed

Medewerkers hebben het pakket uit de automaat gehaald. removal_reason geeft de reden: overdue_return, handover, relay, anomaly of recovery.

Payload-voorbeelden
device_order.overdue

Het pakket is over zijn due_at heen zonder te zijn opgehaald. Het ligt nog in de automaat en de code werkt nog; overdue_at wordt ingesteld en next_actor wordt operator.

Payload-voorbeelden
device_order.exception_opened

Er is een probleem geopend voor de verwerking (bijvoorbeeld door_left_open, deposit_unverified, item_missing, overdue). data.exception bevat id, type, severity en status.

Payload-voorbeelden
device_order.exception_resolved

Iemand heeft een probleem van de verwerking gesloten. data.exception.status is resolved of dismissed en resolution_action geeft aan wat er is gedaan.

Payload-voorbeelden

Payload-voorbeelden: data.device_order: id, kind, status, next_actor, device_type, device_id, device_name, grid_code, reference_number, order_id, external_order_id, due_at, overdue_at, stored_at, ended_at, removal_reason (tijden in ISO 8601, null zolang niet bereikt). Probleemgebeurtenissen voegen data.exception toe: id, type, severity, status, resolution_action. De ophaalcode wordt nooit meegestuurd. event_id is DOE-<id van de registergebeurtenis> en blijft gelijk bij nieuwe pogingen.

Hoe configureren: Instellingen → Webhooks (of GET/PUT /api/v1/webhook-settings): device_order_webhook_url ontvangt elke device_order.*-gebeurtenis; device_order_events beperkt dit tot een door komma's gescheiden lijst. Meerdere URL's kunnen door komma's worden gescheiden. Afleveringen verschijnen in het webhook-afleverlogboek met reference_type device_order.

Handtekening & Verificatie: Ondertekend precies zoals elke andere uitgaande webhook van uw account: legacy Signature-header plus X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 met uw webhook_sign_secret. Nieuwe pogingen hergebruiken dezelfde event_id – dedupliceer daarop.

Pakketten die een partnervervoerder onder zijn eigen account in uw kluizen aflevert, worden niet via dit kanaal verzonden; de partner ontvangt ze via zijn eigen leverancierskluis-webhooks.

Hoe configureren

U kunt webhooks op twee niveaus configureren: op bedrijfsniveau (dekt alles) of per klant (overschrijft voor dat specifieke B2B-subaccount).

1. Naar de instellingen

Log in en ga naar Instellingen → API & Webhooks. Klant-overschrijvingen staan op de klantdetailpagina.

2. Stel het handtekening-geheim in

Kies een string van minimaal 16 tekens, idealiter 32+ willekeurige bytes. Uw ontvanger gebruikt dit geheim om handtekeningen te verifiëren.

3. Stel de gewenste event-URLs in

Vul alleen URLs in voor events die u nodig heeft. Laat de rest leeg.

webhook_sign_geheimU configureert een gedeeld geheim op de instellingenpagina. Elke uitgaande webhook wordt daarmee ondertekend. Uw ontvanger herberekent de handtekening en vergelijkt — bij match is de payload echt en onveranderd.
order_create_webhook_urlVuurt bij aanmaak van een lokale bezorgorder (Delivery / Pickup / P2P) via elke route — webformulier, REST/GraphQL API, e-commerce platform sync, automatische regels, importregels, enz. Label-service en andere niet-bezorg ordertypes worden uitgesloten. Wordt in batch-flow overgeslagen wanneer voor dezelfde ontvanger ook order_create_async_postback_url is geconfigureerd. Configureer via order_create_webhook_url.
order_status_change_webhook_urlVuurt bij elke statusovergang — opgehaald, onderweg, bezorgd, uitzondering, geannuleerd. Configureer via order_status_change_webhook_url.
tracking_event_webhook_urlVuurt bij elk tracking-lifecycle event van een pakket (info ingediend, levering gestart, succesvol bezorgd, niet bezorgd, enz.). Configureer via tracking_event_webhook_url. Bezorg- en ophaalgebeurtenissen bevatten ook het afleverbewijs: proof_files en proof_files_detail (file_id, type, url, full_url, ondertekende download-URL). Foto’s die na de gebeurtenis worden geüpload, komen binnen als pod.files_updated. Elk bestand bevat ook de context van zijn gebeurtenis: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) en service_status (1 = success / 2 = failed); voor oude bestanden zonder vastgelegde gebeurtenis zijn ze null.
order_create_async_postback_urlVuurt eenmaal nadat een batch-import is verwerkt. Payload bevat de resultaten per regel. Configureer via order_create_async_postback_url.
pod_files_webhook_urlWordt geactiveerd wanneer een bezorgfoto of handtekening wordt toegevoegd, vervangen of verwijderd (action: added / updated / removed) — één levering per bestand, geen polling van bijlagen meer. Inschakelen via pod_files_webhook_url. Elk bestand bevat ook de context van zijn gebeurtenis: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) en service_status (1 = success / 2 = failed); voor oude bestanden zonder vastgelegde gebeurtenis zijn ze null.
order_deleted_webhook_urlWordt geactiveerd wanneer een order permanent wordt verwijderd, zodat uw systeem de verwijdering kan spiegelen. Inschakelen via order_deleted_webhook_url.
order_cancel_failed_webhook_urlWordt geactiveerd wanneer een annuleringspoging wordt geweigerd (bijvoorbeeld omdat de order al onderweg is), zodat uw operationele processen mislukte annuleringen kunnen bewaken zonder de API te pollen. Inschakelen via order_cancel_failed_webhook_url.
route_board_webhook_urlWordt verzonden wanneer een plaats op het routebord van houder wisselt of het bord van status verandert — het veld action zegt wat er gebeurde (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Alleen op bedrijfsniveau. Opt-in via route_board_webhook_url.
device_order_webhook_urlOptionele gebeurtenissen voor pakketten die door uw slimme kluizen, kiosken en smart drops worden verwerkt: een pakket opgeslagen in een automaat, opgehaald, door medewerkers eruit gehaald of over de ophaaltermijn heen, en problemen die daarover zijn geopend of opgelost. Uitsluitend aanvullend — geen bestaande webhook verandert en er wordt niets verzonden totdat u device_order_webhook_url instelt.
Gids integratie-updates

Alles wat nieuw is in de API en webhooks — idempotent annuleren, reconciliatie-feeds, v2-handtekeningen, nieuwe events — met kant-en-klare voorbeelden. Alles volledig backwards compatible.

Handtekening & Verificatie

Elke uitgaande webhook bevat een hex-gecodeerde HMAC-SHA256 handtekening in de header. Uw ontvanger moet de handtekening herberekenen over de ruwe body met het gedeelde geheim en het verzoek afwijzen als het niet overeenkomt.

Algoritme
HMAC-SHA256 (hex)
Headernaam
Signature
Verificatiestappen
  1. Lees de ruwe body voordat parsing of middleware deze wijzigt.
  2. Bereken hash_hmac('sha256', rawBody, sharedSecret) en hex-codeer.
  3. Vergelijk met de Signature-header in constante tijd (hash_equals in PHP, crypto.timingSafeEqual in Node).
  4. Antwoord alleen met 2xx als de handtekeningen overeenkomen. Anders 401.
<?php $rawBody = file_get_contents('php://input'); $received = $_SERVER['HTTP_SIGNATURE'] ?? ''; $expected = hash_hmac('sha256', $rawBody, $sharedSecret); if (!hash_equals($expected, $received)) { http_response_code(401); exit('Bad signature'); } $payload = json_decode($rawBody, true); // ... handle event ... http_response_code(200); echo 'ok';
const crypto = require('crypto'); const express = require('express'); const app = express(); app.use('/webhooks/superroute', express.raw({ type: 'application/json' }), (req, res) => { const received = req.header('Signature') || ''; const expected = crypto.createHmac('sha256', sharedSecret) .update(req.body).digest('hex'); if (!crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected))) { return res.status(401).send('Bad signature'); } const payload = JSON.parse(req.body.toString()); // ... handle event ... res.status(200).send('ok'); });
import hmac, hashlib from flask import Flask, request, abort app = Flask(__name__) @app.route('/webhooks/superroute', methods=['POST']) def webhook(): received = request.headers.get('Signature', '') expected = hmac.new(shared_secret.encode(), request.data, hashlib.sha256).hexdigest() if not hmac.compare_digest(received, expected): abort(401) payload = request.get_json() # ... handle event ... return 'ok', 200
func handleWebhook(w http.ResponseWriter, r *http.Request) { body, _ := io.ReadAll(r.Body) received := r.Header.Get("Signature") mac := hmac.New(sha256.New, []byte(sharedSecret)) mac.Write(body) expected := hex.EncodeToString(mac.Sum(nil)) if !hmac.Equal([]byte(received), []byte(expected)) { w.WriteHeader(401); return } // ... handle event ... w.WriteHeader(200) w.Write([]byte("ok")) }
require 'openssl' require 'rack/utils' post '/webhooks/superroute' do raw = request.body.read received = request.env['HTTP_SIGNATURE'] || '' expected = OpenSSL::HMAC.hexdigest('sha256', shared_secret, raw) halt 401 unless Rack::Utils.secure_compare(received, expected) payload = JSON.parse(raw) # ... handle event ... status 200 'ok' end

Pogingen & Betrouwbaarheid

Uw endpoint moet snel met 2xx antwoorden. Anders, bij timeout of onbereikbaarheid, wordt de levering opnieuw geprobeerd.

Max. pogingen
5 (initieel + 4 retries)
Timeout per poging
3 seconden
Terugtrekken
Exponentieel — ongeveer 10s, 100s, 1000s, 10000s
Bouw idempotent. Omdat een levering opnieuw kan worden geprobeerd, kan uw ontvanger hetzelfde event meerdere keren zien. Gebruik order-/tracking-ID als deduplicatiesleutel — bewaar verwerkte IDs minimaal 24 uur.
Aanbevolen respons. Bevestig snel (HTTP 200) en verwerk asynchroon. Voer geen trage operaties synchroon uit in de handler — u raakt de 3-seconden timeout.

Handtekening-verifier

Plak een ontvangen payload, de Signature-headerwaarde en uw geheim — de tool herberekent de handtekening in uw browser (niets verlaat deze pagina) en meldt of ze overeenkomen.

Test-webhook verzenden

Vuur een echte, correct ondertekende webhook af vanaf onze server naar een door u opgegeven URL. Gebruik dit om bereikbaarheid, payload-parsing en handtekening-verificatie te testen.

Recente Webhook-leveringen

Bekijk de meest recente webhook-leveringspogingen op uw account — zowel productie-events als tests vanaf deze pagina. Plak uw Bearer token om te laden.

Tijd Evenement URL Status HTTP Poging Tijd (ms) Testen? Acties
Nog geen webhook-leveringen gevonden.

Beste praktijken