Webhooks
Gateway は外部トリガー用の小さな HTTP Webhook エンドポイントを公開できます。
有効化
{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
// オプション: 明示的な `agentId` ルーティングをこの許可リストに制限。
// 省略するか "*" を含めると任意のエージェントを許可。
// [] に設定するとすべての明示的 `agentId` ルーティングを拒否。
allowedAgentIds: ["hooks", "main"],
},
}
補足:
hooks.enabled=trueの場合、hooks.tokenは必須です。hooks.pathのデフォルトは/hooks。
認証
すべてのリクエストに hook トークンを含める必要があります。ヘッダーでの指定を推奨:
Authorization: Bearer <token>(推奨)x-openclaw-token: <token>- クエリ文字列のトークンは拒否されます(
?token=...は400を返します)。
エンドポイント
POST /hooks/wake
ペイロード:
{ "text": "System line", "mode": "now" }
text必須(string): イベントの説明(例: “New email received”)。modeオプション(now|next-heartbeat): 即座に Heartbeat をトリガーするか(デフォルトnow)、次の定期チェックまで待つか。
効果:
- メインセッションにシステムイベントをキュー
mode=nowの場合、即座に Heartbeat をトリガー
POST /hooks/agent
ペイロード:
{
"message": "Run this",
"name": "Email",
"agentId": "hooks",
"sessionKey": "hook:email:msg-123",
"wakeMode": "now",
"deliver": true,
"channel": "last",
"to": "+15551234567",
"model": "openai/gpt-5.2-mini",
"thinking": "low",
"timeoutSeconds": 120
}
message必須(string): エージェントが処理するプロンプトまたはメッセージ。nameオプション(string): hook の人間向け名称(例: “GitHub”)。セッションサマリーのプレフィックスとして使用。agentIdオプション(string): この hook を特定のエージェントにルーティング。不明な ID はデフォルトのエージェントにフォールバック。設定時、hook は解決されたエージェントのワークスペースと設定を使用して実行。sessionKeyオプション(string): エージェントのセッションを識別するキー。hooks.allowRequestSessionKey=trueでなければこのフィールドは拒否されます。wakeModeオプション(now|next-heartbeat): 即座に Heartbeat をトリガーするか(デフォルトnow)、次の定期チェックまで待つか。deliverオプション(boolean):trueの場合、エージェントの応答をメッセージングチャネルに送信。デフォルトはtrue。Heartbeat の確認応答のみの場合は自動スキップ。channelオプション(string): 配信用のメッセージングチャネル。last、whatsapp、telegram、discord、slack、mattermost(プラグイン)、signal、imessage、msteamsのいずれか。デフォルトはlast。toオプション(string): チャネルの受信者識別子(WhatsApp/Signal は電話番号、Telegram はチャット ID、Discord/Slack/Mattermost(プラグイン)はチャネル ID、MS Teams は会話 ID)。デフォルトはメインセッションの最後の受信者。modelオプション(string): モデルオーバーライド(例:anthropic/claude-3-5-sonnetまたはエイリアス)。制限されている場合は許可モデルリストに含まれている必要あり。thinkingオプション(string): 思考レベルオーバーライド(例:low、medium、high)。timeoutSecondsオプション(number): エージェント実行の最大時間(秒)。
効果:
- 分離されたエージェントターンを実行(独自のセッションキー)
- 常にメインセッションにサマリーを投稿
wakeMode=nowの場合、即座に Heartbeat をトリガー
セッションキーポリシー(破壊的変更)
/hooks/agent ペイロードの sessionKey オーバーライドはデフォルトで無効です。
- 推奨: 固定の
hooks.defaultSessionKeyを設定し、リクエストによるオーバーライドはオフのまま。 - オプション: 必要な場合のみリクエストによるオーバーライドを許可し、プレフィックスを制限。
推奨設定:
{
hooks: {
enabled: true,
token: "${OPENCLAW_HOOKS_TOKEN}",
defaultSessionKey: "hook:ingress",
allowRequestSessionKey: false,
allowedSessionKeyPrefixes: ["hook:"],
},
}
互換性設定(レガシー動作):
{
hooks: {
enabled: true,
token: "${OPENCLAW_HOOKS_TOKEN}",
allowRequestSessionKey: true,
allowedSessionKeyPrefixes: ["hook:"], // 強く推奨
},
}
POST /hooks/<name>(マッピング済み)
カスタム hook 名は hooks.mappings で解決されます(設定を参照)。マッピングにより、任意のペイロードを wake または agent アクションに変換でき、テンプレートやコード変換もオプションで利用可能です。
マッピングオプション(概要):
hooks.presets: ["gmail"]で組み込みの Gmail マッピングを有効化。hooks.mappingsで設定内にmatch、action、テンプレートを定義。hooks.transformsDir+transform.moduleでカスタムロジック用の JS/TS モジュールを読み込み。hooks.transformsDir(設定時)は OpenClaw 設定ディレクトリ配下の transforms ルート内に留まる必要があります(通常~/.openclaw/hooks/transforms)。transform.moduleは有効な transforms ディレクトリ内で解決される必要があります(トラバーサル/エスケープパスは拒否)。
match.sourceを使って汎用的なインジェストエンドポイント(ペイロード駆動のルーティング)を維持。- TS 変換にはランタイムで TS ローダー(例:
bunやtsx)またはプリコンパイルされた.jsが必要。 - マッピングに
deliver: true+channel/toを設定して返信をチャットにルーティング(channelのデフォルトはlastで WhatsApp にフォールバック)。 agentIdで hook を特定のエージェントにルーティング。不明な ID はデフォルトのエージェントにフォールバック。hooks.allowedAgentIdsで明示的なagentIdルーティングを制限。省略(または*を含む)で任意のエージェントを許可。[]で明示的なagentIdルーティングを拒否。hooks.defaultSessionKeyで明示的なキーが提供されない場合の hook エージェント実行のデフォルトセッションを設定。hooks.allowRequestSessionKeyで/hooks/agentペイロードがsessionKeyを設定できるか制御(デフォルト:false)。hooks.allowedSessionKeyPrefixesでリクエストペイロードやマッピングからの明示的なsessionKey値をオプションで制限。allowUnsafeExternalContent: trueでその hook の外部コンテンツ安全ラッパーを無効化(危険。信頼できる内部ソースのみ)。openclaw webhooks gmail setupはopenclaw webhooks gmail run用のhooks.gmail設定を書き込み。 Gmail watch の完全なフローについては Gmail Pub/Sub を参照。
レスポンス
200:/hooks/wake200:/hooks/agent(非同期実行を受付)401: 認証失敗429: 同一クライアントからの認証失敗の繰り返し後(Retry-Afterを確認)400: 無効なペイロード413: ペイロードサイズ超過
例
curl -X POST http://127.0.0.1:18789/hooks/wake \
-H 'Authorization: Bearer SECRET' \
-H 'Content-Type: application/json' \
-d '{"text":"New email received","mode":"now"}'
curl -X POST http://127.0.0.1:18789/hooks/agent \
-H 'x-openclaw-token: SECRET' \
-H 'Content-Type: application/json' \
-d '{"message":"Summarize inbox","name":"Email","wakeMode":"next-heartbeat"}'
異なるモデルの使用
エージェントペイロード(またはマッピング)に model を追加して、その実行のモデルをオーバーライドします:
curl -X POST http://127.0.0.1:18789/hooks/agent \
-H 'x-openclaw-token: SECRET' \
-H 'Content-Type: application/json' \
-d '{"message":"Summarize inbox","name":"Email","model":"openai/gpt-5.2-mini"}'
agents.defaults.models を強制している場合は、オーバーライドモデルがそこに含まれていることを確認してください。
curl -X POST http://127.0.0.1:18789/hooks/gmail \
-H 'Authorization: Bearer SECRET' \
-H 'Content-Type: application/json' \
-d '{"source":"gmail","messages":[{"from":"Ada","subject":"Hello","snippet":"Hi"}]}'
セキュリティ
- hook エンドポイントはループバック、tailnet、または信頼できるリバースプロキシの背後に配置してください。
- 専用の hook トークンを使用し、Gateway の認証トークンを再利用しないでください。
- 認証失敗の繰り返しはクライアントアドレスごとにレート制限され、ブルートフォース攻撃を減速させます。
- マルチエージェントルーティングを使用する場合は、
hooks.allowedAgentIdsで明示的なagentIdの選択を制限してください。 - 呼び出し元によるセッション選択が不要であれば
hooks.allowRequestSessionKey=falseを維持してください。 - リクエストの
sessionKeyを有効にする場合は、hooks.allowedSessionKeyPrefixesを制限してください(例:["hook:"])。 - Webhook ログにセンシティブな生のペイロードを含めないようにしてください。
- hook ペイロードは信頼できないものとして扱われ、デフォルトで安全境界でラップされます。
特定の hook でこれを無効にする必要がある場合は、そのマッピングで
allowUnsafeExternalContent: trueを設定してください(危険)。