Webhooky umožňují, aby Time Slot Control sám odeslal HTTP požadavek do vašeho systému ve chvíli, kdy nastane zvolená událost, například vytvoření, změna, přesun nebo smazání rezervace. Váš systém tak nemusí neustále kontrolovat změny přes API.
Webhook obsahuje identifikátor rezervace a základní stavové údaje. Kompletní detail rezervace (čas slotu, rampa, dopravce, typ vozidla…) si po přijetí webhooku stáhněte přes GET /v3/{tenant}/Reservations/{id} (viz Čtení rezervací).
Doporučujeme kombinovat webhooky s pravidelným stahováním změn přes API. Při dlouhodobé nedostupnosti vašeho serveru tak nepřijdete o žádnou změnu.
webhook.test). Pomocí náhledu payloadu zobrazíte ukázku těla požadavku pro zvolenou událost.reservation.created – rezervace vytvořenareservation.updated – rezervace změněnareservation.deleted – rezervace smazánareservation.deleted.recurrence – smazána opakovaná rezervacereservation.moved – rezervace přesunuta v plánu (např. na jinou rampu)reservation.resized – změněna délka slotureservation.branchoffice.changed – změněna pobočkaPro synchronizaci rezervací do externího systému doporučujeme odebírat minimálně
reservation.created,reservation.updated,reservation.moved,reservation.resizedareservation.deleted.
reservation.markedasarrival – vozidlo označeno jako přijeloreservation.markedasdeparted – vozidlo označeno jako odjeloreservation.processingstarted – zahájeno zpracováníreservation.processingcompleted – ukončeno zpracováníreservation.delivered – doručenoreservation.pending – čeká na zpracováníreservation.carrier.notarrived – dopravce nepřijelreservation.action.notcompleted – požadovaná akce nebyla dokončenareservation.delivery.urgent – urgentní dodávkareservation.customaction.updated – změna vlastní akcereservation.actiondialog.updated – změna v akčním dialogureservation.approval.approved / reservation.approval.rejected – rezervace schválena / zamítnutareservation.ipp.approval.pending / .approved / .rejected – stav schválení IPPreservation.vehicle.platechanged – změna registrační značkyreservation.carrier.contactchanged – změna kontaktu dopravcereservation.driver.changed – změna řidičereservation.carrier.detailschanged – změna údajů dopravcereservation.note.updated – změna poznámkyorder.created, order.updated, order.deletedorder.confirmed, order.confirmation.canceledwebhook.test – testovací událost odeslaná z administraceKaždý webhook je odeslán jako POST s hlavičkou Content-Type: application/json. Tělo má tento tvar:
{
"schemaVersion": "1.0",
"eventId": "6a1f0c2e-8d3b-4f7a-9c1e-2b5d7e9f0a11",
"event": "reservation.updated",
"tenantId": "0f4e2c1a-...",
"occurredAt": "2026-10-06T08:15:42.123Z",
"data": {
"id": "3f6c2a1e-...",
"deliveryDateUtc": "2026-10-06T06:00:00Z",
"realGateVehicleArrivalUtc": "2026-10-06T05:52:10Z"
}
}
eventId
event
occurredAt
data.id
order.*).data.*
approvalStatus a ippApprovalStatus (číselný kód stavu), carrierNotArrived, deliveryDateUtc, realGateVehicleArrivalUtc, realGateVehicleDepartureUtc. Pole bez hodnoty se neposílají.Payload neobsahuje čas slotu, rampu, dopravce ani typ vozidla. Po přijetí webhooku načtěte detail přes
GET /v3/{tenant}/Reservations/{data.id}. U událostireservation.deleteduž detail dostupný není.
Každý požadavek je podepsán pomocí HMAC-SHA256 tajným klíčem odběru. Podpis se posílá vždy, i když je navíc nastavena autentizace (Basic, Bearer, OAuth2).
X-TSC-Timestamp
X-TSC-Signature
sha256= + hex (malá písmena) HMAC-SHA256 z řetězce {timestamp}.{tělo požadavku}.Postup ověření:
X-TSC-Timestamp a surové tělo požadavku (přesně tak, jak přišlo, bez přeformátování JSON).HMAC-SHA256(secret, timestamp + "." + body) a převeďte na hex malými písmeny.sha256= v hlavičce X-TSC-Signature, ideálně porovnáním v konstantním čase.Příklad (C#):
using System.Security.Cryptography;
using System.Text;
static bool VerifyTscSignature(string secret, string timestamp, string body, string signatureHeader)
{
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(timestamp + "." + body));
var expected = "sha256=" + Convert.ToHexString(hash).ToLowerInvariant();
return CryptographicOperations.FixedTimeEquals(
Encoding.ASCII.GetBytes(expected),
Encoding.ASCII.GetBytes(signatureHeader ?? ""));
}
Příklad (Node.js):
const crypto = require('crypto');
function verifyTscSignature(secret, timestamp, rawBody, signatureHeader) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`, 'utf8')
.digest('hex');
const a = Buffer.from(expected);
const b = Buffer.from(signatureHeader || '');
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
429 Too Many Requests) se považuje za trvalou chybu a neopakuje se.Stejná událost může dorazit víckrát, například po opakovaném pokusu. Zpracovávejte webhooky idempotentně podle
eventId. Pořadí doručení není garantováno. Rozhodující jeoccurredAt, případně aktuální stav rezervace načtený přes API.
Doporučení pro přijímající endpoint:
200 OK co nejdříve a samotné zpracování (např. stažení detailu přes API) proveďte asynchronně.