
Język 🇵🇱 Polski
Przegląd
Implementacja
Za kulisami
Webhooki
Z FastComments możliwe jest wywołanie punktu końcowego API za każdym razem, gdy komentarz zostanie dodany, zaktualizowany lub usunięty z naszego systemu.
Realizujemy to za pomocą asynchronicznych webhooków przez HTTP/HTTPS.
Czym są webhooki 
Webhook to mechanizm, lub integracja, pomiędzy dwoma systemami gdzie "producent" (FastComments) wyzwala zdarzenie które "konsument" (Ty) odbiera za pomocą wywołania API.
Obsługiwane zdarzenia i zasoby 
FastComments obsługuje webhooki tylko dla zasobu Comment.
Obsługujemy webhooki dla tworzenia komentarzy, ich usuwania oraz aktualizacji.
Każdy z nich jest traktowany jako osobne zdarzenie w naszym systemie i w związku z tym ma różne semantyki i struktury zdarzeń webhooków.
Dowolna liczba endpointów może subskrybować to samo zdarzenie, z poziomu panelu sterowania lub poprzez API (zobacz Managing Webhooks via the API). Każdy webhook jest dostarczany niezależnie.
Konfiguracja lokalnego środowiska deweloperskiego 
Do lokalnego developmentu użyj narzędzia takiego jak ngrok.
Aby uprościć utrzymywanie bezpieczeństwa systemu, lokalny development przebiega według tego samego procesu co konfiguracja i zabezpieczanie innych środowisk.
Krok 1: Dodaj "localhost" do domen w swoim koncie.
Dodaj "localhost" jako domenę tutaj.
Krok 2: Wybierz klucz API
Będziemy dodawać konfigurację webhooka dla Twojej domeny, więc będziemy potrzebować klucza API. Możesz to zrobić tutaj.
W sekcji "Associate with domain" - wybierz swoją domenę "localhost".
UWAGA: Alternatywnie możesz użyć jednego sekretu API dla całej aktywności testowej i środowisk staging. Po prostu dodaj sekret API dla "All Domains" i nadaj mu nazwę taką jak "test".
Upewnij się, że masz zdefiniowany sekret API dla swojej domeny produkcyjnej (lub domen). Zdarzenia dla wszystkich innych domen będą używać sekretu wildcard (testowego).
Krok 3: Dodaj swój webhook
Podczas działania ngrok lub podobnego narzędzia, ustaw wartość dla "localhost" tutaj.
Po kliknięciu Send Test Payload wyślemy dwa zdarzenia testowe, aby sprawdzić, czy walidujesz klucz API.
Po pomyślnej walidacji kliknij Save.
Krok 4: Dodaj komentarz
Teraz możesz dodawać, edytować lub usuwać komentarze i powinieneś zobaczyć, jak wywołujemy Twoją lokalną maszynę deweloperską ze zdarzeniami, używając Twojego testowego klucza API. Może wystąpić opóźnienie do 30 sekund zanim zdarzenia dotrą do Twojej maszyny.
Konfiguracja 
Postępuj zgodnie z tymi samymi krokami dla localhost, tak jak w środowisku produkcyjnym. Upewnij się, że masz skonfigurowane domeny produkcyjne i sekrety API.
Najpierw przejdź do Webhooks admin. Jest to dostępne poprzez Zarządzanie danymi -> Webhooks.
Strona wyświetla wszystkie webhooki w Twoim koncie:
Kliknij Nowy webhook, aby dodać go. Każdy webhook ma URL, jedno zdarzenie komentarza (utworzone, zaktualizowane lub usunięte), domenę oraz metodę HTTP:
Każdy webhook jest dostarczany niezależnie. Możesz wysłać to samo zdarzenie do kilku punktów końcowych, a webhook o zakresie Wszystkie domeny otrzymuje komentarze ze wszystkich domen, nawet gdy istnieje webhook specyficzny dla domeny dla tego samego zdarzenia. Ten sam URL, zdarzenie i domena nie mogą być dodane dwukrotnie.
Przed zapisaniem kliknij Wyślij testowy ładunek, aby sprawdzić, czy punkt końcowy akceptuje podpisane żądanie. Zobacz następną sekcję, „Testowanie”, aby uzyskać szczegóły.
Z listy możesz edytować, wyłączyć, ponownie włączyć lub usunąć webhook. Wyłączenie zachowuje oczekujące zdarzenia, aż webhook zostanie ponownie włączony; usunięcie powoduje ich odrzucenie.
Webhooki mogą być również tworzone za pośrednictwem API, na przykład przez Zapier. Pojawiają się na tej samej liście ze źródłem API. Zobacz Zarządzanie webhookami za pomocą API.
Testowanie 
Nowe i edytowane strony webhooków mają przycisk Send Test Payload, który wysyła żądanie do adresu URL aktualnie znajdującego się w formularzu, niezależnie od tego, czy został on zapisany. Zdarzenia Create i Update wysyłają przykładowy obiekt WebhookComment, natomiast testowanie Delete wyśle przykładowe ciało żądania zawierające jedynie identyfikator.
Weryfikacja ładunków
Podczas testowania integracji webhooka, sprawdź, czy przychodzące żądania zawierają następujące nagłówki:
X-FastComments-Timestamp– znacznik czasu Unix (sekundy)X-FastComments-Signature– podpis HMAC‑SHA256
Webhooki utworzone przed wprowadzeniem schematu podpisu otrzymują również nagłówek token zawierający Twój sekret API. Nowe webhooki go nie mają.
Użyj weryfikacji podpisu HMAC, aby zapewnić autentyczność ładunków.
Narzędzia testowe
Możesz używać narzędzi takich jak webhook.site lub ngrok, aby przeglądać przychodzące ładunki webhooków podczas programowania.
Typy zdarzeń
- Zdarzenie Create: wywoływane, gdy zostaje utworzony nowy komentarz.
- Zdarzenie Update: wywoływane, gdy komentarz zostaje edytowany.
- Zdarzenie Delete: wywoływane, gdy komentarz zostaje usunięty.
Każdy webhook jest powiązany z jednym zdarzeniem i jedną metodą HTTP (POST, PUT lub DELETE). Każde zdarzenie zawiera pełne dane komentarza w ciele żądania (zobacz Data Structures po format ładunku).
Struktury danych 
Jedyną strukturą wysyłaną przez webhooki jest obiekt WebhookComment, przedstawiony poniżej w TypeScript.
Struktura obiektu WebhookComment
Struktura zdarzenia "Create"
Treść żądania zdarzenia "create" jest obiektem WebhookComment.
Struktura zdarzenia "Update"
Treść żądania zdarzenia "update" jest obiektem WebhookComment.
Struktura zdarzenia "Delete"
Treść żądania zdarzenia "delete" jest obiektem WebhookComment.
Zmiana z 14 listopada 2023
Wcześniej treść żądania zdarzenia "delete" zawierała tylko identyfikator komentarza. Teraz zawiera pełny komentarz w momencie usunięcia.
Każdy klucz jest zawsze obecny w treści. Gdy komentarz nie ma wartości dla danego pola, treść zawiera null
(lub false dla wartości logicznych oraz [] dla list), dzięki czemu kształt dostarczanych danych nigdy nie różni się między komentarzami.
Run 
Gdy użytkownicy są oznaczani w komentarzu, informacje są przechowywane na liście o nazwie mentions. Każdy obiekt na tej liście
ma następującą strukturę.
Run 
Każdy wpis na liście badges ma następującą strukturę. Zobacz przewodnik po odznakach, aby poznać typy odznak.
Run 
Metody HTTP
Metodę HTTP dla każdego typu zdarzenia webhooka można skonfigurować w panelu administracyjnym:
- Zdarzenie Create: POST lub PUT (domyślnie: PUT)
- Zdarzenie Update: POST lub PUT (domyślnie: PUT)
- Zdarzenie Delete: DELETE, POST lub PUT (domyślnie: DELETE)
Ponieważ wszystkie żądania zawierają identyfikator, operacje Create i Update są domyślnie idempotentne (PUT). Powtórzenie tego samego żądania Create lub Update nie powinno tworzyć duplikatów obiektów po Twojej stronie.
Nagłówki żądania
Każde żądanie webhooka zawiera następujące nagłówki:
| Nagłówek | Opis |
|---|---|
Content-Type | application/json |
token | Twój sekret API |
X-FastComments-Timestamp | Znacznik czasu Unix (sekundy) w momencie podpisania żądania |
X-FastComments-Signature | Podpis HMAC-SHA256 (sha256=<hex>) |
Zobacz Bezpieczeństwo i tokeny API, aby uzyskać informacje na temat weryfikacji podpisu HMAC.
Bezpieczeństwo i tokeny API 
FastComments webhook requests include multiple authentication mechanisms for security.
Wysyłane nagłówki
| Nagłówek | Opis |
|---|---|
token | Twój API Secret (w celu zachowania zgodności wstecznej) |
X-FastComments-Timestamp | Znacznik czasu Unix (sekundy), kiedy żądanie zostało podpisane |
X-FastComments-Signature | Podpis HMAC-SHA256 ładunku |
Weryfikacja podpisu HMAC (zalecane)
Zdecydowanie zalecamy weryfikację podpisu HMAC, aby upewnić się, że ładunki webhooków są autentyczne i nie zostały zmienione.
Format podpisu: sha256=<hex-encoded-signature>
Jak obliczany jest podpis:
- Połącz:
timestamp + "." + JSON_payload_body - Oblicz HMAC-SHA256 używając swojego API Secret jako klucza
- Zakoduj wynik w hex
Przykład weryfikacji (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(req, apiSecret) {
const timestamp = req.headers['x-fastcomments-timestamp'];
const signature = req.headers['x-fastcomments-signature'];
if (!timestamp || !signature) {
return false;
}
// Zweryfikuj, że znacznik czasu jest aktualny (w ciągu 5 minut)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Zapobieganie atakom powtórzeniowym
}
// Verify signature
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Przykład weryfikacji (Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# Zweryfikuj, że znacznik czasu jest aktualny
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Zweryfikuj podpis
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
Przykład weryfikacji (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Zweryfikuj, że znacznik czasu jest aktualny (w ciągu 5 minut)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Zweryfikuj podpis
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Starsze uwierzytelnianie
Nagłówek token zawierający Twój API Secret wciąż jest wysyłany dla zachowania zgodności wstecznej. Jednak zalecamy przejście na weryfikację HMAC dla lepszego bezpieczeństwa, ponieważ chroni ona przed atakami powtórzeniowymi.
Zarządzanie webhookami za pomocą API 
Webhooks można również zarządzać za pośrednictwem REST API. Tak integracje takie jak Zapier subskrybują zdarzenia komentarzy bez użycia panelu, i stosują wzorzec REST Hooks: subskrybuj, odbieraj zdarzenia, wypisz się.
Subskrypcje API współistnieją z webhookami skonfigurowanymi w panelu. Zdarzenie komentarza jest dostarczane do każdego webhooka, który pasuje do jego domeny, każde jako osobna dostawa, niezależnie od tego, w jaki sposób webhook został utworzony.
Uwierzytelnianie
Każde żądanie wymaga Twojego klucza API w nagłówku x-api-key (lub parametrze zapytania API_KEY) oraz identyfikatora najemcy w parametrze zapytania tenantId. Oba są wyświetlane na stronie API Secret w panelu.
Subskrypcja
POST https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
x-api-key: YOUR_API_KEY
Content-Type: application/json
{
"url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "comment-created"
}| Pole | Wymagane | Opis |
|---|---|---|
url | Tak | Bezwzględny adres URL http lub https. |
event | Tak | comment-created, comment-updated lub comment-deleted. |
domain | Nie | Domena z konfiguracji Twojego konta. Domyślnie *, co oznacza odbieranie zdarzeń ze wszystkich domen. |
method | Nie | POST (domyślnie), PUT lub DELETE. |
Odpowiedź zawiera subskrypcję:
{
"status": "success",
"webhook": {
"id": "66f1c4c1e7a2b3d4f5a6b7c8",
"url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "comment-created",
"domain": "*",
"method": "POST",
"source": "api",
"enabled": true,
"createdAt": "2026-09-08T12:00:00.000Z"
}
}
Subskrybowanie tego samego URL do tego samego zdarzenia i domeny ponownie zwraca istniejącą subskrypcję zamiast tworzyć duplikat, więc klient może bezpiecznie ponowić próbę. Każdy najemca może mieć maksymalnie 50 subskrypcji API.
Lista
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
Zwraca wszystkie webhooki dla najemcy, w tym te zarządzane w panelu ("source": "dashboard"). Filtruj za pomocą event, domain lub source.
Anulowanie subskrypcji
DELETE https://fastcomments.com/api/v1/webhooks/SUBSCRIPTION_ID?tenantId=YOUR_TENANT_ID
Usunięcie subskrypcji usuwa również wszystkie zdarzenia, które nadal są w kolejce. Tylko subskrypcje utworzone przez API mogą być usunięte w ten sposób; webhook z panelu lub identyfikator nieistniejący na Twoim koncie zwraca 404 z kodem not-found. Webhooki z panelu są edytowane na stronie Webhooks.
Ładunki i podpisy
Dostawy używają takiego samego ładunku jak webhooki z panelu (zobacz Struktury Danych) i są podpisane tym samym schematem HMAC (zobacz Bezpieczeństwo & Tokeny API). Subskrypcje API nigdy nie otrzymują starszego nagłówka token, więc należy weryfikować nagłówek X-FastComments-Signature.
Przykładowe ładunki
GET https://fastcomments.com/api/v1/webhooks/sample-payloads?tenantId=YOUR_TENANT_ID&event=comment-created&limit=3
Zwraca najnowsze komentarze konta w dokładnym formacie, jaki ma dostawa, dzięki czemu integracja może wyświetlić rzeczywiste przykładowe dane przed przyjściem pierwszego zdarzenia. event jest opcjonalny i jedynie walidowany, ponieważ każde zdarzenie dostarcza ten sam obiekt komentarza. limit domyślnie wynosi 3 i przyjmuje wartości od 1 do 10. Kosztuje 2 kredyty API.
{
"status": "success",
"payloads": [
{
"id": "66f1c4c1e7a2b3d4f5a6b7c8",
"urlId": "https://example.com/blog/hello-world",
"commenterName": "Jane Reader",
"comment": "Great article!",
"date": "2026-09-08T12:00:00.000Z",
"approved": true
}
]
}
Odpowiadanie kodem 410 Gone
Jeśli endpoint subskrypcji API odpowie kodem HTTP 410 Gone, FastComments traktuje to jako wypisanie się: subskrypcja jest usuwana wraz z oczekującymi zdarzeniami i nie są podejmowane dalsze próby dostawy. Webhooki skonfigurowane w panelu nigdy nie są usuwane automatycznie; dla nich 410 oznacza zwykłą awarię. Każdy inny kod błędu jest ponawiany i ostatecznie wyłącza webhook, jak opisano w sekcji Jak to działa & Obsługa ponowień.
Panel
Subskrypcje API pojawiają się na liście Webhooks ze źródłem API, gdzie administrator może je edytować, wyłączać, ponownie włączać lub usuwać.
Jak to działa i obsługa ponownych prób 
Wszystkie zmiany obiektu Comment w systemie wywołują zdarzenie, które trafia do kolejki.
Początkowe zdarzenie webhook jest zwykle wysyłane w ciągu sześciu sekund od wystąpienia źródła zdarzenia.
Możesz monitorować tę kolejkę w panelu administracyjnym Webhooks na wypadek, gdyby Twoje API przestało działać.
Jeśli żądanie do Twojego API się nie powiedzie, ponownie umieścimy je w kolejce zgodnie z harmonogramem.
Ten harmonogram to 1 Minute * the retry count. Jeśli wywołanie zakończy się niepowodzeniem raz, spróbuje ponownie za
minutę. Jeśli nie powiedzie się dwa razy, poczeka wtedy dwie minuty, i tak dalej. Dzięki temu
nie przeciążymy Twojego API, jeśli przestaje działać z powodów związanych z obciążeniem.
Webhooks można anulować z strony logów.
Podsumowanie
To kończy naszą dokumentację Webhooks.
Mamy nadzieję, że integracja FastComments Webhook jest łatwa do zrozumienia i szybka do skonfigurowania.
Jeśli uważasz, że zidentyfikowałeś jakiekolwiek luki w naszej dokumentacji, daj nam znać poniżej.