コンテンツにスキップ

Webhook でワークフローを起動する

DAG ワークフローには、外から POST するだけで起動できる URL を 1 本発行できます。手元の スクリプト、社内のサービス、ブラウザ拡張の「送る」ボタンなどから、ワークフローを走らせられます。

このページは意図的に 1 ページで完結させてあります。これだけを渡せば組み込める状態にするため です (人に渡す場合も、コーディング支援の AI に渡す場合も)。言語モデル向けのプレーンテキスト版は /ja/llms-dag-webhook.txt にあります。

ワークフローをプロジェクトに配置すると、その配置ごとに秘密のトークンを含む URL を発行できます。 その URL に JSON オブジェクトを POST すると、body がそのまま start ノードの出力になり、下流の ノードがその形のまま受け取ります。認証は URL に入っているトークンだけで、ヘッダも署名もありません。

値見た目どこから
Webhook URLhttps://minionworkspace.com/api/dag/webhooks/<token>プロジェクトのワークフローを開き、Webhook トリガーの欄で有効化 → コピー
  • ホストは Minion を開いているオリジンと同じです。 ワークスペース ID もプロジェクト ID も パスには出てきません。パスは /api/dag/webhooks/<token> だけで、どこに届くかはトークンが 決めます。
  • URL は「ワークフロー × プロジェクト」ごとに 1 本です。 同じワークフローを 2 つの プロジェクトに配置しているなら URL は別々で、どちらのプロジェクトのメンバー・ロール・ コンテキストで走るかは URL が決めます。呼ぶ側がプロジェクトを指定することはできません。
  • トークンは 32 バイトの乱数 (base64url、43 文字) です。URL 全体が資格情報なので、 環境変数に置いてください (例: MINION_WEBHOOK_URL)。NEXT_PUBLIC_・PUBLIC_・VITE_ を 付けてはいけません。付けるとブラウザに配る JavaScript に埋め込まれます。
  • 画面では URL のトークン部分が伏せられていますが、コピーは常にフルの URL をコピーします。 発行時にしか読めない類のものではないので、無くしたら画面から取り直せます。
操作起きること
有効化トークンを発行して URL が使えるようになる
Rotate token新しいトークンを発行。古い URL は即座に 404 になる。漏れたときはこれ
無効化URL が無効になる。トークンは破棄されます

「一時停止」のつもりで無効化しないでください。 もう一度有効化すると別の URL が発行され、 呼び出し側の設定を書き換える必要があります。

Terminal window
curl -i -X POST "$MINION_WEBHOOK_URL" \
-H 'content-type: application/json' \
-d '{"source": "chrome-extension", "url": "https://example.com/x/status/123"}'

認証ヘッダはありません。 Authorization: Bearer ... も X-...-KEY も署名も使いません。 URL に入っているトークンが唯一の資格情報です。余分なヘッダを付けても読まれず、エラーにもなりません。

URL そのものが鍵なので、ログ・エラー通知・Referer・スクリーンショットに URL を出さない ようにしてください。

ヘッダ必須備考
Content-Type: application/json必須無いと 415。application/json; charset=utf-8 も可
それ以外—読まれません

メソッドは POST だけです。GET などは 405 になります。

決まった箱はありません。 title / body / url のような固定のフィールド名は定義されて いません。好きなキーに好きな型 (文字列・数値・真偽値・配列・ネストしたオブジェクト) を 入れて構いません。封筒 ({"payload": {...}} のような包み) も付けません。送ったオブジェクトが そのまま start ノードの output_data になり、下流のノードがその形で受け取ります。

制約内容
トップレベルの型JSON オブジェクト 1 つ。配列・null・数値・文字列は 400
空ボディ400。何も渡さないときも {} を送ってください
大きさ1MB まで (Content-Length で判定、超えると 413)

受け取り側が形を決めている場合がある

Section titled “受け取り側が形を決めている場合がある”

ワークフローの start ノードに input_contract が 設定されているか、start から出るエッジに contract が貼られていると、body はその型を満たす 必要があり、満たさなければ実行は 1 ノードも走らずに 400 で弾かれます。レスポンスの violations に、どのフィールドがどう違うかが入ります。

contract があるかどうかは、呼ぶ側からは事前に分かりません。 ワークフローを作った人に 「start に contract があるか、あるならフィールド名と型」を聞いてください。設定されていなければ、 どんなオブジェクトでも通ります。

HTTP/1.1 201 Created
{ "execution_id": "3f0c…", "root_nodes": 1, "total_nodes": 7 }

