[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6K1X1SP1G142SDWD2GR0GR6":3,"skill-same:01M6K1X1SP1G142SDWD2GR0GR6":106},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":83,"commitSha":84,"skillDirectory":85,"forksCount":86,"repositoryHtmlUrl":87,"repositoryHomepageUrl":6,"ownerHtmlUrl":88,"ownerBlogUrl":89,"ownerDescription":90,"updatedAt":91,"install":92,"resources":105},"01M6K1X1SP1G142SDWD2GR0GR6","vercel-firewall",null,"Vercel Firewall and security expert guidance. Use when configuring DDoS protection, WAF rules, rate limiting, bot filtering, IP allow\u002Fblock lists, OWASP rulesets, Attack Challenge Mode, or any security configuration on the Vercel platform.","NagyVikt\u002Fcodex-plugins","NagyVikt","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F137165288?v=4","01M6K0SJ3R2DAZRJKJJS10VN87","Viktor Nagy","01M6K0SJ9HXN0GBD91QDQ9WNVV",2,"MIT","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-firewall\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"vercel firewall","firewall","vercel","at","bot","mode","loading","middleware","ip","express","get","expert","up","challenge","configure","ddos","ips","SET","routing middleware","code","2026-11-10 10:12:30",false,"---\nname: vercel-firewall\ndescription: Vercel Firewall and security expert guidance. Use when configuring DDoS protection, WAF rules, rate limiting, bot filtering, IP allow\u002Fblock lists, OWASP rulesets, Attack Challenge Mode, or any security configuration on the Vercel platform.\nmetadata:\n  priority: 5\n  docs:\n    - \"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fsecurity\u002Fvercel-firewall\"\n  sitemap: \"https:\u002F\u002Fvercel.com\u002Fsitemap\u002Fdocs.xml\"\n  pathPatterns:\n    - '.vercel\u002Ffirewall\u002F**'\n  bashPatterns:\n    - '\\bvercel\\s+firewall\\b'\n  promptSignals:\n    phrases:\n      - 'rate limit'\n      - 'rate limiting'\n      - 'firewall'\n      - 'WAF'\n      - 'DDoS protection'\n    minScore: 6\nretrieval:\n  aliases:\n    - waf\n    - ddos protection\n    - security rules\n    - rate limiting\n  intents:\n    - configure firewall\n    - add rate limiting\n    - block ips\n    - set up waf rules\n  entities:\n    - WAF\n    - DDoS\n    - rate limiting\n    - IP block\n    - OWASP\n    - Attack Challenge Mode\nchainTo:\n  -\n    pattern: 'from\\s+[''\"\"]express-rate-limit[''\"\"]|from\\s+[''\"\"]rate-limiter-flexible[''\"\"]'\n    targetSkill: routing-middleware\n    message: 'Application-level rate limiting detected — Vercel Firewall provides platform-level rate limiting without code. Loading Routing Middleware for request interception patterns.'\n  -\n    pattern: 'req\\.ip|request\\.headers\\.get\\([''\"]x-forwarded-for[''\"]\\).*block|ipBlock|denyList'\n    targetSkill: routing-middleware\n    message: 'Manual IP blocking in application code detected — Vercel Firewall handles IP blocking at the edge. Loading Routing Middleware guidance for proper request interception.'\n\n---\n\n# Vercel Firewall\n\nYou are an expert in the Vercel Firewall — a multi-layered security solution with automatic DDoS protection, a customizable Web Application Firewall (WAF), bot management, and rate limiting.\n\n## Architecture & Rule Execution Order\n\n1. DDoS mitigation rules (automatic, platform-wide)\n2. WAF IP blocking rules\n3. WAF custom rules (in priority order)\n4. WAF Managed Rulesets (OWASP, Bot Protection, AI Bots)\n\nChanges propagate globally in under **300ms**. No redeployment required.\n\n## DDoS Protection (Automatic, All Plans)\n\n- Layer 3\u002F4 mitigation (automatic, always on)\n- Layer 7 protection (proprietary, tailored to web apps)\n- **Protectd**: Vercel's DoS mitigation infrastructure analyzes ~550K events\u002Fsec globally with median mitigation time of **2.5 seconds**\n- 40x faster detection with real-time stream processing\n- Handles 1B+ suspicious TCP connections per week\n- Proven to mitigate 1.37 Tbps attacks with zero downtime\n\nNo configuration needed — DDoS protection is always active.\n\n## WAF Custom Rules\n\n### Rule JSON Structure\n\n```json\n{\n  \"name\": \"Block WordPress scanners\",\n  \"description\": \"Block common WordPress probe paths\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"path\",\n          \"op\": \"re\",\n          \"value\": \"^\u002Fwp-(admin|login|content|includes)\u002F\"\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": {\n      \"action\": \"deny\"\n    }\n  }\n}\n```\n\n**Logic**: Each object in `conditionGroup` is an **OR** group. Conditions within a single group are **AND**ed. Multiple groups are **OR**ed.\n\n### Condition Types (25 available)\n\n| Type | Description | Extra Fields |\n|------|-------------|--------------|\n| `path` | URL path | |\n| `method` | HTTP method | |\n| `host` | Hostname | |\n| `ip_address` | Client IP (supports CIDR) | |\n| `user_agent` | User-Agent string | |\n| `header` | Request header value | `key` (header name) |\n| `query` | Query string parameter | `key` (param name) |\n| `cookie` | Cookie value | `key` (cookie name) |\n| `geo_country` | ISO country code (e.g., `US`) | |\n| `geo_continent` | Continent code (e.g., `NA`) | |\n| `geo_country_region` | State\u002Fprovince code | |\n| `geo_city` | City name | |\n| `geo_as_number` | ASN | |\n| `ja4_digest` | JA4 TLS fingerprint | |\n| `ja3_digest` | JA3 TLS fingerprint | |\n| `target_path` | Resolved path after routing | |\n| `route` | Matched route pattern | |\n| `raw_path` | Raw unparsed path | |\n| `region` | Vercel edge region code | |\n| `protocol` | http\u002Fhttps | |\n| `scheme` | URL scheme | |\n| `environment` | Deployment environment | |\n| `bot_name` | Specific bot name | |\n| `bot_category` | Bot category | |\n| `server_action` | Next.js Server Action ID | |\n\n### Condition Operators\n\n| Op | Meaning |\n|----|---------|\n| `eq` | Equals |\n| `neq` | Not equals |\n| `re` | Regex match |\n| `pre` | Starts with |\n| `suf` | Ends with |\n| `sub` | Contains |\n| `inc` | In array |\n| `ninc` | Not in array |\n| `ex` | Exists |\n| `nex` | Not exists |\n| `gt` \u002F `gte` | Greater than (or equal) |\n| `lt` \u002F `lte` | Less than (or equal) |\n\nAdditional optional fields: `neg: true` negates the condition, `key` required for `header`\u002F`query`\u002F`cookie` types.\n\n### Mitigation Actions\n\n| Action | Description |\n|--------|-------------|\n| `log` | Log only, allow traffic |\n| `deny` | Block request (403) |\n| `challenge` | JavaScript browser challenge |\n| `bypass` | Skip all subsequent WAF rules |\n| `rate_limit` | Apply rate limiting (requires `rateLimit` config) |\n| `redirect` | Redirect (requires `redirect` config) |\n\n### Persistent Actions\n\nBy default each request is evaluated individually. With **persistent actions**, rules are applied to all matching requests for a customizable duration (`actionDuration`), allowing the firewall to remember malicious behavior and block it earlier in the lifecycle.\n\n### Action Options\n\n```json\n{\n  \"action\": {\n    \"mitigate\": {\n      \"action\": \"deny\",\n      \"actionDuration\": \"1h\",\n      \"bypassSystem\": false,\n      \"logHeaders\": [\"user-agent\", \"x-forwarded-for\"],\n      \"redirect\": {\n        \"location\": \"https:\u002F\u002Fexample.com\u002Fblocked\",\n        \"permanent\": false\n      }\n    }\n  }\n}\n```\n\n## Practical Rule Examples\n\n### Block Sanctioned Countries\n\n```json\n{\n  \"name\": \"Block OFAC Sanctioned Countries\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"geo_country\",\n          \"op\": \"inc\",\n          \"value\": [\"CU\", \"IR\", \"KP\", \"RU\", \"SY\"]\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"deny\" }\n  }\n}\n```\n\n### Require API Key Header on \u002Fapi\u002F Routes\n\n```json\n{\n  \"name\": \"Require API Key\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"header\",\n          \"op\": \"nex\",\n          \"key\": \"x-api-key\"\n        },\n        {\n          \"type\": \"path\",\n          \"op\": \"pre\",\n          \"value\": \"\u002Fapi\u002F\"\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"deny\" }\n  }\n}\n```\n\n### Block by JA4 TLS Fingerprint\n\n```json\n{\n  \"name\": \"Block Known Malicious JA4\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"ja4_digest\",\n          \"op\": \"eq\",\n          \"value\": \"t13d1516h2_8daaf6152771_b0da82dd1658\"\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"deny\", \"actionDuration\": \"1h\" }\n  }\n}\n```\n\n### Block Datacenter ASNs\n\n```json\n{\n  \"name\": \"Block Known Datacenter ASNs\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"geo_as_number\",\n          \"op\": \"inc\",\n          \"value\": [\"14618\", \"16509\", \"15169\"]\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"deny\" }\n  }\n}\n```\n\n### Challenge cURL Requests\n\n```json\n{\n  \"name\": \"Challenge cURL\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        { \"type\": \"user_agent\", \"op\": \"re\", \"value\": \"^curl\u002F\" }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"challenge\" }\n  }\n}\n```\n\n## Rate Limiting\n\n### Rate Limit Rule\n\n```json\n{\n  \"name\": \"API Rate Limit - 100 req\u002Fmin\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        { \"type\": \"path\", \"op\": \"pre\", \"value\": \"\u002Fapi\u002F\" }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": {\n      \"action\": \"rate_limit\",\n      \"rateLimit\": {\n        \"algo\": \"fixed_window\",\n        \"window\": 60,\n        \"limit\": 100,\n        \"keys\": [\"ip\"],\n        \"action\": \"deny\"\n      }\n    }\n  }\n}\n```\n\n### Login Endpoint Protection\n\n```json\n{\n  \"name\": \"Login Rate Limit\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        { \"type\": \"path\", \"op\": \"eq\", \"value\": \"\u002Fapi\u002Fauth\u002Flogin\" },\n        { \"type\": \"method\", \"op\": \"eq\", \"value\": \"POST\" }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": {\n      \"action\": \"rate_limit\",\n      \"rateLimit\": {\n        \"algo\": \"fixed_window\",\n        \"window\": 60,\n        \"limit\": 10,\n        \"keys\": [\"ip\"],\n        \"action\": \"challenge\"\n      }\n    }\n  }\n}\n```\n\n### Rate Limit Configuration Options\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `algo` | string | `\"fixed_window\"` (all plans) or `\"token_bucket\"` (Enterprise) |\n| `window` | number | Seconds. Min 10, max 600 (Pro), max 3600 (Enterprise) |\n| `limit` | number | Max requests per window |\n| `keys` | array | Count per: `\"ip\"`, `\"ja4\"`, `\"user_agent\"`, custom headers (Enterprise) |\n| `action` | string | When exceeded: `\"deny\"`, `\"log\"`, `\"challenge\"` |\n\nWhen exceeded with `deny`, returns HTTP 429 with `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers.\n\n## Bot Management\n\n### Bot Protection (GA — Free on All Plans)\n\nHeuristics-based detection that challenges non-browser bot traffic without disrupting verified webhook providers. Formerly \"Bot Filter\" during beta — renamed to Bot Protection at GA. Enable in log-only mode first to preview traffic impact:\n\n```json\n{\n  \"action\": \"managedRules.update\",\n  \"id\": \"bot_protection\",\n  \"value\": { \"active\": true, \"action\": \"challenge\" }\n}\n```\n\n> **Note**: The older `bot_filter` ID is deprecated. Use `bot_protection` in new configurations.\n\n### AI Bot Blocking\n\nBlock known AI crawlers (GPTBot, ClaudeBot, etc.):\n\n```json\n{\n  \"action\": \"managedRules.update\",\n  \"id\": \"ai_bots\",\n  \"value\": { \"active\": true, \"action\": \"deny\" }\n}\n```\n\n### Allow a Specific Bot (Bypass Rule)\n\nPlace this higher in priority than Bot Protection managed rules:\n\n```json\n{\n  \"name\": \"Allow My Monitoring Bot\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        { \"type\": \"user_agent\", \"op\": \"eq\", \"value\": \"MyMonitorBot\u002F1.0\" }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"bypass\" }\n  }\n}\n```\n\n### Enable BotID (Traffic Visibility)\n\n```json\n{ \"botIdEnabled\": true }\n```\n\n## IP Allow\u002FBlock Lists\n\n### Block an IP\n\n```json\n{\n  \"action\": \"ip.insert\",\n  \"value\": {\n    \"hostname\": \"my-site.com\",\n    \"ip\": \"203.0.113.45\",\n    \"action\": \"deny\",\n    \"notes\": \"Malicious scraper\"\n  }\n}\n```\n\n### Block a CIDR Range\n\n```json\n{\n  \"action\": \"ip.insert\",\n  \"value\": {\n    \"hostname\": \"my-site.com\",\n    \"ip\": \"203.0.113.0\u002F24\",\n    \"action\": \"deny\",\n    \"notes\": \"Bad actor CIDR block\"\n  }\n}\n```\n\n### Allow an IP (Bypass All Rules)\n\n```json\n{\n  \"action\": \"ip.insert\",\n  \"value\": {\n    \"hostname\": \"my-site.com\",\n    \"ip\": \"198.51.100.1\",\n    \"action\": \"bypass\",\n    \"notes\": \"Internal monitoring IP\"\n  }\n}\n```\n\n### IP Rule Actions\n\n| Action | Effect |\n|--------|--------|\n| `deny` | Block the IP |\n| `challenge` | Serve JS challenge |\n| `log` | Log traffic only |\n| `bypass` | Allow through all rules (allowlist) |\n\n**Note**: `hostname` must match the exact domain. Add separate entries per subdomain.\n\n## OWASP Core Ruleset (CRS)\n\n### Individual CRS Rules\n\n| ID | Protection |\n|----|-----------|\n| `sqli` | SQL Injection |\n| `xss` | Cross-Site Scripting |\n| `rce` | Remote Code Execution |\n| `lfi` | Local File Inclusion |\n| `rfi` | Remote File Inclusion |\n| `sd` | Scanner Detection |\n| `ma` | Multipart Attack |\n| `php` | PHP-specific exploits |\n| `gen` | Generic attack patterns |\n| `sf` | Session Fixation |\n| `java` | Java-specific exploits |\n\n### Enable OWASP Rules\n\n```json\n{\n  \"action\": \"crs.update\",\n  \"id\": \"sqli\",\n  \"value\": { \"active\": true, \"action\": \"deny\" }\n}\n```\n\n### Full OWASP + Bot Configuration (PUT)\n\n```json\n{\n  \"firewallEnabled\": true,\n  \"crs\": {\n    \"sqli\": { \"active\": true, \"action\": \"deny\" },\n    \"xss\": { \"active\": true, \"action\": \"deny\" },\n    \"rce\": { \"active\": true, \"action\": \"deny\" },\n    \"lfi\": { \"active\": true, \"action\": \"deny\" },\n    \"rfi\": { \"active\": true, \"action\": \"deny\" },\n    \"sd\": { \"active\": true, \"action\": \"log\" },\n    \"ma\": { \"active\": true, \"action\": \"deny\" },\n    \"gen\": { \"active\": true, \"action\": \"deny\" },\n    \"sf\": { \"active\": true, \"action\": \"deny\" },\n    \"php\": { \"active\": false, \"action\": \"log\" },\n    \"java\": { \"active\": false, \"action\": \"log\" }\n  },\n  \"managedRules\": {\n    \"owasp\": { \"active\": true, \"action\": \"deny\" },\n    \"bot_protection\": { \"active\": true, \"action\": \"challenge\" },\n    \"ai_bots\": { \"active\": true, \"action\": \"deny\" }\n  },\n  \"botIdEnabled\": true\n}\n```\n\n## Firewall REST API\n\nBase URL: `https:\u002F\u002Fapi.vercel.com`\nAuth: `Authorization: Bearer \u003CVERCEL_TOKEN>`\nQuery params: `?projectId=\u003Cid>&teamId=\u003Cid>`\n\n### Endpoints\n\n| Method | Path | Description |\n|--------|------|-------------|\n| `GET` | `\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fconfig\u002Factive` | Read current config |\n| `PATCH` | `\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fconfig` | Incremental update (add\u002Fremove\u002Fupdate rules) |\n| `PUT` | `\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fconfig` | Full config replacement |\n| `POST` | `\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fbypass` | Create temporary bypass rule |\n\n### PATCH Actions\n\n| Action | Description |\n|--------|-------------|\n| `firewallEnabled` | Enable\u002Fdisable firewall (value: boolean) |\n| `rules.insert` | Add a custom rule |\n| `rules.update` | Update rule (requires `id`) |\n| `rules.remove` | Delete rule (requires `id`) |\n| `rules.priority` | Reorder rule (requires `id`, value = index) |\n| `ip.insert` | Add IP rule |\n| `ip.update` | Update IP rule |\n| `ip.remove` | Delete IP rule |\n| `crs.update` | Enable\u002Fconfigure OWASP CRS rule |\n| `crs.disable` | Disable entire CRS |\n| `managedRules.update` | Configure managed ruleset |\n\n### Add a Rule via cURL\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fapi.vercel.com\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fconfig?projectId=prj_xxx&teamId=team_xxx\" \\\n  -H \"Authorization: Bearer $VERCEL_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"action\": \"rules.insert\",\n    \"value\": {\n      \"name\": \"Block WordPress scanners\",\n      \"active\": true,\n      \"conditionGroup\": [\n        {\n          \"conditions\": [\n            { \"type\": \"path\", \"op\": \"re\", \"value\": \"^\u002Fwp-(admin|login|content|includes)\u002F\" }\n          ]\n        }\n      ],\n      \"action\": { \"mitigate\": { \"action\": \"deny\" } }\n    }\n  }'\n```\n\n### Vercel SDK Usage\n\n```ts\nimport { Vercel } from '@vercel\u002Fsdk'\n\nconst vercel = new Vercel({ bearerToken: process.env.VERCEL_TOKEN })\n\n\u002F\u002F Read current firewall config\nconst config = await vercel.security.readFirewallConfig({\n  configVersion: 'active',\n  projectId: 'prj_xxx',\n  teamId: 'team_xxx',\n})\n\n\u002F\u002F Add a rule\nawait vercel.security.updateFirewallConfig({\n  projectId: 'prj_xxx',\n  teamId: 'team_xxx',\n  requestBody: {\n    action: 'rules.insert',\n    value: {\n      name: 'Rate limit API',\n      active: true,\n      conditionGroup: [\n        { conditions: [{ type: 'path', op: 'pre', value: '\u002Fapi\u002F' }] },\n      ],\n      action: {\n        mitigate: {\n          action: 'rate_limit',\n          rateLimit: { algo: 'fixed_window', window: 60, limit: 100, keys: ['ip'], action: 'deny' },\n        },\n      },\n    },\n  },\n})\n```\n\n### Create Temporary Bypass (Attack Challenge Mode)\n\n```bash\ncurl -X POST \"https:\u002F\u002Fapi.vercel.com\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fbypass?projectId=prj_xxx&teamId=team_xxx\" \\\n  -H \"Authorization: Bearer $VERCEL_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"domain\": \"my-site.com\",\n    \"sourceIp\": \"198.51.100.42\",\n    \"ttl\": 3600000,\n    \"note\": \"Temporary bypass for load testing\"\n  }'\n```\n\n## vercel.json WAF Rules\n\nDeclaratively define firewall rules in `vercel.json` using the `mitigate` key:\n\n```json\n{\n  \"$schema\": \"https:\u002F\u002Fopenapi.vercel.sh\u002Fvercel.json\",\n  \"routes\": [\n    {\n      \"src\": \"\u002Fapi\u002F(.*)\",\n      \"missing\": [\n        { \"type\": \"header\", \"key\": \"x-internal-token\" }\n      ],\n      \"mitigate\": { \"action\": \"deny\" }\n    },\n    {\n      \"src\": \"\u002F(.*)\",\n      \"has\": [\n        { \"type\": \"header\", \"key\": \"user-agent\", \"value\": \"(?i)^curl\u002F\" }\n      ],\n      \"mitigate\": { \"action\": \"challenge\" }\n    }\n  ]\n}\n```\n\nSupported actions in `vercel.json`: `\"challenge\"`, `\"deny\"` only. Rate limiting, `log`, and `bypass` require the Vercel Firewall dashboard at `https:\u002F\u002Fvercel.com\u002F{team}\u002F{project}\u002Ffirewall` or the REST API.\n\n## Attack Challenge Mode\n\n- Available on all plans (free)\n- Shows browser verification challenge to all visitors during active attacks\n- Legitimate bots (Googlebot, webhook providers) automatically pass through\n- Internal Function-to-Function calls within the same account bypass automatically\n- Blocked requests don't count toward CDN\u002Ftraffic usage\n- Configured via dashboard only: open `https:\u002F\u002Fvercel.com\u002F{team}\u002F{project}\u002Ffirewall` → **Bot Management** → **Attack Challenge Mode**\n\n## Plan Availability\n\n| Feature | Hobby | Pro | Enterprise |\n|---------|-------|-----|-----------|\n| DDoS Protection | All | All | All |\n| Custom Rules | 5 | 40 | 1000 |\n| Rate Limiting | 1 rule | 40 rules | 1000 rules |\n| Bot Protection (GA) | Yes | Yes | Yes |\n| OWASP CRS | — | — | Yes |\n| Token Bucket algo | — | — | Yes |\n| Custom rate limit keys | — | — | Yes |\n\n## Observability\n\n- Security event logs in the Firewall tab\n- **IP enrichment** — hover any IP in the Firewall dashboard to see ASN, location, and metadata\n- Create custom WAF rules directly from dashboard traffic charts (select \"Create Custom Rule\" from the actions menu)\n- Linkable to Monitoring queries for investigations\n- DDoS mitigation notifications (alerts on detection)\n- BotID traffic visibility when enabled\n\n## Official Documentation\n\n- [Vercel Firewall Overview](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall)\n- [Custom Rules](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fcustom-rules)\n- [Rate Limiting](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Frate-limiting)\n- [IP Blocking](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fip-blocking)\n- [Managed Rulesets](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fmanaged-rulesets)\n- [Attack Challenge Mode](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fattack-challenge-mode)\n- [Firewall API Guide](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Ffirewall-api)\n- [REST API Reference](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Ffirewall-api)\n","# Vercel Firewall\n\nYou are an expert in the Vercel Firewall — a multi-layered security solution with automatic DDoS protection, a customizable Web Application Firewall (WAF), bot management, and rate limiting.\n\n## Architecture & Rule Execution Order\n\n1. DDoS mitigation rules (automatic, platform-wide)\n2. WAF IP blocking rules\n3. WAF custom rules (in priority order)\n4. WAF Managed Rulesets (OWASP, Bot Protection, AI Bots)\n\nChanges propagate globally in under **300ms**. No redeployment required.\n\n## DDoS Protection (Automatic, All Plans)\n\n- Layer 3\u002F4 mitigation (automatic, always on)\n- Layer 7 protection (proprietary, tailored to web apps)\n- **Protectd**: Vercel's DoS mitigation infrastructure analyzes ~550K events\u002Fsec globally with median mitigation time of **2.5 seconds**\n- 40x faster detection with real-time stream processing\n- Handles 1B+ suspicious TCP connections per week\n- Proven to mitigate 1.37 Tbps attacks with zero downtime\n\nNo configuration needed — DDoS protection is always active.\n\n## WAF Custom Rules\n\n### Rule JSON Structure\n\n```json\n{\n  \"name\": \"Block WordPress scanners\",\n  \"description\": \"Block common WordPress probe paths\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"path\",\n          \"op\": \"re\",\n          \"value\": \"^\u002Fwp-(admin|login|content|includes)\u002F\"\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": {\n      \"action\": \"deny\"\n    }\n  }\n}\n```\n\n**Logic**: Each object in `conditionGroup` is an **OR** group. Conditions within a single group are **AND**ed. Multiple groups are **OR**ed.\n\n### Condition Types (25 available)\n\n| Type | Description | Extra Fields |\n|------|-------------|--------------|\n| `path` | URL path | |\n| `method` | HTTP method | |\n| `host` | Hostname | |\n| `ip_address` | Client IP (supports CIDR) | |\n| `user_agent` | User-Agent string | |\n| `header` | Request header value | `key` (header name) |\n| `query` | Query string parameter | `key` (param name) |\n| `cookie` | Cookie value | `key` (cookie name) |\n| `geo_country` | ISO country code (e.g., `US`) | |\n| `geo_continent` | Continent code (e.g., `NA`) | |\n| `geo_country_region` | State\u002Fprovince code | |\n| `geo_city` | City name | |\n| `geo_as_number` | ASN | |\n| `ja4_digest` | JA4 TLS fingerprint | |\n| `ja3_digest` | JA3 TLS fingerprint | |\n| `target_path` | Resolved path after routing | |\n| `route` | Matched route pattern | |\n| `raw_path` | Raw unparsed path | |\n| `region` | Vercel edge region code | |\n| `protocol` | http\u002Fhttps | |\n| `scheme` | URL scheme | |\n| `environment` | Deployment environment | |\n| `bot_name` | Specific bot name | |\n| `bot_category` | Bot category | |\n| `server_action` | Next.js Server Action ID | |\n\n### Condition Operators\n\n| Op | Meaning |\n|----|---------|\n| `eq` | Equals |\n| `neq` | Not equals |\n| `re` | Regex match |\n| `pre` | Starts with |\n| `suf` | Ends with |\n| `sub` | Contains |\n| `inc` | In array |\n| `ninc` | Not in array |\n| `ex` | Exists |\n| `nex` | Not exists |\n| `gt` \u002F `gte` | Greater than (or equal) |\n| `lt` \u002F `lte` | Less than (or equal) |\n\nAdditional optional fields: `neg: true` negates the condition, `key` required for `header`\u002F`query`\u002F`cookie` types.\n\n### Mitigation Actions\n\n| Action | Description |\n|--------|-------------|\n| `log` | Log only, allow traffic |\n| `deny` | Block request (403) |\n| `challenge` | JavaScript browser challenge |\n| `bypass` | Skip all subsequent WAF rules |\n| `rate_limit` | Apply rate limiting (requires `rateLimit` config) |\n| `redirect` | Redirect (requires `redirect` config) |\n\n### Persistent Actions\n\nBy default each request is evaluated individually. With **persistent actions**, rules are applied to all matching requests for a customizable duration (`actionDuration`), allowing the firewall to remember malicious behavior and block it earlier in the lifecycle.\n\n### Action Options\n\n```json\n{\n  \"action\": {\n    \"mitigate\": {\n      \"action\": \"deny\",\n      \"actionDuration\": \"1h\",\n      \"bypassSystem\": false,\n      \"logHeaders\": [\"user-agent\", \"x-forwarded-for\"],\n      \"redirect\": {\n        \"location\": \"https:\u002F\u002Fexample.com\u002Fblocked\",\n        \"permanent\": false\n      }\n    }\n  }\n}\n```\n\n## Practical Rule Examples\n\n### Block Sanctioned Countries\n\n```json\n{\n  \"name\": \"Block OFAC Sanctioned Countries\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"geo_country\",\n          \"op\": \"inc\",\n          \"value\": [\"CU\", \"IR\", \"KP\", \"RU\", \"SY\"]\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"deny\" }\n  }\n}\n```\n\n### Require API Key Header on \u002Fapi\u002F Routes\n\n```json\n{\n  \"name\": \"Require API Key\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"header\",\n          \"op\": \"nex\",\n          \"key\": \"x-api-key\"\n        },\n        {\n          \"type\": \"path\",\n          \"op\": \"pre\",\n          \"value\": \"\u002Fapi\u002F\"\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"deny\" }\n  }\n}\n```\n\n### Block by JA4 TLS Fingerprint\n\n```json\n{\n  \"name\": \"Block Known Malicious JA4\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"ja4_digest\",\n          \"op\": \"eq\",\n          \"value\": \"t13d1516h2_8daaf6152771_b0da82dd1658\"\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"deny\", \"actionDuration\": \"1h\" }\n  }\n}\n```\n\n### Block Datacenter ASNs\n\n```json\n{\n  \"name\": \"Block Known Datacenter ASNs\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        {\n          \"type\": \"geo_as_number\",\n          \"op\": \"inc\",\n          \"value\": [\"14618\", \"16509\", \"15169\"]\n        }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"deny\" }\n  }\n}\n```\n\n### Challenge cURL Requests\n\n```json\n{\n  \"name\": \"Challenge cURL\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        { \"type\": \"user_agent\", \"op\": \"re\", \"value\": \"^curl\u002F\" }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"challenge\" }\n  }\n}\n```\n\n## Rate Limiting\n\n### Rate Limit Rule\n\n```json\n{\n  \"name\": \"API Rate Limit - 100 req\u002Fmin\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        { \"type\": \"path\", \"op\": \"pre\", \"value\": \"\u002Fapi\u002F\" }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": {\n      \"action\": \"rate_limit\",\n      \"rateLimit\": {\n        \"algo\": \"fixed_window\",\n        \"window\": 60,\n        \"limit\": 100,\n        \"keys\": [\"ip\"],\n        \"action\": \"deny\"\n      }\n    }\n  }\n}\n```\n\n### Login Endpoint Protection\n\n```json\n{\n  \"name\": \"Login Rate Limit\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        { \"type\": \"path\", \"op\": \"eq\", \"value\": \"\u002Fapi\u002Fauth\u002Flogin\" },\n        { \"type\": \"method\", \"op\": \"eq\", \"value\": \"POST\" }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": {\n      \"action\": \"rate_limit\",\n      \"rateLimit\": {\n        \"algo\": \"fixed_window\",\n        \"window\": 60,\n        \"limit\": 10,\n        \"keys\": [\"ip\"],\n        \"action\": \"challenge\"\n      }\n    }\n  }\n}\n```\n\n### Rate Limit Configuration Options\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `algo` | string | `\"fixed_window\"` (all plans) or `\"token_bucket\"` (Enterprise) |\n| `window` | number | Seconds. Min 10, max 600 (Pro), max 3600 (Enterprise) |\n| `limit` | number | Max requests per window |\n| `keys` | array | Count per: `\"ip\"`, `\"ja4\"`, `\"user_agent\"`, custom headers (Enterprise) |\n| `action` | string | When exceeded: `\"deny\"`, `\"log\"`, `\"challenge\"` |\n\nWhen exceeded with `deny`, returns HTTP 429 with `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers.\n\n## Bot Management\n\n### Bot Protection (GA — Free on All Plans)\n\nHeuristics-based detection that challenges non-browser bot traffic without disrupting verified webhook providers. Formerly \"Bot Filter\" during beta — renamed to Bot Protection at GA. Enable in log-only mode first to preview traffic impact:\n\n```json\n{\n  \"action\": \"managedRules.update\",\n  \"id\": \"bot_protection\",\n  \"value\": { \"active\": true, \"action\": \"challenge\" }\n}\n```\n\n> **Note**: The older `bot_filter` ID is deprecated. Use `bot_protection` in new configurations.\n\n### AI Bot Blocking\n\nBlock known AI crawlers (GPTBot, ClaudeBot, etc.):\n\n```json\n{\n  \"action\": \"managedRules.update\",\n  \"id\": \"ai_bots\",\n  \"value\": { \"active\": true, \"action\": \"deny\" }\n}\n```\n\n### Allow a Specific Bot (Bypass Rule)\n\nPlace this higher in priority than Bot Protection managed rules:\n\n```json\n{\n  \"name\": \"Allow My Monitoring Bot\",\n  \"active\": true,\n  \"conditionGroup\": [\n    {\n      \"conditions\": [\n        { \"type\": \"user_agent\", \"op\": \"eq\", \"value\": \"MyMonitorBot\u002F1.0\" }\n      ]\n    }\n  ],\n  \"action\": {\n    \"mitigate\": { \"action\": \"bypass\" }\n  }\n}\n```\n\n### Enable BotID (Traffic Visibility)\n\n```json\n{ \"botIdEnabled\": true }\n```\n\n## IP Allow\u002FBlock Lists\n\n### Block an IP\n\n```json\n{\n  \"action\": \"ip.insert\",\n  \"value\": {\n    \"hostname\": \"my-site.com\",\n    \"ip\": \"203.0.113.45\",\n    \"action\": \"deny\",\n    \"notes\": \"Malicious scraper\"\n  }\n}\n```\n\n### Block a CIDR Range\n\n```json\n{\n  \"action\": \"ip.insert\",\n  \"value\": {\n    \"hostname\": \"my-site.com\",\n    \"ip\": \"203.0.113.0\u002F24\",\n    \"action\": \"deny\",\n    \"notes\": \"Bad actor CIDR block\"\n  }\n}\n```\n\n### Allow an IP (Bypass All Rules)\n\n```json\n{\n  \"action\": \"ip.insert\",\n  \"value\": {\n    \"hostname\": \"my-site.com\",\n    \"ip\": \"198.51.100.1\",\n    \"action\": \"bypass\",\n    \"notes\": \"Internal monitoring IP\"\n  }\n}\n```\n\n### IP Rule Actions\n\n| Action | Effect |\n|--------|--------|\n| `deny` | Block the IP |\n| `challenge` | Serve JS challenge |\n| `log` | Log traffic only |\n| `bypass` | Allow through all rules (allowlist) |\n\n**Note**: `hostname` must match the exact domain. Add separate entries per subdomain.\n\n## OWASP Core Ruleset (CRS)\n\n### Individual CRS Rules\n\n| ID | Protection |\n|----|-----------|\n| `sqli` | SQL Injection |\n| `xss` | Cross-Site Scripting |\n| `rce` | Remote Code Execution |\n| `lfi` | Local File Inclusion |\n| `rfi` | Remote File Inclusion |\n| `sd` | Scanner Detection |\n| `ma` | Multipart Attack |\n| `php` | PHP-specific exploits |\n| `gen` | Generic attack patterns |\n| `sf` | Session Fixation |\n| `java` | Java-specific exploits |\n\n### Enable OWASP Rules\n\n```json\n{\n  \"action\": \"crs.update\",\n  \"id\": \"sqli\",\n  \"value\": { \"active\": true, \"action\": \"deny\" }\n}\n```\n\n### Full OWASP + Bot Configuration (PUT)\n\n```json\n{\n  \"firewallEnabled\": true,\n  \"crs\": {\n    \"sqli\": { \"active\": true, \"action\": \"deny\" },\n    \"xss\": { \"active\": true, \"action\": \"deny\" },\n    \"rce\": { \"active\": true, \"action\": \"deny\" },\n    \"lfi\": { \"active\": true, \"action\": \"deny\" },\n    \"rfi\": { \"active\": true, \"action\": \"deny\" },\n    \"sd\": { \"active\": true, \"action\": \"log\" },\n    \"ma\": { \"active\": true, \"action\": \"deny\" },\n    \"gen\": { \"active\": true, \"action\": \"deny\" },\n    \"sf\": { \"active\": true, \"action\": \"deny\" },\n    \"php\": { \"active\": false, \"action\": \"log\" },\n    \"java\": { \"active\": false, \"action\": \"log\" }\n  },\n  \"managedRules\": {\n    \"owasp\": { \"active\": true, \"action\": \"deny\" },\n    \"bot_protection\": { \"active\": true, \"action\": \"challenge\" },\n    \"ai_bots\": { \"active\": true, \"action\": \"deny\" }\n  },\n  \"botIdEnabled\": true\n}\n```\n\n## Firewall REST API\n\nBase URL: `https:\u002F\u002Fapi.vercel.com`\nAuth: `Authorization: Bearer \u003CVERCEL_TOKEN>`\nQuery params: `?projectId=\u003Cid>&teamId=\u003Cid>`\n\n### Endpoints\n\n| Method | Path | Description |\n|--------|------|-------------|\n| `GET` | `\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fconfig\u002Factive` | Read current config |\n| `PATCH` | `\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fconfig` | Incremental update (add\u002Fremove\u002Fupdate rules) |\n| `PUT` | `\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fconfig` | Full config replacement |\n| `POST` | `\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fbypass` | Create temporary bypass rule |\n\n### PATCH Actions\n\n| Action | Description |\n|--------|-------------|\n| `firewallEnabled` | Enable\u002Fdisable firewall (value: boolean) |\n| `rules.insert` | Add a custom rule |\n| `rules.update` | Update rule (requires `id`) |\n| `rules.remove` | Delete rule (requires `id`) |\n| `rules.priority` | Reorder rule (requires `id`, value = index) |\n| `ip.insert` | Add IP rule |\n| `ip.update` | Update IP rule |\n| `ip.remove` | Delete IP rule |\n| `crs.update` | Enable\u002Fconfigure OWASP CRS rule |\n| `crs.disable` | Disable entire CRS |\n| `managedRules.update` | Configure managed ruleset |\n\n### Add a Rule via cURL\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fapi.vercel.com\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fconfig?projectId=prj_xxx&teamId=team_xxx\" \\\n  -H \"Authorization: Bearer $VERCEL_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"action\": \"rules.insert\",\n    \"value\": {\n      \"name\": \"Block WordPress scanners\",\n      \"active\": true,\n      \"conditionGroup\": [\n        {\n          \"conditions\": [\n            { \"type\": \"path\", \"op\": \"re\", \"value\": \"^\u002Fwp-(admin|login|content|includes)\u002F\" }\n          ]\n        }\n      ],\n      \"action\": { \"mitigate\": { \"action\": \"deny\" } }\n    }\n  }'\n```\n\n### Vercel SDK Usage\n\n```ts\nimport { Vercel } from '@vercel\u002Fsdk'\n\nconst vercel = new Vercel({ bearerToken: process.env.VERCEL_TOKEN })\n\n\u002F\u002F Read current firewall config\nconst config = await vercel.security.readFirewallConfig({\n  configVersion: 'active',\n  projectId: 'prj_xxx',\n  teamId: 'team_xxx',\n})\n\n\u002F\u002F Add a rule\nawait vercel.security.updateFirewallConfig({\n  projectId: 'prj_xxx',\n  teamId: 'team_xxx',\n  requestBody: {\n    action: 'rules.insert',\n    value: {\n      name: 'Rate limit API',\n      active: true,\n      conditionGroup: [\n        { conditions: [{ type: 'path', op: 'pre', value: '\u002Fapi\u002F' }] },\n      ],\n      action: {\n        mitigate: {\n          action: 'rate_limit',\n          rateLimit: { algo: 'fixed_window', window: 60, limit: 100, keys: ['ip'], action: 'deny' },\n        },\n      },\n    },\n  },\n})\n```\n\n### Create Temporary Bypass (Attack Challenge Mode)\n\n```bash\ncurl -X POST \"https:\u002F\u002Fapi.vercel.com\u002Fv1\u002Fsecurity\u002Ffirewall\u002Fbypass?projectId=prj_xxx&teamId=team_xxx\" \\\n  -H \"Authorization: Bearer $VERCEL_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"domain\": \"my-site.com\",\n    \"sourceIp\": \"198.51.100.42\",\n    \"ttl\": 3600000,\n    \"note\": \"Temporary bypass for load testing\"\n  }'\n```\n\n## vercel.json WAF Rules\n\nDeclaratively define firewall rules in `vercel.json` using the `mitigate` key:\n\n```json\n{\n  \"$schema\": \"https:\u002F\u002Fopenapi.vercel.sh\u002Fvercel.json\",\n  \"routes\": [\n    {\n      \"src\": \"\u002Fapi\u002F(.*)\",\n      \"missing\": [\n        { \"type\": \"header\", \"key\": \"x-internal-token\" }\n      ],\n      \"mitigate\": { \"action\": \"deny\" }\n    },\n    {\n      \"src\": \"\u002F(.*)\",\n      \"has\": [\n        { \"type\": \"header\", \"key\": \"user-agent\", \"value\": \"(?i)^curl\u002F\" }\n      ],\n      \"mitigate\": { \"action\": \"challenge\" }\n    }\n  ]\n}\n```\n\nSupported actions in `vercel.json`: `\"challenge\"`, `\"deny\"` only. Rate limiting, `log`, and `bypass` require the Vercel Firewall dashboard at `https:\u002F\u002Fvercel.com\u002F{team}\u002F{project}\u002Ffirewall` or the REST API.\n\n## Attack Challenge Mode\n\n- Available on all plans (free)\n- Shows browser verification challenge to all visitors during active attacks\n- Legitimate bots (Googlebot, webhook providers) automatically pass through\n- Internal Function-to-Function calls within the same account bypass automatically\n- Blocked requests don't count toward CDN\u002Ftraffic usage\n- Configured via dashboard only: open `https:\u002F\u002Fvercel.com\u002F{team}\u002F{project}\u002Ffirewall` → **Bot Management** → **Attack Challenge Mode**\n\n## Plan Availability\n\n| Feature | Hobby | Pro | Enterprise |\n|---------|-------|-----|-----------|\n| DDoS Protection | All | All | All |\n| Custom Rules | 5 | 40 | 1000 |\n| Rate Limiting | 1 rule | 40 rules | 1000 rules |\n| Bot Protection (GA) | Yes | Yes | Yes |\n| OWASP CRS | — | — | Yes |\n| Token Bucket algo | — | — | Yes |\n| Custom rate limit keys | — | — | Yes |\n\n## Observability\n\n- Security event logs in the Firewall tab\n- **IP enrichment** — hover any IP in the Firewall dashboard to see ASN, location, and metadata\n- Create custom WAF rules directly from dashboard traffic charts (select \"Create Custom Rule\" from the actions menu)\n- Linkable to Monitoring queries for investigations\n- DDoS mitigation notifications (alerts on detection)\n- BotID traffic visibility when enabled\n\n## Official Documentation\n\n- [Vercel Firewall Overview](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall)\n- [Custom Rules](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fcustom-rules)\n- [Rate Limiting](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Frate-limiting)\n- [IP Blocking](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fip-blocking)\n- [Managed Rulesets](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fmanaged-rulesets)\n- [Attack Challenge Mode](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fattack-challenge-mode)\n- [Firewall API Guide](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Ffirewall-api)\n- [REST API Reference](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Ffirewall-api)\n",{"name":5,"chainTo":44,"metadata":52,"retrieval":68,"description":7},[45,49],{"message":46,"pattern":47,"targetSkill":48},"Application-level rate limiting detected — Vercel Firewall provides platform-level rate limiting without code. Loading Routing Middleware for request interception patterns.","from\\s+['\"\"]express-rate-limit['\"\"]|from\\s+['\"\"]rate-limiter-flexible['\"\"]","routing-middleware",{"message":50,"pattern":51,"targetSkill":48},"Manual IP blocking in application code detected — Vercel Firewall handles IP blocking at the edge. Loading Routing Middleware guidance for proper request interception.","req\\.ip|request\\.headers\\.get\\(['\"]x-forwarded-for['\"]\\).*block|ipBlock|denyList",{"docs":53,"sitemap":55,"priority":56,"bashPatterns":57,"pathPatterns":59,"promptSignals":61},[54],"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fsecurity\u002Fvercel-firewall","https:\u002F\u002Fvercel.com\u002Fsitemap\u002Fdocs.xml",5,[58],"\\bvercel\\s+firewall\\b",[60],".vercel\u002Ffirewall\u002F**",{"phrases":62,"minScore":67},[63,64,20,65,66],"rate limit","rate limiting","WAF","DDoS protection",6,{"aliases":69,"intents":73,"entities":78},[70,71,72,64],"waf","ddos protection","security rules",[74,75,76,77],"configure firewall","add rate limiting","block ips","set up waf rules",[65,79,64,80,81,82],"DDoS","IP block","OWASP","Attack Challenge Mode","main","9a4409c8751439c3aeeea2bc3940ba05dc3cd3b5","plugins\u002Fvercel\u002Fskills\u002Fvercel-firewall",0,"https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins","https:\u002F\u002Fgithub.com\u002FNagyVikt","https:\u002F\u002Fwebu.hu\u002F","Codex is a tool they said...\r\n\r\nCreator of GitGuardex, CueCards. Tech stack: Next.js · TypeScript · Rust · Linux. ","2026-03-30 02:19:53",{"source":8,"skillName":5,"commands":93,"prompt":103,"zipAvailable":104},[94,97,100],{"tool":95,"command":96},"npx","npx skills add NagyVikt\u002Fcodex-plugins --skill vercel-firewall",{"tool":98,"command":99},"bunx","bunx skills add NagyVikt\u002Fcodex-plugins --skill vercel-firewall",{"tool":101,"command":102},"pnpm","pnpm dlx skills add NagyVikt\u002Fcodex-plugins --skill vercel-firewall","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-firewall\u002FSKILL.md",true,[],[107,149,180,202,227,248],{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":129,"publishedAt":39},"01M6K1ZEN8P9R2S6NPNJNJ8JVH","workflow","Vercel Workflow DevKit (WDK) expert guidance. Use when building durable workflows, long-running tasks, API routes or agents that need pause\u002Fresume, retries, step-based execution, or crash-safe orchestration with Vercel Workflow.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fworkflow\u002FSKILL.md",[113,118,121,126],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":119,"categoryName":120,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":122,"categoryName":123,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":127,"categoryName":128,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000038","人力资源",[109,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148],"workflows","create","run","streaming","logs","start","why","loop","wait for","branch","auto","log","conversation","human","lib","condition","rendering","retries","sleep",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":165,"publishedAt":39},"01M6K1Z71NWFSPHK2VJJ73MVSY","verification","Full-story verification — infers what the user is building, then verifies the complete flow end-to-end: browser → API → data → response. Triggers on dev server start and 'why isn't this working' signals.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fverification\u002FSKILL.md",[155,158,159,162],{"categoryNo":156,"categoryName":157,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},{"categoryNo":160,"categoryName":161,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000031","产品经理",{"categoryNo":163,"categoryName":164,"taxonomyType":124,"taxonomyTypeDesc":125},"01JBSEEDCAT000000000000033","数据分析师",[151,166,133,37,167,168,139,169,170,171,172,173,174,175,176,177,178,26,25,179],"auth","api","projects","user story","full stack","jest","local","project","end","app","false","unit","error","unit test",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":187,"publishedAt":39},"01M6K1YPRYJS3BQEDP8HKBHPEJ","vercel-storage","Vercel storage expert guidance — Blob, Edge Config, and Marketplace storage (Neon Postgres, Upstash Redis). Use when choosing, configuring, or using data storage with Vercel applications.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-storage\u002FSKILL.md",[186],{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},[188,189,21,190,132,191,192,140,193,194,30,195,196,197,175,144,198,199,200,201],"storage","vercel storage","config","supabase","migrate","router","clerk","prisma","connection pooling","neon","turso","upstash","URL","auth0",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":206,"categories":207,"keywords":215,"publishedAt":39},"01M6K1YFEP0GPPGMQ3D0FPTS27","vercel-services","Vercel Services — deploy multiple services within a single Vercel project. Use for monorepo layouts or when combining a backend (Python, Go) with a frontend (Next.js, Vite) in one deployment.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-services\u002FSKILL.md",[208,211,212],{"categoryNo":209,"categoryName":210,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},{"categoryNo":213,"categoryName":214,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000011","运维与部署",[216,217,21,218,219,36,33,220,221,222,31,83,223,224,173,29,175,225,178,226],"vercel services","services","frontend","docker compose","monorepo","go api","fastapi","aws lambda","go backend","apps","python backend",{"skillNo":228,"name":229,"nameZh":6,"description":230,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":231,"categories":232,"keywords":233,"publishedAt":39},"01M6K1Y8S3CRD43DPKX0PK1MTT","vercel-sandbox","Vercel Sandbox guidance — ephemeral Firecracker microVMs for running untrusted code safely. Supports AI agents, code generation, and experimentation. Use when executing user-generated or AI-generated code in isolation.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-sandbox\u002FSKILL.md",[],[234,235,21,236,237,131,132,38,238,239,240,241,242,243,244,245,25,246,229,247],"sandbox","vercel sandbox","safe","ai agents","ai sdk","Code Generation","playground","generated","spawn","install","runner","io","child","student",{"skillNo":249,"name":250,"nameZh":6,"description":251,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":252,"categories":253,"keywords":255,"publishedAt":39},"01M6K1Y1J8S7AN97H75SHBGF7J","vercel-queues","Vercel Queues guidance (public beta) — durable event streaming with topics, consumer groups, retries, and delayed delivery. $0.60\u002F1M ops. Powers Workflow DevKit. Use when building async processing, fan-out patterns, or event-driven architectures.","https:\u002F\u002Fgithub.com\u002FNagyVikt\u002Fcodex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvercel\u002Fskills\u002Fvercel-queues\u002FSKILL.md",[254],{"categoryNo":119,"categoryName":120,"taxonomyType":116,"taxonomyTypeDesc":117},[256,21,109,130,133,257,36,167,33,31,258,259,260,261,175,144,262,147,25,22],"vercel queues","beta","message","delivery","across","worker","processing"]