This episode discusses webhooks in n8n: building webhook-driven workflows that receive events from external systems, exposing API endpoints from the workflow itself, and applying webhook security and payload validation so endpoints aren't easily abused.

In episode 8 you connected workflows to popular services via native integrations: email, Slack, Google Workspace, GitHub, and databases — all with reusable centralized credentials. The pattern used there is always the same: n8n calls other services. Now it's time for the reverse direction.
This episode covers Webhooks & API Automation. You'll learn to build webhook-driven workflows that receive events from external systems, expose API endpoints from n8n workflows themselves, then secure them with payload validation and authentication. By the end of this episode, your workflows can become standalone mini-APIs.
The Webhook node is the most versatile trigger for receiving incoming calls. When you activate a workflow with this node, n8n provides a unique URL that other systems can call — whether POST, GET, or another HTTP method, with JSON or Form-Data body formats.
curl -X POST "https://n8n.example.com/webhook/order-created" \
-H "Content-Type: application/json" \
-d '{"order_id":"ORD-123","total":250000,"email":"budi@example.com"}'There are two modes of how n8n webhooks work that you need to understand:
When a payload arrives, the webhook produces one item with the entire body — fields like body and headers can be read directly via the expression $json.body.order_id. The usual next pattern: validate, process, then store or forward to the target system. This is the foundation of every event-driven integration.
One important detail about the webhook lifecycle: while a workflow is inactive or being edited, incoming requests are rejected with a 404 code. This means webhooks aren't suitable for traffic that can't afford to fail — for that, use a queue or message broker system as a buffer, then poll from n8n. However, for the vast majority of cases — notifications, event synchronization, form submissions — n8n webhooks are more than enough.
Since anyone can call a webhook, incoming payloads can't be trusted at face value. Always validate before processing: make sure required fields exist and formats are correct, reject odd data quickly and cheaply.
{
"order_id": "ORD-123",
"email": "budi@example.com",
"total": 250000
}The validation pattern: an IF node checks for the presence of order_id and email, then if valid, proceeds to processing; if not, returns a 400 response and logs it. Also add data type validation — for example total must be a number — with n8n expressions in the condition panel. Validating early prevents corrupt data from spreading through the entire pipeline, and prevents database nodes from failing on input that doesn't match the schema.
Test this pattern directly: send a payload with missing fields or wrong types using curl, then make sure the workflow responds with a clear code, not an internal error that confuses the caller. A webhook that validates well is a webhook that's easy for others to integrate.
A webhook-driven workflow is a pattern where the workflow is triggered by an event, not by a schedule. This is the key pattern for integrations that need fast reactions. Real examples:
payment.success event → the workflow verifies the signature, matches the order, then sends a confirmation email and records it in the database.pull_request.opened event → the workflow assigns a reviewer and writes an automatic comment.The advantage of this pattern over polling: the reaction happens instantly when the event appears, without the overhead of periodically checking an API. As long as the endpoint is reachable over the internet, the workflow reacts immediately — perfect for real-time integrations.
This pattern is very common in payment and form integrations. A concrete example with a payment gateway: every incoming event is verified first, then the order data is matched against the database, and if everything is valid, the workflow updates the order status and sends confirmation. If verification fails, the event is rejected with a 401 response and logged — without touching any data.
Info
Choose polling (episode 5) when you control the check frequency and the provider doesn't support webhooks. Choose webhooks when instant reactions matter more and the provider can send events.
Not only does it receive events — an n8n workflow can also behave like a full API endpoint with responses. The key is the Respond to Webhook node, which sends a reply to the caller, either as static JSON or taking data from the result of previous node processing.
{
"status": "success",
"order_id": "ORD-123",
"processed_at": "2026-08-03T10:15:00.000Z"
}The typical flow: the webhook receives a request → a Function or Code node processes it → Respond to Webhook returns the result. This lets you build simple APIs without a dedicated server: validate input, call a database, send results. Also add a Webhook node with the GET method to create an endpoint testable via the browser — a quick pattern for mock services or internal endpoints.
One thing often overlooked: behavior when processing is slow. An incoming webhook call waits for the workflow to finish before sending the response, so requests that take a long time can time out on the caller's side. For heavy operations, split into two patterns: the webhook receives and immediately answers "processed", then continues the work on a following branch; or the webhook stores the request in a queue and another workflow (triggered by cron) completes the work. Choose as needed — fast responses for user experience, or full processing for work that genuinely takes long.
An open endpoint on the internet is a risk. There are several layers of defense you can install, from simple to strong:
user and password on every incoming request, configured directly on the webhook node.curl -X POST "https://n8n.example.com/webhook/order-created" \
-H "Authorization: Bearer secret-token-lama-besar" \
-H "Content-Type: application/json" \
-d '{"order_id":"ORD-123"}'The most common combination in production: Header Auth for internal integrations plus signature verification in a Function node for public providers. Never rely solely on webhook URL secrecy — that's not authentication.
Beyond the layers above, make a habit of monitoring webhook endpoints in the Executions tab: see which requests came in, how many succeeded, and whether there are odd patterns like repeated calls from the same IP or suspicious payloads. A public endpoint is an attack surface; making it visible is the cheapest security step.
Episode 9 opened the inbound side of automation: the Webhook node as the gateway for external events, payload validation so bad data doesn't enter the pipeline, webhook-driven patterns for real-time reactions, Respond to Webhook to turn workflows into API endpoints, and security layers from basic auth to signature verification.
Key takeaways:
IF — don't trust external input without checks.Respond to Webhook turns a workflow into an API endpoint with controlled responses.In the next episode we enter data storage: we'll break down database & storage automation — connecting PostgreSQL, MySQL, MongoDB, and Redis, processing batch records, and handling file uploads and downloads in workflows. See you there!