
言語 🇯🇵 日本語
概要
実装
舞台裏
Webhook
FastComments では、コメントがシステムに追加、更新、または削除されるたびに API エンドポイントを呼び出すことができます。
これは HTTP/HTTPS を介した非同期 Webhook によって実現します。
Webhookとは何か 
Webhookは、2つのシステム間の仕組み、または統合であり、"producer" (FastComments) がイベントを発生させ "consumer" (あなた) がAPIコールでそれを受け取るものです。
サポートされているイベントとリソース 
FastComments は Comment リソースに対してのみ Webhook をサポートしています。
コメントの作成、削除、更新に対する Webhook をサポートしています。
これらはすべて当社システム内で個別のイベントとみなされ、そのため Webhook イベントには異なるセマンティクス と構造があります。
ダッシュボードまたは API を通じて(「API での Webhook の管理」を参照)、任意の数のエンドポイントが同じイベントを購読できます。 各 Webhook は個別に配信されます。
ローカル開発のセットアップ 
ローカル開発には、ngrok のようなツールを使用してください。
システムのセキュリティを維持しやすくするため、ローカル開発は他の環境のセットアップおよび保護と同じ手順に従います。
ステップ 1: アカウントのドメインに "localhost" を追加する
"localhost" をこちらでドメインとして追加してください。
ステップ 2: API キーを選択する
ドメインの Webhook 設定を追加するため、API キーが必要です。こちらから追加できます。
「Associate with domain(ドメインとの関連付け)」で、"localhost" ドメインを選択してください。
注意: または、すべてのテスト作業とステージング環境に対して 1 つの API シークレットを使用することもできます。その場合は「All Domains(すべてのドメイン)」に対して API シークレットを追加し、「test」のような名前を付けてください。
本番ドメイン用の API シークレットが定義されていることを確認してください。その他のすべてのドメインのイベントには、ワイルドカード(テスト用)シークレットが使用されます。
ステップ 3: Webhook を追加する
ngrok または同様のツールを実行している状態で、"localhost" の値をこちらで設定してください。
Send Test Payload をクリックすると、API キーの検証が正しく行われているかを確認するため、2 つのテストイベントが送信されます。
検証が成功したら、Save を押してください。
ステップ 4: コメントを追加する
これで、コメントの追加、編集、削除が可能になり、テスト用 API キーを使用して、イベントがローカル開発マシンに送信されるのを確認できるはずです。イベントがマシンに到達するまで、最大 30 秒ほどかかる場合があります。
セットアップ 
localhost に対しても本番と同じ手順を実行してください。プロダクション用ドメインと API シークレットが設定されていることを確認してください。
まず、Webhooks 管理 に移動します。これは「Manage Data」→「Webhooks」からアクセスできます。
このページにはアカウントにあるすべてのWebhookが一覧表示されます:
New Webhook をクリックして追加します。各Webhookには URL、1つのコメントイベント(作成、更新、削除のいずれか)、ドメイン、HTTP メソッドがあります:
各Webhookは独立して配信されます。同じイベントを複数のエンドポイントに送信できます。また、All Domains にスコープされたWebhookは、同じイベントに対してドメイン固有のWebhookが存在していても、すべてのドメインからのコメントを受け取ります。同一の URL、イベント、ドメインの組み合わせは二度追加できません。
保存する前に Send Test Payload をクリックして、エンドポイントが署名付きリクエストを受け入れるか確認してください。詳細は次のセクション「Testing」を参照してください。
一覧からWebhookを編集、無効化、再有効化、削除できます。無効化すると、Webhookが再有効化されるまでキューに入ったイベントは保持されます。削除するとそれらは破棄されます。
WebhookはAPI経由でも作成できます(例: Zapier)。この場合、同じ一覧にソースが API として表示されます。API を使用した Webhook の管理については、Managing Webhooks via the API を参照してください。
テスト 
新規および編集用のWebhookページには、Send Test Payload ボタンがあり、保存済みかどうかに関わらず、フォームに入力されているURLにリクエストを送信します。CreateイベントとUpdateイベントはダミーのWebhookCommentオブジェクトを送信し、DeleteのテストではIDのみを含むダミーのリクエストボディを送信します。
ペイロードの検証
Webhook統合をテストする際、受信リクエストに以下のヘッダーが含まれていることを確認してください:
X-FastComments-Timestamp- Unixタイムスタンプ(秒)X-FastComments-Signature- HMAC-SHA256署名
署名スキームが導入される前に作成されたWebhookも、APIシークレットを含む token ヘッダーを受け取ります。新しいWebhookでは受け取りません。
ペイロードが本物であることを確認するために、HMAC署名検証を使用してください。
テストツール
開発中に受信したWebhookペイロードを検査するには、webhook.site や ngrok などのツールを使用できます。
イベントタイプ
- Createイベント: 新しいコメントが作成されたときにトリガーされます。
- Updateイベント: コメントが編集されたときにトリガーされます。
- Deleteイベント: コメントが削除されたときにトリガーされます。
各Webhookは1つのイベントと1つのHTTPメソッド(POST、PUT、またはDELETE)に紐付けられています。各イベントには、リクエストボディにコメントの完全なデータが含まれます(ペイロード形式については データ構造 を参照してください)。
データ構造 
Webhook経由で送信される構造はWebhookCommentオブジェクトのみで、以下にTypeScriptで示します。
WebhookCommentオブジェクトの構造
"Create"イベントの構造
"create"イベントのリクエストボディはWebhookCommentオブジェクトです。
"Update"イベントの構造
"update"イベントのリクエストボディはWebhookCommentオブジェクトです。
"Delete"イベントの構造
"delete"イベントのリクエストボディはWebhookCommentオブジェクトです。
2023年11月14日時点の変更
以前は"delete"イベントのリクエストボディにはコメントIDのみが含まれていました。現在は削除時点のコメント全体が含まれます。
すべてのキーは常にボディに存在します。コメントにフィールドの値がない場合、ボディには null(ブール値の場合は false、リストの場合は [])が格納されるため、配信の形式はコメントごとに変わりません。
Run 
コメント内でユーザーがタグ付けされると、その情報は mentions というリストに保存されます。そのリスト内の各オブジェクトは以下の構造を持ちます。
Run 
badges リストの各エントリは以下の構造を持ちます。バッジの種類についてはバッジガイドを参照してください。
Run 
HTTPメソッド
管理パネルで各WebhookイベントタイプのHTTPメソッドを設定できます:
- Createイベント: POSTまたはPUT(デフォルト: PUT)
- Updateイベント: POSTまたはPUT(デフォルト: PUT)
- Deleteイベント: DELETE、POST、またはPUT(デフォルト: DELETE)
すべてのリクエストにIDが含まれているため、CreateおよびUpdate操作はデフォルト(PUT)で冪等です。同じCreateまたはUpdateリクエストを繰り返しても、こちら側で重複したオブジェクトが作成されることはありません。
リクエストヘッダー
各Webhookリクエストには以下のヘッダーが含まれます:
| ヘッダー | 説明 |
|---|---|
Content-Type | application/json |
token | あなたのAPIシークレット |
X-FastComments-Timestamp | リクエストが署名された時点のUnixタイムスタンプ(秒) |
X-FastComments-Signature | HMAC-SHA256署名(sha256=<hex>) |
HMAC署名の検証方法については、セキュリティとAPIトークンを参照してください。
セキュリティとAPIトークン 
FastComments の webhook リクエストは、セキュリティのために複数の認証メカニズムを含みます。
送信されるヘッダー
| ヘッダー | 説明 |
|---|---|
token | API シークレット (下位互換性のため) |
X-FastComments-Timestamp | リクエストが署名されたときの Unix タイムスタンプ(秒) |
X-FastComments-Signature | ペイロードの HMAC-SHA256 署名 |
HMAC 署名検証(推奨)
Webhook のペイロードが正当で改ざんされていないことを保証するために、HMAC 署名の検証を強く推奨します。
署名形式: sha256=<hex-encoded-signature>
署名の計算方法:
- 連結:
timestamp + "." + JSON_payload_body - API シークレットをキーとして HMAC-SHA256 を計算
- 結果を十六進エンコード
検証例 (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;
}
// タイムスタンプが最近(5 分以内)かを確認
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // リプレイ攻撃防止
}
// 署名を確認
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
検証例 (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
# タイムスタンプが最近かを確認
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# 署名を確認
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}"
検証例 (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// タイムスタンプが最近(5 分以内)かを確認
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// 署名を確認
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
レガシー認証
token ヘッダーは下位互換性のために引き続き送信されますが、リプレイ攻撃から保護するために、セキュリティ向上の観点から HMAC 検証への移行を推奨します。
APIを使用したWebhookの管理 
WebhookはREST APIからも管理できます。Zapierなどの統合がダッシュボードを操作せずにコメントイベントを購読する仕組みで、REST Hooksパターン(購読、イベント受信、購読解除)に従います。
APIによる購読は、ダッシュボードで設定されたWebhookと並んで管理されます。コメントイベントは、Webhookの作成方法にかかわらず、そのドメインに一致するすべてのWebhookに対して、それぞれ個別の配信として送られます。
認証
すべてのリクエストには、x-api-keyヘッダー(またはAPI_KEYクエリパラメーター)にAPIキーを、tenantIdクエリパラメーターにテナントIDを指定する必要があります。どちらもダッシュボードのAPI Secretページに表示されています。
購読
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"
}| フィールド | 必須 | 説明 |
|---|---|---|
url | はい | 絶対URL(httpまたはhttps)。 |
event | はい | comment-created、comment-updated、またはcomment-deleted。 |
domain | いいえ | アカウント設定に含まれるドメイン。デフォルトは*で、すべてのドメインのイベントを受け取ります。 |
method | いいえ | POST(デフォルト)、PUT、またはDELETE。 |
レスポンスには購読情報が含まれます:
{
"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"
}
}
同じURLを同じイベントとドメインに対して再度購読しようとすると、重複が作成される代わりに既存の購読が返されるため、クライアントは安全にリトライできます。テナントごとに最大50件のAPI購読が可能です。
一覧取得
GET https://fastcomments.com/api/v1/webhooks?tenantId=YOUR_TENANT_ID
テナントのすべてのWebhookを返します。ダッシュボードで管理されているもの("source": "dashboard")も含まれます。event、domain、sourceでフィルターできます。
購読解除
DELETE https://fastcomments.com/api/v1/webhooks/SUBSCRIPTION_ID?tenantId=YOUR_TENANT_ID
購読を削除すると、その購読のためにキューに残っているイベントも破棄されます。この方法で削除できるのはAPI経由で作成された購読のみです。ダッシュボードのWebhookや、アカウントに存在しないIDを指定した場合は、コードnot-foundとともに404が返されます。ダッシュボードのWebhookはWebhooksページで編集してください。
ペイロードと署名
配信にはダッシュボードのWebhookと同じペイロードが使用され(データ構造を参照)、同じHMACスキームで署名されます(セキュリティとAPIトークンを参照)。API購読では従来のtokenヘッダーは送られないため、代わりにX-FastComments-Signatureヘッダーを検証してください。
サンプルペイロード
GET https://fastcomments.com/api/v1/webhooks/sample-payloads?tenantId=YOUR_TENANT_ID&event=comment-created&limit=3
アカウントの最新のコメントを、配信時に含まれるのとまったく同じ形式で返します。これにより、最初のイベントが届く前に統合側で実際のサンプルデータを表示できます。eventは省略可能で、検証のみ行われます。すべてのイベントで同じコメントオブジェクトが配信されるためです。limitのデフォルトは3で、1から10まで指定できます。APIクレジットを2消費します。
{
"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での応答
API購読のエンドポイントがHTTP 410 Goneで応答した場合、FastCommentsはそれを購読解除として扱います。購読はキューに残っているイベントとともに削除され、それ以降の配信は試行されません。ダッシュボードで設定されたWebhookが自動的に削除されることはなく、これらにとって410は通常の失敗です。その他の失敗ステータスはリトライされ、最終的にWebhookが無効化されます。詳細は「仕組みとリトライの処理」を参照してください。
ダッシュボード
API購読は、ソースがAPIとしてWebhooks一覧に表示され、管理者はそこで編集、無効化、再有効化、削除を行えます。
仕組みとリトライの処理 
システム内の Comment オブジェクトへのすべての変更は、イベントを発生させ、そのイベントはキューに送られます。
最初の webhook イベントは通常、イベント発生から6秒以内に送信されます。
API がダウンした場合に備えて、このキューは Webhooks 管理画面で監視できます。
あなたの API へのリクエストが失敗した場合、当社はそれをスケジュールに基づいて再キューします。
そのスケジュールは 1 Minute * the retry count です。コールが1回失敗した場合は1分後に再試行します。2回失敗した場合は2分待ち、以降同様に増えていきます。これは、負荷に関連する理由で API がダウンしている場合に、あなたの API に過剰な負荷をかけないためです。
Webhooks はログページからキャンセルできます。
結論
これで Webhooks ドキュメントは終了です。
FastComments の Webhook 統合がわかりやすく、迅速に設定できることを願っています。
ドキュメントに不備があると感じた場合は、下記からお知らせください。