201 は「受理して実行を作った」という意味で、完了ではありません。 ワークフロー本体は この後ミニオン側で非同期に走ります。

外から進捗や結果を取る API はありません。 execution_id は HQ の画面で実行を特定するための ID で、実行の状態を返す API はログインセッションを要求するため、Webhook のトークンでは読めません。 結果を呼び出し元に返したい場合は、ワークフローの側から自分のサービスを叩く (最後にスキル ノードや script ノードで POST する) 形にしてください。

本文は必ず {"error": "<英語 1 行>"} です。contract 違反のときだけ violations 配列が付きます。 error はそのままボタンの title やトーストに出せる短さです。

statuserror の例意味・対処
400Request body must be a JSON object配列・スカラー・空ボディを送っている
400Invalid JSON bodyJSON として壊れている
400Payload violates start input contract "X"violations[] に違反箇所。送る形を直す
400Payload violates start outgoing edge contracts同上 (start の出力エッジ側の型)
400DAG workflow has no version / DAG workflow has empty graphワークフローが未保存・空。作った人に連絡
400No PM minion assigned to project配置先プロジェクトに PM ロールのミニオンがいない
404Not foundトークンが違う / Webhook が無効 / 配置が無効。3 つは区別されません (総当たり対策)
409Project is archivedプロジェクトが凍結中。解除は人が HQ で行う
413Payload exceeds 1000000 bytes1MB 超
415Content-Type must be application/jsonヘッダ不足
500Internal server error一時障害

4xx は送り直しても同じ結果です。 直してから送ってください。再送の対象は 5xx と タイムアウトだけですが、次の項を読んでからにしてください。

ありません。 Idempotency-Key ヘッダは読みませんし、ボディにも重複排除用のフィールドは ありません。同じ body を 2 回 POST すれば、実行が 2 本走ります。

タイムアウト時の自動再送が危ないのは、201 が返る前に切れても実行は作られている可能性が あるためです。必要なら次のどちらかにしてください。

  • 呼ぶ側で一意な値 ("source_id": "..." など) を body に入れ、ワークフロー側で処理済みかを 見て弾く
  • 自動再送をせず、失敗はユーザーに見せて手で押し直させる (拡張機能のボタンなら、たいていこれで 足ります)

CORS ヘッダは返しません。 Content-Type: application/json の POST は必ずプリフライトを 起こすため、Web ページの JavaScript から直接呼ぶとブラウザにブロックされます。 これは意図した 挙動です — URL 全体が資格情報なので、ページに配る JS に置いてよいものではありません。

呼び出し元可否
ブラウザ拡張の background / service worker (host_permissions に HQ のオリジンを追加)可
サーバー・CLI・CI・ミニオン可
Web ページのフロントエンドから直接不可。自分のサーバーを経由してください

アプリ側のレート制限はありません。 ただし 1 回の POST が実際にワークフローを 1 本走らせ、 ミニオンの (課金対象の) 計算時間を消費します。ボタン連打がそのまま実行の山になるので、 送る側で二重送信を止めてください (送信中はボタンを無効化する、など)。

  • この口は JSON だけです。 multipart もバイナリも受け付けません。
  • URL を渡すのが素直です。 送信サイズが小さく済み、ワークフロー側のミニオンがその URL を 取りに行けます。ただし取得に認証が要らない URL であること。ログインしないと見えない画像は ミニオンからも取れません。
  • base64 で埋め込むこともできますが、1MB の上限に効きます。 base64 は約 1.37 倍になるため、 実質 700KB 程度の画像が上限です。それを超えるものは URL か、先にドライブへ置く形にしてください。
  • 送った body は実行の記録としてそのまま保存されます。base64 を送ると実行履歴も同じだけ太ります。
  • 404 から疑ってください。 有効化したか / Rotate した後の新しい URL か / そのワークフローの 配置が有効か。この 3 つは区別されずに 404 になります。
  • 201 が返るのに何も起きないように見えるときは、HQ の実行一覧を見てください。実行は 作られていて、下流のノードがミニオンに拾われるのを待っている (または失敗している) はずです。
  • 400 で violations が付いているなら、送る形の問題です。フィールド名・型・必須の 過不足が具体的に書かれています。
方法ペイロード備考
手動画面で入力HQ の実行ボタン
スケジュール (cron)常に {}最短 5 分間隔。プロジェクトの PM ミニオンが発火する
WebhookPOST した JSON オブジェクトこのページ