WebhookAPI

投稿が公開された瞬間も、されなかった瞬間もすぐわかる

URLを一度登録すれば、配信が確定するたびにFoPostがそのURLを呼び出します。各イベントには投稿ID、アカウント、プラットフォーム、パーマリンクまたはエラー内容が含まれるため、ポーリングなしでシステムが反応できます。

POST /v1/webhooks
curl -X POST https://api.fopost.com/v1/webhooks \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workspaceId": "9b2f6c1e-...",
    "url": "https://yourbrand.com/hooks/social",
    "events": ["delivery.published", "delivery.failed", "post.published", "post.failed"]
  }'

確定時に発行

アカウントへの配信ごとに1イベント。ネットワークが承認または拒否した時点ですぐに送信されます。

署名付き

すべてのリクエストに署名ヘッダーが付くため、送信元を検証できます。

再試行

2xx以外のレスポンスは、イベントを破棄する前にバックオフ付きで再試行されます。

イベント

公開のライフサイクル全体をイベントでカバー

delivery.publishedは、ネットワークが1つのアカウントへの配信を受け付けたときに発行され、パーマリンクを含みます。delivery.failedは公開できないときに発行され、プラットフォームのエラー内容を含みます。post.publishedとpost.failedは、すべてのアカウントの結果が確定したあと、投稿ごとに1回発行されます。

Webhookリファレンスを読む
delivery.published
{
  "event": "delivery.published",
  "data": {
    "postId": "7d3e0a52-...",
    "postAccountId": "a3c5e7f9-...",
    "accountId": "4a71d80b-...",
    "platform": "linkedin",
    "externalUrl": "https://linkedin.com/feed/update/..."
  },
  "timestamp": "2026-09-01T09:00:07Z"
}

delivery.published

パーマリンクをそのまま保存したり、CMSからリンクしたりできます。

delivery.failed

ネットワーク自身のエラーメッセージが届くので、推測せずに原因を直せます。

ワークスペースごと

Webhookは1つのワークスペースに属し、そのワークスペースの投稿だけを扱います。

確認

処理する前にペイロードを検証

各リクエストは、Webhook作成時に返されるシークレットで署名されています。生のボディから署名を計算してヘッダーと比較し、一致しないものは拒否してください。2xxをすばやく返し、処理はそのあとに行います。

署名の検証を見る
ハンドラー
app.post('/hooks/social', async (req, res) => {
  const signature = req.header(SIGNATURE_HEADER) // header name is in the docs;
  if (!verify(req.rawBody, signature, process.env.WEBHOOK_SECRET)) {
    return res.status(401).end();
  }
  const { event, data } = req.body;
  await queue.add(event, data);
  res.status(200).end();
});

署名ヘッダー

作成時に受け取ったシークレットで検証します。ローテーションは作り直しで行います。

タイムスタンプ付き

timestampを使えば、古いリプレイを無視し、イベントを正しい順序で処理できます。

IDによる冪等性

再試行には同じイベントIDが付くため、二重配信は簡単に除外できます。

管理

エンドポイントの作成、一覧、削除をコードから

WebhookはシンプルなAPIオブジェクトです。環境ごとに1つ作成し、一覧で登録内容を監査し、不要になったものは削除します。開発中はステージングのURLに向け、本番への切り替えは1回の呼び出しで済みます。

開発を始める
スケジュール、フィード、複数のネットワークで動く自動化

エンドポイントの一覧

GET /v1/webhooksで、すべてのURLと購読しているイベントを確認できます。

環境ごと

ステージング用に別のURLを登録すれば、テスト投稿が本番に届くことはありません。

webhooksスコープ

エンドポイントの管理には専用のスコープが必要です。投稿専用のキーでは追加できません。

Webhookに関するよくある質問

どんなイベントがありますか?

投稿、配信、アカウント、受信箱、自動化のイベントがあります。delivery.publishedとdelivery.failedはアカウントごとに1回発行されるため、3つのネットワークへの投稿では最大3回発行されます。post.publishedとpost.failedは投稿ごとに1回です。

Webhookはどう検証しますか?

Webhookを作成し、レスポンスに含まれるシークレットを保存します。毎回の呼び出しで、そのシークレットを使って生のリクエストボディから署名を計算し、署名ヘッダーと比較します。

エンドポイントがダウンしていたら?

2xx以外のレスポンスやタイムアウトは、バックオフ付きで再試行されます。2xxをすばやく返し、イベントはバックグラウンドで処理すれば、余裕を持って時間内に収まります。

特定のアカウントのイベントだけを受け取れますか?

配信イベントにはaccountIdとplatformが含まれるので、受信側で絞り込んでください。Webhookの範囲は個々のアカウントではなく、ワークスペースです。

実際に公開せずにテストできますか?

リクエストをキャプチャするURLにWebhookを向け、テスト用アカウントへの投稿を予約してください。イベントはどの環境でも同じ形式です。

Webhookは必須ですか?

いいえ。GET /v1/posts/:id/deliveriesで、同じステータスを必要なときに取得できます。Webhookを使えばポーリングが不要になります。

今日からWebhookで開発を

無料で始められ、API全体が含まれます。キーを作成すれば、数分で最初の呼び出しができます。

APIキーを取得