目次

n8n Webhook 入門:外部データの受信と応答

Webhookを使うと、イベント発生時に外部サービスからn8nへ通知できます。たとえば、次のような場合です。

  • Webサイトのフォームが送信された
  • 決済サービスから支払い完了の通知が届いた
  • GitHubで新しいPull Requestが作成された
  • 自作プログラムからn8nのワークフローを起動したい

n8nのWebhookノードはURLを生成します。このURLにHTTPリクエストを送ると、ワークフローが起動します。

Webhookを作成する

  1. ワークフローを新規作成し、最初のノードに Webhook を選択します。
  2. 次の項目を設定します。
    • HTTP Method:通常はPOST
    • Path:URLのパス。たとえば contact-form
    • Respond:応答するタイミング(下記を参照)

ノードの上部に2つのURLが表示されます。

URL形式有効になるタイミング
Test URLhttps://あなたのドメイン/webhook-test/contact-formListen for test eventを押した後、リクエストを1回受信します
Production URLhttps://あなたのドメイン/webhook/contact-formワークフローを公開した後
Test URLとProduction URLを表示するWebhookノード
Webhookノード:上部でTest URLとProduction URLを切り替えられます。ここに表示されたURLはlocalhostなので、外部公開用のURLがまだ設定されていません

よくある間違いは、外部サービスにTest URLを設定し、ワークフローの公開後にデータを受信できなくなることです。本番で使うときは、必ずProduction URLに切り替えてください。

テストする

  1. Listen for test eventを押します。
  2. ターミナルからリクエストを送信します。
curl -X POST https://あなたのドメイン/webhook-test/contact-form \\
  -H "Content-Type: application/json" \
  -d '{"name": "王小明", "email": "ming@example.com", "message": "想詢問報價"}'\
  1. WebhookノードのOUTPUTに受信したデータが表示されます。
{
  "headers": { "content-type": "application/json", "...": "..." },
  "params": {},
  "query": {},
  "body": {
    "name": "王小明",
    "email": "ming@example.com",
    "message": "想詢問報價"
  }
}

後続のノードでは {{ $json.body.name }} を使って受信データを読み取れます。URLパラメーター(?id=123)は {{ $json.query.id }} で取得します。

応答方法

Respondの設定で、n8nが応答するタイミングと呼び出し元に返す内容を決めます。

選択肢動作
Immediatelyリクエストを受信するとすぐに応答し、ワークフローはバックグラウンドで実行を続けます
When Last Node Finishesワークフロー全体の実行完了を待ち、最後のノードのデータを返します
Using 'Respond to Webhook' Nodeワークフロー内のRespond to Webhookノードで応答内容を決めます

呼び出し元に「受信した」と知らせるだけでよい場合(決済通知など)はImmediatelyを選びます。処理結果を返す場合(APIとして使うなど)は、Respond to Webhookノードを使います。

n8nでシンプルなAPIを作る

[Webhook GET /price] ─▶ [Google Sheets 查詢] ─▶ [Respond to Webhook]
Webhook、Edit Fields、Respond to Webhookで構成されたワークフロー
Webhook → データを整形 → Respond to WebhookでJSONを返す

Respond to Webhookノードでは、次の項目を設定できます。

  • Respond With:JSON、テキスト、バイナリファイル、リダイレクト
  • Response Code:たとえば200、404
  • Response Headers:たとえばCORSヘッダー


{ "product": "{{ $json.name }}", "price": {{ $json.price }} }

パスパラメーター

Pathには変数を含められます。

orders/:orderId

/webhook/orders/A123を呼び出すと、{{ $json.params.orderId }}の値はA123になります。

リクエストを認証する

Production URLは公開されているため、URLを知っている人なら誰でも呼び出せます。次の方法で保護してください。

  1. Authenticationオプションを使います。Basic Auth、Header Auth、JWT Authを選べます。たとえばHeader Authで名前をX-API-Keyに設定した場合、呼び出し元は正しい値を送る必要があります。
  2. 署名を検証する:Stripe、GitHub、LINEなど多くのサービスはHeaderに署名を含めます。Codeノードで検証できます。
  3. IP許可リストを設定する:WebhookのOptionsで IP(s) Whitelist を設定します。
  4. 推測されにくいランダムな文字列をパスに使います。

ファイルを受信する

フォームからファイルをアップロードすると(multipart/form-data)、ファイルはbinaryデータに格納されます。Google DriveやExtract from Fileなどのノードにそのまま接続できます。

外部サービスからn8nに接続できるようにする

外部サービスがネットワーク経由でn8nに接続できる必要があります。

  • 本番環境へのデプロイ:ドメインとHTTPSを利用できるサーバーを使い、Webhook URLの環境変数を正しく設定します。設定しないと、n8nに http://localhost:5678/... と表示されます。セルフホストでのデプロイを参照してください。
  • ローカルでのテスト:Cloudflare Tunnelやngrokなどを使うと、ローカルの5678ポートを一時的に外部公開できます。

よくある問題

404:The requested webhook is not registered

  • Test URLを使っている場合:先にListen for test eventを押していないか、すでに1回リクエストを受信しています。
  • Production URLを使っている場合:ワークフローが公開されていません。
  • HTTPメソッドが一致していません(POSTに設定しているのにGETで呼び出しているなど)。

bodyが空で受信される

呼び出し元が Content-Type: application/json ヘッダーを送信していることを確認してください。

外部サービスがタイムアウトを報告する

When Last Node Finishesが選択されていて、ワークフローの実行に時間がかかっています。Immediatelyに変更するか、ワークフローを短縮してください。

更新日 2026年10月12日