
Dil 🇹🇷 Türkçe
Genel Bakış
Uygulama
Sahne Arkası
Webhooks
FastComments ile sistemimizde bir yorum eklendiğinde, güncellendiğinde veya kaldırıldığında bir API endpoint'i çağırmak mümkündür.
Bunu HTTP/HTTPS üzerinden asenkron webhooks ile gerçekleştiriyoruz.
Webhooks Nedir 
Webhook, iki sistem arasında bir mekanizma veya entegrasyon olup "üretici" (FastComments) bir olay tetikler ve "tüketici" (Siz) bu olayı bir API çağrısı ile tüketir.
Desteklenen Olaylar ve Kaynaklar 
FastComments yalnızca Yorum kaynağı için webhook'ları destekler.
Yorum oluşturma, silme ve güncelleme için webhook'ları destekliyoruz.
Bunların her biri sistemimizde ayrı olaylar olarak kabul edilir ve bu nedenle webhook olayları için farklı anlamlar ve yapılar içerir.
Dashboard'dan veya API üzerinden (API aracılığıyla Webhook'ları Yönetmeye bakın) aynı olaya birden fazla uç nokta abone olabilir. Her webhook bağımsız olarak teslim edilir.
Yerel Geliştirme Kurulumu 
Yerel geliştirme için ngrok gibi bir araç kullanın.
Sistemi güvenli tutmayı basitleştirmek için, yerel geliştirme diğer ortamları kurma ve güvenli hale getirme sürecinin aynısını takip eder.
Adım 1: Hesabınızdaki alan adlarına "localhost" ekleyin.
"localhost" alan adını buradan ekleyin.
Adım 2: Bir API Anahtarı Seçin
Alan adınız için webhook yapılandırması ekleyeceğiz, bu yüzden bir API anahtarına ihtiyacımız olacak. Bunu buradan yapabilirsiniz.
"Associate with domain" altında - "localhost" alan adınızı seçin.
NOT: Alternatif olarak, tüm test etkinlikleri ve hazırlık (staging) ortamları için tek bir API Gizli Anahtarı kullanabilirsiniz. Sadece "All Domains" için bir API Gizli Anahtarı ekleyin ve ona "test" gibi bir ad verin.
Üretim alan ad(lar)ınız için tanımlanmış bir API Gizli Anahtarı olduğundan emin olun. Diğer tüm alan adlarının etkinlikleri joker (test) gizli anahtarını kullanacaktır.
Adım 3: Webhook'unuzu Ekleyin
ngrok veya benzeri bir araç çalışırken, "localhost" için değeri buradan ayarlayın.
Send Test Payload tıklandığında, API anahtarını doğruladığınızı kontrol etmek için size iki test etkinliği göndereceğiz.
Doğrulama tamamlandıktan sonra Save tuşuna basın.
Adım 4: Bir Yorum Ekleyin
Artık yorum ekleyebilir, düzenleyebilir veya silebilirsiniz ve etkinliklerle birlikte test API anahtarınızı kullanarak yerel geliştirme makinenizi aradığımızı görmelisiniz. Etkinliklerin makinenize ulaşması 30 saniye kadar sürebilir.
Kurulum 
localhost için üretim gibi aynı adımları izleyin. Üretim domain'leri ve API Secrets ayarlandığından emin olun.
İlk olarak, Webhooks admin adresine gidin. Bu, Manage Data -> Webhooks üzerinden erişilebilir.
Sayfa, hesabınızdaki tüm webhook'ları listeler:
New Webhook'a tıklayarak bir tane ekleyin. Her webhook'un bir URL'si, bir yorum olayı (oluşturuldu, güncellendi veya silindi), bir domain'i ve bir HTTP yöntemi vardır:
Her webhook bağımsız olarak teslim edilir. Aynı olayı birden fazla uç noktaya gönderebilirsiniz ve All Domains kapsamına sahip bir webhook, aynı olay için domain'e özgü bir webhook mevcut olsa bile tüm domain'lerden yorum alır. Aynı URL, olay ve domain iki kez eklenemez.
Kaydetmeden önce, uç noktanın imzalı bir isteği kabul edip etmediğini kontrol etmek için Send Test Payload'a tıklayın. Ayrıntılar için bir sonraki bölüm olan "Testing"e bakın.
Listeden bir webhook'u düzenleyebilir, devre dışı bırakabilir, yeniden etkinleştirebilir veya silebilirsiniz. Devre dışı bırakma, webhook yeniden etkinleştirilene kadar kuyruğa alınan olayları tutar; silme ise bunları yok eder.
Webhook'lar ayrıca API üzerinden, örneğin Zapier ile oluşturulabilir. Bunlar aynı listede API kaynağıyla görünür. API üzerinden Webhook Yönetimine bakın.
Test 
Yeni webhook ekleme ve düzenleme sayfalarında, formda o an bulunan URL'ye kaydedilmiş olup olmadığına bakılmaksızın istek gönderen bir Send Test Payload düğmesi bulunur. Create ve Update olayları sahte bir WebhookComment nesnesi gönderirken, Delete testi yalnızca bir ID içeren sahte bir istek gövdesi gönderir.
Payload'ları Doğrulama
Webhook entegrasyonunuzu test ederken, gelen isteklerin aşağıdaki başlıkları içerdiğini doğrulayın:
X-FastComments-Timestamp- Unix zaman damgası (saniye)X-FastComments-Signature- HMAC-SHA256 imzası
İmza şeması tanıtılmadan önce oluşturulmuş webhooks, API Secret'ınızı içeren bir token başlığı da alır. Yeni webhooks bunu almaz.
Payload'ların orijinal olduğundan emin olmak için HMAC imza doğrulamasını kullanın.
Test Araçları
Geliştirme sırasında gelen webhook payload'larını incelemek için webhook.site veya ngrok gibi araçları kullanabilirsiniz.
Olay Türleri
- Create Event: Yeni bir yorum oluşturulduğunda tetiklenir.
- Update Event: Bir yorum düzenlendiğinde tetiklenir.
- Delete Event: Bir yorum silindiğinde tetiklenir.
Her webhook tek bir olaya ve tek bir HTTP metoduna (POST, PUT veya DELETE) bağlıdır. Her olay, istek gövdesinde tam yorum verisini içerir (payload formatı için Veri Yapıları bölümüne bakın).
Veri Yapıları 
Webhooklar aracılığıyla gönderilen tek yapı, aşağıda TypeScript ile özetlenen WebhookComment nesnesidir.
WebhookComment Nesnesinin Yapısı
"Create" Olayının Yapısı
"create" olayının istek gövdesi bir WebhookComment nesnesidir.
"Update" Olayının Yapısı
"update" olayının istek gövdesi bir WebhookComment nesnesidir.
"Delete" Olayının Yapısı
"delete" olayının istek gövdesi bir WebhookComment nesnesidir.
14 Kasım 2023 itibarıyla değişiklik
Daha önce "delete" olayının istek gövdesi yalnızca yorum kimliğini (id) içeriyordu. Artık silme anındaki yorumun tamamını içerir.
Her anahtar gövdede her zaman bulunur. Yorumun bir alan için değeri olmadığında gövde null taşır
(booleans için false, listeler için []), böylece bir teslimatın şekli yorumdan yoruma asla değişmez.
Run 
Kullanıcılar bir yorumda etiketlendiğinde, bilgi mentions adlı bir listede saklanır. Bu listedeki her nesne
aşağıdaki yapıya sahiptir.
Run 
badges listesindeki her girdi aşağıdaki yapıya sahiptir. Rozet türleri için Rozetler rehberine bakın.
Run 
HTTP Metotları
Her webhook olay türü için HTTP metodunu yönetim panelinde yapılandırabilirsiniz:
- Create Olayı: POST veya PUT (varsayılan: PUT)
- Update Olayı: POST veya PUT (varsayılan: PUT)
- Delete Olayı: DELETE, POST veya PUT (varsayılan: DELETE)
Tüm istekler bir kimlik (ID) içerdiğinden, Create ve Update işlemleri varsayılan olarak idempotenttir (PUT). Aynı Create veya Update isteğini tekrarlamak, sizin tarafınızda yinelenen nesneler oluşturmamalıdır.
İstek Başlıkları
Her webhook isteği aşağıdaki başlıkları içerir:
| Başlık | Açıklama |
|---|---|
Content-Type | application/json |
token | API Gizli Anahtarınız (API Secret) |
X-FastComments-Timestamp | İsteğin imzalandığı Unix zaman damgası (saniye) |
X-FastComments-Signature | HMAC-SHA256 imzası (sha256=<hex>) |
HMAC imzasını doğrulama hakkında bilgi için Güvenlik ve API Tokenları sayfasına bakın.
Güvenlik ve API Token'ları 
FastComments webhook istekleri güvenlik için birden fazla kimlik doğrulama mekanizması içerir.
Gönderilen Başlıklar
| Header | Açıklama |
|---|---|
token | API Gizli Anahtarınız (geriye dönük uyumluluk için) |
X-FastComments-Timestamp | İsteğin imzalandığı Unix zaman damgası (saniye) |
X-FastComments-Signature | Gönderinin HMAC-SHA256 imzası |
HMAC İmza Doğrulaması (Önerilen)
Webhook gönderilerinin orijinal ve değiştirilmemiş olduğunu sağlamak için HMAC imzasını doğrulamanızı şiddetle tavsiye ederiz.
İmza Formatı: sha256=<hex-encoded-signature>
İmzanın nasıl hesaplandığı:
- Birleştir:
timestamp + "." + JSON_payload_body - Anahtar olarak API Gizli Anahtarınızı kullanarak HMAC-SHA256 hesaplayın
- Sonucu hexadecimal (hex) olarak kodlayın
Doğrulama Örneği (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;
}
// Zaman damgasının güncel olduğunu doğrula (5 dakika içinde)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Tekrar oynatma (replay) saldırılarını önlemek için
}
// İmzayı doğrula
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Doğrulama Örneği (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
# Zaman damgasının güncel olduğunu doğrula
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# İmzayı doğrula
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}"
Doğrulama Örneği (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Zaman damgasının güncel olduğunu doğrula (5 dakika içinde)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// İmzayı doğrula
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Eski Kimlik Doğrulama
token başlığı, API Gizli Anahtarınızı içeren, geriye dönük uyumluluk için hâlâ gönderilmektedir. Ancak, tekrar oynatma saldırılarına karşı koruma sağladığı için geliştirilmiş güvenlik için HMAC doğrulamasına geçmenizi öneririz.
API üzerinden Webhook'ları Yönetme 
Webhooks ayrıca REST API üzerinden yönetilebilir. Bu, Zapier gibi entegrasyonların kontrol paneline dokunmadan yorum olaylarına abone olmasını sağlar ve REST Hooks desenini izler: abone ol, olayları al, aboneliği iptal et.
API abonelikleri, kontrol panelinde yapılandırılmış webhooks'ların yanında bulunur. Bir yorum olayı, alanına uyan her webhook'a, webhook'un nasıl oluşturulduğuna bakılmaksızın, ayrı bir teslimat olarak gönderilir.
Kimlik Doğrulama
Her istek, x-api-key başlığında (veya API_KEY sorgu parametresinde) API Anahtarınızı ve tenantId sorgu parametresinde kiracı kimliğinizi gerektirir. Her ikisi de kontrol panelindeki API Gizli Sayfası'nda gösterilir.
Abone Ol
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"
}| Alan | Gerekli | Açıklama |
|---|---|---|
url | Evet | Mutlak bir http veya https URL'si. |
event | Evet | comment-created, comment-updated or comment-deleted. |
domain | Hayır | Hesap yapılandırmanızdaki bir alan adı. Varsayılan * olup, her alan adı için olayları alır. |
method | Hayır | POST (default), PUT or DELETE. |
Yanıt, aboneliği içerir:
{
"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"
}
}
Aynı URL'yi aynı olay ve alan adına tekrar abone etmek, bir kopya oluşturmak yerine mevcut aboneliği döndürür, böylece bir istemci güvenle yeniden deneyebilir. Her kiracı en fazla 50 API aboneliğine sahip olabilir.
Liste
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
Kiracı için kontrol panelinde yönetilenler dahil olmak üzere tüm webhook'ları döndürür ("source": "dashboard"). event, domain veya source ile filtreleyin.
Aboneliği İptal Et
DELETE https://fastcomments.com/api/v1/webhooks/SUBSCRIPTION_ID?tenantId=YOUR_TENANT_ID
Bir aboneliği silmek, ona hâlâ kuyrukta bekleyen olayları da iptal eder. Bu şekilde yalnızca API üzerinden oluşturulan abonelikler silinebilir; kontrol paneli webhook'u veya hesabınızda bulunmayan bir kimlik, 404 yanıtını not-found koduyla verir. Kontrol paneli webhook'ları Webhooks sayfasında düzenlenir.
Yükler ve İmzalama
Teslimatlar, kontrol paneli webhook'larıyla aynı yükü kullanır (Data Structures bölümüne bakın) ve aynı HMAC şemasıyla imzalanır (Security & API Tokens bölümüne bakın). API abonelikleri asla eski token başlığını almaz, bu yüzden X-FastComments-Signature başlığını doğrulayın.
Örnek Yükler
GET https://fastcomments.com/api/v1/webhooks/sample-payloads?tenantId=YOUR_TENANT_ID&event=comment-created&limit=3
Hesabın en son yorumlarını, teslimatın taşıdığı tam biçimde döndürür, böylece bir entegrasyon ilk olay gelmeden gerçek örnek verileri gösterebilir. event isteğe bağlıdır ve sadece doğrulanır, çünkü her olay aynı yorum nesnesini taşır. limit varsayılan olarak 3'tür ve 1 ile 10 arasında kabul eder. 2 API kredisi maliyetlidir.
{
"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
}
]
}
410 Gone Yanıtı
Bir API aboneliğinin uç noktası HTTP 410 Gone yanıtı verirse, FastComments bunu bir abonelik iptali olarak değerlendirir: abonelik, kuyrukta bekleyen olaylarıyla birlikte silinir ve başka teslimat denenmez. Kontrol panelinde yapılandırılmış webhook'lar otomatik olarak silinmez; onlar için 410 sıradan bir hatadır. Diğer tüm hata durumları yeniden denenir ve sonunda webhook devre dışı bırakılır, How it Works & Handling Retries bölümünde açıklandığı gibi.
Kontrol Paneli
API abonelikleri, Webhooks listesinde API kaynağıyla görünür; burada bir yönetici onları düzenleyebilir, devre dışı bırakabilir, yeniden etkinleştirebilir veya silebilir.
Nasıl Çalışır ve Tekrar Denemeleri Yönetme 
Sistemdeki Comment nesnesine yapılan tüm değişiklikler, bir kuyruğa düşen bir olay tetikler.
İlk webhook olayı genellikle olay kaynağı gerçekleştikten sonraki altı saniye içinde gönderilir.
API'niz devre dışı kalması durumunda, bu kuyruğu Webhooks yönetim panelinden izleyebilirsiniz.
API'nize yapılan bir istek başarısız olursa, bunu bir zamanlamaya göre yeniden kuyruğa alırız.
Bu zamanlama 1 Dakika * yeniden deneme sayısı şeklindedir. Çağrı bir kez başarısız olursa, bir dakika sonra tekrar dener. İki kez başarısız olursa, iki dakika bekler ve bu böyle devam eder. Bu, yük kaynaklı nedenlerle düşüyorsanız API'nizi aşırı yüklememek içindir.
Webhook'lar logs sayfasından iptal edilebilir.
Sonuç olarak
Bu, Webhooks belgelerimizin sonudur.
Umarız FastComments Webhook entegrasyonunu anlaşılması kolay ve kurulumu hızlı bulursunuz.
Belgelerimizde herhangi bir boşluk tespit ettiğinizi düşünüyorsanız, lütfen aşağıdan bize bildirin.