Protect public webhooks with Ainoflow Guard rate limiting

Go to Workflow
0 views
Built by Dmitrij Zykovic Dmitrij Zykovic
Created on February 18, 2026

Description

Webhook Rate Limiter (Ainoflow Guard)

Stop webhook flooding before it starts. Add production-grade rate limiting to any n8n webhook in minutes - reject abusive traffic before expensive workflow logic executes.

✨ Key Features

⚑ Edge-style decisions** - Allow/deny checked before any business logic runs
πŸ›‘οΈ Burst protection** - Configurable limits (requests per time window)
πŸ”„ Stateless** - No queues, databases, or counters needed in n8n
πŸ“‘ Proxy-aware** - Correct IP extraction behind Cloudflare, nginx, load balancers
πŸ”‘ Dual identity modes** - Rate limit by IP address or API key
⏱️ Retry-After headers** - Proper 429 responses with retry guidance
πŸ’₯ Fail-open** - Guard outage doesn't block your production traffic
πŸ”§ Auto-setup** - Guard policy auto-creates on first request

🎯 How It Works

Webhook receives POST request

Identity extracted from headers:
API key (x-api-key) β†’ per-client limiting
Client IP (X-Forwarded-For / x-real-ip) β†’ per-IP limiting

Guard decides allow or deny:
POST /api/v1/guard/{route:identity}/counter
Checks against configured rate limit policy

Allowed β†’ your business logic executes β†’ 200 OK

Denied β†’ immediate 429 Too Many Requests + Retry-After header

Client β†’ Webhook β†’ Identity β†’ Guard β†’ Allowed? β†’ Business Logic β†’ 200 OK
↓ NO
429 + Retry-After

πŸ”§ Setup Requirements

Ainoflow** - Sign up free for Guard API access. Free plan available.

That's it. One credential, one API.

⚑ Quick Start

1. Import workflow and set Ainoflow Bearer credential on GuardCheck node

2. Edit Config node with your limits:

| Variable | Default | Description |
|----------|---------|-------------|
| rate_limit | 30 | Max requests per window |
| window_sec | 60 | Window in seconds |
| identity_mode | ip | ip or apiKey |
| route_name | webhook | Endpoint name |

3. Replace BusinessLogic node with your workflow

Access original request:
const body = $('Webhook').first().json.body;
const headers = $('Webhook').first().json.headers;

4. Activate and test

πŸ§ͺ Testing

Burst Test

Bash (Linux/macOS):
for i in {1..50}; do
curl -s -o /dev/null -w "%{http_code}\n" \
-X POST https://your-n8n.com/webhook/rate-limited-endpoint \
-H "Content-Type: application/json" \
-d '{"test": true}'
done

PowerShell (Windows):
1..50 | ForEach-Object {
(Invoke-WebRequest -Uri "https://your-n8n.com/webhook/rate-limited-endpoint" -Method POST -Body '{"test":true}' -ContentType "application/json" -UseBasicParsing).StatusCode
}

Expected: First 30 β†’ 200, remaining β†’ 429

Proxy Test

curl -H "X-Forwarded-For: 1.2.3.4, 5.6.7.8" \
-X POST https://your-n8n.com/webhook/rate-limited-endpoint

Identity key should use 1.2.3.4 (first IP from chain).

πŸ’¬ Response Examples

Allowed (200 OK)

{
"ok": true,
"data": { "message": "Request processed successfully" }
}

Denied (429 Too Many Requests)

Headers: Retry-After: 17

{
"ok": false,
"error": "rate_limited",
"retryAfter": 17
}

πŸ—οΈ Workflow Architecture

| Section | Nodes | Description |
|---------|-------|-------------|
| Rate Limit Check | Webhook β†’ Config β†’ BuildIdentity β†’ GuardCheck β†’ IfAllowed | Extract identity, check Guard |
| Allowed Path | BusinessLogic β†’ RespondOk | Your logic + 200 response |
| Denied Path | BuildDeniedResponse β†’ RespondRateLimited | 429 + Retry-After |

Total: 9 nodes. Minimal by design.

πŸ”’ What This Protects Against

βœ… Webhook flooding - bot traffic, retry storms hitting your endpoint
βœ… Credit burn - one runaway loop = €500+ OpenAI/Twilio bill overnight
βœ… Automation overload - uncontrolled DB writes, external API hammering
βœ… Accidental loops - webhook chains triggering each other endlessly

❌ What This Does NOT Replace

Cloudflare / WAF (network-level protection)
Bot detection (behavioral analysis)
Layer 3/4 DDoS mitigation
Authentication (who is the user?)

Guard handles application-level rate decisions, not network security.

πŸ”‘ Identity Modes

IP Mode (default)

Best for public webhooks where clients don't have API keys.

X-Forwarded-For: 1.2.3.4, 5.6.7.8 β†’ identity = "1.2.3.4"
x-real-ip: 10.0.0.1 β†’ identity = "10.0.0.1"

⚠️ IP addresses can be shared (NAT, mobile carriers, offices).

API Key Mode

Best for authenticated endpoints with per-client keys.

x-api-key: client_abc123 β†’ identity = "client_abc123"

Falls back to IP if header is missing.

πŸ› οΈ Customization

Rate Limit Presets

| Use Case | rate_limit | window_sec | Result |
|----------|-----------|------------|--------|
| Burst protection | 30 | 60 | 30/min |
| API rate limiting | 100 | 3600 | 100/hour |
| LLM cost protection | 10 | 60 | 10/min |
| Daily limit | 1000 | 86400 | 1000/day |

Multiple Endpoints

Use different route_name values to create separate rate limits:

Config A: route_name = "orders" β†’ key = "orders:1.2.3.4"
Config B: route_name = "payments" β†’ key = "payments:1.2.3.4"

Each route has independent counters.

Fail-Open vs Fail-Closed

Default: Fail-open - Guard API uses failOpen=true, so Guard outage doesn't block traffic.

To switch to fail-closed: change failOpen query parameter to false in GuardCheck node.

Combine with Shield (Dedup Protection)

Getting duplicate webhook deliveries? Add Ainoflow Shield before your business logic - one trigger, one execution, guaranteed. Guard + Shield = rate limiting + deduplication on the same endpoint.

⚠️ Important Notes

Guard policy auto-creates** on first request with rateMax/rateWindow parameters
allowPolicyOverwrite=true* is set for easy demo/testing - Config node values always apply. *Production:** set to false in GuardCheck query params to lock policy and prevent hidden config drift
Denied requests not counted** - only successful requests increment the counter
Window resets atomically** - no gradual decay, clean reset every N seconds
No state in n8n** - all rate limiting state lives in Guard API
5-second timeout** - GuardCheck has 5s timeout to prevent blocking

πŸ’Ό Need Customization?

Want to add temporary bans, cost protection mode, multi-tier rate limiting, or per-client usage dashboards?

Ainova Systems - We build custom AI automation infrastructure and safety layers for production workflows.

Tags: webhook, rate-limiting, security, guard, burst-protection, api-protection, ainoflow, production, webhook-security, cost-control

Nodes Used (2)

Code
n8n-nodes-base.code
HTTP Request
n8n-nodes-base.httpRequest