Skip to main content
Tato stránka popisuje mechaniku doručování webhooků — jak dlouho SmsManager čeká na odpověď vašeho serveru, co považuje za úspěch, jak volání opakuje, jak ověřit pravost požadavku přes podpis a jak si sestavit vlastní formát požadavku. Nastavení callback URL, formát payloadu a typy událostí najdete v návodu Webhooky.

Doručení a očekávaná odpověď

Když nastane událost, SmsManager pošle na vaši callback URL HTTP požadavek a čeká na odpověď nejvýše 5 sekund. Pokud váš server do této doby neodpoví, pokus je považován za neúspěšný a zařazen k opakování.
  • Za úspěch se považuje pouze stavový kód 2xx (200–299). Tělo odpovědi se vůbec nečte — rozhoduje jen stavový kód. Nemusíte tedy vracet žádný konkrétní obsah.
  • Přesměrování (3xx) se nenásleduje a počítá se jako neúspěch. Uvádějte proto přímo finální URL.
Odpovězte 200 OK co nejdříve a payload zpracujte až následně (asynchronně, například přes frontu). Držíte tím dobu odezvy pod limitem 5 s a předejdete zbytečnému opakování. Další doporučení najdete v sekci Osvědčené postupy návodu.

Opakování při selhání

Pokud pokus selže, SmsManager doručení zopakuje. Opakování se spustí v těchto případech:
  • server neodpověděl (vypršel časový limit) nebo se spojení nezdařilo,
  • odpověď byla přesměrování (3xx),
  • stav 408 Request Timeout nebo 429 Too Many Requests,
  • jakýkoli stav 5xx,
  • ostatní stavy 4xx.
Zpráva je doručena nejvýše 5× (první pokus a až 4 opakování). Mezi pokusy roste prodleva (exponenciální backoff). Po pátém neúspěšném pokusu se událost zahodí.
Kvůli opakování musí být váš handler idempotentní — stejná událost může dorazit vícekrát. K deduplikaci na úrovni HTTP požadavku použijte hlavičku X-Request-Id (viz níže), na úrovni jednotlivé události pak kombinaci message_id + result (viz poznámka o idempotenci v návodu).

Hlavička X-Request-Id

Každý webhook požadavek nese hlavičku X-Request-Id — identifikátor ve formátu UUID odvozený ze sady zpráv, které jsou v daném doručení spojeny. Vzniká jako sha256 ze seřazených ID zpráv, z něhož se prvních 32 hex znaků přeformátuje do tvaru UUID.
  • Je stabilní napříč opakováními téhož doručení a nezávisí na pořadí zpráv — díky tomu jej lze použít jako klíč pro deduplikaci na úrovni HTTP požadavku.
  • Jde o systémovou hlavičku, kterou nelze přepsat vlastní hodnotou (viz vlastní formát níže).

Podpis požadavku (X-Request-Signature)

Pokud je pro API klíč nastaveno podpisové tajemství (viz callback_secret níže), přidá SmsManager ke každému požadavku (kromě GET) hlavičku X-Request-Signature. Její hodnota je HMAC‑SHA256 z přesného těla požadavku, zakódovaná v hexadecimální podobě, kde klíčem je vaše tajemství:
Pravost ověříte tak, že si stejný podpis spočítáte nad surovým tělem požadavku přesně tak, jak dorazilo (před parsováním JSON) a porovnáte jej v konstantním čase s přijatou hlavičkou:
Ověření podpisu (Node.js)
Podpis počítejte vždy nad surovými bajty těla, které jste přijali — nikoli nad výsledkem, který získáte po deserializaci a opětovné serializaci JSON. Přeuspořádání klíčů nebo změna mezer by změnily vstup HMAC a podpis by neseděl.
Požadavky metodou GET nejsou podepsané (nemají tělo). Pokud pro klíč není nastavené tajemství, hlavička X-Request-Signature se vůbec nepřidává.

Nastavení podpisového tajemství (callback_secret)

Podpisové tajemství nastavíte jako pole default_callback_secret na API klíči přes SmsManager REST API — stejným způsobem jako výchozí callback URL:
Nastavit podpisové tajemství
Jakmile je tajemství nastavené, jsou všechny webhooky odeslané tímto API klíčem podepsané hlavičkou X-Request-Signature. Tajemství nemá žádnou výchozí hodnotu — dokud jej nenastavíte, požadavky se nepodepisují. Uchovávejte jej v tajnosti; rotaci provedete opětovným voláním apikey/update s novou hodnotou.

Vlastní formát webhooku

Ve výchozím stavu SmsManager posílá POST s polem objektů událostí (viz formát payloadu). Pokud potřebujete jiný tvar požadavku — vlastní obálku, hlavičky, metodu nebo formát — nastavte pole callback jako objekt místo textové URL. Tuto definici SmsManager zvaliduje a použije k sestavení každého požadavku.

Šablony a proměnné

Hodnoty v šablonách item a body mohou obsahovat zástupné symboly ve tvaru [[cesta]] (dvojité hranaté závorky). Cesta podporuje tečkovou i indexovou notaci, např. [[message_id]], [[to.phone_number]], [[payload.order_id]].
  • Celá hodnota je jeden zástupný symbol ("id": "[[message_id]]") → dosadí se v původním datovém typu (řetězec, číslo, objekt, pole, null).
  • Symbol uvnitř textu ("msg": "ID: [[message_id]]") → hodnota se převede na řetězec a vloží do textu.
  • Únik: [[!cesta]] vypíše doslovně [[cesta]].
  • Klíče objektů se nešablonují — nahrazují se pouze hodnoty. Neznámá proměnná zůstane v textu beze změny.
Dostupné proměnné odpovídají poli události: message_id, request_id, phone_number (nebo to.phone_number), result, timestamp, gateway, type a payload (včetně vnořených cest jako payload.order_id).

Sestavení těla (item / body)

Kombinace polí item a body určuje výsledný tvar požadavku:

Příklady

Vlastní JSON obálka s hlavičkou Authorization — každá událost se vykreslí přes item a pole se vloží do body:
Vlastní obálka (item + body)
Pro dvě události pošle SmsManager tělo {"commands":[ {…MID1…}, {…MID2…} ]}. Formát application/x-www-form-urlencoded:
Form-urlencoded
Metoda GET — vykreslená hodnota se připojí jako query řetězec:
GET s query parametry

Omezení

  • Celá definice callback musí serializovat do max. 8192 bajtů; výsledné vykreslené tělo do max. 1 MiB.
  • U metody GET se vykreslená hodnota vloží do query řetězce — bez těla, bez hlavičky Content-Type a bez podpisu; batch_size je 1.
  • Systémové hlavičky User-Agent a X-Request-Id (vždy) a X-Request-Signature (je‑li nastavené tajemství, mimo GET) se přidávají automaticky. X-Request-Id má vždy přednost před vlastní hlavičkou stejného jména.

Další kroky

Webhooky

Nastavení callback URL, formát payloadu, typy událostí a sekvence stavů.

Reference webhooků

Kompletní reference polí pro všechny tři webhook události.

message_id a request_id

Jak se skládají identifikátory, které webhooky a X-Request-Id používají.

Příjem požadavku

Proč 200 OK znamená jen přijetí ke zpracování a kdy dorazí doručenky.