Skip to main content
Fintoro API podporuje odchádzajúce webhooky pre integrácie riadené udalosťami. Ak potrebujete na zmeny reagovať priebežne a držať externý systém zosynchronizovaný s čo najmenším oneskorením, webhooky sú správny mechanizmus. Fintoro Vám odošle HTTP POST request vždy, keď nastane vybraná obchodná udalosť. Webhooky v Fintoro API sú navrhnuté ako tenký trigger, nie ako paralelný snapshot API. Payload doručenia vždy obsahuje len identitu udalosti, jej typ a odkaz na resource cez resource.type + resource.id. Detail si následne dotiahnete z Fintoro API vo verzii, ktorú používa Vaša integrácia.

Kedy webhooky použiť

  • keď potrebujete reagovať na vytvorenie, úpravu alebo zmazanie bez toho, aby ste stav zmien stavali na periodickom dotazovaní,
  • keď si chcete lokálnu cache alebo downstream systém synchronizovať len pri reálnej zmene,
  • keď potrebujete oddeliť prijatie udalosti od následného načítania detailu resource-u.
Odporúčaný model je: webhook prijmete, overíte podpis, uložíte webhook-id na deduplikáciu a až potom si načítate detail resource-u z Fintoro API. Periodické dotazovanie nechajte len ako backfill alebo kontrolný fallback, nie ako primárny trigger zmien.

Správa odberov

Odbery webhookov spravujete priamo cez Fintoro API. Secret v otvorenej podobe sa zobrazí iba pri vytvorení odberu alebo pri jeho manuálnej rotácii. Presný CRUD kontrakt, request schémy a response payloady nájdete priamo v Webhook API referencii. Prakticky to znamená:
  • hodnotu plainTextSecret si musíte bezpečne uložiť pri create alebo rotate odpovedi,
  • zmena url ani subscribedEvents secret automaticky nerotuje,
  • isActive = false historické záznamy nevypína, len zastaví nové pokusy o doručenie.

Požiadavky na endpoint

Pri ukladaní alebo update odberu nestačí, aby url bola len syntakticky validná HTTPS adresa. Fintoro endpoint overuje prísnejšie:
  • url musí používať https://,
  • url nesmie obsahovať používateľské meno ani heslo,
  • hostname sa musí resolvnuť na verejnú IP adresu,
  • localhost, .local, privátne rozsahy, loopback, link-local a iné rezervované adresy backend odmietne.
Tá istá kontrola prebehne znovu aj tesne pred samotným odoslaním webhooku. Ak endpoint medzičasom prestane spĺňať tieto podmienky, Fintoro request vôbec neodošle a delivery označí ako neúspešné.

Payload doručenia

Payload webhooku je zámerne tenký:

Význam polí

Payload neobsahuje:
  • verziu API,
  • absolútnu ani relatívnu URL na resource,
  • plný snapshot resource-u,
  • vnorené lookupy alebo vnorené obchodné objekty.
Takýto kontrakt ostáva stabilný aj vtedy, keď Vaša integrácia používa konkrétnu verziu detailových endpointov alebo vlastnú stratégiu načítania.

Delivery headery

Každý webhook request obsahuje tieto hlavičky: webhook-id a webhook-timestamp nepodpisujete samostatne do vlastného kanonického reťazca. Podpis sa počíta nad raw request body presne v tvare, v akom prišiel.

Overenie podpisu

Overenie requestu by malo mať štyri vrstvy:
  1. skontrolujte, že request obsahuje všetky webhook headery,
  2. skontrolujte, že webhook-timestamp nie je príliš starý alebo príliš ďaleko v budúcnosti,
  3. vypočítajte HMAC SHA-256 nad raw request body a porovnajte ho v constant-time režime,
  4. deduplikujte podľa webhook-id, aby ste vedeli bezpečne spracovať opakované doručenie.

Odporúčaný flow

Pseudokód

JavaScript / Node.js-like príklad

Ako odpovedať na delivery

  • Vráťte 2xx až keď ste request bezpečne prijali, overili a uložili na ďalšie spracovanie.
  • Ak signature alebo timestamp nesedia, vráťte 401 alebo inú vlastnú autentifikačnú chybu podľa politiky prijímača webhookov.
  • Pri dočasnom downstream probléme vráťte non-2xx, ak chcete, aby systém webhook zopakoval.
  • Ak request prijmete, ale ešte len zaraďujete interné spracovanie do fronty, 204 No Content je úplne v poriadku.
Fintoro používa opakované doručovanie pri neúspešnom doručení. Preto prijímač webhookov musí byť:
  • idempotentný,
  • odolný voči duplicitám,
  • schopný vrátiť 2xx aj pri znovu doručenom už spracovanom webhook-id.

Mechanizmus opakovania

Fintoro považuje doručenie za neúspešné, keď:
  • prijímač webhookov vráti non-2xx HTTP status,
  • request timeoutne,
  • nastane sieťová chyba pri odoslaní.
  • endpoint pri predodovacej kontrole už neprejde bezpečnostnou validáciou URL, DNS a IP adresy.
Aktuálna politika doručovania je: Prakticky to znamená tento typický priebeh: Po vyčerpaní všetkých pokusov sa doručenie označí ako finálne neúspešné. Odber sa automaticky nevypína len preto, že jeden alebo viac pokusov zlyhalo. Z pohľadu prijímača webhookov je dôležité:
  • nepredpokladať exactly-once delivery,
  • rátať s tým, že ten istý webhook-id môže prísť opakovane,
  • odpovedať rýchlo a ťažšiu logiku delegovať do internej fronty,
  • vracať non-2xx len vtedy, keď naozaj chcete, aby Fintoro doručenie zopakovalo.

Thin payload a následné načítanie detailu

Odporúčaný integračný flow:
  1. prijmite webhook a overte podpis,
  2. deduplikujte podľa webhook-id,
  3. podľa type a resource určite, ktorý endpoint detailu potrebujete,
  4. detail si načítajte z Fintoro API vo verzii, ktorú používa Vaša integrácia,
  5. business logiku robte až nad načítaným detailom.
Príklady:
  • clients.updated + resource.id = 42GET /clients/42
  • invoices.created + resource.id = 301GET /invoices/301
  • warehouse-outbound-receipts.deleted + resource.id = 88 → ak už detail neexistuje, spracujte delete lokálne len podľa payloadu eventu
Pri delete eventoch rátajte s tým, že detail resource-u už nemusí byť dostupný. V takom prípade je zdrojom pravdy samotný webhook event a Vaše lokálne mapovanie.

Dostupné eventy

Master data

CRM

Sklady a katalóg

Doklady

Praktické odporúčania pre produkciu

  • nepúšťajte ťažkú business logiku priamo vo vlákne HTTP requestu prijímača webhookov,
  • raw payload aj webhook-id si ukladajte pred ďalším spracovaním,
  • secret rotujte kontrolovane a s plánom výmeny na strane prijímača webhookov,
  • sledujte retry vzory a opakované non-2xx odpovede ako indikátor incidentu na strane prijímača webhookov,
  • logujte si webhook-id, type, resource.type, resource.id a X-Request-Id z následného načítania detailu,
  • pri delete eventoch sa nespoliehajte na to, že detail endpoint ešte stále vráti resource.

Súvisiace sekcie