WEBHOOKS

Webhook

Ricevi eventi in tempo reale da Superroute — ordini, cambi di stato, aggiornamenti di tracciamento. Con payload firmati, tentativi automatici e debugger integrato.

Guida all'Integrazione Webhook
Centro Sviluppatori Casa

Guida all'Integrazione Webhook

Cosa sono i webhook?

Un webhook è una richiesta HTTP POST che Superroute invia a un URL configurato ogni volta che succede qualcosa — un ordine viene creato, una consegna completata, un evento di tracciamento registrato. Tu costruisci un endpoint di ricezione, noi vi consegnamo l'evento.

Come funziona la consegna

Gli eventi vengono accodati e inviati in modo asincrono. Ogni richiesta porta una firma HMAC-SHA256 per verificare la provenienza. Le consegne fallite (non 2xx o timeout) vengono riprovate con backoff esponenziale fino a 5 volte.

Modello di sicurezza

Configuri un segreto condiviso nella pagina impostazioni. Ogni webhook uscente viene firmato con tale segreto. Il ricevitore ricalcola la firma e confronta — se coincidono, il payload è autentico e non manomesso.

Catalogo Eventi

Sono disponibili otto tipi di eventi uscenti. Ognuno ha il proprio campo URL nella pagina impostazioni — puoi iscriverti a qualsiasi sottoinsieme.

ordine.creato

Si attiva alla creazione di un ordine di consegna locale (Delivery / Pickup / P2P) tramite qualsiasi canale: form web, API REST/GraphQL, sincronizzazione piattaforma e-commerce, regole automatiche, righe importate, ecc. Esclude gli ordini label-service e altri tipi non di consegna. Saltato nel flusso batch quando lo stesso destinatario ha anche order_create_async_postback_url configurato. Configura con order_create_webhook_url.

Esempi di Payload
ordine.status_change

Si attiva ad ogni transizione di stato — ritirato, in transito, consegnato, eccezione, annullato. Configura con order_status_change_webhook_url.

Esempi di Payload
monitoraggio.evento

Si attiva ad ogni evento del ciclo di vita di un pacco (informazioni inviate, inizio consegna, consegna riuscita, non consegnato, ecc.). Configura con tracking_event_webhook_url. Gli eventi di consegna e di ritiro contengono anche la prova di consegna: proof_files e proof_files_detail (file_id, type, url, full_url, URL di download firmato). Le foto caricate dopo l’evento arrivano come pod.files_updated. Ogni file include anche il contesto del suo evento: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) e service_status (1 = success / 2 = failed); per i file storici senza evento registrato sono null.

Esempi di Payload
ordine.create_async

Si attiva una volta al termine dell'elaborazione di un'importazione batch. Il payload contiene l'array dei risultati per riga. Configura con order_create_async_postback_url.

Esempi di Payload
File POD aggiornati

Attivato quando una foto di consegna o una firma viene aggiunta, sostituita o rimossa (action: added / updated / removed) — un invio per file, niente più polling degli allegati. Si attiva configurando pod_files_webhook_url. Ogni file include anche il contesto del suo evento: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) e service_status (1 = success / 2 = failed); per i file storici senza evento registrato sono null.

Esempi di Payload
Ordine eliminato

Attivato quando un ordine viene eliminato definitivamente, così il tuo sistema può replicare la rimozione. Si attiva configurando order_deleted_webhook_url.

Esempi di Payload
Annullamento ordine non riuscito

