Přijímejte události v reálném čase od Superroute — objednávky, změny stavu, aktualizace sledování. S podepsanými payload, automatickými opakováními a vestavěným debuggerem.
Webhook je HTTP POST požadavek, který Superroute pošle na vámi nakonfigurovanou URL pokaždé, když se něco stane — vytvoří se objednávka, dokončí doručení, zaznamená událost sledování. Vy postavíte přijímací endpoint, my tam událost doručíme.
Jak doručování funguje
Události se řadí do fronty a posílají asynchronně. Každý požadavek nese podpis HMAC-SHA256 pro ověření původu. Neúspěšná doručení (ne 2xx nebo timeout) se opakují s exponenciálním backoffem až 5×.
Bezpečnostní model
Nakonfigurujete sdílené tajemství na stránce nastavení. Každý odchozí webhook se jím podepisuje. Příjemce přepočítá podpis a porovná — pokud se shodují, payload je pravý a nezměněný.
Katalog Událostí
K dispozici je osm typů odchozích událostí. Každý má vlastní URL pole na stránce nastavení — přihlaste se k libovolné podmnožině.
objednávka.vytvořený
Spustí se při vytvoření objednávky lokálního doručení (Delivery / Pickup / P2P) jakoukoli cestou: webový formulář, REST/GraphQL API, synchronizace e-commerce platformy, automatická pravidla, importované řádky atd. Vylučuje label-service a další nedoručovací typy objednávek. Přeskočeno v batch toku, pokud má stejný příjemce také nakonfigurovaný order_create_async_postback_url. Konfigurujte přes order_create_webhook_url.
Spustí se při každé události životního cyklu sledování balíku. Konfigurujte přes tracking_event_webhook_url. Události doručení a vyzvednutí nesou také doklad o doručení: proof_files a proof_files_detail (file_id, type, url, full_url, podepsaná URL ke stažení). Fotografie nahrané po události přicházejí jako pod.files_updated. Každý soubor nese také kontext své události: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) a service_status (1 = success / 2 = failed); u starých souborů bez zaznamenané události jsou null.
Příklady Payload
{
"id": 90001,
"order_id": 1001,
"order_ref": "REF-001",
"location_id": 12,
"location_name": "Toronto Depot",
"tracking_event_type": "D",
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"otep_status": "delivered",
"proof_files": [
"storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg"
],
"proof_files_detail": [
{
"file_id": 234567,
"type": 1,
"url": "storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"full_url": "https://api.superroute.ca/storage/2026-07-20/1001_S_Ab3kQ9xYzLm4Np.jpeg",
"signed_url": "https://api.superroute.ca/files/pod/234567?expires=1784748600&signature=8f2c1d...",
"signed_url_expires_at": 1784748600,
"tracking_event_id": 90001,
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"service_type": 1,
"service_status": 1
},
{
"file_id": 234568,
"type": 2,
"url": "storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg",
"full_url": "https://api.superroute.ca/storage/2026-07-20/1001_P_Cd7rT2wVuKe8Hs.jpeg",
"signed_url": "https://api.superroute.ca/files/pod/234568?expires=1784748600&signature=41ba90...",
"signed_url_expires_at": 1784748600,
"tracking_event_id": 90001,
"tracking_event_status_id": 500,
"tracking_event_key": "deliver_success",
"service_type": 1,
"service_status": 1
}
],
"description": {
"en": "Your parcel has been delivered successfully. Thank you!",
"fr": "Votre colis a été livré avec succès. Merci !",
"chs": "您的包裹已成功送达,感谢您的使用!",
"cht": "您的包裹已成功送達,感謝您的使用!",
"es": "Tu paquete ha sido entregado con éxito. ¡Gracias!",
"de": "Ihr Paket wurde erfolgreich zugestellt. Vielen Dank!",
"nl": "Uw pakket is succesvol afgeleverd, bedankt voor uw gebruik!",
"pt": "Seu pacote foi entregue com sucesso. Obrigado!",
"it": "Il tuo pacco è stato consegnato con successo. Grazie!",
"sr": "Vaš paket je uspešno dostavljen, hvala vam što koristite naše usluge!",
"hu": "Csomagja sikeresen kiszállításra került, köszönjük hogy használta szolgáltatásunkat!",
"pl": "Twoja paczka została dostarczona pomyślnie. Dziękujemy!",
"sk": "Váš balík bol úspešne doručený. Ďakujeme!",
"cs": "Váš balík byl úspěšně doručen. Děkujeme!"
},
"tracking_number": [
"SR000000001"
],
"external_tracking_number": [
"1Z999AA10123456784"
]
}
order.create_async
Spustí se jednou po dokončení dávkového importu. Payload obsahuje pole výsledků pro každý řádek. Konfigurujte přes order_create_async_postback_url.
Spustí se, když je fotografie doručení nebo podpis přidán, nahrazen či odstraněn (action: added / updated / removed) — jedno doručení na soubor, už žádné dotazování na přílohy. Aktivuje se nastavením pod_files_webhook_url. Každý soubor nese také kontext své události: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) a service_status (1 = success / 2 = failed); u starých souborů bez zaznamenané události jsou null.
Spustí se, když je pokus o zrušení zamítnut (například objednávka je již v doručování), aby vaše provozní procesy mohly sledovat neúspěšná zrušení bez dotazování API. Aktivuje se nastavením order_cancel_failed_webhook_url.
Příklady Payload
{
"result": false,
"code": "ORDER_ALREADY_IN_DELIVERY",
"message": "Order can no longer be cancelled at its current status",
"http_status": 409,
"submitted": {
"order_id": 1001,
"tracking_number": "SR000000001",
"external_tracking_number": null
}
}
Změna místa na nástěnce tras
Spustí se, kdykoli místo na nástěnce tras změní držitele nebo se změní stav nástěnky — pole action říká, co se stalo (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Pouze na úrovni firmy. Přihlášení přes route_board_webhook_url.
Samostatný webhookový kanál pro externí doručovací poskytovately integrované s chytrými boxy. Události se doručují na koncový bod nastavený pro váš poskytovatelský účet a každý koncový bod se může přihlásit k libovolné podmnožině typů událostí.
partner_locker.delivery.doors_opened
Dvířka Otevřena — Spouští se v okamžiku otevření dvířek přihrádek při pokusu o doručení — ať už kurýr zadal přístupový kód na obrazovce boxu, nebo použil API vzdáleného otevření — včetně opětovných otevření po přeřazení. Blok opening uvádí každou otevřenou přihrádku s grid_id, hardwarovým číslem dvířek compartment_number a pickup_locker_number (pořadové zobrazovací číslo počítané shora dolů v každém sloupci a poté zleva doprava). Každá přihrádka nese i pickup_locker_code — označení "{shelf_code}-{pickup_locker_number}", ke kterému je příjemce nasměrován; null, pokud přihrádka nemá číslo vyzvednutí. Obsah zprávy zahrnuje také pickup_code — kód pro vyzvednutí určený příjemci, přidělený v okamžiku otevření dvířek; po potvrzení vložení kurýrem zůstává stejným kódem a k vyzvednutí jej lze použít až po tomto potvrzení.
Doručeno do boxu — Spustí se, když je uložení potvrzeno a balíky jsou v boxu. Obsah zahrnuje kód pro vyzvednutí příjemcem. Každá přihrádka nese i pickup_locker_code — označení "{shelf_code}-{pickup_locker_number}", ke kterému je příjemce nasměrován; null, pokud přihrádka nemá číslo vyzvednutí. U dvířek otevřených přes API dálkového otevírání platforma uložení uzavře sama, jakmile box nahlásí zavření všech otevřených dvířek, takže událost se spustí i bez volání confirm; confirmed_by označuje cestu uzavření: courier_terminal, partner_api, door_close, timeout_door_closed nebo console.
Opravné otevření — Spustí se, když se obsazené schránky znovu otevřou v rámci opravného okna k nápravě chybného uložení — z obrazovky boxu nebo přes API. Blok correction uvádí znovu otevřené schránky. Každá přihrádka nese i pickup_locker_code — označení "{shelf_code}-{pickup_locker_number}", ke kterému je příjemce nasměrován; null, pokud přihrádka nemá číslo vyzvednutí.
partner_locker_delivery.event_type_code_rotated — Spouští se, když partner vymění doručovací nebo vyzvedávací kód doručení. Blok rotation uvádí, který kód byl nahrazen, kdy a zda bylo znovu odesláno upozornění příjemci — nový kód nikdy necestuje webhookem; odhalí se pouze v přímé odpovědi API na výměnu.
Podpis a Ověření: Webhooky poskytovatelských boxů používají vlastní schéma podepisování: X-Webhook-Signature je base64(HMAC-SHA256(tajemství, časové razítko + "\n" + id doručení + "\n" + surové tělo)), přičemž časové razítko a id doručení pocházejí z hlaviček X-Webhook-Timestamp a X-Webhook-Delivery-Id. Ověřte také X-Webhook-Content-Digest (SHA-256 těla) a odmítejte zastaralá časová razítka. X-Webhook-Id zůstává stabilní napříč opakováními — použijte ho pro idempotenci.
Jak Konfigurovat: Koncové body se spravují v části Doručování třetích stran → Poskytovatelský box → Nastavení, jeden koncový bod na poskytovatele, s volitelným seznamem událostí. Neúspěšná doručení se opakují s exponenciálním odstupem až 7krát, než skončí v mrtvé schránce; události z mrtvé schránky lze ručně znovu odeslat ze stránky událostí.
Sandbox události (testovací skříňky): Doručení vytvořená na testovacích skříňkách emitují stejné webhook události jako produkce, podepsané stejným tajemstvím, takže můžete vyvíjet s realistickým provozem. Sandbox události jsou označeny třemi způsoby: obsah nese "livemode": false, event_id začíná předponou PLE-MOCK- a požadavek obsahuje hlavičku X-Webhook-Test: 1. Pokud je na koncovém bodě nastavena sandbox adresa, sandbox události směřují tam místo produkční adresy; jinak se vrátí na produkční adresu, stále označené. Přepínač „Doručovat sandbox události" zcela zastaví sandbox doručování.
Události doručování třetích stran
Webhooky doručování balíků odesílané externím poskytovatelům doručování (kurýrům). Pokrývají životní cyklus přidělení doručení, takže kurýr už nemusí nové úkoly zjišťovat dotazováním. Tato kategorie je oddělená od událostí Smart Locker níže: každý poskytovatel konfiguruje nezávislý koncový bod, podpisový tajný klíč a odběr událostí pro každou kategorii — ve vlastním portálu nebo prostřednictvím operátora platformy.
delivery.assignment.created
Přidělení vytvořeno — Spustí se, když je objednávka přidělena poskytovateli — automatickým pravidlem nebo ručně. Payload obsahuje číslo přidělení, identifikátory objednávky a sledovací čísla balíků.
Přidělení zrušeno — Spustí se, když platforma stáhne přidělení od poskytovatele. Pole reason rozlišuje: cancelled (přidělení bylo zrušeno u dopravce), fallback_to_self_delivery (platforma převzala objednávku zpět do vlastního doručování) a reassigned (objednávka byla přesunuta k jinému poskytovateli).
Částečné doručení — Spustí se, když byla část zásilky doručena, zatímco ostatní balíky jsou stále na cestě. Pole packages obsahuje výsledek každého balíku a legs uvádí externí objednávky zadané u dopravce — po jedné na balík, pokud dopravce nepřijímá vícekusové zásilky.
Podpis a Ověření: Webhooky doručování třetích stran používají stejné schéma podepisování jako webhooky poskytovatelských boxů: X-Webhook-Signature je base64(HMAC-SHA256(secret, timestamp + "\n" + delivery id + "\n" + raw body)), přičemž timestamp a delivery id pocházejí z hlaviček X-Webhook-Timestamp a X-Webhook-Delivery-Id. Ověřte také X-Webhook-Content-Digest (SHA-256 těla) a odmítejte zastaralá časová razítka. X-Webhook-Id zůstává stabilní napříč opakováními — použijte jej pro idempotenci.
Jak Konfigurovat: Poskytovatelé si tento koncový bod konfigurují sami v portálu poskytovatele (Nastavení webhooků), nebo tak učiní operátor platformy v části Doručování třetích stran → Poskytovatelé → Webhooks. Jeden koncový bod na poskytovatele s volitelným seznamem událostí. Podpisový tajný klíč lze vygenerovat automaticky nebo nastavit na vlastní hodnotu a je k nahlédnutí na stránce nastavení. Neúspěšná doručení se opakují s exponenciálním odstupem až 7krát, než skončí v mrtvé schránce; události z mrtvé schránky lze opakovat ručně. Ze stránky nastavení lze kdykoli odeslat podepsanou testovací (mock) událost — testovací požadavky nesou hlavičku X-Webhook-Test: 1 a obsahují "test": true v datech payloadu.
Události životního cyklu objednávky
Podrobné, volitelné události vedle klasického webhooku order.status_change (který zůstává beze změny): kdo byl přiřazen, zda řidič přijal, kdy byl balík vyzvednut, na cestě, doručen nebo neúspěšný, plus změny služby řidičů a frekvenčně omezené polohy řidičů. Nic se neodesílá, dokud nenastavíte URL adresy níže.
order.assigned
K objednávce byl přiřazen řidič (ručně, plánováním tras nebo automatickým přiřazením). data.source = auto_assign, když to provedl orchestrátor.
Poloha řidiče z aplikace nebo trackeru, omezená na řidiče pomocí driver_location_min_interval_sec (výchozí 60 s). Odesílá se pouze na driver_location_webhook_url.
Jak Konfigurovat: Nastavení → Webhooky (nebo GET/PUT /api/v1/webhook-settings, GraphQL webhookSettingsUpdate): order_lifecycle_webhook_url přijímá každou událost order.* a driver.on_duty_changed; order_lifecycle_events to zužuje na seznam oddělený čárkami; driver_location_webhook_url a driver_location_min_interval_sec řídí driver.location_update. Více URL adres lze oddělit čárkami. Doručení se zobrazují v protokolu doručení webhooků s reference_type order / driver.
Podpis a Ověření: Podepsáno přesně jako každý jiný odchozí webhook vašeho účtu: původní hlavička Signature plus X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 s vaším webhook_sign_secret. Opakované pokusy používají stejné event_id – deduplikujte podle něj.
Události objednávek v zařízeních
Volitelné události pro zásilky zpracované vašimi chytrými schránkami, kiosky a smart drop boxy: zásilka uložená do zařízení, vyzvednutá, vyjmutá personálem nebo po termínu vyzvednutí a také problémy otevřené nebo vyřešené v souvislosti s ní. Pouze rozšíření — žádný stávající webhook se nemění a nic se neodešle, dokud nenastavíte device_order_webhook_url.
device_order.stored
Zásilka byla vložena do zařízení a čeká na další osobu (příjemce, kurýra nebo provozovatele, viz data.device_order.next_actor). due_at je termín vyzvednutí.
Ke zpracování byl otevřen problém (například door_left_open, deposit_unverified, item_missing, overdue). data.exception obsahuje id, type, severity a status.
Příklady 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 (časy ve formátu ISO 8601, null, dokud nenastanou). Události problémů přidávají data.exception: id, type, severity, status, resolution_action. Kód pro vyzvednutí se nikdy neuvádí. event_id má tvar DOE-<id události registru> a při opakovaných pokusech se nemění.
Jak Konfigurovat: Nastavení → Webhooky (nebo GET/PUT /api/v1/webhook-settings): device_order_webhook_url přijímá každou událost device_order.*; device_order_events ji zužuje na seznam oddělený čárkami. Více URL adres lze oddělit čárkami. Doručení se zobrazují v protokolu doručení webhooků s reference_type device_order.
Podpis a Ověření: Podepsáno přesně jako každý jiný odchozí webhook vašeho účtu: původní hlavička Signature plus X-Webhook-Id / X-Webhook-Timestamp / X-Webhook-Signature-V2 s vaším webhook_sign_secret. Opakované pokusy používají stejné event_id – deduplikujte podle něj.
Zásilky, které partnerský dopravce doručí do vašich schránek pod vlastním účtem, se tímto kanálem neodesílají; partner je dostává přes vlastní webhooky schránek poskytovatele.
Jak Konfigurovat
Webhooky můžete konfigurovat na dvou úrovních: na úrovni firmy (zahrnuje vše) nebo na úrovni zákazníka (přepisuje pro daný B2B podúčet).
1. Přejděte do nastavení
Přihlaste se a přejděte do Nastavení → API a Webhooky. Přepisy na úrovni zákazníka jsou na stránce detailu zákazníka.
2. Nastavte tajemství podpisu
Zvolte řetězec alespoň 16 znaků, ideálně 32+ náhodných bajtů. Příjemce ho použije k ověření podpisů.
3. Nastavte požadované URL událostí
Vyplňte pouze URL událostí, které vás zajímají. Ostatní nechte prázdné.
webhook_sign_secretNakonfigurujete sdílené tajemství na stránce nastavení. Každý odchozí webhook se jím podepisuje. Příjemce přepočítá podpis a porovná — pokud se shodují, payload je pravý a nezměněný.
order_create_webhook_urlSpustí se při vytvoření objednávky lokálního doručení (Delivery / Pickup / P2P) jakoukoli cestou: webový formulář, REST/GraphQL API, synchronizace e-commerce platformy, automatická pravidla, importované řádky atd. Vylučuje label-service a další nedoručovací typy objednávek. Přeskočeno v batch toku, pokud má stejný příjemce také nakonfigurovaný order_create_async_postback_url. Konfigurujte přes order_create_webhook_url.
order_status_change_webhook_urlSpustí se při každé změně stavu — vyzvednuto, v tranzitu, doručeno, výjimka, zrušeno. Konfigurujte přes order_status_change_webhook_url.
tracking_event_webhook_urlSpustí se při každé události životního cyklu sledování balíku. Konfigurujte přes tracking_event_webhook_url. Události doručení a vyzvednutí nesou také doklad o doručení: proof_files a proof_files_detail (file_id, type, url, full_url, podepsaná URL ke stažení). Fotografie nahrané po události přicházejí jako pod.files_updated. Každý soubor nese také kontext své události: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) a service_status (1 = success / 2 = failed); u starých souborů bez zaznamenané události jsou null.
order_create_async_postback_urlSpustí se jednou po dokončení dávkového importu. Payload obsahuje pole výsledků pro každý řádek. Konfigurujte přes order_create_async_postback_url.
pod_files_webhook_urlSpustí se, když je fotografie doručení nebo podpis přidán, nahrazen či odstraněn (action: added / updated / removed) — jedno doručení na soubor, už žádné dotazování na přílohy. Aktivuje se nastavením pod_files_webhook_url. Každý soubor nese také kontext své události: tracking_event_id, tracking_event_status_id, tracking_event_key, service_type (1 = delivery / 2 = pickup) a service_status (1 = success / 2 = failed); u starých souborů bez zaznamenané události jsou null.
order_deleted_webhook_urlSpustí se při trvalém odstranění objednávky, aby ji váš systém mohl zrcadlit. Aktivuje se nastavením order_deleted_webhook_url.
order_cancel_failed_webhook_urlSpustí se, když je pokus o zrušení zamítnut (například objednávka je již v doručování), aby vaše provozní procesy mohly sledovat neúspěšná zrušení bez dotazování API. Aktivuje se nastavením order_cancel_failed_webhook_url.
route_board_webhook_urlSpustí se, kdykoli místo na nástěnce tras změní držitele nebo se změní stav nástěnky — pole action říká, co se stalo (claimed, standby, pooled, promoted, withdrawn, vetoed, replaced, assigned, awarded, lost, displaced, settled, board_opened, board_closed, board_cancelled). Pouze na úrovni firmy. Přihlášení přes route_board_webhook_url.
device_order_webhook_urlVolitelné události pro zásilky zpracované vašimi chytrými schránkami, kiosky a smart drop boxy: zásilka uložená do zařízení, vyzvednutá, vyjmutá personálem nebo po termínu vyzvednutí a také problémy otevřené nebo vyřešené v souvislosti s ní. Pouze rozšíření — žádný stávající webhook se nemění a nic se neodešle, dokud nenastavíte device_order_webhook_url.
Každý odchozí webhook nese hex-kódovaný podpis HMAC-SHA256 v hlavičce. Příjemce musí znovu vypočítat podpis nad surovým tělem se sdíleným tajemstvím a odmítnout požadavek, pokud se neshoduje.
Algoritmus
HMAC-SHA256 (hex)
Název hlavičky
Signature
Kroky ověření
Přečtěte surové tělo dříve, než ho parsing nebo middleware upraví.
Vypočítejte hash_hmac('sha256', rawBody, sharedSecret) a kódujte v hex.
Porovnejte s hlavičkou Signature v konstantním čase (hash_equals v PHP, crypto.timingSafeEqual v Node).
Odpovězte 2xx pouze pokud se podpisy shodují. Jinak 401.
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
Opakování a Spolehlivost
Váš endpoint by měl rychle odpovědět 2xx. Jinak, při timeoutu nebo nedostupnosti, se doručení opakuje.
Max. pokusů
5 (počáteční + 4 opakování)
Timeout na pokus
3 sekundy
Ústup
Exponenciální — cca 10s, 100s, 1000s, 10000s
Stavte na idempotenci. Protože se doručení může opakovat, příjemce může vidět stejnou událost vícekrát. Použijte ID objednávky/sledování jako klíč pro deduplikaci — uchovávejte zpracovaná ID alespoň 24 hodin.
Doporučená odpověď. Rychle potvrďte (HTTP 200) a zpracujte asynchronně. Vyhněte se pomalým operacím synchronně v handleru — narazíte na 3sekundový timeout.
Ověřovač Podpisu
Vložte přijatý payload, hodnotu hlavičky Signature a vaše tajemství — nástroj přepočítá podpis v prohlížeči (nic neopustí tuto stránku) a oznámí, zda se shodují.
Odeslat Testovací Webhook
Spusťte skutečný, správně podepsaný webhook z našeho serveru na URL, kterou zadáte. Užitečné pro testování dostupnosti příjemce, parsování payload a logiky ověření podpisu.
Poslední Doručení Webhook
Zobrazte si nejnovější pokusy o doručení webhook na vašem účtu — produkční události i testy z této stránky. Vložte Bearer token pro načtení.
Čas
Událost
URL
Stav
HTTP
Pokus
Čas (ms)
Testovat?
Akce
Zatím žádná doručení webhook.
Nejlepší Praxe
Rychle potvrďte (HTTP 200) a zpracujte asynchronně, abyste se vešli pod 3sekundový timeout.
Vždy ověřte podpis dříve, než budete důvěřovat payloadu.
Zpracovávejte události jako at-least-once — deduplikujte podle čísla objednávky/sledování.
Používejte HTTPS endpointy s platným certifikátem.
Logujte příchozí požadavky, abyste je mohli přehrát při chybě v handleru.