n8n Webhook node: the complete reference
Updated 2026-10-21 · 6 min read
The n8n Webhook node is a trigger that gives your workflow an HTTP endpoint. Anything that can send an HTTP request (Stripe, GitHub, a form, your own backend) can start the workflow, and the workflow can answer like an API. This reference covers URLs, paths, authentication, the request data you receive, response modes, every option, and the errors that come up most.
Migrating a Pipedream HTTP trigger? The cutover plan for Pipedream HTTP triggers covers switching senders without losing events. This page is about the node itself.
Test URL and production URL
Each Webhook node has two URLs, shown at the top of the node panel (docs):
| Test URL | Production URL | |
|---|---|---|
| Path prefix | /webhook-test/ |
/webhook/ |
| Registered when | You select Listen for test event (or execute the workflow) | You publish the workflow |
| Listens for | 120 seconds | Until you unpublish |
| Data shown in editor | Yes | No, see the Executions tab |
A typical production URL is https://your-n8n.example.com/webhook/orders. On self-hosted n8n the webhook, webhook-test and webhook-waiting prefixes can be changed with N8N_ENDPOINT_WEBHOOK, N8N_ENDPOINT_WEBHOOK_TEST and N8N_ENDPOINT_WEBHOOK_WAIT (endpoint variables).
Most "webhook not working" reports come down to this table: the sender is configured with the test URL, or the workflow was never published.
Path and route parameters
By default the Path is a random UUID, which avoids collisions between workflows. Set your own path when you want a stable, readable endpoint. Route parameters are allowed:
/orders/:orderId
/:tenant/events
/:tenant/orders/:orderId
The values arrive in params, for example $json.params.orderId. n8n allows only one webhook per path and HTTP method across the instance; publishing a second one with the same pair fails until you change one of them.
HTTP methods
DELETE, GET, HEAD, PATCH, POST and PUT. By default a node accepts one method. To accept several, open Settings and turn on Allow Multiple HTTP Methods. The node then has one output per method, so a GET and a POST to the same path can take different branches.
What the workflow receives
The Webhook node outputs one item that includes these parts (plus metadata such as the webhook URL):
{
"headers": { "content-type": "application/json", "x-signature": "..." },
"params": { "orderId": "1042" },
"query": { "dryRun": "true" },
"body": { "id": 1042, "total": 59.9 }
}
Reference them downstream as {{ $json.body.total }}, or from later nodes as {{ $('Webhook').first().json.body.total }}. Query values are strings; convert before comparing numbers.
Payload limit: 16 MB. Self-hosted instances can change it with N8N_PAYLOAD_SIZE_MAX (in MiB). File uploads via form-data have their own limit, N8N_FORMDATA_FILE_SIZE_MAX.
To receive files, add the Binary Property option (POST, PATCH or PUT): the file lands in the binary field you name. To receive data in a raw format such as JSON or XML instead of parsed fields, turn on Raw Body.
Authentication
| Method | Sender must send | Typical use |
|---|---|---|
| None | Nothing | Public forms, senders that sign payloads instead |
| Basic auth | Authorization: Basic … |
Simple internal callers |
| Header auth | A header you define, e.g. X-API-Key: … |
Most server-to-server calls |
| JWT auth | A signed JWT | Callers that already issue JWTs |
The credential is stored like any other n8n credential. On top of auth you can add IP(s) Allowlist: requests from other IPs get a 403. Behind a reverse proxy, set N8N_PROXY_HOPS or the allowlist will see the proxy's IP.
Services like Stripe and GitHub sign the payload rather than sending a shared header. For those, keep Authentication on None and verify the signature first, either with the service's own n8n trigger node where one exists or with the Crypto node. Signature code in a Code node needs crypto, which is blocked in internal runner mode and must be allow-listed (NODE_FUNCTION_ALLOW_BUILTIN=crypto) on self-hosted runners.
Response modes
The Respond parameter decides what the caller gets back:
| Respond | Caller receives | Use when |
|---|---|---|
| Immediately | Response code and "Workflow got started" | Fire-and-forget events, slow workflows |
| When Last Node Finishes | Output of the last node (All Entries, First Entry JSON, First Entry Binary, or No Response Body) | Simple API endpoints |
| Using 'Respond to Webhook' Node | Whatever the Respond to Webhook node defines | Custom status codes, headers, early replies |
| Streaming response | Streamed output | AI agent workflows with streaming nodes |
On n8n Cloud, requests that don't get a response within 100 seconds fail with a Cloudflare 524 (common issues). For anything that may run longer, respond immediately and let the caller poll a second webhook for the result.
Options
| Option | What it does |
|---|---|
| Allowed Origins (CORS) | Comma-separated origins; * by default |
| Binary Property | Store an uploaded file under this binary field |
| Ignore Bots | Skip link previewers and crawlers |
| IP(s) Allowlist | Allowed caller IPs, others get 403 |
| Only Run If | Expression on { body, headers, params, query }; non-matching requests get a 200 without creating an execution |
| Raw Body | Keep the raw request body |
| Response Code / Headers / Content-Type / Data | Shape the response (availability depends on Respond mode) |
| Property Name | Return one key of the first entry instead of the whole object |
Only Run If is handy for webhook senders that post many event types to one URL: {{ $json.body.type === 'invoice.paid' }} ignores everything else without creating executions.
HTML responses are wrapped in a sandboxed iframe since n8n 1.103.0, so relative form actions and scripts that touch the top window won't work.
Testing with curl
curl -X POST https://your-n8n.example.com/webhook-test/orders \
-H 'Content-Type: application/json' \
-H 'X-API-Key: test-key' \
-d '{"id":1042,"total":59.9}'
Select Listen for test event first, then run the command within 120 seconds. Switch to /webhook/ once the workflow is published.
Common errors
| Symptom | Cause | Fix |
|---|---|---|
| 404 on the production URL | Workflow not published | Publish it |
| 404 on the test URL | Not listening | Select Listen for test event, call within 120 s |
| Message that the path and method are already in use | Another published workflow has the same path and method | Change the path or unpublish the other workflow |
| 403 from allowed IPs | n8n is behind a proxy | Set N8N_PROXY_HOPS |
| 524 on Cloud | Response took longer than 100 s | Respond immediately, process async |
| Large requests rejected | Over the 16 MB payload limit | Raise N8N_PAYLOAD_SIZE_MAX (self-hosted) or send a link instead |
From Pipedream HTTP triggers
A Pipedream HTTP trigger gives each workflow a URL on *.m.pipedream.net with a 512 KB body limit by default and returns a 200 "Success!" page unless you call $.respond() (Pipedream triggers). In n8n the same workflow starts with a Webhook node, and $.respond() becomes a Respond to Webhook node. Every sender has to be updated with the new URL, so plan the switch before Pipedream Workflows stops on March 31, 2027.
Our converter creates the Webhook node with the right method and response mode for each HTTP-triggered workflow and lists the URLs you need to change. The report and 1 workflow are free. Full export: $3 per workflow, $19 minimum — coming soon. Full process: migrate Pipedream to n8n.
Not affiliated with Pipedream or n8n.
FAQ
- Why does my n8n webhook URL return 404?
- Usually you are calling the production URL of a workflow that isn't published, or the test URL when nobody clicked Listen for test event. The test URL listens for 120 seconds; the production URL works only after you publish.
- What is the maximum payload size for the n8n Webhook node?
- 16 MB. On self-hosted n8n you can raise it with the N8N_PAYLOAD_SIZE_MAX environment variable.
- How do I secure an n8n webhook?
- Set Authentication to Basic auth, Header auth or JWT auth, and optionally add an IP(s) Allowlist. Requests from IPs outside the allowlist get a 403.
- Can one Webhook node accept both GET and POST?
- Yes. In the node Settings turn on Allow Multiple HTTP Methods. The node then gets one output per method.
- How long can an n8n Cloud webhook take to respond?
- n8n Cloud sits behind Cloudflare, so a webhook that doesn't respond within 100 seconds fails with a 524. Respond immediately and process in the background for long jobs.
Related
Sources
- https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook
- https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/common-issues
- https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/workflow-development
- https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/endpoints
- https://pipedream.com/docs/workflows/building-workflows/triggers