Attivato quando un tentativo di annullamento viene rifiutato (ad esempio l'ordine è già in consegna), così i tuoi processi operativi possono monitorare gli annullamenti falliti senza interrogare l'API. Si attiva configurando order_cancel_failed_webhook_url.

Esempi di Payload
Posto della bacheca percorsi modificato

Si attiva quando un posto della bacheca percorsi cambia titolare o la bacheca cambia stato — il campo action indica cosa è successo (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Solo a livello aziendale. Iscrizione tramite route_board_webhook_url.

Esempi di Payload

Eventi armadietti fornitore

Un canale webhook separato per i fornitore di consegna terzi integrati con gli armadietti intelligenti. Gli eventi vengono consegnati all'endpoint configurato per il tuo account fornitore e ogni endpoint può sottoscrivere qualsiasi sottoinsieme di tipi di evento.

partner_locker.delivery.doors_opened

Sportelli Aperti — Si attiva nel momento in cui gli sportelli si aprono per un tentativo di consegna — sia che il corriere abbia usato lo schermo dell'armadietto con il codice di accesso sia l'API di apertura remota — incluse le riaperture per riassegnazione. Il blocco opening elenca ogni scomparto aperto con grid_id, numero sportello hardware compartment_number e pickup_locker_number (numero sequenziale di visualizzazione contato dall'alto verso il basso per colonna, poi da sinistra a destra). Ogni scomparto riporta anche pickup_locker_code: l'etichetta "{shelf_code}-{pickup_locker_number}" a cui viene indirizzato il destinatario; null quando lo scomparto non ha un numero di ritiro. Il payload include anche pickup_code: il codice di ritiro del destinatario, assegnato nel momento in cui si aprono gli sportelli; resta lo stesso codice dopo che il corriere conferma il deposito e diventa utilizzabile per il ritiro solo a deposito confermato.

Esempi di Payload
partner_locker.delivery.delivered

Consegnato nell'armadietto — Attivato quando un deposito è confermato e i pacchi sono nell'armadietto. Il payload include il codice di ritiro del destinatario. Ogni scomparto riporta anche pickup_locker_code: l'etichetta "{shelf_code}-{pickup_locker_number}" a cui viene indirizzato il destinatario; null quando lo scomparto non ha un numero di ritiro. Per gli sportelli aperti tramite l'API di apertura remota la piattaforma liquida il deposito non appena l'armadietto segnala chiusi tutti gli sportelli aperti, quindi l'evento scatta senza una chiamata confirm; confirmed_by indica il percorso di liquidazione: courier_terminal, partner_api, door_close, timeout_door_closed o console.

Esempi di Payload
partner_locker.pickup.completed

Ritirato — Attivato quando il destinatario ha ritirato i pacchi depositati.

Esempi di Payload
partner_locker.delivery.failed

Consegna non riuscita — Attivato quando una consegna fallisce; sono inclusi i codici di errore per pacco.

Esempi di Payload
partner_locker.delivery.expired

Scaduto — Attivato quando un codice di consegna inutilizzato o un deposito non ritirato supera la scadenza.

Esempi di Payload
partner_locker.delivery.cancelled

Annullato — Attivato quando una consegna viene annullata prima del completamento.

Esempi di Payload
partner_locker.delivery.correction_reopened

Riapertura di correzione — Attivato quando gli scomparti occupati vengono riaperti entro la finestra di correzione per rimediare a un posizionamento errato — dallo schermo dell'armadietto o tramite API. Il blocco correction elenca gli scomparti riaperti. Ogni scomparto riporta anche pickup_locker_code: l'etichetta "{shelf_code}-{pickup_locker_number}" a cui viene indirizzato il destinatario; null quando lo scomparto non ha un numero di ritiro.

Esempi di Payload
partner_locker.delivery.code_rotated

partner_locker_delivery.event_type_code_rotated — Si attiva quando il partner rigenera il codice di consegna o il codice di ritiro di una consegna. Il blocco rotation indica quale codice è stato sostituito, quando, e se la notifica al destinatario è stata reinviata — il nuovo codice non viaggia mai in un webhook; viene rivelato solo nella risposta diretta dell'API di rigenerazione.

Esempi di Payload

Firma e Verifica: I webhook degli armadietti fornitore usano un proprio schema di firma: X-Webhook-Signature è base64(HMAC-SHA256(segreto, timestamp + "\n" + id consegna + "\n" + corpo grezzo)), dove timestamp e id consegna provengono dagli header X-Webhook-Timestamp e X-Webhook-Delivery-Id. Verifica anche X-Webhook-Content-Digest (SHA-256 del corpo) e rifiuta i timestamp obsoleti. X-Webhook-Id resta stabile tra i tentativi — usalo per l'idempotenza.

Come Configurare: Gli endpoint si gestiscono in Consegna di terzi → Armadietto fornitore → Impostazioni, un endpoint per fornitore, con un elenco di eventi selezionabile. Le consegne fallite vengono ritentate con backoff esponenziale fino a 7 volte prima della dead letter; gli eventi in dead letter possono essere reinviati manualmente dalla pagina eventi.

Eventi sandbox (armadietti simulati): Le consegne create su armadietti simulati emettono gli stessi eventi webhook della produzione, firmati con lo stesso segreto, così da poter sviluppare con traffico realistico. Gli eventi sandbox sono contrassegnati in tre modi: il payload contiene "livemode": false, l'event_id inizia con PLE-MOCK- e la richiesta include l'header X-Webhook-Test: 1. Se sull'endpoint è configurato un URL sandbox, gli eventi sandbox vengono inviati lì invece che all'URL di produzione; altrimenti ripiegano sull'URL di produzione, sempre contrassegnati. L'interruttore «Consegna eventi sandbox» ferma completamente la consegna sandbox.

Eventi di consegna di terzi

Webhook di consegna pacchi inviati ai fornitori di consegna di terzi (corrieri). Coprono il ciclo di vita delle assegnazioni di consegna, così il corriere non deve più interrogare la piattaforma in cerca di nuovi incarichi. Questa categoria è separata dagli eventi degli armadietti intelligenti qui sotto: ogni fornitore configura per categoria un endpoint, un segreto di firma e una sottoscrizione eventi indipendenti — nel proprio portale fornitore oppure tramite l'operatore della piattaforma.

delivery.assignment.created

Assegnazione creata — Si attiva quando un ordine viene assegnato al fornitore — da una regola automatica o manualmente. Il payload contiene il numero di assegnazione, gli identificativi dell'ordine e i numeri di tracciamento dei pacchi.

Esempi di Payload
delivery.assignment.handed_over

Pacchi affidati — Si attiva quando il magazzino ha consegnato fisicamente al fornitore tutti i pacchi dell'assegnazione.

Esempi di Payload
delivery.assignment.cancelled

Assegnazione annullata — Si attiva quando la piattaforma ritira un'assegnazione dal fornitore. Il campo reason distingue cancelled (l'assegnazione è stata annullata presso il vettore), fallback_to_self_delivery (la piattaforma ha ripreso l'ordine in consegna propria) e reassigned (l'ordine è stato spostato a un altro fornitore).

Esempi di Payload
delivery.assignment.partial_delivered

Consegna parziale — Si attiva quando una parte della spedizione è stata consegnata mentre altri colli sono ancora in corso. L'array packages riporta l'esito di ogni collo e legs elenca gli ordini esterni prenotati presso il corriere: uno per collo quando il corriere non accetta spedizioni multicollo.

Esempi di Payload

Firma e Verifica: I webhook di consegna di terzi usano lo stesso schema di firma dei webhook degli armadietti fornitore: X-Webhook-Signature è base64(HMAC-SHA256(secret, timestamp + "\n" + delivery id + "\n" + raw body)), dove timestamp e delivery id provengono dagli header X-Webhook-Timestamp e X-Webhook-Delivery-Id. Verifica anche X-Webhook-Content-Digest (SHA-256 del corpo) e rifiuta i timestamp obsoleti. X-Webhook-Id resta stabile tra i tentativi — usalo per l'idempotenza.

Come Configurare: I fornitori configurano questo endpoint autonomamente nel portale fornitore (Impostazioni webhook), oppure lo fa l'operatore della piattaforma in Consegna di terzi → Fornitori → Webhook. Un endpoint per fornitore con un elenco di eventi selezionabile. Il segreto di firma può essere generato automaticamente o impostato con un valore personalizzato, ed è consultabile nella pagina delle impostazioni. Le consegne fallite vengono ritentate con backoff esponenziale fino a 7 volte prima della dead letter; gli eventi in dead letter possono essere reinviati manualmente. Dalla pagina delle impostazioni è possibile inviare in qualsiasi momento un evento di test (mock) firmato: le richieste di test portano l'header X-Webhook-Test: 1 e contengono "test": true nei dati del payload.

Eventi del ciclo di vita dell'ordine

Eventi granulari e opzionali accanto al classico webhook order.status_change (che resta invariato): chi è stato assegnato, se l'autista ha accettato, quando il pacco è stato ritirato, è in viaggio, consegnato o fallito, oltre ai cambi di turno degli autisti e alle posizioni degli autisti a frequenza limitata. Non viene inviato nulla finché non configuri gli URL qui sotto.

order.assigned

Un autista è stato assegnato all'ordine (manualmente, dalla pianificazione dei giri o dall'assegnazione automatica). data.source = auto_assign quando lo ha fatto l'orchestratore.

Esempi di Payload
order.unassigned

L'ordine ha perso il suo autista (passaggio di consegne, revoca, rifiuto, timeout). data.previous_driver_id indica chi lo aveva.

Esempi di Payload
order.accepted

L'autista ha accettato nell'app un ordine assegnato automaticamente (turno autisti con accettazione obbligatoria).

Esempi di Payload
order.rejected

L'autista ha rifiutato un ordine assegnato; data.reason contiene il motivo opzionale in testo libero.

Esempi di Payload
order.pickup_started

L'autista ha avviato il ritiro (stato Ritiro iniziato / In Ritiro).

Esempi di Payload
order.picked_up

Il pacco è stato ritirato (stato Già ritirato).

Esempi di Payload
order.on_the_way

Il pacco è in viaggio verso il destinatario (stato Consegna iniziata / In Consegna).

Esempi di Payload
order.completed

La consegna è riuscita (stato Riuscito).

Esempi di Payload
order.failed

Il tentativo di consegna è fallito (Riconsegnare più tardi, Da riprogrammare, Rifiutato dal destinatario).

Esempi di Payload
order.cancelled

L'ordine è stato annullato.

Esempi di Payload
order.ready

Lo staff (o un autista, se consentito) ha contrassegnato l'ordine come pronto per il ritiro (Opzioni di dispatch → pronto per il ritiro).

Esempi di Payload
driver.on_duty_changed

Un autista è entrato o uscito dal turno nell'app (opzione turno autisti).

Esempi di Payload
driver.location_update

Una posizione dell'autista proveniente dall'app o dal tracker, limitata per autista da driver_location_min_interval_sec (predefinito 60 s). Inviata solo a driver_location_webhook_url.

Esempi di Payload

Come Configurare: Impostazioni → Webhook (oppure GET/PUT /api/v1/webhook-settings, GraphQL webhookSettingsUpdate): order_lifecycle_webhook_url riceve tutti gli eventi order.* e driver.on_duty_changed; order_lifecycle_events li restringe a un elenco separato da virgole; driver_location_webhook_url e driver_location_min_interval_sec controllano driver.location_update. È possibile indicare più URL separati da virgole. Le consegne compaiono nel registro delle consegne webhook con reference_type order / driver.

Firma e Verifica: Firmato esattamente come ogni altro webhook in uscita del tuo account: header Signature legacy più X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 con il tuo webhook_sign_secret. I nuovi tentativi riutilizzano lo stesso event_id: usalo per la deduplicazione.

Eventi degli ordini su dispositivo

Eventi facoltativi per i pacchi gestiti dai tuoi armadietti intelligenti, chioschi e smart drop: un pacco depositato in una macchina, ritirato, prelevato dal personale o oltre la scadenza di ritiro, e i problemi aperti o risolti su di esso. Solo aggiuntivo: nessun webhook esistente cambia e non viene inviato nulla finché non configuri device_order_webhook_url.

device_order.stored

Un pacco è stato depositato nella macchina e attende la persona successiva (destinatario, corriere o operatore, vedi data.device_order.next_actor). due_at è la scadenza di ritiro.

Esempi di Payload
device_order.collected

Il pacco è stato ritirato dalla persona che attendeva: il destinatario, il corriere o il personale che svuota uno smart drop.

Esempi di Payload
device_order.removed

Il personale ha prelevato il pacco dalla macchina. removal_reason indica il motivo: overdue_return, handover, relay, anomaly o recovery.

Esempi di Payload
device_order.overdue

Il pacco ha superato il suo due_at senza essere ritirato. È ancora nella macchina e il codice funziona ancora; overdue_at viene impostato e next_actor diventa operator.

Esempi di Payload
device_order.exception_opened

È stato aperto un problema sulla gestione (ad esempio door_left_open, deposit_unverified, item_missing, overdue). data.exception contiene id, type, severity e status.

Esempi di Payload
device_order.exception_resolved

Una persona ha chiuso un problema sulla gestione. data.exception.status è resolved o dismissed e resolution_action indica cosa è stato fatto.

Esempi di Payload

Esempi di Payload: 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 (orari in ISO 8601, null finché non raggiunti). Gli eventi di problema aggiungono data.exception: id, type, severity, status, resolution_action. Il codice di ritiro non è mai incluso. event_id è DOE-<id dell'evento del registro> e resta invariato nei tentativi successivi.

Come Configurare: Impostazioni → Webhooks (o GET/PUT /api/v1/webhook-settings): device_order_webhook_url riceve ogni evento device_order.*; device_order_events lo limita a un elenco separato da virgole. Più URL possono essere separati da virgole. Le consegne compaiono nel registro delle consegne webhook con reference_type device_order.

Firma e Verifica: Firmato esattamente come ogni altro webhook in uscita del tuo account: header Signature legacy più X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 con il tuo webhook_sign_secret. I nuovi tentativi riutilizzano lo stesso event_id: usalo per la deduplicazione.

I pacchi che un vettore partner consegna nei tuoi armadietti con il proprio account non vengono inviati su questo canale; il partner li riceve tramite i webhook degli armadietti del fornitore.

Come Configurare

Puoi configurare i webhook a due livelli: aziendale (copre tutto) o per cliente (sovrascrive per quel sotto-account B2B specifico).

1. Vai alle impostazioni

Accedi e vai in Impostazioni → API e Webhook. Le sovrascritture per cliente sono nella pagina di dettaglio del cliente.

2. Imposta il segreto di firma

Scegli una stringa di almeno 16 caratteri, idealmente 32+ byte casuali. Il ricevitore la userà per verificare le firme.

3. Imposta gli URL eventi desiderati

Compila solo gli URL degli eventi che ti interessano. Lascia gli altri vuoti.

webhook_sign_secretConfiguri un segreto condiviso nella pagina impostazioni. Ogni webhook uscente viene firmato con tale segreto. Il ricevitore ricalcola la firma e confronta — se coincidono, il payload è autentico e non manomesso.
order_create_webhook_urlSi attiva alla creazione di un ordine di consegna locale (Delivery / Pickup / P2P) tramite qualsiasi canale: form web, API REST/GraphQL, sincronizzazione piattaforma e-commerce, regole automatiche, righe importate, ecc. Esclude gli ordini label-service e altri tipi non di consegna. Saltato nel flusso batch quando lo stesso destinatario ha anche order_create_async_postback_url configurato. Configura con order_create_webhook_url.
order_status_change_webhook_urlSi attiva ad ogni transizione di stato — ritirato, in transito, consegnato, eccezione, annullato. Configura con order_status_change_webhook_url.
tracking_event_webhook_urlSi attiva ad ogni evento del ciclo di vita di un pacco (informazioni inviate, inizio consegna, consegna riuscita, non consegnato, ecc.). Configura con tracking_event_webhook_url. Gli eventi di consegna e di ritiro contengono anche la prova di consegna: proof_files e proof_files_detail (file_id, type, url, full_url, URL di download firmato). Le foto caricate dopo l’evento arrivano come pod.files_updated. Ogni file include anche il contesto del suo evento: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) e service_status (1 = success / 2 = failed); per i file storici senza evento registrato sono null.
order_create_async_postback_urlSi attiva una volta al termine dell'elaborazione di un'importazione batch. Il payload contiene l'array dei risultati per riga. Configura con order_create_async_postback_url.
pod_files_webhook_urlAttivato quando una foto di consegna o una firma viene aggiunta, sostituita o rimossa (action: added / updated / removed) — un invio per file, niente più polling degli allegati. Si attiva configurando pod_files_webhook_url. Ogni file include anche il contesto del suo evento: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) e service_status (1 = success / 2 = failed); per i file storici senza evento registrato sono null.
order_deleted_webhook_urlAttivato quando un ordine viene eliminato definitivamente, così il tuo sistema può replicare la rimozione. Si attiva configurando order_deleted_webhook_url.
order_cancel_failed_webhook_urlAttivato quando un tentativo di annullamento viene rifiutato (ad esempio l'ordine è già in consegna), così i tuoi processi operativi possono monitorare gli annullamenti falliti senza interrogare l'API. Si attiva configurando order_cancel_failed_webhook_url.
route_board_webhook_urlSi attiva quando un posto della bacheca percorsi cambia titolare o la bacheca cambia stato — il campo action indica cosa è successo (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Solo a livello aziendale. Iscrizione tramite route_board_webhook_url.
device_order_webhook_urlEventi facoltativi per i pacchi gestiti dai tuoi armadietti intelligenti, chioschi e smart drop: un pacco depositato in una macchina, ritirato, prelevato dal personale o oltre la scadenza di ritiro, e i problemi aperti o risolti su di esso. Solo aggiuntivo: nessun webhook esistente cambia e non viene inviato nulla finché non configuri device_order_webhook_url.
Guida agli aggiornamenti di integrazione

Tutte le novità di API e webhook — annullamento idempotente, feed di riconciliazione, firme v2, nuovi eventi — con esempi pronti da copiare. Tutto pienamente retrocompatibile.

Firma e Verifica

Ogni webhook uscente porta una firma HMAC-SHA256 codificata in esadecimale nell'header. Il ricevitore deve ricalcolarla sul body grezzo con il segreto condiviso e rifiutare la richiesta se non corrisponde.

Algoritmo
HMAC-SHA256 (hex)
Nome header
Signature
Passi di verifica
  1. Leggi il body grezzo prima che parsing o middleware lo modifichino.
  2. Calcola hash_hmac('sha256', rawBody, sharedSecret) e codifica in esadecimale.
  3. Confronta con l'header Signature a tempo costante (hash_equals in PHP, crypto.timingSafeEqual in Node).
  4. Rispondi 2xx solo se le firme coincidono. Altrimenti 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

Tentativi e Affidabilità

L'endpoint dovrebbe rispondere rapidamente con 2xx. Altrimenti, in caso di timeout o irraggiungibilità, la consegna viene riprovata.

Tentativi massimi
5 (iniziale + 4 retry)
Timeout per tentativo
3 secondi
Backoff
Esponenziale — circa 10s, 100s, 1000s, 10000s
Progetta per l'idempotenza. Poiché una consegna può essere ritentata, il ricevitore può vedere lo stesso evento più volte. Usa l'ID ordine/tracking come chiave di deduplica — conserva gli ID elaborati almeno 24 ore.
Risposta consigliata. Conferma rapidamente (HTTP 200) ed elabora in modo asincrono. Evita operazioni lente in modo sincrono nel handler — incontrerai il timeout di 3 secondi.

Verificatore di Firma

Incolla un payload ricevuto, il valore dell'header Signature e il tuo segreto — lo strumento ricalcola la firma nel browser (nulla esce da questa pagina) e ti dice se coincide.

Invia Webhook di Test

Spara un webhook reale e firmato correttamente dal nostro server a un URL che fornisci. Usalo per verificare raggiungibilità del ricevitore, parsing del payload e logica di verifica firma.

Consegne Webhook Recenti

Vedi i tentativi di consegna webhook più recenti del tuo account — eventi reali di produzione e test inviati da questa pagina. Incolla il Bearer token per caricare.

Tempo Evento URL Stato HTTP Tentativo Tempo (ms) Prova? Azioni
Nessuna consegna webhook trovata.

Best Practice