Webhook ドキュメント

Webhook は、LMS プラットフォーム内で発生したイベント(学習進捗更新、テスト結果、RAG インデックス更新など) を外部システムにリアルタイムで通知する仕組みです。 自社システムやデータレイク、Teams Bot などと連携するために利用します。


1. Webhook の基本仕様

  • リクエスト形式: HTTP POST
  • Content-Type: application/json
  • 再送: 最大 3 回のリトライ(5秒間隔)
  • 署名付き(HMAC-SHA256) による検証に対応

Webhook は非同期で送信され、イベント発火順に配信が保証されます(同一ユーザー・同一プロジェクト内)。

2. セキュリティ(署名検証)

すべての Webhook リクエストには X-LMS-Signature ヘッダーが付与されます。

X-LMS-Signature: sha256=abcdef123456...

署名は以下の式で生成されています:

signature = HMAC_SHA256(webhook_secret, request_body)
■ C#(署名検証コード例)
var secret = "your_webhook_secret";
var body = await new StreamReader(Request.Body).ReadToEndAsync();

using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var computed = hmac.ComputeHash(Encoding.UTF8.GetBytes(body));
var computedHex = BitConverter.ToString(computed).Replace("-", "").ToLower();

var signature = Request.Headers["X-LMS-Signature"].ToString().Replace("sha256=", "");

if (computedHex != signature)
{
    return Unauthorized();
}

3. Webhook イベント一覧

イベント 説明
user.progress.updated ユーザーの学習進捗が更新された
user.test.completed テスト・クイズを完了した
curriculum.course.updated コース内容が更新された
rag.index.rebuilt RAG インデックスが再構築された
rag.crawl.completed クローラーがデータ取得を完了した
admin.user.created 新規ユーザーが作成された

4. Webhook 受信例

■ user.progress.updated
{
  "event": "user.progress.updated",
  "timestamp": "2025-03-01T12:40:00Z",
  "data": {
    "userId": "USR-1034",
    "courseId": "CRS-AI-101",
    "progress": 68,
    "updatedBy": "yamada@company.com"
  }
}
■ rag.index.rebuilt
{
  "event": "rag.index.rebuilt",
  "timestamp": "2025-03-01T09:10:15Z",
  "data": {
    "indexId": "IDX-2025-02-28",
    "documentsIndexed": 4321,
    "duration": "83 seconds",
    "status": "success"
  }
}

5. リトライ仕様

  • 200 OK を返した場合 → 配信成功
  • 200 以外 → 5秒間隔で最大 3 回リトライ
  • 3 回失敗 → Dead-letter リストに保存(管理画面で確認可能)

6. 受信エンドポイントの要件

Webhook 受信サーバーは以下を満たす必要があります。

  • HTTPS を必須
  • POST メソッドのみ
  • Content-Type: application/json に対応
  • 署名検証を実装することが推奨

7. テスト送信(管理画面)

RAG 管理者画面 / 管理者画面から テスト Webhook 送信 を実行できます。 本番イベントを待たずに接続確認できます。


次:RAG パイプライン ドキュメントへ →