Webhooki
Odbieraj zdarzenia w czasie rzeczywistym przez HTTP POST na swój endpoint
Ostatnio zaktualizowano
Webhooki odbierają zdarzenia w czasie rzeczywistym przez HTTP POST na skonfigurowany przez Ciebie adres URL. Te same zdarzenia są dostępne także przez SSE. Webhooki są skonfigurowane dla każdej organizacji - każda organizacja ma własne webhooki.
Zarządzanie
Pełne schematy żądań i odpowiedzi znajdziesz w specyfikacji OpenAPI.
| Metoda | Ścieżka | Opis |
|---|---|---|
| GET | /api/orgs/:orgId/webhooks | Pobranie webhooków |
| GET | /api/orgs/:orgId/webhooks/delivery-stats | Pobranie statystyk dostarczeń |
| POST | /api/orgs/:orgId/webhooks/retry-deliveries | Ponowna próba dostarczeń. Body: mode (failed lub force) i opcjonalnie id dla jednego webhooka. failed: tylko dostawy ostatecznie nieudane, od razu. force: dostawy oczekujące i ostatecznie nieudane, w tle, z pominięciem czasów oczekiwania. |
| GET | /api/orgs/:orgId/webhooks/:id | Pobranie webhooka według ID |
| POST | /api/orgs/:orgId/webhooks | Utworzenie webhooka |
| PATCH | /api/orgs/:orgId/webhooks/:id | Aktualizacja webhooka |
| DELETE | /api/orgs/:orgId/webhooks/:id | Usunięcie webhooka |
Tworzenie webhooka
POST /api/orgs/org_abc123/webhooks
Content-Type: application/json
x-api-key: tkn_xxx{
"url": "https://jouw-server.com/webhooks/tillor",
"subscribedEventKeys": ["invoice:created", "invoice:paid", "customer:updated"],
"enabled": true
}- url - Endpoint HTTPS, który przyjmuje żądania POST
- subscribedEventKeys - Tablica kluczy zdarzeń lub
["*"]dla wszystkich zdarzeń. Pełną listę znajdziesz w Tillor w Menu profilu → Dla deweloperów przy Dodaj webhooka → Subskrybowane wydarzenia.
Kilka zdarzeń występuje tak często, że nie można ich wybrać i nie docierają też przez *, na przykład fizyczny stan szlabanów, pisanie w skrzynce odbiorczej, logi kontrolerów i obecność pojazdów. Nie ma ich na poniższej liście. To, które zdarzenia możesz wybrać, zależy też od Twoich uprawnień.
- enabled -
true, aby włączyć dostarczanie
Możesz wybrać tylko zdarzenia, do których Twój członek organizacji ma odpowiednie uprawnienie (np. transakcje bankowe dla bankAccountTransaction:*). Wildcard * jest dostępny tylko dla członków z pełnym dostępem (*). Przy nieprawidłowej kombinacji API zwraca błąd. Webhook przekazuje pełny payload wraz z powiązanymi danymi (jak klient przy rezerwacji). Dlatego, aby utworzyć webhook, zmienić jego URL lub zdarzenia albo włączyć go ponownie, musisz mieć też prawo odczytu tych domen.
Payload webhooka
Każde dostarczenie webhooka to POST z:
Nagłówkami:
Content-Type: application/jsonX-Webhook-Event-ID- stabilne unikalne ID tego logicznego dostarczenia (ta sama wartość przy ponownych próbach)X-Webhook-Signature- podpis HMAC-SHA256 body, formatsha256=<hex>(zobacz Weryfikacja podpisu)
Body:
{
"event": "invoice:created",
"data": {},
"timestamp": 1735689600000,
"traceId": "4bf92f3577b34da6a3ce929d0e0e4736",
"spanId": "00f067aa0ba902b7",
"triggeredBy": {
"id": "usr_63x8jp68is",
"name": "Niels"
}
}| Pole | Typ | Opis |
|---|---|---|
event | string | Klucz zdarzenia (np. invoice:created) |
data | object | Payload specyficzny dla zdarzenia |
timestamp | number | Unix timestamp (ms) w chwili wysłania zdarzenia |
traceId | string | ID śladu OpenTelemetry akcji Tillor, która wywołała to zdarzenie. Podaj je w kontakcie z supportem; nie jest tajne. |
spanId | string (opcjonalnie) | Span w obrębie tego śladu |
triggeredBy | object | null | Użytkownik, który wykonał akcję (id, name). null przy akcjach systemowych (cron, synchronizacja banku, …) |
Pełne przykłady payloadów znajdziesz w Przykładach.
Weryfikacja podpisu
Każdy webhook ma własny sekret podpisywania (64 znaki hex, widoczny w tabeli webhooków przez Pokaż sekret podpisywania w Menu profilu → Dla deweloperów). Tillor podpisuje każdy POST tym sekretem, abyś mógł sprawdzić, że żądanie naprawdę pochodzi od Tillor i że body nie zostało zmienione.
Jak podpisuje Tillor:
- Oblicz
HMAC-SHA256(signingSecret, raw_request_body)(hex małymi literami). - Wyślij to jako
X-Webhook-Signature: sha256=<hex>.
Jak weryfikujesz Ty:
- Odczytaj surowe body żądania (przed parsowaniem JSON - inaczej hash się nie zgodzi).
- Sam oblicz
HMAC-SHA256(signingSecret, raw_body)w hex. - Porównaj z wartością po
sha256=z nagłówkaX-Webhook-Signatureza pomocą porównania constant-time.
import crypto from "node:crypto";
function verifyTillorWebhook(rawBody, headerSignature, signingSecret) {
const expected = crypto.createHmac("sha256", signingSecret).update(rawBody).digest("hex");
const received = headerSignature.replace(/^sha256=/, "");
const a = Buffer.from(expected, "hex");
const b = Buffer.from(received, "hex");
return a.length === b.length && crypto.timingSafeEqual(a, b);
}Traktuj sekret jak hasło
Sekret podpisywania możesz wyświetlić w Tillor przez Pokaż sekret podpisywania w tabeli webhooków. Przechowuj go jako sekret (zmienna środowiskowa, vault) i nigdy go nie loguj. Podejrzewasz wyciek? Usuń webhook i utwórz nowy; dostaniesz wtedy nowy sekret.
Zachowanie dostarczania i ponowne próby
- Odpowiedz statusem 2xx, aby potwierdzić sukces.
- Przy nieudanym dostarczeniu (status inny niż 2xx, błąd sieci lub zablokowany cel) Tillor automatycznie ponawia dostarczenie ze stopniowo coraz dłuższymi odstępami. Każda próba używa tego samego payloadu, tego samego podpisu i tego samego ID zdarzenia (idempotentnie).
| Próba | Czas oczekiwania od poprzedniej próby |
|---|---|
| 1 | od razu |
| 2 | 1 sekunda |
| 3 | 2 sekundy |
| 4 | 4 sekundy |
| 5 | 8 sekund |
| 6 | 5 minut |
| 7 | 30 minut |
| 8 | 2 godziny |
| 9 | 6 godzin |
| 10 | 24 godziny |
- Jeśli jedna z prób się powiedzie (2xx) → dostarczenie jest zakończone.
- Jeśli nie powiedzie się też próba 10 (po 24 h) → dostarczenie jest ostatecznie oznaczone jako nieudane i nie jest już ponawiane.
- Jeśli w międzyczasie webhook zostanie wyłączony, Tillor przestaje ponawiać próby.
Idempotentność
Każda ponowna próba używa tego samego X-Webhook-Event-ID i X-Webhook-Signature. Deduplikuj po swojej stronie według tego nagłówka, aby udana ponowna próba po wolnej odpowiedzi 200 nie spowodowała podwójnego przetworzenia.
Powiadomienia przy utrzymujących się błędach
Jeśli dostarczenia do endpointu webhooka stale się nie udają, Tillor wysyła najwyżej dwa powiadomienia na incydent (na endpoint):
- Po 5 minutach utrzymujących się błędów - e-mail na adres e-mail organizacji (
supportEmail, w przeciwnym razieemail) oraz do członków organizacji z uprawnieniami do zmiany ustawień organizacji, a także push (jeśli włączony) dla tych członków. E-mail podaje, od kiedy dostarczenia się nie udają. Daty w e-mailu używają strefy czasowej z Ustawienia > Ogólne (domyślnieEurope/Brussels). - Przy ostatecznym niepowodzeniu - ci sami odbiorcy dostają jedno powiadomienie, gdy pierwsze zdarzenie w tym incydencie zostanie po wszystkich próbach ostatecznie oznaczone jako nieudane.
Nie dostajesz powiadomienia dla każdego nieudanego zdarzenia. Gdy wszystkie nieudane dostarczenia dla endpointu zostaną rozwiązane (dostarczone pomyślnie), kolejny incydent zaczyna się od nowa według tych samych reguł.
W Menu profilu → Dla deweloperów tabela webhooków pokazuje dla każdego endpointu zwięzły status dostarczeń (liczby oczekujące na ponowną próbę i ostatecznie nieudane). Kliknij ikonę ℹ, aby zobaczyć szczegóły, w tym pełny komunikat błędu i payload ostatniej próby.
- Ponów próbę dostarczenia nieudanych dostaw (↻): tylko dostawy ostatecznie nieudane dla tego webhooka.
- Wymuś ponowną próbę (⚡): wszystkie oczekujące i ostatecznie nieudane dostawy dla tego webhooka, niezależnie od zaplanowanych czasów oczekiwania. Tillor uruchamia to w tle, aby duże kolejki (np. tysiące zdarzeń) były przetwarzane bezpiecznie.
- Wymuś ponowną próbę wszystkich w prawym górnym rogu obok Dodaj webhooka: to samo dla wszystkich włączonych webhooków w organizacji.
Typy zdarzeń
Klucze zdarzeń mają format entity:action lub entity:subresource:action. Pełną listę, z uprawnieniem dla każdego zdarzenia i przykładowym payloadem, znajdziesz w indeksie zdarzeń. Ta strona jest generowana z kodu, więc zawsze jest kompletna. Te same klucze znajdziesz w Tillor w Menu profilu → Dla deweloperów przy Dodaj webhooka → Subskrybowane wydarzenia.
Webhooki a SSE
| Zastosowanie | Rekomendacja |
|---|---|
| Integracja po stronie serwera | Webhooki - Twój serwer odbiera POST-y |
| Proste logowanie | Webhooki - Minimalna konfiguracja |
| Dashboard w czasie rzeczywistym, aktualizacje na żywo w aplikacji | SSE - Jedno połączenie, małe opóźnienie. |
| Wiele typów zdarzeń, filtrowanie po stronie klienta | SSE - Użyj parametru zapytania events, aby ograniczyć ruch. |
Powiązane
- OpenAPI - Pełna specyfikacja API
- HTTP API - REST API i klucze API
- SSE - Te same zdarzenia przez Server-Sent Events
- Automatyzacje - Wysyłanie własnych wiadomości z automatyzacji