[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-vercel-firewall":3,"mdc--hm0cid-key":37,"related-repo-vercel-vercel-firewall":4964,"related-org-vercel-vercel-firewall":5077},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"vercel-firewall","configure Vercel Firewall and WAF","Vercel Firewall expert guidance — automatic DDoS mitigation, the Vercel WAF (custom rules, IP blocking, managed rulesets, rate limiting), Attack Mode, system bypass, bot management, and the `vercel firewall` CLI. Use when configuring platform-level security, responding to attacks, or staging firewall rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"vercel","Vercel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel.png",[12,16,17,20,23],{"name":13,"slug":14,"type":15},"Security","security","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Monitoring","monitoring",{"name":21,"slug":22,"type":15},"Deployment","deployment",{"name":24,"slug":25,"type":15},"Infrastructure","infrastructure",226,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fvercel-plugin","2026-05-08T04:58:39.089559",null,36,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Comprehensive Vercel ecosystem plugin — relational knowledge graph, skills for every major product, specialized agents, and Vercel conventions. Turns any AI agent into a Vercel expert.","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fvercel-plugin\u002Ftree\u002FHEAD\u002Fskills\u002Fvercel-firewall","---\nname: vercel-firewall\ndescription: Vercel Firewall expert guidance — automatic DDoS mitigation, the Vercel WAF (custom rules, IP blocking, managed rulesets, rate limiting), Attack Mode, system bypass, bot management, and the `vercel firewall` CLI. Use when configuring platform-level security, responding to attacks, or staging firewall rules.\nmetadata:\n  priority: 7\n  docs:\n    - 'https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall'\n    - 'https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli\u002Ffirewall'\n  bashPatterns:\n    - '\\bvercel\\s+firewall\\b'\n  promptSignals:\n    phrases:\n      - 'vercel firewall'\n      - 'vercel waf'\n      - 'attack mode'\n      - 'ddos protection'\n      - 'ip block'\n      - 'managed ruleset'\n      - 'bot protection'\n      - 'system bypass'\n      - 'rate limit rule'\n    allOf:\n      - [firewall, vercel]\n      - [waf, vercel]\n      - [ddos, vercel]\n      - [challenge, vercel]\n      - ['rate limit', vercel]\n      - ['system bypass', vercel]\n      - ['ip block', vercel]\n    noneOf: []\n    minScore: 6\nretrieval:\n  aliases:\n    - ddos protection\n    - waf rules\n    - bot protection\n    - rate limiting\n    - attack mode\n    - ip allowlist\n    - traffic filtering\n    - verified bots\n  intents:\n    - protect from ddos\n    - block malicious traffic\n    - configure firewall\n    - rate limit api\n    - allow bot through firewall\n    - enable attack mode\n    - publish firewall rule\n  entities:\n    - Vercel Firewall\n    - Vercel WAF\n    - DDoS\n    - Attack Mode\n    - Bot Protection\n    - Managed Rulesets\n    - System Bypass\n    - JA3\n    - JA4\n---\n\n# Vercel Firewall\n\nYou are an expert in the Vercel Firewall including the `vercel firewall` CLI, Vercel WAF and platform-level protections (custom rules, IP blocks, system bypass, Attack Mode, system mitigations). You follow all the [best practices](#best-practices) outlined below.\n\n## Core Knowledge\n\n- **Vercel ships a multi-layered firewall**, not just a CDN. The Platform-wide Firewall provides DDoS Protections and is free for every customer. Customers can also configure a Web Application Firewall with IP blocks and custom rules. Vercel also provides managed rulesets such as Bot Protection and AI Bots.\n- **Automatic DDoS mitigation is on for every project on every plan, including Hobby**, with no configuration required. It covers L3\u002FL4\u002FL7 attacks.\n- **Vercel does not bill for traffic blocked by DDoS mitigations or WAF.** Usage is only incurred for requests served before mitigation kicked in or not classified as an attack. You do not pay for requests or bandwidth for denies, challenges, or rate-limits from WAF custom rules or managed rules.\n- **Custom rules** allows the user to define their own Firewall rules. Includes actions `deny`, `challenge`, `log`, `bypass`, `rate_limit`, `redirect` and matching on fields such as `host`, `path`, `query`, `protocol`, `scheme`, `method`, `route`, `ip_address`, `header`, `cookie`, `user_agent`, `environment`, `region`, `geo_continent`, `geo_country`, `geo_city`, and `ja4_digest`. See https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Frule-configuration for full information.\n\n## Overview\n\nProject must be linked first (`vercel link`).\n\n```bash\nvercel firewall overview                  # active rules, blocks, bypasses, attack-mode, drafts\nvercel firewall overview --json\nvercel firewall diff                      # show unpublished draft changes\nvercel firewall diff --json\n```\n\n`rules` and `ip-blocks` changes are **staged** as drafts — run `vercel firewall publish --yes` to make them live. `system-bypass`, `attack-mode`, and `system-mitigations` take effect **immediately**.\n\n## Custom rules\n\n[Custom rules](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fcustom-rules) define traffic policies based on request attributes. Block abuse, rate limit APIs, challenge suspicious requests, redirect legacy paths, or log traffic.\n\n### View\n\n```bash\nvercel firewall rules list                          # table of all rules\nvercel firewall rules list --expand                 # show conditions + actions\nvercel firewall rules list --json\nvercel firewall rules inspect \"My Rule\"             # full detail of one rule\nvercel firewall rules inspect \"My Rule\" --json\n```\n\n### Create — four modes\n\n```bash\n# AI — TTY only, BLOCKED FOR AGENTS\u002FSCRIPTS\nvercel firewall rules add --ai \"Rate limit \u002Fapi to 100 requests per minute by IP\"\n\n# Interactive wizard — TTY only, BLOCKED FOR AGENTS\u002FSCRIPTS\nvercel firewall rules add\n\n# Flags — works in scripts and agents\nvercel firewall rules add \"Block crawlers\" \\\n  --condition '{\"type\":\"user_agent\",\"op\":\"sub\",\"value\":\"crawler\"}' \\\n  --action deny --yes\n\n# JSON — works in scripts and agents\nvercel firewall rules add --json '{\"name\":\"Block crawlers\",\"conditionGroup\":[{\"conditions\":[{\"type\":\"user_agent\",\"op\":\"sub\",\"value\":\"crawler\"}]}],\"action\":{\"mitigate\":{\"action\":\"deny\"}}}' --yes\n```\n\n### Multiple conditions (AND) and OR groups\n\n```bash\n# AND — multiple --condition flags in the same group\nvercel firewall rules add \"Secure admin\" \\\n  --condition '{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fadmin\"}' \\\n  --condition '{\"type\":\"geo_country\",\"op\":\"eq\",\"neg\":true,\"value\":\"US\"}' \\\n  --action deny --yes\n\n# OR — use --or to start a new group\nvercel firewall rules add \"Block dangerous methods\" \\\n  --condition '{\"type\":\"method\",\"op\":\"eq\",\"value\":\"DELETE\"}' \\\n  --or \\\n  --condition '{\"type\":\"method\",\"op\":\"eq\",\"value\":\"PATCH\"}' \\\n  --action challenge --yes\n```\n\n### Edit and manage\n\n```bash\nvercel firewall rules edit \"My Rule\" --action challenge --yes      # change action\nvercel firewall rules edit \"My Rule\" --name \"New Name\" --yes       # rename\nvercel firewall rules edit \"My Rule\" --enabled --yes               # enable\nvercel firewall rules edit \"My Rule\" --disabled --yes              # disable\nvercel firewall rules edit \"My Rule\" \\\n  --condition '{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fnew\"}' --yes    # replace conditions\n\nvercel firewall rules enable  \"My Rule\"\nvercel firewall rules disable \"My Rule\"\nvercel firewall rules remove  \"My Rule\" --yes                      # aliases: rm, delete\nvercel firewall rules reorder \"My Rule\" --first  --yes             # move to highest priority\nvercel firewall rules reorder \"My Rule\" --last   --yes\nvercel firewall rules reorder \"My Rule\" --position 3 --yes         # 1-based\n```\n\nRules are evaluated in priority order (top to bottom). Reorder to control which rule matches first.\n\nNOTE: When using `edit` with `--condition`, it will overwrite all conditions listed in the rule. Make sure to specify all conditions when editing a rule.\n\n### Condition format\n\nEach `--condition` is a JSON object:\n\n```json\n{\n  \"type\": \"path\", \u002F\u002F condition type (required)\n  \"op\": \"pre\", \u002F\u002F operator (required)\n  \"value\": \"\u002Fapi\", \u002F\u002F value (required for most operators; omit for ex\u002Fnex)\n  \"key\": \"Authorization\", \u002F\u002F required for header \u002F cookie \u002F query types\n  \"neg\": true \u002F\u002F negate the condition (optional, default false)\n}\n```\n\nConditions within a group are **AND'd**. Multiple groups (separated by `--or`) are **OR'd**.\n\n### Operators\n\n`eq`\u002F`neq` (equals), `sub` (contains), `pre` (starts-with), `suf` (ends-with), `re` (regex), `ex`\u002F`nex` (exists; omit `value`), `inc`\u002F`ninc` (in set; `value` is array or comma-separated), `gt`\u002F`gte`\u002F`lt`\u002F`lte` (numeric). Set `neg: true` to negate any operator.\n\n### Condition types\n\n- **Request shape**: `path`, `raw_path` (pre-rewrite), `target_path` (post-rewrite), `route` (e.g., `\u002Fblog\u002F[slug]`), `server_action`, `method`, `host`, `protocol`, `scheme`, `environment` (preview|production), `region`\n- **Client**: `ip_address` (IP or CIDR), `user_agent`, `geo_country`, `geo_continent`, `geo_country_region`, `geo_city`, `geo_as_number`\n- **Headers \u002F cookies \u002F queries** — require `key`: `header`, `cookie`, `query`\n- **TLS fingerprints**: `ja4_digest` (all plans), `ja3_digest` (Enterprise only)\n\n### Actions\n\n- `deny` — block (403)\n- `challenge` — show verification page\n- `log` — log without blocking (use to tune before enforcing)\n- `bypass` — skip remaining WAF custom rules + managed rulesets\n- `rate_limit` — throttle by counting key (see Rate limit example for flags)\n\nAll actions accept `--duration` (Pro\u002FEnterprise): `1m`, `5m`, `15m`, `30m`, `1h`. Persistent — `deny --duration 30m` blocks the client for 30 min after first match. Without a duration the action evaluates per-request. Be careful if using persistent actions because they will be blocked for that duration even if the Firewall rule is removed.\n\n### Rate limit example\n\n```bash\nvercel firewall rules add \"Rate limit API\" \\\n  --condition '{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fapi\"}' \\\n  --action rate_limit \\\n  --rate-limit-window 60 \\\n  --rate-limit-requests 100 \\\n  --rate-limit-keys ip \\\n  --rate-limit-action deny \\\n  --yes\n```\n\n- `--rate-limit-window` — seconds, 10–3600\n- `--rate-limit-requests` — max per window, 1–10,000,000\n- `--rate-limit-keys` — count by `ip` (default) or `ja4`. `header:\u003Cname>` Enterprise only. Repeatable.\n- `--rate-limit-algo` — `fixed_window` (default), `token_bucket` (Enterprise only)\n- `--rate-limit-action` — when limit exceeded: `rate_limit` returns 429 (default), `deny` 403, `challenge`, `log`\n- Counters are **per region** — N regions can collectively exceed your configured limit by ~N×.\n\nWhen the user asks for firewall help on a project — or asks \"what rate limits should I add?\" — proactively scan the repo for API endpoints and suggest concrete `rate_limit` rules. Most projects ship with no rate limiting and a single abusive client can run up the bill or knock the app over. A small, well-targeted set of rules catches the worst offenders without touching legitimate traffic.\n\nMethod scoping matters — `GET \u002Fapi\u002Ffoo` and `POST \u002Fapi\u002Ffoo` will likely need different rate limits. Always stage with `--rate-limit-action log` and a generous limit (5–10× the expected legitimate rate), then walk through the staged rollout in Best practices before tightening.\n\nFor more sophisticated counting (custom buckets, hashing identifiers from headers\u002Fcookies, sliding windows from your own code) point the user at the **Rate Limiting SDK**: https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Frate-limiting-sdk.\n\n## IP blocks\n\n[IP blocking](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fip-blocking) blocks IPs or CIDRs entirely. Staged — requires `publish`.\n\n```bash\nvercel firewall ip-blocks list\nvercel firewall ip-blocks list --json\nvercel firewall ip-blocks block 1.2.3.4 --yes\nvercel firewall ip-blocks block 10.0.0.0\u002F24 --hostname example.com --yes   # scoped to a host\nvercel firewall ip-blocks block 1.2.3.4 --notes \"Abuse report #123\" --yes\nvercel firewall ip-blocks unblock 1.2.3.4 --yes\nvercel firewall ip-blocks unblock 1.2.3.4 --hostname example.com --yes     # disambiguate when blocked on multiple hosts\nvercel firewall ip-blocks unblock ip_abc123 --yes                          # by rule ID\n```\n\n## System bypass\n\n[System bypass rules](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fsystem-bypass-rules) exempt trusted IPs\u002FCIDRs from **all** firewall checks (office, CI servers, uptime monitors). Immediate — no publish.\n\n```bash\nvercel firewall system-bypass list\nvercel firewall system-bypass list --json\nvercel firewall system-bypass add 10.0.0.1 --yes\nvercel firewall system-bypass add 10.0.0.0\u002F24 --yes\nvercel firewall system-bypass add 10.0.0.1 --domain example.com --yes\nvercel firewall system-bypass add 10.0.0.1 --domain \"*.example.com\" --yes  # wildcard domain\nvercel firewall system-bypass add 10.0.0.1 --notes \"Office IP\" --yes\nvercel firewall system-bypass remove 10.0.0.1 --yes\n```\n\nSystem bypass does **not** override your own custom rules — for that, use a custom rule with `--action bypass`.\n\n## Attack mode\n\n[Attack Mode](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fattack-mode) is the emergency response for active attacks. Unverified visitors see a challenge page; verified bots and search crawlers are exempt. Immediate — no publish. **Requires interactive confirmation; blocked for agents\u002Fscripts due to severity.**\n\n```bash\nvercel firewall attack-mode enable --duration 1h --yes    # 1h (default)\nvercel firewall attack-mode enable --duration 6h --yes\nvercel firewall attack-mode enable --duration 24h --yes\nvercel firewall attack-mode disable --yes\n```\n\n## System mitigations\n\nVercel automatically [mitigates DDoS attacks](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fddos-mitigation). In rare cases (debugging false positives) you may need to pause them. Auto-resumes after 24h. Immediate. **Blocked for agents\u002Fscripts due to severity — pausing removes DDoS protection.**\n\n```bash\nvercel firewall system-mitigations pause  --yes    # 24h, auto-resume\nvercel firewall system-mitigations resume --yes\n```\n\n## Publishing\n\n```bash\nvercel firewall diff                      # review staged changes\nvercel firewall publish --yes             # push drafts to production\nvercel firewall discard --yes             # throw away drafts\n```\n\n## Querying firewall metrics from the CLI\n\nIf the project has **Observability Plus**, `vc metrics` returns firewall counters that you can analyze without leaving the terminal — useful for the \"review traffic\" step in the staged rollout, or for spotting which rules are doing real work.\n\n```bash\nvc metrics vercel.firewall_action.count \\\n  --group-by waf_rule_id \\\n  --group-by waf_action \\\n  --since 3d \\\n  --granularity 4h \\\n  --format json\n```\n\n- `--group-by waf_rule_id` — break out hits per rule. Match the IDs to `vercel firewall rules list --json` to see which rule fired.\n- `--group-by waf_action` — splits `log` \u002F `deny` \u002F `challenge` \u002F `rate_limit` \u002F `bypass` so you can tell what actually got enforced versus only logged.\n- `--since` accepts `1h`, `24h`, `3d`, `7d`, etc.; `--granularity` is the bucket size.\n- `--format json` is best for programmatic review; drop it for a human-readable table.\n\nFor an **active-attack triage** lens — \"is something happening right now?\" — narrow the window and tighten the granularity:\n\n```bash\nvc metrics vercel.firewall_action.count \\\n  --group-by waf_action \\\n  --since 1h \\\n  --granularity 5m \\\n  --format json\n```\n\nOther dimensions and metric names exist; run `vc metrics --help` to discover them, and check https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli\u002Fmetrics for the full catalog. If the command errors with \"metrics not enabled\" or similar, the project isn't on Observability Plus — fall back to the dashboard URL (`\u002Ffirewall\u002Ftraffic?filter=\u003CruleId>`) for the same data.\n\n## Best practices\n\nThe firewall sits in front of every request. A misconfigured rule can block real users, kill SEO crawlers, or break checkout. Treat changes like a production database migration: stage, review, and let the user pull the trigger.\n\n- **Roll new rules out in stages, not in one shot.** A new rule's blast radius is unpredictable until real traffic hits it. Walk every meaningful rule through the stages below, asking the user to `vercel firewall publish --yes` between each. Don't skip stages even if a rule \"obviously\" matches only attackers — common JA4s and user agents collide with real users far more often than they look like they will.\n  1. **Log everywhere.** Add the rule with `--action log` so it records hits to the Firewall dashboard but blocks nothing.\n\n     ```bash\n     vercel firewall rules add \"Block exploit probes\" \\\n       --condition '{\"type\":\"path\",\"op\":\"inc\",\"value\":[\"\u002Fwp-admin\",\"\u002F.env\",\"\u002F.git\u002Fconfig\",\"\u002Fphpmyadmin\"]}' \\\n       --action log --yes\n     ```\n\n  2. **Have the user review traffic in the dashboard.** Get the rule ID from the `rules add` output or `vercel firewall rules list --json` (look for the `id` field — rule IDs start with `rule_`). Read the team and project slugs from `.vercel\u002Fproject.json` (`orgSlug` \u002F `projectName`) or via `vercel project ls`. Construct the filtered traffic URL and ask the user to open it:\n\n     ```\n     https:\u002F\u002Fvercel.com\u002F\u003Cteam>\u002F\u003Cproject>\u002Ffirewall\u002Ftraffic?filter=\u003CruleId>\n     ```\n\n     Have them confirm only the intended traffic is matching (no real users, no SEO crawlers, no internal tools) before moving on.\n\n  3. **Block in preview first.** Edit the rule to `deny` (or `challenge`) and add an `environment = preview` condition so production stays in log mode. This lets the user hit a preview deployment and confirm the block fires correctly without exposing real users:\n\n     ```bash\n     vercel firewall rules edit \"Block exploit probes\" \\\n       --action deny \\\n       --condition '{\"type\":\"path\",\"op\":\"inc\",\"value\":[\"\u002Fwp-admin\",\"\u002F.env\",\"\u002F.git\u002Fconfig\",\"\u002Fphpmyadmin\"]}' \\\n       --condition '{\"type\":\"environment\",\"op\":\"eq\",\"value\":\"preview\"}' \\\n       --yes\n     ```\n\n     Have the user publish, then test the affected paths in a preview URL. Re-check the dashboard URL filtered by rule ID to see the blocks land.\n\n  4. **Block in production.** Once the user is satisfied with the production log data, edit to `deny` \u002F `challenge` and have them publish. Keep the dashboard URL handy for the first 24h in case you need to roll back with `--action log` or `rules disable`.\n\n- **Stage drafts; let the user publish.** Mutating commands (`rules add\u002Fedit\u002Fenable\u002Fdisable\u002Fremove\u002Freorder`, `ip-blocks block\u002Funblock`) only stage. Run `vercel firewall diff` to show what will change, then **ask the user to run `vercel firewall publish --yes` themselves** — don't push to production on their behalf. Use `discard --yes` only if the user asks to abandon staged changes.\n\n- **Don't run commands the CLI blocks for agents.** Surface what the user needs to do instead:\n  - `vercel firewall rules add --ai \"...\"` and `vercel firewall rules add` (wizard) — TTY-only. Use `--condition` flags or `--json`.\n  - `vercel firewall attack-mode enable` — requires explicit interactive confirmation; have the user run it.\n  - `vercel firewall system-mitigations pause` — pauses platform DDoS protection across the project; have the user run it and resume ASAP.\n\n- **Inspect before recommending publish.** A `deny` with a loose condition (e.g., `path` starts with `\u002F`) blocks the entire site. Always `vercel firewall rules inspect \"Name\" --expand` and `vercel firewall diff` before handing the publish step to the user.\n\n- **Tune rate limits gently.** Start with a generous `--rate-limit-requests` (5–10× the expected legitimate rate) and `--rate-limit-action log`. After the user reviews dashboard data, tighten the limit and switch the action to `rate_limit`, `challenge`, or `deny`.\n\n- **Keep bypasses narrow.** When unblocking trusted automation, scope by a shared-secret header **plus** an IP or CIDR. Avoid wide-open bypasses (e.g., a single header with a known value an attacker could guess).\n\n- **Don't over-block.** User agents, JA4, and IP addresses may collide with real users far more than they look like they will:\n  - **JA4 fingerprints are shared across millions of clients.** A single Chrome point release, a single iOS version, or a popular mobile SDK all produce the same JA4. \"Block this JA4\" can silently take out an entire browser cohort. Before recommending a JA4 rule, run it through the staged log → preview → log-prod → block flow above and have the user confirm the dashboard shows only attacker behavior (high request rate, suspicious paths, anomalous geos) — not just \"this JA4 hit `\u002Flogin` once.\"\n  - **User-agent substring rules over-match constantly.** `sub` matches like `crawler`, `bot`, `python`, `curl`, or `headless` will block legitimate tools (uptime monitors, link previewers, SEO auditors, partner integrations, the user's own CI). For known-good crawlers (Googlebot, Bingbot, Slack\u002FDiscord\u002FX unfurlers, etc.) prefer Vercel's verified-bot signals over UA strings, and pair UA conditions with another condition (path, geo, rate) so a single UA token can't take down a whole class of clients.\n  - **Sanity-check before staging.** Before adding a block, ask the user: \"Does this fingerprint also match Chrome on macOS \u002F our mobile app \u002F a partner's webhook?\" If you don't know, the answer is \"log first, decide later.\"\n\n## External reverse proxies\n\nExternal proxies in front of Vercel reduce firewall and Bot Protection accuracy: real client IPs become opaque, signal reliability drops, legitimate users may be repeatedly challenged. Avoid when you can. If required, use **Verified Proxy** so Vercel trusts your proxy's headers from a known egress range. https:\u002F\u002Fvercel.com\u002Fdocs\u002Fsecurity\u002Freverse-proxy\n\n## Official Documentation\n\n- [Vercel Firewall](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall)\n- [Bot management](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fbot-management)\n- [Vercel CLI](https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli\u002Ffirewall)\n",{"data":38,"body":97},{"name":4,"description":6,"metadata":39,"retrieval":72},{"priority":40,"docs":41,"bashPatterns":44,"promptSignals":46},7,[42,43],"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall","https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli\u002Ffirewall",[45],"\\bvercel\\s+firewall\\b",{"phrases":47,"allOf":57,"noneOf":70,"minScore":71},[48,49,50,51,52,53,54,55,56],"vercel firewall","vercel waf","attack mode","ddos protection","ip block","managed ruleset","bot protection","system bypass","rate limit rule",[58,60,62,64,66,68,69],[59,8],"firewall",[61,8],"waf",[63,8],"ddos",[65,8],"challenge",[67,8],"rate limit",[55,8],[52,8],[],6,{"aliases":73,"intents":79,"entities":87},[51,74,54,75,50,76,77,78],"waf rules","rate limiting","ip allowlist","traffic filtering","verified bots",[80,81,82,83,84,85,86],"protect from ddos","block malicious traffic","configure firewall","rate limit api","allow bot through firewall","enable attack mode","publish firewall rule",[88,89,90,91,92,93,94,95,96],"Vercel Firewall","Vercel WAF","DDoS","Attack Mode","Bot Protection","Managed Rulesets","System Bypass","JA3","JA4",{"type":98,"children":99},"root",[100,107,130,137,356,362,375,477,540,545,556,563,725,731,982,988,1229,1235,1757,1762,1783,1789,1801,2025,2051,2057,2188,2194,2396,2402,2455,2512,2518,2676,2810,2822,2850,2868,2873,2892,3161,3166,3185,3446,3465,3470,3486,3619,3624,3643,3704,3710,3787,3793,3812,3921,4044,4056,4139,4168,4174,4179,4898,4904,4922,4928,4958],{"type":101,"tag":102,"props":103,"children":104},"element","h1",{"id":4},[105],{"type":106,"value":88},"text",{"type":101,"tag":108,"props":109,"children":110},"p",{},[111,113,119,121,128],{"type":106,"value":112},"You are an expert in the Vercel Firewall including the ",{"type":101,"tag":114,"props":115,"children":117},"code",{"className":116},[],[118],{"type":106,"value":48},{"type":106,"value":120}," CLI, Vercel WAF and platform-level protections (custom rules, IP blocks, system bypass, Attack Mode, system mitigations). You follow all the ",{"type":101,"tag":122,"props":123,"children":125},"a",{"href":124},"#best-practices",[126],{"type":106,"value":127},"best practices",{"type":106,"value":129}," outlined below.",{"type":101,"tag":131,"props":132,"children":134},"h2",{"id":133},"core-knowledge",[135],{"type":106,"value":136},"Core Knowledge",{"type":101,"tag":138,"props":139,"children":140},"ul",{},[141,153,163,173],{"type":101,"tag":142,"props":143,"children":144},"li",{},[145,151],{"type":101,"tag":146,"props":147,"children":148},"strong",{},[149],{"type":106,"value":150},"Vercel ships a multi-layered firewall",{"type":106,"value":152},", not just a CDN. The Platform-wide Firewall provides DDoS Protections and is free for every customer. Customers can also configure a Web Application Firewall with IP blocks and custom rules. Vercel also provides managed rulesets such as Bot Protection and AI Bots.",{"type":101,"tag":142,"props":154,"children":155},{},[156,161],{"type":101,"tag":146,"props":157,"children":158},{},[159],{"type":106,"value":160},"Automatic DDoS mitigation is on for every project on every plan, including Hobby",{"type":106,"value":162},", with no configuration required. It covers L3\u002FL4\u002FL7 attacks.",{"type":101,"tag":142,"props":164,"children":165},{},[166,171],{"type":101,"tag":146,"props":167,"children":168},{},[169],{"type":106,"value":170},"Vercel does not bill for traffic blocked by DDoS mitigations or WAF.",{"type":106,"value":172}," Usage is only incurred for requests served before mitigation kicked in or not classified as an attack. You do not pay for requests or bandwidth for denies, challenges, or rate-limits from WAF custom rules or managed rules.",{"type":101,"tag":142,"props":174,"children":175},{},[176,181,183,189,191,196,197,203,204,210,211,217,218,224,226,232,233,239,240,246,247,253,254,260,261,267,268,274,275,281,282,288,289,295,296,302,303,309,310,316,317,323,324,330,331,337,339,345,347,354],{"type":101,"tag":146,"props":177,"children":178},{},[179],{"type":106,"value":180},"Custom rules",{"type":106,"value":182}," allows the user to define their own Firewall rules. Includes actions ",{"type":101,"tag":114,"props":184,"children":186},{"className":185},[],[187],{"type":106,"value":188},"deny",{"type":106,"value":190},", ",{"type":101,"tag":114,"props":192,"children":194},{"className":193},[],[195],{"type":106,"value":65},{"type":106,"value":190},{"type":101,"tag":114,"props":198,"children":200},{"className":199},[],[201],{"type":106,"value":202},"log",{"type":106,"value":190},{"type":101,"tag":114,"props":205,"children":207},{"className":206},[],[208],{"type":106,"value":209},"bypass",{"type":106,"value":190},{"type":101,"tag":114,"props":212,"children":214},{"className":213},[],[215],{"type":106,"value":216},"rate_limit",{"type":106,"value":190},{"type":101,"tag":114,"props":219,"children":221},{"className":220},[],[222],{"type":106,"value":223},"redirect",{"type":106,"value":225}," and matching on fields such as ",{"type":101,"tag":114,"props":227,"children":229},{"className":228},[],[230],{"type":106,"value":231},"host",{"type":106,"value":190},{"type":101,"tag":114,"props":234,"children":236},{"className":235},[],[237],{"type":106,"value":238},"path",{"type":106,"value":190},{"type":101,"tag":114,"props":241,"children":243},{"className":242},[],[244],{"type":106,"value":245},"query",{"type":106,"value":190},{"type":101,"tag":114,"props":248,"children":250},{"className":249},[],[251],{"type":106,"value":252},"protocol",{"type":106,"value":190},{"type":101,"tag":114,"props":255,"children":257},{"className":256},[],[258],{"type":106,"value":259},"scheme",{"type":106,"value":190},{"type":101,"tag":114,"props":262,"children":264},{"className":263},[],[265],{"type":106,"value":266},"method",{"type":106,"value":190},{"type":101,"tag":114,"props":269,"children":271},{"className":270},[],[272],{"type":106,"value":273},"route",{"type":106,"value":190},{"type":101,"tag":114,"props":276,"children":278},{"className":277},[],[279],{"type":106,"value":280},"ip_address",{"type":106,"value":190},{"type":101,"tag":114,"props":283,"children":285},{"className":284},[],[286],{"type":106,"value":287},"header",{"type":106,"value":190},{"type":101,"tag":114,"props":290,"children":292},{"className":291},[],[293],{"type":106,"value":294},"cookie",{"type":106,"value":190},{"type":101,"tag":114,"props":297,"children":299},{"className":298},[],[300],{"type":106,"value":301},"user_agent",{"type":106,"value":190},{"type":101,"tag":114,"props":304,"children":306},{"className":305},[],[307],{"type":106,"value":308},"environment",{"type":106,"value":190},{"type":101,"tag":114,"props":311,"children":313},{"className":312},[],[314],{"type":106,"value":315},"region",{"type":106,"value":190},{"type":101,"tag":114,"props":318,"children":320},{"className":319},[],[321],{"type":106,"value":322},"geo_continent",{"type":106,"value":190},{"type":101,"tag":114,"props":325,"children":327},{"className":326},[],[328],{"type":106,"value":329},"geo_country",{"type":106,"value":190},{"type":101,"tag":114,"props":332,"children":334},{"className":333},[],[335],{"type":106,"value":336},"geo_city",{"type":106,"value":338},", and ",{"type":101,"tag":114,"props":340,"children":342},{"className":341},[],[343],{"type":106,"value":344},"ja4_digest",{"type":106,"value":346},". See ",{"type":101,"tag":122,"props":348,"children":352},{"href":349,"rel":350},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Frule-configuration",[351],"nofollow",[353],{"type":106,"value":349},{"type":106,"value":355}," for full information.",{"type":101,"tag":131,"props":357,"children":359},{"id":358},"overview",[360],{"type":106,"value":361},"Overview",{"type":101,"tag":108,"props":363,"children":364},{},[365,367,373],{"type":106,"value":366},"Project must be linked first (",{"type":101,"tag":114,"props":368,"children":370},{"className":369},[],[371],{"type":106,"value":372},"vercel link",{"type":106,"value":374},").",{"type":101,"tag":376,"props":377,"children":382},"pre",{"className":378,"code":379,"language":380,"meta":381,"style":381},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","vercel firewall overview                  # active rules, blocks, bypasses, attack-mode, drafts\nvercel firewall overview --json\nvercel firewall diff                      # show unpublished draft changes\nvercel firewall diff --json\n","bash","",[383],{"type":101,"tag":114,"props":384,"children":385},{"__ignoreMap":381},[386,414,435,457],{"type":101,"tag":387,"props":388,"children":391},"span",{"class":389,"line":390},"line",1,[392,397,403,408],{"type":101,"tag":387,"props":393,"children":395},{"style":394},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[396],{"type":106,"value":8},{"type":101,"tag":387,"props":398,"children":400},{"style":399},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[401],{"type":106,"value":402}," firewall",{"type":101,"tag":387,"props":404,"children":405},{"style":399},[406],{"type":106,"value":407}," overview",{"type":101,"tag":387,"props":409,"children":411},{"style":410},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[412],{"type":106,"value":413},"                  # active rules, blocks, bypasses, attack-mode, drafts\n",{"type":101,"tag":387,"props":415,"children":417},{"class":389,"line":416},2,[418,422,426,430],{"type":101,"tag":387,"props":419,"children":420},{"style":394},[421],{"type":106,"value":8},{"type":101,"tag":387,"props":423,"children":424},{"style":399},[425],{"type":106,"value":402},{"type":101,"tag":387,"props":427,"children":428},{"style":399},[429],{"type":106,"value":407},{"type":101,"tag":387,"props":431,"children":432},{"style":399},[433],{"type":106,"value":434}," --json\n",{"type":101,"tag":387,"props":436,"children":438},{"class":389,"line":437},3,[439,443,447,452],{"type":101,"tag":387,"props":440,"children":441},{"style":394},[442],{"type":106,"value":8},{"type":101,"tag":387,"props":444,"children":445},{"style":399},[446],{"type":106,"value":402},{"type":101,"tag":387,"props":448,"children":449},{"style":399},[450],{"type":106,"value":451}," diff",{"type":101,"tag":387,"props":453,"children":454},{"style":410},[455],{"type":106,"value":456},"                      # show unpublished draft changes\n",{"type":101,"tag":387,"props":458,"children":460},{"class":389,"line":459},4,[461,465,469,473],{"type":101,"tag":387,"props":462,"children":463},{"style":394},[464],{"type":106,"value":8},{"type":101,"tag":387,"props":466,"children":467},{"style":399},[468],{"type":106,"value":402},{"type":101,"tag":387,"props":470,"children":471},{"style":399},[472],{"type":106,"value":451},{"type":101,"tag":387,"props":474,"children":475},{"style":399},[476],{"type":106,"value":434},{"type":101,"tag":108,"props":478,"children":479},{},[480,486,488,494,496,501,503,509,511,517,518,524,525,531,533,538],{"type":101,"tag":114,"props":481,"children":483},{"className":482},[],[484],{"type":106,"value":485},"rules",{"type":106,"value":487}," and ",{"type":101,"tag":114,"props":489,"children":491},{"className":490},[],[492],{"type":106,"value":493},"ip-blocks",{"type":106,"value":495}," changes are ",{"type":101,"tag":146,"props":497,"children":498},{},[499],{"type":106,"value":500},"staged",{"type":106,"value":502}," as drafts — run ",{"type":101,"tag":114,"props":504,"children":506},{"className":505},[],[507],{"type":106,"value":508},"vercel firewall publish --yes",{"type":106,"value":510}," to make them live. ",{"type":101,"tag":114,"props":512,"children":514},{"className":513},[],[515],{"type":106,"value":516},"system-bypass",{"type":106,"value":190},{"type":101,"tag":114,"props":519,"children":521},{"className":520},[],[522],{"type":106,"value":523},"attack-mode",{"type":106,"value":338},{"type":101,"tag":114,"props":526,"children":528},{"className":527},[],[529],{"type":106,"value":530},"system-mitigations",{"type":106,"value":532}," take effect ",{"type":101,"tag":146,"props":534,"children":535},{},[536],{"type":106,"value":537},"immediately",{"type":106,"value":539},".",{"type":101,"tag":131,"props":541,"children":543},{"id":542},"custom-rules",[544],{"type":106,"value":180},{"type":101,"tag":108,"props":546,"children":547},{},[548,554],{"type":101,"tag":122,"props":549,"children":552},{"href":550,"rel":551},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fcustom-rules",[351],[553],{"type":106,"value":180},{"type":106,"value":555}," define traffic policies based on request attributes. Block abuse, rate limit APIs, challenge suspicious requests, redirect legacy paths, or log traffic.",{"type":101,"tag":557,"props":558,"children":560},"h3",{"id":559},"view",[561],{"type":106,"value":562},"View",{"type":101,"tag":376,"props":564,"children":566},{"className":378,"code":565,"language":380,"meta":381,"style":381},"vercel firewall rules list                          # table of all rules\nvercel firewall rules list --expand                 # show conditions + actions\nvercel firewall rules list --json\nvercel firewall rules inspect \"My Rule\"             # full detail of one rule\nvercel firewall rules inspect \"My Rule\" --json\n",[567],{"type":101,"tag":114,"props":568,"children":569},{"__ignoreMap":381},[570,596,625,648,689],{"type":101,"tag":387,"props":571,"children":572},{"class":389,"line":390},[573,577,581,586,591],{"type":101,"tag":387,"props":574,"children":575},{"style":394},[576],{"type":106,"value":8},{"type":101,"tag":387,"props":578,"children":579},{"style":399},[580],{"type":106,"value":402},{"type":101,"tag":387,"props":582,"children":583},{"style":399},[584],{"type":106,"value":585}," rules",{"type":101,"tag":387,"props":587,"children":588},{"style":399},[589],{"type":106,"value":590}," list",{"type":101,"tag":387,"props":592,"children":593},{"style":410},[594],{"type":106,"value":595},"                          # table of all rules\n",{"type":101,"tag":387,"props":597,"children":598},{"class":389,"line":416},[599,603,607,611,615,620],{"type":101,"tag":387,"props":600,"children":601},{"style":394},[602],{"type":106,"value":8},{"type":101,"tag":387,"props":604,"children":605},{"style":399},[606],{"type":106,"value":402},{"type":101,"tag":387,"props":608,"children":609},{"style":399},[610],{"type":106,"value":585},{"type":101,"tag":387,"props":612,"children":613},{"style":399},[614],{"type":106,"value":590},{"type":101,"tag":387,"props":616,"children":617},{"style":399},[618],{"type":106,"value":619}," --expand",{"type":101,"tag":387,"props":621,"children":622},{"style":410},[623],{"type":106,"value":624},"                 # show conditions + actions\n",{"type":101,"tag":387,"props":626,"children":627},{"class":389,"line":437},[628,632,636,640,644],{"type":101,"tag":387,"props":629,"children":630},{"style":394},[631],{"type":106,"value":8},{"type":101,"tag":387,"props":633,"children":634},{"style":399},[635],{"type":106,"value":402},{"type":101,"tag":387,"props":637,"children":638},{"style":399},[639],{"type":106,"value":585},{"type":101,"tag":387,"props":641,"children":642},{"style":399},[643],{"type":106,"value":590},{"type":101,"tag":387,"props":645,"children":646},{"style":399},[647],{"type":106,"value":434},{"type":101,"tag":387,"props":649,"children":650},{"class":389,"line":459},[651,655,659,663,668,674,679,684],{"type":101,"tag":387,"props":652,"children":653},{"style":394},[654],{"type":106,"value":8},{"type":101,"tag":387,"props":656,"children":657},{"style":399},[658],{"type":106,"value":402},{"type":101,"tag":387,"props":660,"children":661},{"style":399},[662],{"type":106,"value":585},{"type":101,"tag":387,"props":664,"children":665},{"style":399},[666],{"type":106,"value":667}," inspect",{"type":101,"tag":387,"props":669,"children":671},{"style":670},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[672],{"type":106,"value":673}," \"",{"type":101,"tag":387,"props":675,"children":676},{"style":399},[677],{"type":106,"value":678},"My Rule",{"type":101,"tag":387,"props":680,"children":681},{"style":670},[682],{"type":106,"value":683},"\"",{"type":101,"tag":387,"props":685,"children":686},{"style":410},[687],{"type":106,"value":688},"             # full detail of one rule\n",{"type":101,"tag":387,"props":690,"children":692},{"class":389,"line":691},5,[693,697,701,705,709,713,717,721],{"type":101,"tag":387,"props":694,"children":695},{"style":394},[696],{"type":106,"value":8},{"type":101,"tag":387,"props":698,"children":699},{"style":399},[700],{"type":106,"value":402},{"type":101,"tag":387,"props":702,"children":703},{"style":399},[704],{"type":106,"value":585},{"type":101,"tag":387,"props":706,"children":707},{"style":399},[708],{"type":106,"value":667},{"type":101,"tag":387,"props":710,"children":711},{"style":670},[712],{"type":106,"value":673},{"type":101,"tag":387,"props":714,"children":715},{"style":399},[716],{"type":106,"value":678},{"type":101,"tag":387,"props":718,"children":719},{"style":670},[720],{"type":106,"value":683},{"type":101,"tag":387,"props":722,"children":723},{"style":399},[724],{"type":106,"value":434},{"type":101,"tag":557,"props":726,"children":728},{"id":727},"create-four-modes",[729],{"type":106,"value":730},"Create — four modes",{"type":101,"tag":376,"props":732,"children":734},{"className":378,"code":733,"language":380,"meta":381,"style":381},"# AI — TTY only, BLOCKED FOR AGENTS\u002FSCRIPTS\nvercel firewall rules add --ai \"Rate limit \u002Fapi to 100 requests per minute by IP\"\n\n# Interactive wizard — TTY only, BLOCKED FOR AGENTS\u002FSCRIPTS\nvercel firewall rules add\n\n# Flags — works in scripts and agents\nvercel firewall rules add \"Block crawlers\" \\\n  --condition '{\"type\":\"user_agent\",\"op\":\"sub\",\"value\":\"crawler\"}' \\\n  --action deny --yes\n\n# JSON — works in scripts and agents\nvercel firewall rules add --json '{\"name\":\"Block crawlers\",\"conditionGroup\":[{\"conditions\":[{\"type\":\"user_agent\",\"op\":\"sub\",\"value\":\"crawler\"}]}],\"action\":{\"mitigate\":{\"action\":\"deny\"}}}' --yes\n",[735],{"type":101,"tag":114,"props":736,"children":737},{"__ignoreMap":381},[738,746,785,794,802,822,829,837,876,904,923,931,940],{"type":101,"tag":387,"props":739,"children":740},{"class":389,"line":390},[741],{"type":101,"tag":387,"props":742,"children":743},{"style":410},[744],{"type":106,"value":745},"# AI — TTY only, BLOCKED FOR AGENTS\u002FSCRIPTS\n",{"type":101,"tag":387,"props":747,"children":748},{"class":389,"line":416},[749,753,757,761,766,771,775,780],{"type":101,"tag":387,"props":750,"children":751},{"style":394},[752],{"type":106,"value":8},{"type":101,"tag":387,"props":754,"children":755},{"style":399},[756],{"type":106,"value":402},{"type":101,"tag":387,"props":758,"children":759},{"style":399},[760],{"type":106,"value":585},{"type":101,"tag":387,"props":762,"children":763},{"style":399},[764],{"type":106,"value":765}," add",{"type":101,"tag":387,"props":767,"children":768},{"style":399},[769],{"type":106,"value":770}," --ai",{"type":101,"tag":387,"props":772,"children":773},{"style":670},[774],{"type":106,"value":673},{"type":101,"tag":387,"props":776,"children":777},{"style":399},[778],{"type":106,"value":779},"Rate limit \u002Fapi to 100 requests per minute by IP",{"type":101,"tag":387,"props":781,"children":782},{"style":670},[783],{"type":106,"value":784},"\"\n",{"type":101,"tag":387,"props":786,"children":787},{"class":389,"line":437},[788],{"type":101,"tag":387,"props":789,"children":791},{"emptyLinePlaceholder":790},true,[792],{"type":106,"value":793},"\n",{"type":101,"tag":387,"props":795,"children":796},{"class":389,"line":459},[797],{"type":101,"tag":387,"props":798,"children":799},{"style":410},[800],{"type":106,"value":801},"# Interactive wizard — TTY only, BLOCKED FOR AGENTS\u002FSCRIPTS\n",{"type":101,"tag":387,"props":803,"children":804},{"class":389,"line":691},[805,809,813,817],{"type":101,"tag":387,"props":806,"children":807},{"style":394},[808],{"type":106,"value":8},{"type":101,"tag":387,"props":810,"children":811},{"style":399},[812],{"type":106,"value":402},{"type":101,"tag":387,"props":814,"children":815},{"style":399},[816],{"type":106,"value":585},{"type":101,"tag":387,"props":818,"children":819},{"style":399},[820],{"type":106,"value":821}," add\n",{"type":101,"tag":387,"props":823,"children":824},{"class":389,"line":71},[825],{"type":101,"tag":387,"props":826,"children":827},{"emptyLinePlaceholder":790},[828],{"type":106,"value":793},{"type":101,"tag":387,"props":830,"children":831},{"class":389,"line":40},[832],{"type":101,"tag":387,"props":833,"children":834},{"style":410},[835],{"type":106,"value":836},"# Flags — works in scripts and agents\n",{"type":101,"tag":387,"props":838,"children":840},{"class":389,"line":839},8,[841,845,849,853,857,861,866,870],{"type":101,"tag":387,"props":842,"children":843},{"style":394},[844],{"type":106,"value":8},{"type":101,"tag":387,"props":846,"children":847},{"style":399},[848],{"type":106,"value":402},{"type":101,"tag":387,"props":850,"children":851},{"style":399},[852],{"type":106,"value":585},{"type":101,"tag":387,"props":854,"children":855},{"style":399},[856],{"type":106,"value":765},{"type":101,"tag":387,"props":858,"children":859},{"style":670},[860],{"type":106,"value":673},{"type":101,"tag":387,"props":862,"children":863},{"style":399},[864],{"type":106,"value":865},"Block crawlers",{"type":101,"tag":387,"props":867,"children":868},{"style":670},[869],{"type":106,"value":683},{"type":101,"tag":387,"props":871,"children":873},{"style":872},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[874],{"type":106,"value":875}," \\\n",{"type":101,"tag":387,"props":877,"children":879},{"class":389,"line":878},9,[880,885,890,895,900],{"type":101,"tag":387,"props":881,"children":882},{"style":399},[883],{"type":106,"value":884},"  --condition",{"type":101,"tag":387,"props":886,"children":887},{"style":670},[888],{"type":106,"value":889}," '",{"type":101,"tag":387,"props":891,"children":892},{"style":399},[893],{"type":106,"value":894},"{\"type\":\"user_agent\",\"op\":\"sub\",\"value\":\"crawler\"}",{"type":101,"tag":387,"props":896,"children":897},{"style":670},[898],{"type":106,"value":899},"'",{"type":101,"tag":387,"props":901,"children":902},{"style":872},[903],{"type":106,"value":875},{"type":101,"tag":387,"props":905,"children":907},{"class":389,"line":906},10,[908,913,918],{"type":101,"tag":387,"props":909,"children":910},{"style":399},[911],{"type":106,"value":912},"  --action",{"type":101,"tag":387,"props":914,"children":915},{"style":399},[916],{"type":106,"value":917}," deny",{"type":101,"tag":387,"props":919,"children":920},{"style":399},[921],{"type":106,"value":922}," --yes\n",{"type":101,"tag":387,"props":924,"children":926},{"class":389,"line":925},11,[927],{"type":101,"tag":387,"props":928,"children":929},{"emptyLinePlaceholder":790},[930],{"type":106,"value":793},{"type":101,"tag":387,"props":932,"children":934},{"class":389,"line":933},12,[935],{"type":101,"tag":387,"props":936,"children":937},{"style":410},[938],{"type":106,"value":939},"# JSON — works in scripts and agents\n",{"type":101,"tag":387,"props":941,"children":943},{"class":389,"line":942},13,[944,948,952,956,960,965,969,974,978],{"type":101,"tag":387,"props":945,"children":946},{"style":394},[947],{"type":106,"value":8},{"type":101,"tag":387,"props":949,"children":950},{"style":399},[951],{"type":106,"value":402},{"type":101,"tag":387,"props":953,"children":954},{"style":399},[955],{"type":106,"value":585},{"type":101,"tag":387,"props":957,"children":958},{"style":399},[959],{"type":106,"value":765},{"type":101,"tag":387,"props":961,"children":962},{"style":399},[963],{"type":106,"value":964}," --json",{"type":101,"tag":387,"props":966,"children":967},{"style":670},[968],{"type":106,"value":889},{"type":101,"tag":387,"props":970,"children":971},{"style":399},[972],{"type":106,"value":973},"{\"name\":\"Block crawlers\",\"conditionGroup\":[{\"conditions\":[{\"type\":\"user_agent\",\"op\":\"sub\",\"value\":\"crawler\"}]}],\"action\":{\"mitigate\":{\"action\":\"deny\"}}}",{"type":101,"tag":387,"props":975,"children":976},{"style":670},[977],{"type":106,"value":899},{"type":101,"tag":387,"props":979,"children":980},{"style":399},[981],{"type":106,"value":922},{"type":101,"tag":557,"props":983,"children":985},{"id":984},"multiple-conditions-and-and-or-groups",[986],{"type":106,"value":987},"Multiple conditions (AND) and OR groups",{"type":101,"tag":376,"props":989,"children":991},{"className":378,"code":990,"language":380,"meta":381,"style":381},"# AND — multiple --condition flags in the same group\nvercel firewall rules add \"Secure admin\" \\\n  --condition '{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fadmin\"}' \\\n  --condition '{\"type\":\"geo_country\",\"op\":\"eq\",\"neg\":true,\"value\":\"US\"}' \\\n  --action deny --yes\n\n# OR — use --or to start a new group\nvercel firewall rules add \"Block dangerous methods\" \\\n  --condition '{\"type\":\"method\",\"op\":\"eq\",\"value\":\"DELETE\"}' \\\n  --or \\\n  --condition '{\"type\":\"method\",\"op\":\"eq\",\"value\":\"PATCH\"}' \\\n  --action challenge --yes\n",[992],{"type":101,"tag":114,"props":993,"children":994},{"__ignoreMap":381},[995,1003,1039,1063,1087,1102,1109,1117,1153,1177,1189,1213],{"type":101,"tag":387,"props":996,"children":997},{"class":389,"line":390},[998],{"type":101,"tag":387,"props":999,"children":1000},{"style":410},[1001],{"type":106,"value":1002},"# AND — multiple --condition flags in the same group\n",{"type":101,"tag":387,"props":1004,"children":1005},{"class":389,"line":416},[1006,1010,1014,1018,1022,1026,1031,1035],{"type":101,"tag":387,"props":1007,"children":1008},{"style":394},[1009],{"type":106,"value":8},{"type":101,"tag":387,"props":1011,"children":1012},{"style":399},[1013],{"type":106,"value":402},{"type":101,"tag":387,"props":1015,"children":1016},{"style":399},[1017],{"type":106,"value":585},{"type":101,"tag":387,"props":1019,"children":1020},{"style":399},[1021],{"type":106,"value":765},{"type":101,"tag":387,"props":1023,"children":1024},{"style":670},[1025],{"type":106,"value":673},{"type":101,"tag":387,"props":1027,"children":1028},{"style":399},[1029],{"type":106,"value":1030},"Secure admin",{"type":101,"tag":387,"props":1032,"children":1033},{"style":670},[1034],{"type":106,"value":683},{"type":101,"tag":387,"props":1036,"children":1037},{"style":872},[1038],{"type":106,"value":875},{"type":101,"tag":387,"props":1040,"children":1041},{"class":389,"line":437},[1042,1046,1050,1055,1059],{"type":101,"tag":387,"props":1043,"children":1044},{"style":399},[1045],{"type":106,"value":884},{"type":101,"tag":387,"props":1047,"children":1048},{"style":670},[1049],{"type":106,"value":889},{"type":101,"tag":387,"props":1051,"children":1052},{"style":399},[1053],{"type":106,"value":1054},"{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fadmin\"}",{"type":101,"tag":387,"props":1056,"children":1057},{"style":670},[1058],{"type":106,"value":899},{"type":101,"tag":387,"props":1060,"children":1061},{"style":872},[1062],{"type":106,"value":875},{"type":101,"tag":387,"props":1064,"children":1065},{"class":389,"line":459},[1066,1070,1074,1079,1083],{"type":101,"tag":387,"props":1067,"children":1068},{"style":399},[1069],{"type":106,"value":884},{"type":101,"tag":387,"props":1071,"children":1072},{"style":670},[1073],{"type":106,"value":889},{"type":101,"tag":387,"props":1075,"children":1076},{"style":399},[1077],{"type":106,"value":1078},"{\"type\":\"geo_country\",\"op\":\"eq\",\"neg\":true,\"value\":\"US\"}",{"type":101,"tag":387,"props":1080,"children":1081},{"style":670},[1082],{"type":106,"value":899},{"type":101,"tag":387,"props":1084,"children":1085},{"style":872},[1086],{"type":106,"value":875},{"type":101,"tag":387,"props":1088,"children":1089},{"class":389,"line":691},[1090,1094,1098],{"type":101,"tag":387,"props":1091,"children":1092},{"style":399},[1093],{"type":106,"value":912},{"type":101,"tag":387,"props":1095,"children":1096},{"style":399},[1097],{"type":106,"value":917},{"type":101,"tag":387,"props":1099,"children":1100},{"style":399},[1101],{"type":106,"value":922},{"type":101,"tag":387,"props":1103,"children":1104},{"class":389,"line":71},[1105],{"type":101,"tag":387,"props":1106,"children":1107},{"emptyLinePlaceholder":790},[1108],{"type":106,"value":793},{"type":101,"tag":387,"props":1110,"children":1111},{"class":389,"line":40},[1112],{"type":101,"tag":387,"props":1113,"children":1114},{"style":410},[1115],{"type":106,"value":1116},"# OR — use --or to start a new group\n",{"type":101,"tag":387,"props":1118,"children":1119},{"class":389,"line":839},[1120,1124,1128,1132,1136,1140,1145,1149],{"type":101,"tag":387,"props":1121,"children":1122},{"style":394},[1123],{"type":106,"value":8},{"type":101,"tag":387,"props":1125,"children":1126},{"style":399},[1127],{"type":106,"value":402},{"type":101,"tag":387,"props":1129,"children":1130},{"style":399},[1131],{"type":106,"value":585},{"type":101,"tag":387,"props":1133,"children":1134},{"style":399},[1135],{"type":106,"value":765},{"type":101,"tag":387,"props":1137,"children":1138},{"style":670},[1139],{"type":106,"value":673},{"type":101,"tag":387,"props":1141,"children":1142},{"style":399},[1143],{"type":106,"value":1144},"Block dangerous methods",{"type":101,"tag":387,"props":1146,"children":1147},{"style":670},[1148],{"type":106,"value":683},{"type":101,"tag":387,"props":1150,"children":1151},{"style":872},[1152],{"type":106,"value":875},{"type":101,"tag":387,"props":1154,"children":1155},{"class":389,"line":878},[1156,1160,1164,1169,1173],{"type":101,"tag":387,"props":1157,"children":1158},{"style":399},[1159],{"type":106,"value":884},{"type":101,"tag":387,"props":1161,"children":1162},{"style":670},[1163],{"type":106,"value":889},{"type":101,"tag":387,"props":1165,"children":1166},{"style":399},[1167],{"type":106,"value":1168},"{\"type\":\"method\",\"op\":\"eq\",\"value\":\"DELETE\"}",{"type":101,"tag":387,"props":1170,"children":1171},{"style":670},[1172],{"type":106,"value":899},{"type":101,"tag":387,"props":1174,"children":1175},{"style":872},[1176],{"type":106,"value":875},{"type":101,"tag":387,"props":1178,"children":1179},{"class":389,"line":906},[1180,1185],{"type":101,"tag":387,"props":1181,"children":1182},{"style":399},[1183],{"type":106,"value":1184},"  --or",{"type":101,"tag":387,"props":1186,"children":1187},{"style":872},[1188],{"type":106,"value":875},{"type":101,"tag":387,"props":1190,"children":1191},{"class":389,"line":925},[1192,1196,1200,1205,1209],{"type":101,"tag":387,"props":1193,"children":1194},{"style":399},[1195],{"type":106,"value":884},{"type":101,"tag":387,"props":1197,"children":1198},{"style":670},[1199],{"type":106,"value":889},{"type":101,"tag":387,"props":1201,"children":1202},{"style":399},[1203],{"type":106,"value":1204},"{\"type\":\"method\",\"op\":\"eq\",\"value\":\"PATCH\"}",{"type":101,"tag":387,"props":1206,"children":1207},{"style":670},[1208],{"type":106,"value":899},{"type":101,"tag":387,"props":1210,"children":1211},{"style":872},[1212],{"type":106,"value":875},{"type":101,"tag":387,"props":1214,"children":1215},{"class":389,"line":933},[1216,1220,1225],{"type":101,"tag":387,"props":1217,"children":1218},{"style":399},[1219],{"type":106,"value":912},{"type":101,"tag":387,"props":1221,"children":1222},{"style":399},[1223],{"type":106,"value":1224}," challenge",{"type":101,"tag":387,"props":1226,"children":1227},{"style":399},[1228],{"type":106,"value":922},{"type":101,"tag":557,"props":1230,"children":1232},{"id":1231},"edit-and-manage",[1233],{"type":106,"value":1234},"Edit and manage",{"type":101,"tag":376,"props":1236,"children":1238},{"className":378,"code":1237,"language":380,"meta":381,"style":381},"vercel firewall rules edit \"My Rule\" --action challenge --yes      # change action\nvercel firewall rules edit \"My Rule\" --name \"New Name\" --yes       # rename\nvercel firewall rules edit \"My Rule\" --enabled --yes               # enable\nvercel firewall rules edit \"My Rule\" --disabled --yes              # disable\nvercel firewall rules edit \"My Rule\" \\\n  --condition '{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fnew\"}' --yes    # replace conditions\n\nvercel firewall rules enable  \"My Rule\"\nvercel firewall rules disable \"My Rule\"\nvercel firewall rules remove  \"My Rule\" --yes                      # aliases: rm, delete\nvercel firewall rules reorder \"My Rule\" --first  --yes             # move to highest priority\nvercel firewall rules reorder \"My Rule\" --last   --yes\nvercel firewall rules reorder \"My Rule\" --position 3 --yes         # 1-based\n",[1239],{"type":101,"tag":114,"props":1240,"children":1241},{"__ignoreMap":381},[1242,1293,1351,1396,1441,1476,1505,1512,1545,1577,1618,1665,1706],{"type":101,"tag":387,"props":1243,"children":1244},{"class":389,"line":390},[1245,1249,1253,1257,1262,1266,1270,1274,1279,1283,1288],{"type":101,"tag":387,"props":1246,"children":1247},{"style":394},[1248],{"type":106,"value":8},{"type":101,"tag":387,"props":1250,"children":1251},{"style":399},[1252],{"type":106,"value":402},{"type":101,"tag":387,"props":1254,"children":1255},{"style":399},[1256],{"type":106,"value":585},{"type":101,"tag":387,"props":1258,"children":1259},{"style":399},[1260],{"type":106,"value":1261}," edit",{"type":101,"tag":387,"props":1263,"children":1264},{"style":670},[1265],{"type":106,"value":673},{"type":101,"tag":387,"props":1267,"children":1268},{"style":399},[1269],{"type":106,"value":678},{"type":101,"tag":387,"props":1271,"children":1272},{"style":670},[1273],{"type":106,"value":683},{"type":101,"tag":387,"props":1275,"children":1276},{"style":399},[1277],{"type":106,"value":1278}," --action",{"type":101,"tag":387,"props":1280,"children":1281},{"style":399},[1282],{"type":106,"value":1224},{"type":101,"tag":387,"props":1284,"children":1285},{"style":399},[1286],{"type":106,"value":1287}," --yes",{"type":101,"tag":387,"props":1289,"children":1290},{"style":410},[1291],{"type":106,"value":1292},"      # change action\n",{"type":101,"tag":387,"props":1294,"children":1295},{"class":389,"line":416},[1296,1300,1304,1308,1312,1316,1320,1324,1329,1333,1338,1342,1346],{"type":101,"tag":387,"props":1297,"children":1298},{"style":394},[1299],{"type":106,"value":8},{"type":101,"tag":387,"props":1301,"children":1302},{"style":399},[1303],{"type":106,"value":402},{"type":101,"tag":387,"props":1305,"children":1306},{"style":399},[1307],{"type":106,"value":585},{"type":101,"tag":387,"props":1309,"children":1310},{"style":399},[1311],{"type":106,"value":1261},{"type":101,"tag":387,"props":1313,"children":1314},{"style":670},[1315],{"type":106,"value":673},{"type":101,"tag":387,"props":1317,"children":1318},{"style":399},[1319],{"type":106,"value":678},{"type":101,"tag":387,"props":1321,"children":1322},{"style":670},[1323],{"type":106,"value":683},{"type":101,"tag":387,"props":1325,"children":1326},{"style":399},[1327],{"type":106,"value":1328}," --name",{"type":101,"tag":387,"props":1330,"children":1331},{"style":670},[1332],{"type":106,"value":673},{"type":101,"tag":387,"props":1334,"children":1335},{"style":399},[1336],{"type":106,"value":1337},"New Name",{"type":101,"tag":387,"props":1339,"children":1340},{"style":670},[1341],{"type":106,"value":683},{"type":101,"tag":387,"props":1343,"children":1344},{"style":399},[1345],{"type":106,"value":1287},{"type":101,"tag":387,"props":1347,"children":1348},{"style":410},[1349],{"type":106,"value":1350},"       # rename\n",{"type":101,"tag":387,"props":1352,"children":1353},{"class":389,"line":437},[1354,1358,1362,1366,1370,1374,1378,1382,1387,1391],{"type":101,"tag":387,"props":1355,"children":1356},{"style":394},[1357],{"type":106,"value":8},{"type":101,"tag":387,"props":1359,"children":1360},{"style":399},[1361],{"type":106,"value":402},{"type":101,"tag":387,"props":1363,"children":1364},{"style":399},[1365],{"type":106,"value":585},{"type":101,"tag":387,"props":1367,"children":1368},{"style":399},[1369],{"type":106,"value":1261},{"type":101,"tag":387,"props":1371,"children":1372},{"style":670},[1373],{"type":106,"value":673},{"type":101,"tag":387,"props":1375,"children":1376},{"style":399},[1377],{"type":106,"value":678},{"type":101,"tag":387,"props":1379,"children":1380},{"style":670},[1381],{"type":106,"value":683},{"type":101,"tag":387,"props":1383,"children":1384},{"style":399},[1385],{"type":106,"value":1386}," --enabled",{"type":101,"tag":387,"props":1388,"children":1389},{"style":399},[1390],{"type":106,"value":1287},{"type":101,"tag":387,"props":1392,"children":1393},{"style":410},[1394],{"type":106,"value":1395},"               # enable\n",{"type":101,"tag":387,"props":1397,"children":1398},{"class":389,"line":459},[1399,1403,1407,1411,1415,1419,1423,1427,1432,1436],{"type":101,"tag":387,"props":1400,"children":1401},{"style":394},[1402],{"type":106,"value":8},{"type":101,"tag":387,"props":1404,"children":1405},{"style":399},[1406],{"type":106,"value":402},{"type":101,"tag":387,"props":1408,"children":1409},{"style":399},[1410],{"type":106,"value":585},{"type":101,"tag":387,"props":1412,"children":1413},{"style":399},[1414],{"type":106,"value":1261},{"type":101,"tag":387,"props":1416,"children":1417},{"style":670},[1418],{"type":106,"value":673},{"type":101,"tag":387,"props":1420,"children":1421},{"style":399},[1422],{"type":106,"value":678},{"type":101,"tag":387,"props":1424,"children":1425},{"style":670},[1426],{"type":106,"value":683},{"type":101,"tag":387,"props":1428,"children":1429},{"style":399},[1430],{"type":106,"value":1431}," --disabled",{"type":101,"tag":387,"props":1433,"children":1434},{"style":399},[1435],{"type":106,"value":1287},{"type":101,"tag":387,"props":1437,"children":1438},{"style":410},[1439],{"type":106,"value":1440},"              # disable\n",{"type":101,"tag":387,"props":1442,"children":1443},{"class":389,"line":691},[1444,1448,1452,1456,1460,1464,1468,1472],{"type":101,"tag":387,"props":1445,"children":1446},{"style":394},[1447],{"type":106,"value":8},{"type":101,"tag":387,"props":1449,"children":1450},{"style":399},[1451],{"type":106,"value":402},{"type":101,"tag":387,"props":1453,"children":1454},{"style":399},[1455],{"type":106,"value":585},{"type":101,"tag":387,"props":1457,"children":1458},{"style":399},[1459],{"type":106,"value":1261},{"type":101,"tag":387,"props":1461,"children":1462},{"style":670},[1463],{"type":106,"value":673},{"type":101,"tag":387,"props":1465,"children":1466},{"style":399},[1467],{"type":106,"value":678},{"type":101,"tag":387,"props":1469,"children":1470},{"style":670},[1471],{"type":106,"value":683},{"type":101,"tag":387,"props":1473,"children":1474},{"style":872},[1475],{"type":106,"value":875},{"type":101,"tag":387,"props":1477,"children":1478},{"class":389,"line":71},[1479,1483,1487,1492,1496,1500],{"type":101,"tag":387,"props":1480,"children":1481},{"style":399},[1482],{"type":106,"value":884},{"type":101,"tag":387,"props":1484,"children":1485},{"style":670},[1486],{"type":106,"value":889},{"type":101,"tag":387,"props":1488,"children":1489},{"style":399},[1490],{"type":106,"value":1491},"{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fnew\"}",{"type":101,"tag":387,"props":1493,"children":1494},{"style":670},[1495],{"type":106,"value":899},{"type":101,"tag":387,"props":1497,"children":1498},{"style":399},[1499],{"type":106,"value":1287},{"type":101,"tag":387,"props":1501,"children":1502},{"style":410},[1503],{"type":106,"value":1504},"    # replace conditions\n",{"type":101,"tag":387,"props":1506,"children":1507},{"class":389,"line":40},[1508],{"type":101,"tag":387,"props":1509,"children":1510},{"emptyLinePlaceholder":790},[1511],{"type":106,"value":793},{"type":101,"tag":387,"props":1513,"children":1514},{"class":389,"line":839},[1515,1519,1523,1527,1532,1537,1541],{"type":101,"tag":387,"props":1516,"children":1517},{"style":394},[1518],{"type":106,"value":8},{"type":101,"tag":387,"props":1520,"children":1521},{"style":399},[1522],{"type":106,"value":402},{"type":101,"tag":387,"props":1524,"children":1525},{"style":399},[1526],{"type":106,"value":585},{"type":101,"tag":387,"props":1528,"children":1529},{"style":399},[1530],{"type":106,"value":1531}," enable",{"type":101,"tag":387,"props":1533,"children":1534},{"style":670},[1535],{"type":106,"value":1536},"  \"",{"type":101,"tag":387,"props":1538,"children":1539},{"style":399},[1540],{"type":106,"value":678},{"type":101,"tag":387,"props":1542,"children":1543},{"style":670},[1544],{"type":106,"value":784},{"type":101,"tag":387,"props":1546,"children":1547},{"class":389,"line":878},[1548,1552,1556,1560,1565,1569,1573],{"type":101,"tag":387,"props":1549,"children":1550},{"style":394},[1551],{"type":106,"value":8},{"type":101,"tag":387,"props":1553,"children":1554},{"style":399},[1555],{"type":106,"value":402},{"type":101,"tag":387,"props":1557,"children":1558},{"style":399},[1559],{"type":106,"value":585},{"type":101,"tag":387,"props":1561,"children":1562},{"style":399},[1563],{"type":106,"value":1564}," disable",{"type":101,"tag":387,"props":1566,"children":1567},{"style":670},[1568],{"type":106,"value":673},{"type":101,"tag":387,"props":1570,"children":1571},{"style":399},[1572],{"type":106,"value":678},{"type":101,"tag":387,"props":1574,"children":1575},{"style":670},[1576],{"type":106,"value":784},{"type":101,"tag":387,"props":1578,"children":1579},{"class":389,"line":906},[1580,1584,1588,1592,1597,1601,1605,1609,1613],{"type":101,"tag":387,"props":1581,"children":1582},{"style":394},[1583],{"type":106,"value":8},{"type":101,"tag":387,"props":1585,"children":1586},{"style":399},[1587],{"type":106,"value":402},{"type":101,"tag":387,"props":1589,"children":1590},{"style":399},[1591],{"type":106,"value":585},{"type":101,"tag":387,"props":1593,"children":1594},{"style":399},[1595],{"type":106,"value":1596}," remove",{"type":101,"tag":387,"props":1598,"children":1599},{"style":670},[1600],{"type":106,"value":1536},{"type":101,"tag":387,"props":1602,"children":1603},{"style":399},[1604],{"type":106,"value":678},{"type":101,"tag":387,"props":1606,"children":1607},{"style":670},[1608],{"type":106,"value":683},{"type":101,"tag":387,"props":1610,"children":1611},{"style":399},[1612],{"type":106,"value":1287},{"type":101,"tag":387,"props":1614,"children":1615},{"style":410},[1616],{"type":106,"value":1617},"                      # aliases: rm, delete\n",{"type":101,"tag":387,"props":1619,"children":1620},{"class":389,"line":925},[1621,1625,1629,1633,1638,1642,1646,1650,1655,1660],{"type":101,"tag":387,"props":1622,"children":1623},{"style":394},[1624],{"type":106,"value":8},{"type":101,"tag":387,"props":1626,"children":1627},{"style":399},[1628],{"type":106,"value":402},{"type":101,"tag":387,"props":1630,"children":1631},{"style":399},[1632],{"type":106,"value":585},{"type":101,"tag":387,"props":1634,"children":1635},{"style":399},[1636],{"type":106,"value":1637}," reorder",{"type":101,"tag":387,"props":1639,"children":1640},{"style":670},[1641],{"type":106,"value":673},{"type":101,"tag":387,"props":1643,"children":1644},{"style":399},[1645],{"type":106,"value":678},{"type":101,"tag":387,"props":1647,"children":1648},{"style":670},[1649],{"type":106,"value":683},{"type":101,"tag":387,"props":1651,"children":1652},{"style":399},[1653],{"type":106,"value":1654}," --first",{"type":101,"tag":387,"props":1656,"children":1657},{"style":399},[1658],{"type":106,"value":1659},"  --yes",{"type":101,"tag":387,"props":1661,"children":1662},{"style":410},[1663],{"type":106,"value":1664},"             # move to highest priority\n",{"type":101,"tag":387,"props":1666,"children":1667},{"class":389,"line":933},[1668,1672,1676,1680,1684,1688,1692,1696,1701],{"type":101,"tag":387,"props":1669,"children":1670},{"style":394},[1671],{"type":106,"value":8},{"type":101,"tag":387,"props":1673,"children":1674},{"style":399},[1675],{"type":106,"value":402},{"type":101,"tag":387,"props":1677,"children":1678},{"style":399},[1679],{"type":106,"value":585},{"type":101,"tag":387,"props":1681,"children":1682},{"style":399},[1683],{"type":106,"value":1637},{"type":101,"tag":387,"props":1685,"children":1686},{"style":670},[1687],{"type":106,"value":673},{"type":101,"tag":387,"props":1689,"children":1690},{"style":399},[1691],{"type":106,"value":678},{"type":101,"tag":387,"props":1693,"children":1694},{"style":670},[1695],{"type":106,"value":683},{"type":101,"tag":387,"props":1697,"children":1698},{"style":399},[1699],{"type":106,"value":1700}," --last",{"type":101,"tag":387,"props":1702,"children":1703},{"style":399},[1704],{"type":106,"value":1705},"   --yes\n",{"type":101,"tag":387,"props":1707,"children":1708},{"class":389,"line":942},[1709,1713,1717,1721,1725,1729,1733,1737,1742,1748,1752],{"type":101,"tag":387,"props":1710,"children":1711},{"style":394},[1712],{"type":106,"value":8},{"type":101,"tag":387,"props":1714,"children":1715},{"style":399},[1716],{"type":106,"value":402},{"type":101,"tag":387,"props":1718,"children":1719},{"style":399},[1720],{"type":106,"value":585},{"type":101,"tag":387,"props":1722,"children":1723},{"style":399},[1724],{"type":106,"value":1637},{"type":101,"tag":387,"props":1726,"children":1727},{"style":670},[1728],{"type":106,"value":673},{"type":101,"tag":387,"props":1730,"children":1731},{"style":399},[1732],{"type":106,"value":678},{"type":101,"tag":387,"props":1734,"children":1735},{"style":670},[1736],{"type":106,"value":683},{"type":101,"tag":387,"props":1738,"children":1739},{"style":399},[1740],{"type":106,"value":1741}," --position",{"type":101,"tag":387,"props":1743,"children":1745},{"style":1744},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1746],{"type":106,"value":1747}," 3",{"type":101,"tag":387,"props":1749,"children":1750},{"style":399},[1751],{"type":106,"value":1287},{"type":101,"tag":387,"props":1753,"children":1754},{"style":410},[1755],{"type":106,"value":1756},"         # 1-based\n",{"type":101,"tag":108,"props":1758,"children":1759},{},[1760],{"type":106,"value":1761},"Rules are evaluated in priority order (top to bottom). Reorder to control which rule matches first.",{"type":101,"tag":108,"props":1763,"children":1764},{},[1765,1767,1773,1775,1781],{"type":106,"value":1766},"NOTE: When using ",{"type":101,"tag":114,"props":1768,"children":1770},{"className":1769},[],[1771],{"type":106,"value":1772},"edit",{"type":106,"value":1774}," with ",{"type":101,"tag":114,"props":1776,"children":1778},{"className":1777},[],[1779],{"type":106,"value":1780},"--condition",{"type":106,"value":1782},", it will overwrite all conditions listed in the rule. Make sure to specify all conditions when editing a rule.",{"type":101,"tag":557,"props":1784,"children":1786},{"id":1785},"condition-format",[1787],{"type":106,"value":1788},"Condition format",{"type":101,"tag":108,"props":1790,"children":1791},{},[1792,1794,1799],{"type":106,"value":1793},"Each ",{"type":101,"tag":114,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":106,"value":1780},{"type":106,"value":1800}," is a JSON object:",{"type":101,"tag":376,"props":1802,"children":1806},{"className":1803,"code":1804,"language":1805,"meta":381,"style":381},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"type\": \"path\", \u002F\u002F condition type (required)\n  \"op\": \"pre\", \u002F\u002F operator (required)\n  \"value\": \"\u002Fapi\", \u002F\u002F value (required for most operators; omit for ex\u002Fnex)\n  \"key\": \"Authorization\", \u002F\u002F required for header \u002F cookie \u002F query types\n  \"neg\": true \u002F\u002F negate the condition (optional, default false)\n}\n","json",[1807],{"type":101,"tag":114,"props":1808,"children":1809},{"__ignoreMap":381},[1810,1818,1862,1903,1945,1987,2017],{"type":101,"tag":387,"props":1811,"children":1812},{"class":389,"line":390},[1813],{"type":101,"tag":387,"props":1814,"children":1815},{"style":670},[1816],{"type":106,"value":1817},"{\n",{"type":101,"tag":387,"props":1819,"children":1820},{"class":389,"line":416},[1821,1825,1831,1835,1840,1844,1848,1852,1857],{"type":101,"tag":387,"props":1822,"children":1823},{"style":670},[1824],{"type":106,"value":1536},{"type":101,"tag":387,"props":1826,"children":1828},{"style":1827},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1829],{"type":106,"value":1830},"type",{"type":101,"tag":387,"props":1832,"children":1833},{"style":670},[1834],{"type":106,"value":683},{"type":101,"tag":387,"props":1836,"children":1837},{"style":670},[1838],{"type":106,"value":1839},":",{"type":101,"tag":387,"props":1841,"children":1842},{"style":670},[1843],{"type":106,"value":673},{"type":101,"tag":387,"props":1845,"children":1846},{"style":399},[1847],{"type":106,"value":238},{"type":101,"tag":387,"props":1849,"children":1850},{"style":670},[1851],{"type":106,"value":683},{"type":101,"tag":387,"props":1853,"children":1854},{"style":670},[1855],{"type":106,"value":1856},",",{"type":101,"tag":387,"props":1858,"children":1859},{"style":410},[1860],{"type":106,"value":1861}," \u002F\u002F condition type (required)\n",{"type":101,"tag":387,"props":1863,"children":1864},{"class":389,"line":437},[1865,1869,1874,1878,1882,1886,1890,1894,1898],{"type":101,"tag":387,"props":1866,"children":1867},{"style":670},[1868],{"type":106,"value":1536},{"type":101,"tag":387,"props":1870,"children":1871},{"style":1827},[1872],{"type":106,"value":1873},"op",{"type":101,"tag":387,"props":1875,"children":1876},{"style":670},[1877],{"type":106,"value":683},{"type":101,"tag":387,"props":1879,"children":1880},{"style":670},[1881],{"type":106,"value":1839},{"type":101,"tag":387,"props":1883,"children":1884},{"style":670},[1885],{"type":106,"value":673},{"type":101,"tag":387,"props":1887,"children":1888},{"style":399},[1889],{"type":106,"value":376},{"type":101,"tag":387,"props":1891,"children":1892},{"style":670},[1893],{"type":106,"value":683},{"type":101,"tag":387,"props":1895,"children":1896},{"style":670},[1897],{"type":106,"value":1856},{"type":101,"tag":387,"props":1899,"children":1900},{"style":410},[1901],{"type":106,"value":1902}," \u002F\u002F operator (required)\n",{"type":101,"tag":387,"props":1904,"children":1905},{"class":389,"line":459},[1906,1910,1915,1919,1923,1927,1932,1936,1940],{"type":101,"tag":387,"props":1907,"children":1908},{"style":670},[1909],{"type":106,"value":1536},{"type":101,"tag":387,"props":1911,"children":1912},{"style":1827},[1913],{"type":106,"value":1914},"value",{"type":101,"tag":387,"props":1916,"children":1917},{"style":670},[1918],{"type":106,"value":683},{"type":101,"tag":387,"props":1920,"children":1921},{"style":670},[1922],{"type":106,"value":1839},{"type":101,"tag":387,"props":1924,"children":1925},{"style":670},[1926],{"type":106,"value":673},{"type":101,"tag":387,"props":1928,"children":1929},{"style":399},[1930],{"type":106,"value":1931},"\u002Fapi",{"type":101,"tag":387,"props":1933,"children":1934},{"style":670},[1935],{"type":106,"value":683},{"type":101,"tag":387,"props":1937,"children":1938},{"style":670},[1939],{"type":106,"value":1856},{"type":101,"tag":387,"props":1941,"children":1942},{"style":410},[1943],{"type":106,"value":1944}," \u002F\u002F value (required for most operators; omit for ex\u002Fnex)\n",{"type":101,"tag":387,"props":1946,"children":1947},{"class":389,"line":691},[1948,1952,1957,1961,1965,1969,1974,1978,1982],{"type":101,"tag":387,"props":1949,"children":1950},{"style":670},[1951],{"type":106,"value":1536},{"type":101,"tag":387,"props":1953,"children":1954},{"style":1827},[1955],{"type":106,"value":1956},"key",{"type":101,"tag":387,"props":1958,"children":1959},{"style":670},[1960],{"type":106,"value":683},{"type":101,"tag":387,"props":1962,"children":1963},{"style":670},[1964],{"type":106,"value":1839},{"type":101,"tag":387,"props":1966,"children":1967},{"style":670},[1968],{"type":106,"value":673},{"type":101,"tag":387,"props":1970,"children":1971},{"style":399},[1972],{"type":106,"value":1973},"Authorization",{"type":101,"tag":387,"props":1975,"children":1976},{"style":670},[1977],{"type":106,"value":683},{"type":101,"tag":387,"props":1979,"children":1980},{"style":670},[1981],{"type":106,"value":1856},{"type":101,"tag":387,"props":1983,"children":1984},{"style":410},[1985],{"type":106,"value":1986}," \u002F\u002F required for header \u002F cookie \u002F query types\n",{"type":101,"tag":387,"props":1988,"children":1989},{"class":389,"line":71},[1990,1994,1999,2003,2007,2012],{"type":101,"tag":387,"props":1991,"children":1992},{"style":670},[1993],{"type":106,"value":1536},{"type":101,"tag":387,"props":1995,"children":1996},{"style":1827},[1997],{"type":106,"value":1998},"neg",{"type":101,"tag":387,"props":2000,"children":2001},{"style":670},[2002],{"type":106,"value":683},{"type":101,"tag":387,"props":2004,"children":2005},{"style":670},[2006],{"type":106,"value":1839},{"type":101,"tag":387,"props":2008,"children":2009},{"style":670},[2010],{"type":106,"value":2011}," true",{"type":101,"tag":387,"props":2013,"children":2014},{"style":410},[2015],{"type":106,"value":2016}," \u002F\u002F negate the condition (optional, default false)\n",{"type":101,"tag":387,"props":2018,"children":2019},{"class":389,"line":40},[2020],{"type":101,"tag":387,"props":2021,"children":2022},{"style":670},[2023],{"type":106,"value":2024},"}\n",{"type":101,"tag":108,"props":2026,"children":2027},{},[2028,2030,2035,2037,2043,2045,2050],{"type":106,"value":2029},"Conditions within a group are ",{"type":101,"tag":146,"props":2031,"children":2032},{},[2033],{"type":106,"value":2034},"AND'd",{"type":106,"value":2036},". Multiple groups (separated by ",{"type":101,"tag":114,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":106,"value":2042},"--or",{"type":106,"value":2044},") are ",{"type":101,"tag":146,"props":2046,"children":2047},{},[2048],{"type":106,"value":2049},"OR'd",{"type":106,"value":539},{"type":101,"tag":557,"props":2052,"children":2054},{"id":2053},"operators",[2055],{"type":106,"value":2056},"Operators",{"type":101,"tag":108,"props":2058,"children":2059},{},[2060,2066,2068,2074,2076,2082,2084,2089,2091,2097,2099,2105,2107,2113,2114,2120,2122,2127,2129,2135,2136,2142,2144,2149,2151,2157,2158,2164,2165,2171,2172,2178,2180,2186],{"type":101,"tag":114,"props":2061,"children":2063},{"className":2062},[],[2064],{"type":106,"value":2065},"eq",{"type":106,"value":2067},"\u002F",{"type":101,"tag":114,"props":2069,"children":2071},{"className":2070},[],[2072],{"type":106,"value":2073},"neq",{"type":106,"value":2075}," (equals), ",{"type":101,"tag":114,"props":2077,"children":2079},{"className":2078},[],[2080],{"type":106,"value":2081},"sub",{"type":106,"value":2083}," (contains), ",{"type":101,"tag":114,"props":2085,"children":2087},{"className":2086},[],[2088],{"type":106,"value":376},{"type":106,"value":2090}," (starts-with), ",{"type":101,"tag":114,"props":2092,"children":2094},{"className":2093},[],[2095],{"type":106,"value":2096},"suf",{"type":106,"value":2098}," (ends-with), ",{"type":101,"tag":114,"props":2100,"children":2102},{"className":2101},[],[2103],{"type":106,"value":2104},"re",{"type":106,"value":2106}," (regex), ",{"type":101,"tag":114,"props":2108,"children":2110},{"className":2109},[],[2111],{"type":106,"value":2112},"ex",{"type":106,"value":2067},{"type":101,"tag":114,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":106,"value":2119},"nex",{"type":106,"value":2121}," (exists; omit ",{"type":101,"tag":114,"props":2123,"children":2125},{"className":2124},[],[2126],{"type":106,"value":1914},{"type":106,"value":2128},"), ",{"type":101,"tag":114,"props":2130,"children":2132},{"className":2131},[],[2133],{"type":106,"value":2134},"inc",{"type":106,"value":2067},{"type":101,"tag":114,"props":2137,"children":2139},{"className":2138},[],[2140],{"type":106,"value":2141},"ninc",{"type":106,"value":2143}," (in set; ",{"type":101,"tag":114,"props":2145,"children":2147},{"className":2146},[],[2148],{"type":106,"value":1914},{"type":106,"value":2150}," is array or comma-separated), ",{"type":101,"tag":114,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":106,"value":2156},"gt",{"type":106,"value":2067},{"type":101,"tag":114,"props":2159,"children":2161},{"className":2160},[],[2162],{"type":106,"value":2163},"gte",{"type":106,"value":2067},{"type":101,"tag":114,"props":2166,"children":2168},{"className":2167},[],[2169],{"type":106,"value":2170},"lt",{"type":106,"value":2067},{"type":101,"tag":114,"props":2173,"children":2175},{"className":2174},[],[2176],{"type":106,"value":2177},"lte",{"type":106,"value":2179}," (numeric). Set ",{"type":101,"tag":114,"props":2181,"children":2183},{"className":2182},[],[2184],{"type":106,"value":2185},"neg: true",{"type":106,"value":2187}," to negate any operator.",{"type":101,"tag":557,"props":2189,"children":2191},{"id":2190},"condition-types",[2192],{"type":106,"value":2193},"Condition types",{"type":101,"tag":138,"props":2195,"children":2196},{},[2197,2286,2339,2372],{"type":101,"tag":142,"props":2198,"children":2199},{},[2200,2205,2207,2212,2213,2219,2221,2227,2229,2234,2236,2242,2243,2249,2250,2255,2256,2261,2262,2267,2268,2273,2274,2279,2281],{"type":101,"tag":146,"props":2201,"children":2202},{},[2203],{"type":106,"value":2204},"Request shape",{"type":106,"value":2206},": ",{"type":101,"tag":114,"props":2208,"children":2210},{"className":2209},[],[2211],{"type":106,"value":238},{"type":106,"value":190},{"type":101,"tag":114,"props":2214,"children":2216},{"className":2215},[],[2217],{"type":106,"value":2218},"raw_path",{"type":106,"value":2220}," (pre-rewrite), ",{"type":101,"tag":114,"props":2222,"children":2224},{"className":2223},[],[2225],{"type":106,"value":2226},"target_path",{"type":106,"value":2228}," (post-rewrite), ",{"type":101,"tag":114,"props":2230,"children":2232},{"className":2231},[],[2233],{"type":106,"value":273},{"type":106,"value":2235}," (e.g., ",{"type":101,"tag":114,"props":2237,"children":2239},{"className":2238},[],[2240],{"type":106,"value":2241},"\u002Fblog\u002F[slug]",{"type":106,"value":2128},{"type":101,"tag":114,"props":2244,"children":2246},{"className":2245},[],[2247],{"type":106,"value":2248},"server_action",{"type":106,"value":190},{"type":101,"tag":114,"props":2251,"children":2253},{"className":2252},[],[2254],{"type":106,"value":266},{"type":106,"value":190},{"type":101,"tag":114,"props":2257,"children":2259},{"className":2258},[],[2260],{"type":106,"value":231},{"type":106,"value":190},{"type":101,"tag":114,"props":2263,"children":2265},{"className":2264},[],[2266],{"type":106,"value":252},{"type":106,"value":190},{"type":101,"tag":114,"props":2269,"children":2271},{"className":2270},[],[2272],{"type":106,"value":259},{"type":106,"value":190},{"type":101,"tag":114,"props":2275,"children":2277},{"className":2276},[],[2278],{"type":106,"value":308},{"type":106,"value":2280}," (preview|production), ",{"type":101,"tag":114,"props":2282,"children":2284},{"className":2283},[],[2285],{"type":106,"value":315},{"type":101,"tag":142,"props":2287,"children":2288},{},[2289,2294,2295,2300,2302,2307,2308,2313,2314,2319,2320,2326,2327,2332,2333],{"type":101,"tag":146,"props":2290,"children":2291},{},[2292],{"type":106,"value":2293},"Client",{"type":106,"value":2206},{"type":101,"tag":114,"props":2296,"children":2298},{"className":2297},[],[2299],{"type":106,"value":280},{"type":106,"value":2301}," (IP or CIDR), ",{"type":101,"tag":114,"props":2303,"children":2305},{"className":2304},[],[2306],{"type":106,"value":301},{"type":106,"value":190},{"type":101,"tag":114,"props":2309,"children":2311},{"className":2310},[],[2312],{"type":106,"value":329},{"type":106,"value":190},{"type":101,"tag":114,"props":2315,"children":2317},{"className":2316},[],[2318],{"type":106,"value":322},{"type":106,"value":190},{"type":101,"tag":114,"props":2321,"children":2323},{"className":2322},[],[2324],{"type":106,"value":2325},"geo_country_region",{"type":106,"value":190},{"type":101,"tag":114,"props":2328,"children":2330},{"className":2329},[],[2331],{"type":106,"value":336},{"type":106,"value":190},{"type":101,"tag":114,"props":2334,"children":2336},{"className":2335},[],[2337],{"type":106,"value":2338},"geo_as_number",{"type":101,"tag":142,"props":2340,"children":2341},{},[2342,2347,2349,2354,2355,2360,2361,2366,2367],{"type":101,"tag":146,"props":2343,"children":2344},{},[2345],{"type":106,"value":2346},"Headers \u002F cookies \u002F queries",{"type":106,"value":2348}," — require ",{"type":101,"tag":114,"props":2350,"children":2352},{"className":2351},[],[2353],{"type":106,"value":1956},{"type":106,"value":2206},{"type":101,"tag":114,"props":2356,"children":2358},{"className":2357},[],[2359],{"type":106,"value":287},{"type":106,"value":190},{"type":101,"tag":114,"props":2362,"children":2364},{"className":2363},[],[2365],{"type":106,"value":294},{"type":106,"value":190},{"type":101,"tag":114,"props":2368,"children":2370},{"className":2369},[],[2371],{"type":106,"value":245},{"type":101,"tag":142,"props":2373,"children":2374},{},[2375,2380,2381,2386,2388,2394],{"type":101,"tag":146,"props":2376,"children":2377},{},[2378],{"type":106,"value":2379},"TLS fingerprints",{"type":106,"value":2206},{"type":101,"tag":114,"props":2382,"children":2384},{"className":2383},[],[2385],{"type":106,"value":344},{"type":106,"value":2387}," (all plans), ",{"type":101,"tag":114,"props":2389,"children":2391},{"className":2390},[],[2392],{"type":106,"value":2393},"ja3_digest",{"type":106,"value":2395}," (Enterprise only)",{"type":101,"tag":557,"props":2397,"children":2399},{"id":2398},"actions",[2400],{"type":106,"value":2401},"Actions",{"type":101,"tag":138,"props":2403,"children":2404},{},[2405,2415,2425,2435,2445],{"type":101,"tag":142,"props":2406,"children":2407},{},[2408,2413],{"type":101,"tag":114,"props":2409,"children":2411},{"className":2410},[],[2412],{"type":106,"value":188},{"type":106,"value":2414}," — block (403)",{"type":101,"tag":142,"props":2416,"children":2417},{},[2418,2423],{"type":101,"tag":114,"props":2419,"children":2421},{"className":2420},[],[2422],{"type":106,"value":65},{"type":106,"value":2424}," — show verification page",{"type":101,"tag":142,"props":2426,"children":2427},{},[2428,2433],{"type":101,"tag":114,"props":2429,"children":2431},{"className":2430},[],[2432],{"type":106,"value":202},{"type":106,"value":2434}," — log without blocking (use to tune before enforcing)",{"type":101,"tag":142,"props":2436,"children":2437},{},[2438,2443],{"type":101,"tag":114,"props":2439,"children":2441},{"className":2440},[],[2442],{"type":106,"value":209},{"type":106,"value":2444}," — skip remaining WAF custom rules + managed rulesets",{"type":101,"tag":142,"props":2446,"children":2447},{},[2448,2453],{"type":101,"tag":114,"props":2449,"children":2451},{"className":2450},[],[2452],{"type":106,"value":216},{"type":106,"value":2454}," — throttle by counting key (see Rate limit example for flags)",{"type":101,"tag":108,"props":2456,"children":2457},{},[2458,2460,2466,2468,2474,2475,2481,2482,2488,2489,2495,2496,2502,2504,2510],{"type":106,"value":2459},"All actions accept ",{"type":101,"tag":114,"props":2461,"children":2463},{"className":2462},[],[2464],{"type":106,"value":2465},"--duration",{"type":106,"value":2467}," (Pro\u002FEnterprise): ",{"type":101,"tag":114,"props":2469,"children":2471},{"className":2470},[],[2472],{"type":106,"value":2473},"1m",{"type":106,"value":190},{"type":101,"tag":114,"props":2476,"children":2478},{"className":2477},[],[2479],{"type":106,"value":2480},"5m",{"type":106,"value":190},{"type":101,"tag":114,"props":2483,"children":2485},{"className":2484},[],[2486],{"type":106,"value":2487},"15m",{"type":106,"value":190},{"type":101,"tag":114,"props":2490,"children":2492},{"className":2491},[],[2493],{"type":106,"value":2494},"30m",{"type":106,"value":190},{"type":101,"tag":114,"props":2497,"children":2499},{"className":2498},[],[2500],{"type":106,"value":2501},"1h",{"type":106,"value":2503},". Persistent — ",{"type":101,"tag":114,"props":2505,"children":2507},{"className":2506},[],[2508],{"type":106,"value":2509},"deny --duration 30m",{"type":106,"value":2511}," blocks the client for 30 min after first match. Without a duration the action evaluates per-request. Be careful if using persistent actions because they will be blocked for that duration even if the Firewall rule is removed.",{"type":101,"tag":557,"props":2513,"children":2515},{"id":2514},"rate-limit-example",[2516],{"type":106,"value":2517},"Rate limit example",{"type":101,"tag":376,"props":2519,"children":2521},{"className":378,"code":2520,"language":380,"meta":381,"style":381},"vercel firewall rules add \"Rate limit API\" \\\n  --condition '{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fapi\"}' \\\n  --action rate_limit \\\n  --rate-limit-window 60 \\\n  --rate-limit-requests 100 \\\n  --rate-limit-keys ip \\\n  --rate-limit-action deny \\\n  --yes\n",[2522],{"type":101,"tag":114,"props":2523,"children":2524},{"__ignoreMap":381},[2525,2561,2585,2601,2618,2635,2652,2668],{"type":101,"tag":387,"props":2526,"children":2527},{"class":389,"line":390},[2528,2532,2536,2540,2544,2548,2553,2557],{"type":101,"tag":387,"props":2529,"children":2530},{"style":394},[2531],{"type":106,"value":8},{"type":101,"tag":387,"props":2533,"children":2534},{"style":399},[2535],{"type":106,"value":402},{"type":101,"tag":387,"props":2537,"children":2538},{"style":399},[2539],{"type":106,"value":585},{"type":101,"tag":387,"props":2541,"children":2542},{"style":399},[2543],{"type":106,"value":765},{"type":101,"tag":387,"props":2545,"children":2546},{"style":670},[2547],{"type":106,"value":673},{"type":101,"tag":387,"props":2549,"children":2550},{"style":399},[2551],{"type":106,"value":2552},"Rate limit API",{"type":101,"tag":387,"props":2554,"children":2555},{"style":670},[2556],{"type":106,"value":683},{"type":101,"tag":387,"props":2558,"children":2559},{"style":872},[2560],{"type":106,"value":875},{"type":101,"tag":387,"props":2562,"children":2563},{"class":389,"line":416},[2564,2568,2572,2577,2581],{"type":101,"tag":387,"props":2565,"children":2566},{"style":399},[2567],{"type":106,"value":884},{"type":101,"tag":387,"props":2569,"children":2570},{"style":670},[2571],{"type":106,"value":889},{"type":101,"tag":387,"props":2573,"children":2574},{"style":399},[2575],{"type":106,"value":2576},"{\"type\":\"path\",\"op\":\"pre\",\"value\":\"\u002Fapi\"}",{"type":101,"tag":387,"props":2578,"children":2579},{"style":670},[2580],{"type":106,"value":899},{"type":101,"tag":387,"props":2582,"children":2583},{"style":872},[2584],{"type":106,"value":875},{"type":101,"tag":387,"props":2586,"children":2587},{"class":389,"line":437},[2588,2592,2597],{"type":101,"tag":387,"props":2589,"children":2590},{"style":399},[2591],{"type":106,"value":912},{"type":101,"tag":387,"props":2593,"children":2594},{"style":399},[2595],{"type":106,"value":2596}," rate_limit",{"type":101,"tag":387,"props":2598,"children":2599},{"style":872},[2600],{"type":106,"value":875},{"type":101,"tag":387,"props":2602,"children":2603},{"class":389,"line":459},[2604,2609,2614],{"type":101,"tag":387,"props":2605,"children":2606},{"style":399},[2607],{"type":106,"value":2608},"  --rate-limit-window",{"type":101,"tag":387,"props":2610,"children":2611},{"style":1744},[2612],{"type":106,"value":2613}," 60",{"type":101,"tag":387,"props":2615,"children":2616},{"style":872},[2617],{"type":106,"value":875},{"type":101,"tag":387,"props":2619,"children":2620},{"class":389,"line":691},[2621,2626,2631],{"type":101,"tag":387,"props":2622,"children":2623},{"style":399},[2624],{"type":106,"value":2625},"  --rate-limit-requests",{"type":101,"tag":387,"props":2627,"children":2628},{"style":1744},[2629],{"type":106,"value":2630}," 100",{"type":101,"tag":387,"props":2632,"children":2633},{"style":872},[2634],{"type":106,"value":875},{"type":101,"tag":387,"props":2636,"children":2637},{"class":389,"line":71},[2638,2643,2648],{"type":101,"tag":387,"props":2639,"children":2640},{"style":399},[2641],{"type":106,"value":2642},"  --rate-limit-keys",{"type":101,"tag":387,"props":2644,"children":2645},{"style":399},[2646],{"type":106,"value":2647}," ip",{"type":101,"tag":387,"props":2649,"children":2650},{"style":872},[2651],{"type":106,"value":875},{"type":101,"tag":387,"props":2653,"children":2654},{"class":389,"line":40},[2655,2660,2664],{"type":101,"tag":387,"props":2656,"children":2657},{"style":399},[2658],{"type":106,"value":2659},"  --rate-limit-action",{"type":101,"tag":387,"props":2661,"children":2662},{"style":399},[2663],{"type":106,"value":917},{"type":101,"tag":387,"props":2665,"children":2666},{"style":872},[2667],{"type":106,"value":875},{"type":101,"tag":387,"props":2669,"children":2670},{"class":389,"line":839},[2671],{"type":101,"tag":387,"props":2672,"children":2673},{"style":399},[2674],{"type":106,"value":2675},"  --yes\n",{"type":101,"tag":138,"props":2677,"children":2678},{},[2679,2690,2701,2736,2762,2798],{"type":101,"tag":142,"props":2680,"children":2681},{},[2682,2688],{"type":101,"tag":114,"props":2683,"children":2685},{"className":2684},[],[2686],{"type":106,"value":2687},"--rate-limit-window",{"type":106,"value":2689}," — seconds, 10–3600",{"type":101,"tag":142,"props":2691,"children":2692},{},[2693,2699],{"type":101,"tag":114,"props":2694,"children":2696},{"className":2695},[],[2697],{"type":106,"value":2698},"--rate-limit-requests",{"type":106,"value":2700}," — max per window, 1–10,000,000",{"type":101,"tag":142,"props":2702,"children":2703},{},[2704,2710,2712,2718,2720,2726,2728,2734],{"type":101,"tag":114,"props":2705,"children":2707},{"className":2706},[],[2708],{"type":106,"value":2709},"--rate-limit-keys",{"type":106,"value":2711}," — count by ",{"type":101,"tag":114,"props":2713,"children":2715},{"className":2714},[],[2716],{"type":106,"value":2717},"ip",{"type":106,"value":2719}," (default) or ",{"type":101,"tag":114,"props":2721,"children":2723},{"className":2722},[],[2724],{"type":106,"value":2725},"ja4",{"type":106,"value":2727},". ",{"type":101,"tag":114,"props":2729,"children":2731},{"className":2730},[],[2732],{"type":106,"value":2733},"header:\u003Cname>",{"type":106,"value":2735}," Enterprise only. Repeatable.",{"type":101,"tag":142,"props":2737,"children":2738},{},[2739,2745,2747,2753,2755,2761],{"type":101,"tag":114,"props":2740,"children":2742},{"className":2741},[],[2743],{"type":106,"value":2744},"--rate-limit-algo",{"type":106,"value":2746}," — ",{"type":101,"tag":114,"props":2748,"children":2750},{"className":2749},[],[2751],{"type":106,"value":2752},"fixed_window",{"type":106,"value":2754}," (default), ",{"type":101,"tag":114,"props":2756,"children":2758},{"className":2757},[],[2759],{"type":106,"value":2760},"token_bucket",{"type":106,"value":2395},{"type":101,"tag":142,"props":2763,"children":2764},{},[2765,2771,2773,2778,2780,2785,2787,2792,2793],{"type":101,"tag":114,"props":2766,"children":2768},{"className":2767},[],[2769],{"type":106,"value":2770},"--rate-limit-action",{"type":106,"value":2772}," — when limit exceeded: ",{"type":101,"tag":114,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":106,"value":216},{"type":106,"value":2779}," returns 429 (default), ",{"type":101,"tag":114,"props":2781,"children":2783},{"className":2782},[],[2784],{"type":106,"value":188},{"type":106,"value":2786}," 403, ",{"type":101,"tag":114,"props":2788,"children":2790},{"className":2789},[],[2791],{"type":106,"value":65},{"type":106,"value":190},{"type":101,"tag":114,"props":2794,"children":2796},{"className":2795},[],[2797],{"type":106,"value":202},{"type":101,"tag":142,"props":2799,"children":2800},{},[2801,2803,2808],{"type":106,"value":2802},"Counters are ",{"type":101,"tag":146,"props":2804,"children":2805},{},[2806],{"type":106,"value":2807},"per region",{"type":106,"value":2809}," — N regions can collectively exceed your configured limit by ~N×.",{"type":101,"tag":108,"props":2811,"children":2812},{},[2813,2815,2820],{"type":106,"value":2814},"When the user asks for firewall help on a project — or asks \"what rate limits should I add?\" — proactively scan the repo for API endpoints and suggest concrete ",{"type":101,"tag":114,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":106,"value":216},{"type":106,"value":2821}," rules. Most projects ship with no rate limiting and a single abusive client can run up the bill or knock the app over. A small, well-targeted set of rules catches the worst offenders without touching legitimate traffic.",{"type":101,"tag":108,"props":2823,"children":2824},{},[2825,2827,2833,2834,2840,2842,2848],{"type":106,"value":2826},"Method scoping matters — ",{"type":101,"tag":114,"props":2828,"children":2830},{"className":2829},[],[2831],{"type":106,"value":2832},"GET \u002Fapi\u002Ffoo",{"type":106,"value":487},{"type":101,"tag":114,"props":2835,"children":2837},{"className":2836},[],[2838],{"type":106,"value":2839},"POST \u002Fapi\u002Ffoo",{"type":106,"value":2841}," will likely need different rate limits. Always stage with ",{"type":101,"tag":114,"props":2843,"children":2845},{"className":2844},[],[2846],{"type":106,"value":2847},"--rate-limit-action log",{"type":106,"value":2849}," and a generous limit (5–10× the expected legitimate rate), then walk through the staged rollout in Best practices before tightening.",{"type":101,"tag":108,"props":2851,"children":2852},{},[2853,2855,2860,2861,2867],{"type":106,"value":2854},"For more sophisticated counting (custom buckets, hashing identifiers from headers\u002Fcookies, sliding windows from your own code) point the user at the ",{"type":101,"tag":146,"props":2856,"children":2857},{},[2858],{"type":106,"value":2859},"Rate Limiting SDK",{"type":106,"value":2206},{"type":101,"tag":122,"props":2862,"children":2865},{"href":2863,"rel":2864},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Frate-limiting-sdk",[351],[2866],{"type":106,"value":2863},{"type":106,"value":539},{"type":101,"tag":131,"props":2869,"children":2870},{"id":493},[2871],{"type":106,"value":2872},"IP blocks",{"type":101,"tag":108,"props":2874,"children":2875},{},[2876,2883,2885,2891],{"type":101,"tag":122,"props":2877,"children":2880},{"href":2878,"rel":2879},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fip-blocking",[351],[2881],{"type":106,"value":2882},"IP blocking",{"type":106,"value":2884}," blocks IPs or CIDRs entirely. Staged — requires ",{"type":101,"tag":114,"props":2886,"children":2888},{"className":2887},[],[2889],{"type":106,"value":2890},"publish",{"type":106,"value":539},{"type":101,"tag":376,"props":2893,"children":2895},{"className":378,"code":2894,"language":380,"meta":381,"style":381},"vercel firewall ip-blocks list\nvercel firewall ip-blocks list --json\nvercel firewall ip-blocks block 1.2.3.4 --yes\nvercel firewall ip-blocks block 10.0.0.0\u002F24 --hostname example.com --yes   # scoped to a host\nvercel firewall ip-blocks block 1.2.3.4 --notes \"Abuse report #123\" --yes\nvercel firewall ip-blocks unblock 1.2.3.4 --yes\nvercel firewall ip-blocks unblock 1.2.3.4 --hostname example.com --yes     # disambiguate when blocked on multiple hosts\nvercel firewall ip-blocks unblock ip_abc123 --yes                          # by rule ID\n",[2896],{"type":101,"tag":114,"props":2897,"children":2898},{"__ignoreMap":381},[2899,2920,2943,2972,3015,3060,3088,3128],{"type":101,"tag":387,"props":2900,"children":2901},{"class":389,"line":390},[2902,2906,2910,2915],{"type":101,"tag":387,"props":2903,"children":2904},{"style":394},[2905],{"type":106,"value":8},{"type":101,"tag":387,"props":2907,"children":2908},{"style":399},[2909],{"type":106,"value":402},{"type":101,"tag":387,"props":2911,"children":2912},{"style":399},[2913],{"type":106,"value":2914}," ip-blocks",{"type":101,"tag":387,"props":2916,"children":2917},{"style":399},[2918],{"type":106,"value":2919}," list\n",{"type":101,"tag":387,"props":2921,"children":2922},{"class":389,"line":416},[2923,2927,2931,2935,2939],{"type":101,"tag":387,"props":2924,"children":2925},{"style":394},[2926],{"type":106,"value":8},{"type":101,"tag":387,"props":2928,"children":2929},{"style":399},[2930],{"type":106,"value":402},{"type":101,"tag":387,"props":2932,"children":2933},{"style":399},[2934],{"type":106,"value":2914},{"type":101,"tag":387,"props":2936,"children":2937},{"style":399},[2938],{"type":106,"value":590},{"type":101,"tag":387,"props":2940,"children":2941},{"style":399},[2942],{"type":106,"value":434},{"type":101,"tag":387,"props":2944,"children":2945},{"class":389,"line":437},[2946,2950,2954,2958,2963,2968],{"type":101,"tag":387,"props":2947,"children":2948},{"style":394},[2949],{"type":106,"value":8},{"type":101,"tag":387,"props":2951,"children":2952},{"style":399},[2953],{"type":106,"value":402},{"type":101,"tag":387,"props":2955,"children":2956},{"style":399},[2957],{"type":106,"value":2914},{"type":101,"tag":387,"props":2959,"children":2960},{"style":399},[2961],{"type":106,"value":2962}," block",{"type":101,"tag":387,"props":2964,"children":2965},{"style":1744},[2966],{"type":106,"value":2967}," 1.2.3.4",{"type":101,"tag":387,"props":2969,"children":2970},{"style":399},[2971],{"type":106,"value":922},{"type":101,"tag":387,"props":2973,"children":2974},{"class":389,"line":459},[2975,2979,2983,2987,2991,2996,3001,3006,3010],{"type":101,"tag":387,"props":2976,"children":2977},{"style":394},[2978],{"type":106,"value":8},{"type":101,"tag":387,"props":2980,"children":2981},{"style":399},[2982],{"type":106,"value":402},{"type":101,"tag":387,"props":2984,"children":2985},{"style":399},[2986],{"type":106,"value":2914},{"type":101,"tag":387,"props":2988,"children":2989},{"style":399},[2990],{"type":106,"value":2962},{"type":101,"tag":387,"props":2992,"children":2993},{"style":399},[2994],{"type":106,"value":2995}," 10.0.0.0\u002F24",{"type":101,"tag":387,"props":2997,"children":2998},{"style":399},[2999],{"type":106,"value":3000}," --hostname",{"type":101,"tag":387,"props":3002,"children":3003},{"style":399},[3004],{"type":106,"value":3005}," example.com",{"type":101,"tag":387,"props":3007,"children":3008},{"style":399},[3009],{"type":106,"value":1287},{"type":101,"tag":387,"props":3011,"children":3012},{"style":410},[3013],{"type":106,"value":3014},"   # scoped to a host\n",{"type":101,"tag":387,"props":3016,"children":3017},{"class":389,"line":691},[3018,3022,3026,3030,3034,3038,3043,3047,3052,3056],{"type":101,"tag":387,"props":3019,"children":3020},{"style":394},[3021],{"type":106,"value":8},{"type":101,"tag":387,"props":3023,"children":3024},{"style":399},[3025],{"type":106,"value":402},{"type":101,"tag":387,"props":3027,"children":3028},{"style":399},[3029],{"type":106,"value":2914},{"type":101,"tag":387,"props":3031,"children":3032},{"style":399},[3033],{"type":106,"value":2962},{"type":101,"tag":387,"props":3035,"children":3036},{"style":1744},[3037],{"type":106,"value":2967},{"type":101,"tag":387,"props":3039,"children":3040},{"style":399},[3041],{"type":106,"value":3042}," --notes",{"type":101,"tag":387,"props":3044,"children":3045},{"style":670},[3046],{"type":106,"value":673},{"type":101,"tag":387,"props":3048,"children":3049},{"style":399},[3050],{"type":106,"value":3051},"Abuse report #123",{"type":101,"tag":387,"props":3053,"children":3054},{"style":670},[3055],{"type":106,"value":683},{"type":101,"tag":387,"props":3057,"children":3058},{"style":399},[3059],{"type":106,"value":922},{"type":101,"tag":387,"props":3061,"children":3062},{"class":389,"line":71},[3063,3067,3071,3075,3080,3084],{"type":101,"tag":387,"props":3064,"children":3065},{"style":394},[3066],{"type":106,"value":8},{"type":101,"tag":387,"props":3068,"children":3069},{"style":399},[3070],{"type":106,"value":402},{"type":101,"tag":387,"props":3072,"children":3073},{"style":399},[3074],{"type":106,"value":2914},{"type":101,"tag":387,"props":3076,"children":3077},{"style":399},[3078],{"type":106,"value":3079}," unblock",{"type":101,"tag":387,"props":3081,"children":3082},{"style":1744},[3083],{"type":106,"value":2967},{"type":101,"tag":387,"props":3085,"children":3086},{"style":399},[3087],{"type":106,"value":922},{"type":101,"tag":387,"props":3089,"children":3090},{"class":389,"line":40},[3091,3095,3099,3103,3107,3111,3115,3119,3123],{"type":101,"tag":387,"props":3092,"children":3093},{"style":394},[3094],{"type":106,"value":8},{"type":101,"tag":387,"props":3096,"children":3097},{"style":399},[3098],{"type":106,"value":402},{"type":101,"tag":387,"props":3100,"children":3101},{"style":399},[3102],{"type":106,"value":2914},{"type":101,"tag":387,"props":3104,"children":3105},{"style":399},[3106],{"type":106,"value":3079},{"type":101,"tag":387,"props":3108,"children":3109},{"style":1744},[3110],{"type":106,"value":2967},{"type":101,"tag":387,"props":3112,"children":3113},{"style":399},[3114],{"type":106,"value":3000},{"type":101,"tag":387,"props":3116,"children":3117},{"style":399},[3118],{"type":106,"value":3005},{"type":101,"tag":387,"props":3120,"children":3121},{"style":399},[3122],{"type":106,"value":1287},{"type":101,"tag":387,"props":3124,"children":3125},{"style":410},[3126],{"type":106,"value":3127},"     # disambiguate when blocked on multiple hosts\n",{"type":101,"tag":387,"props":3129,"children":3130},{"class":389,"line":839},[3131,3135,3139,3143,3147,3152,3156],{"type":101,"tag":387,"props":3132,"children":3133},{"style":394},[3134],{"type":106,"value":8},{"type":101,"tag":387,"props":3136,"children":3137},{"style":399},[3138],{"type":106,"value":402},{"type":101,"tag":387,"props":3140,"children":3141},{"style":399},[3142],{"type":106,"value":2914},{"type":101,"tag":387,"props":3144,"children":3145},{"style":399},[3146],{"type":106,"value":3079},{"type":101,"tag":387,"props":3148,"children":3149},{"style":399},[3150],{"type":106,"value":3151}," ip_abc123",{"type":101,"tag":387,"props":3153,"children":3154},{"style":399},[3155],{"type":106,"value":1287},{"type":101,"tag":387,"props":3157,"children":3158},{"style":410},[3159],{"type":106,"value":3160},"                          # by rule ID\n",{"type":101,"tag":131,"props":3162,"children":3163},{"id":516},[3164],{"type":106,"value":3165},"System bypass",{"type":101,"tag":108,"props":3167,"children":3168},{},[3169,3176,3178,3183],{"type":101,"tag":122,"props":3170,"children":3173},{"href":3171,"rel":3172},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fvercel-waf\u002Fsystem-bypass-rules",[351],[3174],{"type":106,"value":3175},"System bypass rules",{"type":106,"value":3177}," exempt trusted IPs\u002FCIDRs from ",{"type":101,"tag":146,"props":3179,"children":3180},{},[3181],{"type":106,"value":3182},"all",{"type":106,"value":3184}," firewall checks (office, CI servers, uptime monitors). Immediate — no publish.",{"type":101,"tag":376,"props":3186,"children":3188},{"className":378,"code":3187,"language":380,"meta":381,"style":381},"vercel firewall system-bypass list\nvercel firewall system-bypass list --json\nvercel firewall system-bypass add 10.0.0.1 --yes\nvercel firewall system-bypass add 10.0.0.0\u002F24 --yes\nvercel firewall system-bypass add 10.0.0.1 --domain example.com --yes\nvercel firewall system-bypass add 10.0.0.1 --domain \"*.example.com\" --yes  # wildcard domain\nvercel firewall system-bypass add 10.0.0.1 --notes \"Office IP\" --yes\nvercel firewall system-bypass remove 10.0.0.1 --yes\n",[3189],{"type":101,"tag":114,"props":3190,"children":3191},{"__ignoreMap":381},[3192,3212,3235,3263,3290,3326,3375,3419],{"type":101,"tag":387,"props":3193,"children":3194},{"class":389,"line":390},[3195,3199,3203,3208],{"type":101,"tag":387,"props":3196,"children":3197},{"style":394},[3198],{"type":106,"value":8},{"type":101,"tag":387,"props":3200,"children":3201},{"style":399},[3202],{"type":106,"value":402},{"type":101,"tag":387,"props":3204,"children":3205},{"style":399},[3206],{"type":106,"value":3207}," system-bypass",{"type":101,"tag":387,"props":3209,"children":3210},{"style":399},[3211],{"type":106,"value":2919},{"type":101,"tag":387,"props":3213,"children":3214},{"class":389,"line":416},[3215,3219,3223,3227,3231],{"type":101,"tag":387,"props":3216,"children":3217},{"style":394},[3218],{"type":106,"value":8},{"type":101,"tag":387,"props":3220,"children":3221},{"style":399},[3222],{"type":106,"value":402},{"type":101,"tag":387,"props":3224,"children":3225},{"style":399},[3226],{"type":106,"value":3207},{"type":101,"tag":387,"props":3228,"children":3229},{"style":399},[3230],{"type":106,"value":590},{"type":101,"tag":387,"props":3232,"children":3233},{"style":399},[3234],{"type":106,"value":434},{"type":101,"tag":387,"props":3236,"children":3237},{"class":389,"line":437},[3238,3242,3246,3250,3254,3259],{"type":101,"tag":387,"props":3239,"children":3240},{"style":394},[3241],{"type":106,"value":8},{"type":101,"tag":387,"props":3243,"children":3244},{"style":399},[3245],{"type":106,"value":402},{"type":101,"tag":387,"props":3247,"children":3248},{"style":399},[3249],{"type":106,"value":3207},{"type":101,"tag":387,"props":3251,"children":3252},{"style":399},[3253],{"type":106,"value":765},{"type":101,"tag":387,"props":3255,"children":3256},{"style":1744},[3257],{"type":106,"value":3258}," 10.0.0.1",{"type":101,"tag":387,"props":3260,"children":3261},{"style":399},[3262],{"type":106,"value":922},{"type":101,"tag":387,"props":3264,"children":3265},{"class":389,"line":459},[3266,3270,3274,3278,3282,3286],{"type":101,"tag":387,"props":3267,"children":3268},{"style":394},[3269],{"type":106,"value":8},{"type":101,"tag":387,"props":3271,"children":3272},{"style":399},[3273],{"type":106,"value":402},{"type":101,"tag":387,"props":3275,"children":3276},{"style":399},[3277],{"type":106,"value":3207},{"type":101,"tag":387,"props":3279,"children":3280},{"style":399},[3281],{"type":106,"value":765},{"type":101,"tag":387,"props":3283,"children":3284},{"style":399},[3285],{"type":106,"value":2995},{"type":101,"tag":387,"props":3287,"children":3288},{"style":399},[3289],{"type":106,"value":922},{"type":101,"tag":387,"props":3291,"children":3292},{"class":389,"line":691},[3293,3297,3301,3305,3309,3313,3318,3322],{"type":101,"tag":387,"props":3294,"children":3295},{"style":394},[3296],{"type":106,"value":8},{"type":101,"tag":387,"props":3298,"children":3299},{"style":399},[3300],{"type":106,"value":402},{"type":101,"tag":387,"props":3302,"children":3303},{"style":399},[3304],{"type":106,"value":3207},{"type":101,"tag":387,"props":3306,"children":3307},{"style":399},[3308],{"type":106,"value":765},{"type":101,"tag":387,"props":3310,"children":3311},{"style":1744},[3312],{"type":106,"value":3258},{"type":101,"tag":387,"props":3314,"children":3315},{"style":399},[3316],{"type":106,"value":3317}," --domain",{"type":101,"tag":387,"props":3319,"children":3320},{"style":399},[3321],{"type":106,"value":3005},{"type":101,"tag":387,"props":3323,"children":3324},{"style":399},[3325],{"type":106,"value":922},{"type":101,"tag":387,"props":3327,"children":3328},{"class":389,"line":71},[3329,3333,3337,3341,3345,3349,3353,3357,3362,3366,3370],{"type":101,"tag":387,"props":3330,"children":3331},{"style":394},[3332],{"type":106,"value":8},{"type":101,"tag":387,"props":3334,"children":3335},{"style":399},[3336],{"type":106,"value":402},{"type":101,"tag":387,"props":3338,"children":3339},{"style":399},[3340],{"type":106,"value":3207},{"type":101,"tag":387,"props":3342,"children":3343},{"style":399},[3344],{"type":106,"value":765},{"type":101,"tag":387,"props":3346,"children":3347},{"style":1744},[3348],{"type":106,"value":3258},{"type":101,"tag":387,"props":3350,"children":3351},{"style":399},[3352],{"type":106,"value":3317},{"type":101,"tag":387,"props":3354,"children":3355},{"style":670},[3356],{"type":106,"value":673},{"type":101,"tag":387,"props":3358,"children":3359},{"style":399},[3360],{"type":106,"value":3361},"*.example.com",{"type":101,"tag":387,"props":3363,"children":3364},{"style":670},[3365],{"type":106,"value":683},{"type":101,"tag":387,"props":3367,"children":3368},{"style":399},[3369],{"type":106,"value":1287},{"type":101,"tag":387,"props":3371,"children":3372},{"style":410},[3373],{"type":106,"value":3374},"  # wildcard domain\n",{"type":101,"tag":387,"props":3376,"children":3377},{"class":389,"line":40},[3378,3382,3386,3390,3394,3398,3402,3406,3411,3415],{"type":101,"tag":387,"props":3379,"children":3380},{"style":394},[3381],{"type":106,"value":8},{"type":101,"tag":387,"props":3383,"children":3384},{"style":399},[3385],{"type":106,"value":402},{"type":101,"tag":387,"props":3387,"children":3388},{"style":399},[3389],{"type":106,"value":3207},{"type":101,"tag":387,"props":3391,"children":3392},{"style":399},[3393],{"type":106,"value":765},{"type":101,"tag":387,"props":3395,"children":3396},{"style":1744},[3397],{"type":106,"value":3258},{"type":101,"tag":387,"props":3399,"children":3400},{"style":399},[3401],{"type":106,"value":3042},{"type":101,"tag":387,"props":3403,"children":3404},{"style":670},[3405],{"type":106,"value":673},{"type":101,"tag":387,"props":3407,"children":3408},{"style":399},[3409],{"type":106,"value":3410},"Office IP",{"type":101,"tag":387,"props":3412,"children":3413},{"style":670},[3414],{"type":106,"value":683},{"type":101,"tag":387,"props":3416,"children":3417},{"style":399},[3418],{"type":106,"value":922},{"type":101,"tag":387,"props":3420,"children":3421},{"class":389,"line":839},[3422,3426,3430,3434,3438,3442],{"type":101,"tag":387,"props":3423,"children":3424},{"style":394},[3425],{"type":106,"value":8},{"type":101,"tag":387,"props":3427,"children":3428},{"style":399},[3429],{"type":106,"value":402},{"type":101,"tag":387,"props":3431,"children":3432},{"style":399},[3433],{"type":106,"value":3207},{"type":101,"tag":387,"props":3435,"children":3436},{"style":399},[3437],{"type":106,"value":1596},{"type":101,"tag":387,"props":3439,"children":3440},{"style":1744},[3441],{"type":106,"value":3258},{"type":101,"tag":387,"props":3443,"children":3444},{"style":399},[3445],{"type":106,"value":922},{"type":101,"tag":108,"props":3447,"children":3448},{},[3449,3451,3456,3458,3464],{"type":106,"value":3450},"System bypass does ",{"type":101,"tag":146,"props":3452,"children":3453},{},[3454],{"type":106,"value":3455},"not",{"type":106,"value":3457}," override your own custom rules — for that, use a custom rule with ",{"type":101,"tag":114,"props":3459,"children":3461},{"className":3460},[],[3462],{"type":106,"value":3463},"--action bypass",{"type":106,"value":539},{"type":101,"tag":131,"props":3466,"children":3467},{"id":523},[3468],{"type":106,"value":3469},"Attack mode",{"type":101,"tag":108,"props":3471,"children":3472},{},[3473,3479,3481],{"type":101,"tag":122,"props":3474,"children":3477},{"href":3475,"rel":3476},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fattack-mode",[351],[3478],{"type":106,"value":91},{"type":106,"value":3480}," is the emergency response for active attacks. Unverified visitors see a challenge page; verified bots and search crawlers are exempt. Immediate — no publish. ",{"type":101,"tag":146,"props":3482,"children":3483},{},[3484],{"type":106,"value":3485},"Requires interactive confirmation; blocked for agents\u002Fscripts due to severity.",{"type":101,"tag":376,"props":3487,"children":3489},{"className":378,"code":3488,"language":380,"meta":381,"style":381},"vercel firewall attack-mode enable --duration 1h --yes    # 1h (default)\nvercel firewall attack-mode enable --duration 6h --yes\nvercel firewall attack-mode enable --duration 24h --yes\nvercel firewall attack-mode disable --yes\n",[3490],{"type":101,"tag":114,"props":3491,"children":3492},{"__ignoreMap":381},[3493,3532,3564,3596],{"type":101,"tag":387,"props":3494,"children":3495},{"class":389,"line":390},[3496,3500,3504,3509,3513,3518,3523,3527],{"type":101,"tag":387,"props":3497,"children":3498},{"style":394},[3499],{"type":106,"value":8},{"type":101,"tag":387,"props":3501,"children":3502},{"style":399},[3503],{"type":106,"value":402},{"type":101,"tag":387,"props":3505,"children":3506},{"style":399},[3507],{"type":106,"value":3508}," attack-mode",{"type":101,"tag":387,"props":3510,"children":3511},{"style":399},[3512],{"type":106,"value":1531},{"type":101,"tag":387,"props":3514,"children":3515},{"style":399},[3516],{"type":106,"value":3517}," --duration",{"type":101,"tag":387,"props":3519,"children":3520},{"style":399},[3521],{"type":106,"value":3522}," 1h",{"type":101,"tag":387,"props":3524,"children":3525},{"style":399},[3526],{"type":106,"value":1287},{"type":101,"tag":387,"props":3528,"children":3529},{"style":410},[3530],{"type":106,"value":3531},"    # 1h (default)\n",{"type":101,"tag":387,"props":3533,"children":3534},{"class":389,"line":416},[3535,3539,3543,3547,3551,3555,3560],{"type":101,"tag":387,"props":3536,"children":3537},{"style":394},[3538],{"type":106,"value":8},{"type":101,"tag":387,"props":3540,"children":3541},{"style":399},[3542],{"type":106,"value":402},{"type":101,"tag":387,"props":3544,"children":3545},{"style":399},[3546],{"type":106,"value":3508},{"type":101,"tag":387,"props":3548,"children":3549},{"style":399},[3550],{"type":106,"value":1531},{"type":101,"tag":387,"props":3552,"children":3553},{"style":399},[3554],{"type":106,"value":3517},{"type":101,"tag":387,"props":3556,"children":3557},{"style":399},[3558],{"type":106,"value":3559}," 6h",{"type":101,"tag":387,"props":3561,"children":3562},{"style":399},[3563],{"type":106,"value":922},{"type":101,"tag":387,"props":3565,"children":3566},{"class":389,"line":437},[3567,3571,3575,3579,3583,3587,3592],{"type":101,"tag":387,"props":3568,"children":3569},{"style":394},[3570],{"type":106,"value":8},{"type":101,"tag":387,"props":3572,"children":3573},{"style":399},[3574],{"type":106,"value":402},{"type":101,"tag":387,"props":3576,"children":3577},{"style":399},[3578],{"type":106,"value":3508},{"type":101,"tag":387,"props":3580,"children":3581},{"style":399},[3582],{"type":106,"value":1531},{"type":101,"tag":387,"props":3584,"children":3585},{"style":399},[3586],{"type":106,"value":3517},{"type":101,"tag":387,"props":3588,"children":3589},{"style":399},[3590],{"type":106,"value":3591}," 24h",{"type":101,"tag":387,"props":3593,"children":3594},{"style":399},[3595],{"type":106,"value":922},{"type":101,"tag":387,"props":3597,"children":3598},{"class":389,"line":459},[3599,3603,3607,3611,3615],{"type":101,"tag":387,"props":3600,"children":3601},{"style":394},[3602],{"type":106,"value":8},{"type":101,"tag":387,"props":3604,"children":3605},{"style":399},[3606],{"type":106,"value":402},{"type":101,"tag":387,"props":3608,"children":3609},{"style":399},[3610],{"type":106,"value":3508},{"type":101,"tag":387,"props":3612,"children":3613},{"style":399},[3614],{"type":106,"value":1564},{"type":101,"tag":387,"props":3616,"children":3617},{"style":399},[3618],{"type":106,"value":922},{"type":101,"tag":131,"props":3620,"children":3621},{"id":530},[3622],{"type":106,"value":3623},"System mitigations",{"type":101,"tag":108,"props":3625,"children":3626},{},[3627,3629,3636,3638],{"type":106,"value":3628},"Vercel automatically ",{"type":101,"tag":122,"props":3630,"children":3633},{"href":3631,"rel":3632},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall\u002Fddos-mitigation",[351],[3634],{"type":106,"value":3635},"mitigates DDoS attacks",{"type":106,"value":3637},". In rare cases (debugging false positives) you may need to pause them. Auto-resumes after 24h. Immediate. ",{"type":101,"tag":146,"props":3639,"children":3640},{},[3641],{"type":106,"value":3642},"Blocked for agents\u002Fscripts due to severity — pausing removes DDoS protection.",{"type":101,"tag":376,"props":3644,"children":3646},{"className":378,"code":3645,"language":380,"meta":381,"style":381},"vercel firewall system-mitigations pause  --yes    # 24h, auto-resume\nvercel firewall system-mitigations resume --yes\n",[3647],{"type":101,"tag":114,"props":3648,"children":3649},{"__ignoreMap":381},[3650,3680],{"type":101,"tag":387,"props":3651,"children":3652},{"class":389,"line":390},[3653,3657,3661,3666,3671,3675],{"type":101,"tag":387,"props":3654,"children":3655},{"style":394},[3656],{"type":106,"value":8},{"type":101,"tag":387,"props":3658,"children":3659},{"style":399},[3660],{"type":106,"value":402},{"type":101,"tag":387,"props":3662,"children":3663},{"style":399},[3664],{"type":106,"value":3665}," system-mitigations",{"type":101,"tag":387,"props":3667,"children":3668},{"style":399},[3669],{"type":106,"value":3670}," pause",{"type":101,"tag":387,"props":3672,"children":3673},{"style":399},[3674],{"type":106,"value":1659},{"type":101,"tag":387,"props":3676,"children":3677},{"style":410},[3678],{"type":106,"value":3679},"    # 24h, auto-resume\n",{"type":101,"tag":387,"props":3681,"children":3682},{"class":389,"line":416},[3683,3687,3691,3695,3700],{"type":101,"tag":387,"props":3684,"children":3685},{"style":394},[3686],{"type":106,"value":8},{"type":101,"tag":387,"props":3688,"children":3689},{"style":399},[3690],{"type":106,"value":402},{"type":101,"tag":387,"props":3692,"children":3693},{"style":399},[3694],{"type":106,"value":3665},{"type":101,"tag":387,"props":3696,"children":3697},{"style":399},[3698],{"type":106,"value":3699}," resume",{"type":101,"tag":387,"props":3701,"children":3702},{"style":399},[3703],{"type":106,"value":922},{"type":101,"tag":131,"props":3705,"children":3707},{"id":3706},"publishing",[3708],{"type":106,"value":3709},"Publishing",{"type":101,"tag":376,"props":3711,"children":3713},{"className":378,"code":3712,"language":380,"meta":381,"style":381},"vercel firewall diff                      # review staged changes\nvercel firewall publish --yes             # push drafts to production\nvercel firewall discard --yes             # throw away drafts\n",[3714],{"type":101,"tag":114,"props":3715,"children":3716},{"__ignoreMap":381},[3717,3737,3762],{"type":101,"tag":387,"props":3718,"children":3719},{"class":389,"line":390},[3720,3724,3728,3732],{"type":101,"tag":387,"props":3721,"children":3722},{"style":394},[3723],{"type":106,"value":8},{"type":101,"tag":387,"props":3725,"children":3726},{"style":399},[3727],{"type":106,"value":402},{"type":101,"tag":387,"props":3729,"children":3730},{"style":399},[3731],{"type":106,"value":451},{"type":101,"tag":387,"props":3733,"children":3734},{"style":410},[3735],{"type":106,"value":3736},"                      # review staged changes\n",{"type":101,"tag":387,"props":3738,"children":3739},{"class":389,"line":416},[3740,3744,3748,3753,3757],{"type":101,"tag":387,"props":3741,"children":3742},{"style":394},[3743],{"type":106,"value":8},{"type":101,"tag":387,"props":3745,"children":3746},{"style":399},[3747],{"type":106,"value":402},{"type":101,"tag":387,"props":3749,"children":3750},{"style":399},[3751],{"type":106,"value":3752}," publish",{"type":101,"tag":387,"props":3754,"children":3755},{"style":399},[3756],{"type":106,"value":1287},{"type":101,"tag":387,"props":3758,"children":3759},{"style":410},[3760],{"type":106,"value":3761},"             # push drafts to production\n",{"type":101,"tag":387,"props":3763,"children":3764},{"class":389,"line":437},[3765,3769,3773,3778,3782],{"type":101,"tag":387,"props":3766,"children":3767},{"style":394},[3768],{"type":106,"value":8},{"type":101,"tag":387,"props":3770,"children":3771},{"style":399},[3772],{"type":106,"value":402},{"type":101,"tag":387,"props":3774,"children":3775},{"style":399},[3776],{"type":106,"value":3777}," discard",{"type":101,"tag":387,"props":3779,"children":3780},{"style":399},[3781],{"type":106,"value":1287},{"type":101,"tag":387,"props":3783,"children":3784},{"style":410},[3785],{"type":106,"value":3786},"             # throw away drafts\n",{"type":101,"tag":131,"props":3788,"children":3790},{"id":3789},"querying-firewall-metrics-from-the-cli",[3791],{"type":106,"value":3792},"Querying firewall metrics from the CLI",{"type":101,"tag":108,"props":3794,"children":3795},{},[3796,3798,3803,3804,3810],{"type":106,"value":3797},"If the project has ",{"type":101,"tag":146,"props":3799,"children":3800},{},[3801],{"type":106,"value":3802},"Observability Plus",{"type":106,"value":190},{"type":101,"tag":114,"props":3805,"children":3807},{"className":3806},[],[3808],{"type":106,"value":3809},"vc metrics",{"type":106,"value":3811}," returns firewall counters that you can analyze without leaving the terminal — useful for the \"review traffic\" step in the staged rollout, or for spotting which rules are doing real work.",{"type":101,"tag":376,"props":3813,"children":3815},{"className":378,"code":3814,"language":380,"meta":381,"style":381},"vc metrics vercel.firewall_action.count \\\n  --group-by waf_rule_id \\\n  --group-by waf_action \\\n  --since 3d \\\n  --granularity 4h \\\n  --format json\n",[3816],{"type":101,"tag":114,"props":3817,"children":3818},{"__ignoreMap":381},[3819,3841,3858,3874,3891,3908],{"type":101,"tag":387,"props":3820,"children":3821},{"class":389,"line":390},[3822,3827,3832,3837],{"type":101,"tag":387,"props":3823,"children":3824},{"style":394},[3825],{"type":106,"value":3826},"vc",{"type":101,"tag":387,"props":3828,"children":3829},{"style":399},[3830],{"type":106,"value":3831}," metrics",{"type":101,"tag":387,"props":3833,"children":3834},{"style":399},[3835],{"type":106,"value":3836}," vercel.firewall_action.count",{"type":101,"tag":387,"props":3838,"children":3839},{"style":872},[3840],{"type":106,"value":875},{"type":101,"tag":387,"props":3842,"children":3843},{"class":389,"line":416},[3844,3849,3854],{"type":101,"tag":387,"props":3845,"children":3846},{"style":399},[3847],{"type":106,"value":3848},"  --group-by",{"type":101,"tag":387,"props":3850,"children":3851},{"style":399},[3852],{"type":106,"value":3853}," waf_rule_id",{"type":101,"tag":387,"props":3855,"children":3856},{"style":872},[3857],{"type":106,"value":875},{"type":101,"tag":387,"props":3859,"children":3860},{"class":389,"line":437},[3861,3865,3870],{"type":101,"tag":387,"props":3862,"children":3863},{"style":399},[3864],{"type":106,"value":3848},{"type":101,"tag":387,"props":3866,"children":3867},{"style":399},[3868],{"type":106,"value":3869}," waf_action",{"type":101,"tag":387,"props":3871,"children":3872},{"style":872},[3873],{"type":106,"value":875},{"type":101,"tag":387,"props":3875,"children":3876},{"class":389,"line":459},[3877,3882,3887],{"type":101,"tag":387,"props":3878,"children":3879},{"style":399},[3880],{"type":106,"value":3881},"  --since",{"type":101,"tag":387,"props":3883,"children":3884},{"style":399},[3885],{"type":106,"value":3886}," 3d",{"type":101,"tag":387,"props":3888,"children":3889},{"style":872},[3890],{"type":106,"value":875},{"type":101,"tag":387,"props":3892,"children":3893},{"class":389,"line":691},[3894,3899,3904],{"type":101,"tag":387,"props":3895,"children":3896},{"style":399},[3897],{"type":106,"value":3898},"  --granularity",{"type":101,"tag":387,"props":3900,"children":3901},{"style":399},[3902],{"type":106,"value":3903}," 4h",{"type":101,"tag":387,"props":3905,"children":3906},{"style":872},[3907],{"type":106,"value":875},{"type":101,"tag":387,"props":3909,"children":3910},{"class":389,"line":71},[3911,3916],{"type":101,"tag":387,"props":3912,"children":3913},{"style":399},[3914],{"type":106,"value":3915},"  --format",{"type":101,"tag":387,"props":3917,"children":3918},{"style":399},[3919],{"type":106,"value":3920}," json\n",{"type":101,"tag":138,"props":3922,"children":3923},{},[3924,3943,3986,4033],{"type":101,"tag":142,"props":3925,"children":3926},{},[3927,3933,3935,3941],{"type":101,"tag":114,"props":3928,"children":3930},{"className":3929},[],[3931],{"type":106,"value":3932},"--group-by waf_rule_id",{"type":106,"value":3934}," — break out hits per rule. Match the IDs to ",{"type":101,"tag":114,"props":3936,"children":3938},{"className":3937},[],[3939],{"type":106,"value":3940},"vercel firewall rules list --json",{"type":106,"value":3942}," to see which rule fired.",{"type":101,"tag":142,"props":3944,"children":3945},{},[3946,3952,3954,3959,3961,3966,3967,3972,3973,3978,3979,3984],{"type":101,"tag":114,"props":3947,"children":3949},{"className":3948},[],[3950],{"type":106,"value":3951},"--group-by waf_action",{"type":106,"value":3953}," — splits ",{"type":101,"tag":114,"props":3955,"children":3957},{"className":3956},[],[3958],{"type":106,"value":202},{"type":106,"value":3960}," \u002F ",{"type":101,"tag":114,"props":3962,"children":3964},{"className":3963},[],[3965],{"type":106,"value":188},{"type":106,"value":3960},{"type":101,"tag":114,"props":3968,"children":3970},{"className":3969},[],[3971],{"type":106,"value":65},{"type":106,"value":3960},{"type":101,"tag":114,"props":3974,"children":3976},{"className":3975},[],[3977],{"type":106,"value":216},{"type":106,"value":3960},{"type":101,"tag":114,"props":3980,"children":3982},{"className":3981},[],[3983],{"type":106,"value":209},{"type":106,"value":3985}," so you can tell what actually got enforced versus only logged.",{"type":101,"tag":142,"props":3987,"children":3988},{},[3989,3995,3997,4002,4003,4009,4010,4016,4017,4023,4025,4031],{"type":101,"tag":114,"props":3990,"children":3992},{"className":3991},[],[3993],{"type":106,"value":3994},"--since",{"type":106,"value":3996}," accepts ",{"type":101,"tag":114,"props":3998,"children":4000},{"className":3999},[],[4001],{"type":106,"value":2501},{"type":106,"value":190},{"type":101,"tag":114,"props":4004,"children":4006},{"className":4005},[],[4007],{"type":106,"value":4008},"24h",{"type":106,"value":190},{"type":101,"tag":114,"props":4011,"children":4013},{"className":4012},[],[4014],{"type":106,"value":4015},"3d",{"type":106,"value":190},{"type":101,"tag":114,"props":4018,"children":4020},{"className":4019},[],[4021],{"type":106,"value":4022},"7d",{"type":106,"value":4024},", etc.; ",{"type":101,"tag":114,"props":4026,"children":4028},{"className":4027},[],[4029],{"type":106,"value":4030},"--granularity",{"type":106,"value":4032}," is the bucket size.",{"type":101,"tag":142,"props":4034,"children":4035},{},[4036,4042],{"type":101,"tag":114,"props":4037,"children":4039},{"className":4038},[],[4040],{"type":106,"value":4041},"--format json",{"type":106,"value":4043}," is best for programmatic review; drop it for a human-readable table.",{"type":101,"tag":108,"props":4045,"children":4046},{},[4047,4049,4054],{"type":106,"value":4048},"For an ",{"type":101,"tag":146,"props":4050,"children":4051},{},[4052],{"type":106,"value":4053},"active-attack triage",{"type":106,"value":4055}," lens — \"is something happening right now?\" — narrow the window and tighten the granularity:",{"type":101,"tag":376,"props":4057,"children":4059},{"className":378,"code":4058,"language":380,"meta":381,"style":381},"vc metrics vercel.firewall_action.count \\\n  --group-by waf_action \\\n  --since 1h \\\n  --granularity 5m \\\n  --format json\n",[4060],{"type":101,"tag":114,"props":4061,"children":4062},{"__ignoreMap":381},[4063,4082,4097,4112,4128],{"type":101,"tag":387,"props":4064,"children":4065},{"class":389,"line":390},[4066,4070,4074,4078],{"type":101,"tag":387,"props":4067,"children":4068},{"style":394},[4069],{"type":106,"value":3826},{"type":101,"tag":387,"props":4071,"children":4072},{"style":399},[4073],{"type":106,"value":3831},{"type":101,"tag":387,"props":4075,"children":4076},{"style":399},[4077],{"type":106,"value":3836},{"type":101,"tag":387,"props":4079,"children":4080},{"style":872},[4081],{"type":106,"value":875},{"type":101,"tag":387,"props":4083,"children":4084},{"class":389,"line":416},[4085,4089,4093],{"type":101,"tag":387,"props":4086,"children":4087},{"style":399},[4088],{"type":106,"value":3848},{"type":101,"tag":387,"props":4090,"children":4091},{"style":399},[4092],{"type":106,"value":3869},{"type":101,"tag":387,"props":4094,"children":4095},{"style":872},[4096],{"type":106,"value":875},{"type":101,"tag":387,"props":4098,"children":4099},{"class":389,"line":437},[4100,4104,4108],{"type":101,"tag":387,"props":4101,"children":4102},{"style":399},[4103],{"type":106,"value":3881},{"type":101,"tag":387,"props":4105,"children":4106},{"style":399},[4107],{"type":106,"value":3522},{"type":101,"tag":387,"props":4109,"children":4110},{"style":872},[4111],{"type":106,"value":875},{"type":101,"tag":387,"props":4113,"children":4114},{"class":389,"line":459},[4115,4119,4124],{"type":101,"tag":387,"props":4116,"children":4117},{"style":399},[4118],{"type":106,"value":3898},{"type":101,"tag":387,"props":4120,"children":4121},{"style":399},[4122],{"type":106,"value":4123}," 5m",{"type":101,"tag":387,"props":4125,"children":4126},{"style":872},[4127],{"type":106,"value":875},{"type":101,"tag":387,"props":4129,"children":4130},{"class":389,"line":691},[4131,4135],{"type":101,"tag":387,"props":4132,"children":4133},{"style":399},[4134],{"type":106,"value":3915},{"type":101,"tag":387,"props":4136,"children":4137},{"style":399},[4138],{"type":106,"value":3920},{"type":101,"tag":108,"props":4140,"children":4141},{},[4142,4144,4150,4152,4158,4160,4166],{"type":106,"value":4143},"Other dimensions and metric names exist; run ",{"type":101,"tag":114,"props":4145,"children":4147},{"className":4146},[],[4148],{"type":106,"value":4149},"vc metrics --help",{"type":106,"value":4151}," to discover them, and check ",{"type":101,"tag":122,"props":4153,"children":4156},{"href":4154,"rel":4155},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcli\u002Fmetrics",[351],[4157],{"type":106,"value":4154},{"type":106,"value":4159}," for the full catalog. If the command errors with \"metrics not enabled\" or similar, the project isn't on Observability Plus — fall back to the dashboard URL (",{"type":101,"tag":114,"props":4161,"children":4163},{"className":4162},[],[4164],{"type":106,"value":4165},"\u002Ffirewall\u002Ftraffic?filter=\u003CruleId>",{"type":106,"value":4167},") for the same data.",{"type":101,"tag":131,"props":4169,"children":4171},{"id":4170},"best-practices",[4172],{"type":106,"value":4173},"Best practices",{"type":101,"tag":108,"props":4175,"children":4176},{},[4177],{"type":106,"value":4178},"The firewall sits in front of every request. A misconfigured rule can block real users, kill SEO crawlers, or break checkout. Treat changes like a production database migration: stage, review, and let the user pull the trigger.",{"type":101,"tag":138,"props":4180,"children":4181},{},[4182,4577,4632,4699,4744,4787,4804],{"type":101,"tag":142,"props":4183,"children":4184},{},[4185,4190,4192,4197,4199],{"type":101,"tag":146,"props":4186,"children":4187},{},[4188],{"type":106,"value":4189},"Roll new rules out in stages, not in one shot.",{"type":106,"value":4191}," A new rule's blast radius is unpredictable until real traffic hits it. Walk every meaningful rule through the stages below, asking the user to ",{"type":101,"tag":114,"props":4193,"children":4195},{"className":4194},[],[4196],{"type":106,"value":508},{"type":106,"value":4198}," between each. Don't skip stages even if a rule \"obviously\" matches only attackers — common JA4s and user agents collide with real users far more often than they look like they will.",{"type":101,"tag":4200,"props":4201,"children":4202},"ol",{},[4203,4304,4392,4540],{"type":101,"tag":142,"props":4204,"children":4205},{},[4206,4211,4213,4219,4221],{"type":101,"tag":146,"props":4207,"children":4208},{},[4209],{"type":106,"value":4210},"Log everywhere.",{"type":106,"value":4212}," Add the rule with ",{"type":101,"tag":114,"props":4214,"children":4216},{"className":4215},[],[4217],{"type":106,"value":4218},"--action log",{"type":106,"value":4220}," so it records hits to the Firewall dashboard but blocks nothing.",{"type":101,"tag":376,"props":4222,"children":4224},{"className":378,"code":4223,"language":380,"meta":381,"style":381},"vercel firewall rules add \"Block exploit probes\" \\\n  --condition '{\"type\":\"path\",\"op\":\"inc\",\"value\":[\"\u002Fwp-admin\",\"\u002F.env\",\"\u002F.git\u002Fconfig\",\"\u002Fphpmyadmin\"]}' \\\n  --action log --yes\n",[4225],{"type":101,"tag":114,"props":4226,"children":4227},{"__ignoreMap":381},[4228,4264,4288],{"type":101,"tag":387,"props":4229,"children":4230},{"class":389,"line":390},[4231,4235,4239,4243,4247,4251,4256,4260],{"type":101,"tag":387,"props":4232,"children":4233},{"style":394},[4234],{"type":106,"value":8},{"type":101,"tag":387,"props":4236,"children":4237},{"style":399},[4238],{"type":106,"value":402},{"type":101,"tag":387,"props":4240,"children":4241},{"style":399},[4242],{"type":106,"value":585},{"type":101,"tag":387,"props":4244,"children":4245},{"style":399},[4246],{"type":106,"value":765},{"type":101,"tag":387,"props":4248,"children":4249},{"style":670},[4250],{"type":106,"value":673},{"type":101,"tag":387,"props":4252,"children":4253},{"style":399},[4254],{"type":106,"value":4255},"Block exploit probes",{"type":101,"tag":387,"props":4257,"children":4258},{"style":670},[4259],{"type":106,"value":683},{"type":101,"tag":387,"props":4261,"children":4262},{"style":872},[4263],{"type":106,"value":875},{"type":101,"tag":387,"props":4265,"children":4266},{"class":389,"line":416},[4267,4271,4275,4280,4284],{"type":101,"tag":387,"props":4268,"children":4269},{"style":399},[4270],{"type":106,"value":884},{"type":101,"tag":387,"props":4272,"children":4273},{"style":670},[4274],{"type":106,"value":889},{"type":101,"tag":387,"props":4276,"children":4277},{"style":399},[4278],{"type":106,"value":4279},"{\"type\":\"path\",\"op\":\"inc\",\"value\":[\"\u002Fwp-admin\",\"\u002F.env\",\"\u002F.git\u002Fconfig\",\"\u002Fphpmyadmin\"]}",{"type":101,"tag":387,"props":4281,"children":4282},{"style":670},[4283],{"type":106,"value":899},{"type":101,"tag":387,"props":4285,"children":4286},{"style":872},[4287],{"type":106,"value":875},{"type":101,"tag":387,"props":4289,"children":4290},{"class":389,"line":437},[4291,4295,4300],{"type":101,"tag":387,"props":4292,"children":4293},{"style":399},[4294],{"type":106,"value":912},{"type":101,"tag":387,"props":4296,"children":4297},{"style":399},[4298],{"type":106,"value":4299}," log",{"type":101,"tag":387,"props":4301,"children":4302},{"style":399},[4303],{"type":106,"value":922},{"type":101,"tag":142,"props":4305,"children":4306},{},[4307,4312,4314,4320,4322,4327,4329,4335,4337,4343,4345,4351,4353,4359,4360,4366,4368,4374,4376,4386,4390],{"type":101,"tag":146,"props":4308,"children":4309},{},[4310],{"type":106,"value":4311},"Have the user review traffic in the dashboard.",{"type":106,"value":4313}," Get the rule ID from the ",{"type":101,"tag":114,"props":4315,"children":4317},{"className":4316},[],[4318],{"type":106,"value":4319},"rules add",{"type":106,"value":4321}," output or ",{"type":101,"tag":114,"props":4323,"children":4325},{"className":4324},[],[4326],{"type":106,"value":3940},{"type":106,"value":4328}," (look for the ",{"type":101,"tag":114,"props":4330,"children":4332},{"className":4331},[],[4333],{"type":106,"value":4334},"id",{"type":106,"value":4336}," field — rule IDs start with ",{"type":101,"tag":114,"props":4338,"children":4340},{"className":4339},[],[4341],{"type":106,"value":4342},"rule_",{"type":106,"value":4344},"). Read the team and project slugs from ",{"type":101,"tag":114,"props":4346,"children":4348},{"className":4347},[],[4349],{"type":106,"value":4350},".vercel\u002Fproject.json",{"type":106,"value":4352}," (",{"type":101,"tag":114,"props":4354,"children":4356},{"className":4355},[],[4357],{"type":106,"value":4358},"orgSlug",{"type":106,"value":3960},{"type":101,"tag":114,"props":4361,"children":4363},{"className":4362},[],[4364],{"type":106,"value":4365},"projectName",{"type":106,"value":4367},") or via ",{"type":101,"tag":114,"props":4369,"children":4371},{"className":4370},[],[4372],{"type":106,"value":4373},"vercel project ls",{"type":106,"value":4375},". Construct the filtered traffic URL and ask the user to open it:",{"type":101,"tag":376,"props":4377,"children":4381},{"className":4378,"code":4380,"language":106},[4379],"language-text","https:\u002F\u002Fvercel.com\u002F\u003Cteam>\u002F\u003Cproject>\u002Ffirewall\u002Ftraffic?filter=\u003CruleId>\n",[4382],{"type":101,"tag":114,"props":4383,"children":4384},{"__ignoreMap":381},[4385],{"type":106,"value":4380},{"type":101,"tag":4387,"props":4388,"children":4389},"br",{},[],{"type":106,"value":4391},"Have them confirm only the intended traffic is matching (no real users, no SEO crawlers, no internal tools) before moving on.",{"type":101,"tag":142,"props":4393,"children":4394},{},[4395,4400,4402,4407,4409,4414,4416,4422,4424,4535,4538],{"type":101,"tag":146,"props":4396,"children":4397},{},[4398],{"type":106,"value":4399},"Block in preview first.",{"type":106,"value":4401}," Edit the rule to ",{"type":101,"tag":114,"props":4403,"children":4405},{"className":4404},[],[4406],{"type":106,"value":188},{"type":106,"value":4408}," (or ",{"type":101,"tag":114,"props":4410,"children":4412},{"className":4411},[],[4413],{"type":106,"value":65},{"type":106,"value":4415},") and add an ",{"type":101,"tag":114,"props":4417,"children":4419},{"className":4418},[],[4420],{"type":106,"value":4421},"environment = preview",{"type":106,"value":4423}," condition so production stays in log mode. This lets the user hit a preview deployment and confirm the block fires correctly without exposing real users:",{"type":101,"tag":376,"props":4425,"children":4427},{"className":378,"code":4426,"language":380,"meta":381,"style":381},"vercel firewall rules edit \"Block exploit probes\" \\\n  --action deny \\\n  --condition '{\"type\":\"path\",\"op\":\"inc\",\"value\":[\"\u002Fwp-admin\",\"\u002F.env\",\"\u002F.git\u002Fconfig\",\"\u002Fphpmyadmin\"]}' \\\n  --condition '{\"type\":\"environment\",\"op\":\"eq\",\"value\":\"preview\"}' \\\n  --yes\n",[4428],{"type":101,"tag":114,"props":4429,"children":4430},{"__ignoreMap":381},[4431,4466,4481,4504,4528],{"type":101,"tag":387,"props":4432,"children":4433},{"class":389,"line":390},[4434,4438,4442,4446,4450,4454,4458,4462],{"type":101,"tag":387,"props":4435,"children":4436},{"style":394},[4437],{"type":106,"value":8},{"type":101,"tag":387,"props":4439,"children":4440},{"style":399},[4441],{"type":106,"value":402},{"type":101,"tag":387,"props":4443,"children":4444},{"style":399},[4445],{"type":106,"value":585},{"type":101,"tag":387,"props":4447,"children":4448},{"style":399},[4449],{"type":106,"value":1261},{"type":101,"tag":387,"props":4451,"children":4452},{"style":670},[4453],{"type":106,"value":673},{"type":101,"tag":387,"props":4455,"children":4456},{"style":399},[4457],{"type":106,"value":4255},{"type":101,"tag":387,"props":4459,"children":4460},{"style":670},[4461],{"type":106,"value":683},{"type":101,"tag":387,"props":4463,"children":4464},{"style":872},[4465],{"type":106,"value":875},{"type":101,"tag":387,"props":4467,"children":4468},{"class":389,"line":416},[4469,4473,4477],{"type":101,"tag":387,"props":4470,"children":4471},{"style":399},[4472],{"type":106,"value":912},{"type":101,"tag":387,"props":4474,"children":4475},{"style":399},[4476],{"type":106,"value":917},{"type":101,"tag":387,"props":4478,"children":4479},{"style":872},[4480],{"type":106,"value":875},{"type":101,"tag":387,"props":4482,"children":4483},{"class":389,"line":437},[4484,4488,4492,4496,4500],{"type":101,"tag":387,"props":4485,"children":4486},{"style":399},[4487],{"type":106,"value":884},{"type":101,"tag":387,"props":4489,"children":4490},{"style":670},[4491],{"type":106,"value":889},{"type":101,"tag":387,"props":4493,"children":4494},{"style":399},[4495],{"type":106,"value":4279},{"type":101,"tag":387,"props":4497,"children":4498},{"style":670},[4499],{"type":106,"value":899},{"type":101,"tag":387,"props":4501,"children":4502},{"style":872},[4503],{"type":106,"value":875},{"type":101,"tag":387,"props":4505,"children":4506},{"class":389,"line":459},[4507,4511,4515,4520,4524],{"type":101,"tag":387,"props":4508,"children":4509},{"style":399},[4510],{"type":106,"value":884},{"type":101,"tag":387,"props":4512,"children":4513},{"style":670},[4514],{"type":106,"value":889},{"type":101,"tag":387,"props":4516,"children":4517},{"style":399},[4518],{"type":106,"value":4519},"{\"type\":\"environment\",\"op\":\"eq\",\"value\":\"preview\"}",{"type":101,"tag":387,"props":4521,"children":4522},{"style":670},[4523],{"type":106,"value":899},{"type":101,"tag":387,"props":4525,"children":4526},{"style":872},[4527],{"type":106,"value":875},{"type":101,"tag":387,"props":4529,"children":4530},{"class":389,"line":691},[4531],{"type":101,"tag":387,"props":4532,"children":4533},{"style":399},[4534],{"type":106,"value":2675},{"type":101,"tag":4387,"props":4536,"children":4537},{},[],{"type":106,"value":4539},"Have the user publish, then test the affected paths in a preview URL. Re-check the dashboard URL filtered by rule ID to see the blocks land.",{"type":101,"tag":142,"props":4541,"children":4542},{},[4543,4548,4550,4555,4556,4561,4563,4568,4570,4576],{"type":101,"tag":146,"props":4544,"children":4545},{},[4546],{"type":106,"value":4547},"Block in production.",{"type":106,"value":4549}," Once the user is satisfied with the production log data, edit to ",{"type":101,"tag":114,"props":4551,"children":4553},{"className":4552},[],[4554],{"type":106,"value":188},{"type":106,"value":3960},{"type":101,"tag":114,"props":4557,"children":4559},{"className":4558},[],[4560],{"type":106,"value":65},{"type":106,"value":4562}," and have them publish. Keep the dashboard URL handy for the first 24h in case you need to roll back with ",{"type":101,"tag":114,"props":4564,"children":4566},{"className":4565},[],[4567],{"type":106,"value":4218},{"type":106,"value":4569}," or ",{"type":101,"tag":114,"props":4571,"children":4573},{"className":4572},[],[4574],{"type":106,"value":4575},"rules disable",{"type":106,"value":539},{"type":101,"tag":142,"props":4578,"children":4579},{},[4580,4585,4587,4593,4594,4600,4602,4608,4610,4622,4624,4630],{"type":101,"tag":146,"props":4581,"children":4582},{},[4583],{"type":106,"value":4584},"Stage drafts; let the user publish.",{"type":106,"value":4586}," Mutating commands (",{"type":101,"tag":114,"props":4588,"children":4590},{"className":4589},[],[4591],{"type":106,"value":4592},"rules add\u002Fedit\u002Fenable\u002Fdisable\u002Fremove\u002Freorder",{"type":106,"value":190},{"type":101,"tag":114,"props":4595,"children":4597},{"className":4596},[],[4598],{"type":106,"value":4599},"ip-blocks block\u002Funblock",{"type":106,"value":4601},") only stage. Run ",{"type":101,"tag":114,"props":4603,"children":4605},{"className":4604},[],[4606],{"type":106,"value":4607},"vercel firewall diff",{"type":106,"value":4609}," to show what will change, then ",{"type":101,"tag":146,"props":4611,"children":4612},{},[4613,4615,4620],{"type":106,"value":4614},"ask the user to run ",{"type":101,"tag":114,"props":4616,"children":4618},{"className":4617},[],[4619],{"type":106,"value":508},{"type":106,"value":4621}," themselves",{"type":106,"value":4623}," — don't push to production on their behalf. Use ",{"type":101,"tag":114,"props":4625,"children":4627},{"className":4626},[],[4628],{"type":106,"value":4629},"discard --yes",{"type":106,"value":4631}," only if the user asks to abandon staged changes.",{"type":101,"tag":142,"props":4633,"children":4634},{},[4635,4640,4642],{"type":101,"tag":146,"props":4636,"children":4637},{},[4638],{"type":106,"value":4639},"Don't run commands the CLI blocks for agents.",{"type":106,"value":4641}," Surface what the user needs to do instead:",{"type":101,"tag":138,"props":4643,"children":4644},{},[4645,4677,4688],{"type":101,"tag":142,"props":4646,"children":4647},{},[4648,4654,4655,4661,4663,4668,4670,4676],{"type":101,"tag":114,"props":4649,"children":4651},{"className":4650},[],[4652],{"type":106,"value":4653},"vercel firewall rules add --ai \"...\"",{"type":106,"value":487},{"type":101,"tag":114,"props":4656,"children":4658},{"className":4657},[],[4659],{"type":106,"value":4660},"vercel firewall rules add",{"type":106,"value":4662}," (wizard) — TTY-only. Use ",{"type":101,"tag":114,"props":4664,"children":4666},{"className":4665},[],[4667],{"type":106,"value":1780},{"type":106,"value":4669}," flags or ",{"type":101,"tag":114,"props":4671,"children":4673},{"className":4672},[],[4674],{"type":106,"value":4675},"--json",{"type":106,"value":539},{"type":101,"tag":142,"props":4678,"children":4679},{},[4680,4686],{"type":101,"tag":114,"props":4681,"children":4683},{"className":4682},[],[4684],{"type":106,"value":4685},"vercel firewall attack-mode enable",{"type":106,"value":4687}," — requires explicit interactive confirmation; have the user run it.",{"type":101,"tag":142,"props":4689,"children":4690},{},[4691,4697],{"type":101,"tag":114,"props":4692,"children":4694},{"className":4693},[],[4695],{"type":106,"value":4696},"vercel firewall system-mitigations pause",{"type":106,"value":4698}," — pauses platform DDoS protection across the project; have the user run it and resume ASAP.",{"type":101,"tag":142,"props":4700,"children":4701},{},[4702,4707,4709,4714,4716,4721,4723,4728,4730,4736,4737,4742],{"type":101,"tag":146,"props":4703,"children":4704},{},[4705],{"type":106,"value":4706},"Inspect before recommending publish.",{"type":106,"value":4708}," A ",{"type":101,"tag":114,"props":4710,"children":4712},{"className":4711},[],[4713],{"type":106,"value":188},{"type":106,"value":4715}," with a loose condition (e.g., ",{"type":101,"tag":114,"props":4717,"children":4719},{"className":4718},[],[4720],{"type":106,"value":238},{"type":106,"value":4722}," starts with ",{"type":101,"tag":114,"props":4724,"children":4726},{"className":4725},[],[4727],{"type":106,"value":2067},{"type":106,"value":4729},") blocks the entire site. Always ",{"type":101,"tag":114,"props":4731,"children":4733},{"className":4732},[],[4734],{"type":106,"value":4735},"vercel firewall rules inspect \"Name\" --expand",{"type":106,"value":487},{"type":101,"tag":114,"props":4738,"children":4740},{"className":4739},[],[4741],{"type":106,"value":4607},{"type":106,"value":4743}," before handing the publish step to the user.",{"type":101,"tag":142,"props":4745,"children":4746},{},[4747,4752,4754,4759,4761,4766,4768,4773,4774,4779,4781,4786],{"type":101,"tag":146,"props":4748,"children":4749},{},[4750],{"type":106,"value":4751},"Tune rate limits gently.",{"type":106,"value":4753}," Start with a generous ",{"type":101,"tag":114,"props":4755,"children":4757},{"className":4756},[],[4758],{"type":106,"value":2698},{"type":106,"value":4760}," (5–10× the expected legitimate rate) and ",{"type":101,"tag":114,"props":4762,"children":4764},{"className":4763},[],[4765],{"type":106,"value":2847},{"type":106,"value":4767},". After the user reviews dashboard data, tighten the limit and switch the action to ",{"type":101,"tag":114,"props":4769,"children":4771},{"className":4770},[],[4772],{"type":106,"value":216},{"type":106,"value":190},{"type":101,"tag":114,"props":4775,"children":4777},{"className":4776},[],[4778],{"type":106,"value":65},{"type":106,"value":4780},", or ",{"type":101,"tag":114,"props":4782,"children":4784},{"className":4783},[],[4785],{"type":106,"value":188},{"type":106,"value":539},{"type":101,"tag":142,"props":4788,"children":4789},{},[4790,4795,4797,4802],{"type":101,"tag":146,"props":4791,"children":4792},{},[4793],{"type":106,"value":4794},"Keep bypasses narrow.",{"type":106,"value":4796}," When unblocking trusted automation, scope by a shared-secret header ",{"type":101,"tag":146,"props":4798,"children":4799},{},[4800],{"type":106,"value":4801},"plus",{"type":106,"value":4803}," an IP or CIDR. Avoid wide-open bypasses (e.g., a single header with a known value an attacker could guess).",{"type":101,"tag":142,"props":4805,"children":4806},{},[4807,4812,4814],{"type":101,"tag":146,"props":4808,"children":4809},{},[4810],{"type":106,"value":4811},"Don't over-block.",{"type":106,"value":4813}," User agents, JA4, and IP addresses may collide with real users far more than they look like they will:",{"type":101,"tag":138,"props":4815,"children":4816},{},[4817,4835,4888],{"type":101,"tag":142,"props":4818,"children":4819},{},[4820,4825,4827,4833],{"type":101,"tag":146,"props":4821,"children":4822},{},[4823],{"type":106,"value":4824},"JA4 fingerprints are shared across millions of clients.",{"type":106,"value":4826}," A single Chrome point release, a single iOS version, or a popular mobile SDK all produce the same JA4. \"Block this JA4\" can silently take out an entire browser cohort. Before recommending a JA4 rule, run it through the staged log → preview → log-prod → block flow above and have the user confirm the dashboard shows only attacker behavior (high request rate, suspicious paths, anomalous geos) — not just \"this JA4 hit ",{"type":101,"tag":114,"props":4828,"children":4830},{"className":4829},[],[4831],{"type":106,"value":4832},"\u002Flogin",{"type":106,"value":4834}," once.\"",{"type":101,"tag":142,"props":4836,"children":4837},{},[4838,4843,4845,4850,4852,4858,4859,4865,4866,4872,4873,4879,4880,4886],{"type":101,"tag":146,"props":4839,"children":4840},{},[4841],{"type":106,"value":4842},"User-agent substring rules over-match constantly.",{"type":106,"value":4844}," ",{"type":101,"tag":114,"props":4846,"children":4848},{"className":4847},[],[4849],{"type":106,"value":2081},{"type":106,"value":4851}," matches like ",{"type":101,"tag":114,"props":4853,"children":4855},{"className":4854},[],[4856],{"type":106,"value":4857},"crawler",{"type":106,"value":190},{"type":101,"tag":114,"props":4860,"children":4862},{"className":4861},[],[4863],{"type":106,"value":4864},"bot",{"type":106,"value":190},{"type":101,"tag":114,"props":4867,"children":4869},{"className":4868},[],[4870],{"type":106,"value":4871},"python",{"type":106,"value":190},{"type":101,"tag":114,"props":4874,"children":4876},{"className":4875},[],[4877],{"type":106,"value":4878},"curl",{"type":106,"value":4780},{"type":101,"tag":114,"props":4881,"children":4883},{"className":4882},[],[4884],{"type":106,"value":4885},"headless",{"type":106,"value":4887}," will block legitimate tools (uptime monitors, link previewers, SEO auditors, partner integrations, the user's own CI). For known-good crawlers (Googlebot, Bingbot, Slack\u002FDiscord\u002FX unfurlers, etc.) prefer Vercel's verified-bot signals over UA strings, and pair UA conditions with another condition (path, geo, rate) so a single UA token can't take down a whole class of clients.",{"type":101,"tag":142,"props":4889,"children":4890},{},[4891,4896],{"type":101,"tag":146,"props":4892,"children":4893},{},[4894],{"type":106,"value":4895},"Sanity-check before staging.",{"type":106,"value":4897}," Before adding a block, ask the user: \"Does this fingerprint also match Chrome on macOS \u002F our mobile app \u002F a partner's webhook?\" If you don't know, the answer is \"log first, decide later.\"",{"type":101,"tag":131,"props":4899,"children":4901},{"id":4900},"external-reverse-proxies",[4902],{"type":106,"value":4903},"External reverse proxies",{"type":101,"tag":108,"props":4905,"children":4906},{},[4907,4909,4914,4916],{"type":106,"value":4908},"External proxies in front of Vercel reduce firewall and Bot Protection accuracy: real client IPs become opaque, signal reliability drops, legitimate users may be repeatedly challenged. Avoid when you can. If required, use ",{"type":101,"tag":146,"props":4910,"children":4911},{},[4912],{"type":106,"value":4913},"Verified Proxy",{"type":106,"value":4915}," so Vercel trusts your proxy's headers from a known egress range. ",{"type":101,"tag":122,"props":4917,"children":4920},{"href":4918,"rel":4919},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fsecurity\u002Freverse-proxy",[351],[4921],{"type":106,"value":4918},{"type":101,"tag":131,"props":4923,"children":4925},{"id":4924},"official-documentation",[4926],{"type":106,"value":4927},"Official Documentation",{"type":101,"tag":138,"props":4929,"children":4930},{},[4931,4939,4949],{"type":101,"tag":142,"props":4932,"children":4933},{},[4934],{"type":101,"tag":122,"props":4935,"children":4937},{"href":42,"rel":4936},[351],[4938],{"type":106,"value":88},{"type":101,"tag":142,"props":4940,"children":4941},{},[4942],{"type":101,"tag":122,"props":4943,"children":4946},{"href":4944,"rel":4945},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fbot-management",[351],[4947],{"type":106,"value":4948},"Bot management",{"type":101,"tag":142,"props":4950,"children":4951},{},[4952],{"type":101,"tag":122,"props":4953,"children":4955},{"href":43,"rel":4954},[351],[4956],{"type":106,"value":4957},"Vercel CLI",{"type":101,"tag":4959,"props":4960,"children":4961},"style",{},[4962],{"type":106,"value":4963},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4965,"total":5076},[4966,4983,5001,5016,5033,5050,5065],{"slug":4967,"name":4967,"fn":4968,"description":4969,"org":4970,"tags":4971,"stars":26,"repoUrl":27,"updatedAt":4982},"ai-gateway","configure and manage Vercel AI Gateway","Vercel AI Gateway expert guidance. Use when configuring model routing, provider failover, cost tracking, or managing multiple AI providers through a unified API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4972,4975,4978,4981],{"name":4973,"slug":4974,"type":15},"AI Infrastructure","ai-infrastructure",{"name":4976,"slug":4977,"type":15},"Cost Optimization","cost-optimization",{"name":4979,"slug":4980,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:06.57787",{"slug":4984,"name":4984,"fn":4985,"description":4986,"org":4987,"tags":4988,"stars":26,"repoUrl":27,"updatedAt":5000},"auth","integrate authentication in Next.js apps","Authentication integration guidance — Clerk (native Vercel Marketplace), Descope, and Auth0 setup for Next.js applications. Covers middleware auth patterns, sign-in\u002Fsign-up flows, and Marketplace provisioning. Use when implementing user authentication.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4989,4992,4995,4998,4999],{"name":4990,"slug":4991,"type":15},"Auth0","auth0",{"name":4993,"slug":4994,"type":15},"Authentication","authentication",{"name":4996,"slug":4997,"type":15},"Next.js","next-js",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:56:17.050565",{"slug":5002,"name":5002,"fn":5003,"description":5004,"org":5005,"tags":5006,"stars":26,"repoUrl":27,"updatedAt":5015},"bootstrap","bootstrap Vercel-linked repositories","Project bootstrapping orchestrator for repos that depend on Vercel-linked resources (databases, auth, and managed integrations). Use when setting up or repairing a repository so linking, environment provisioning, env pulls, and first-run db\u002Fdev commands happen in the correct safe order.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5007,5010,5011,5014],{"name":5008,"slug":5009,"type":15},"Configuration","configuration",{"name":21,"slug":22,"type":15},{"name":5012,"slug":5013,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:18.297868",{"slug":5017,"name":5017,"fn":5018,"description":5019,"org":5020,"tags":5021,"stars":26,"repoUrl":27,"updatedAt":5032},"cdn-caching","debug Vercel CDN caching behavior","Debug Vercel CDN caching — cache hit rate, stale content, revalidation behavior, ISR + PPR, per-request cache reasons (cacheReason) and PPR state (ppr_state), and costs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5022,5025,5028,5031],{"name":5023,"slug":5024,"type":15},"Caching","caching",{"name":5026,"slug":5027,"type":15},"Observability","observability",{"name":5029,"slug":5030,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-07-30T05:31:34.628944",{"slug":5034,"name":5034,"fn":5035,"description":5036,"org":5037,"tags":5038,"stars":26,"repoUrl":27,"updatedAt":5049},"chat-sdk","build multi-platform chatbots with Vercel","Vercel Chat SDK expert guidance. Use when building multi-platform chat bots — Slack, Telegram, Microsoft Teams, Discord, Google Chat, GitHub, Linear — with a single codebase. Covers the Chat class, adapters, threads, messages, cards, modals, streaming, state management, and webhook setup.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5039,5042,5045,5048],{"name":5040,"slug":5041,"type":15},"Agents","agents",{"name":5043,"slug":5044,"type":15},"Messaging","messaging",{"name":5046,"slug":5047,"type":15},"SDK","sdk",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:26.921901",{"slug":5051,"name":5051,"fn":5052,"description":5053,"org":5054,"tags":5055,"stars":26,"repoUrl":27,"updatedAt":5064},"deployments-cicd","manage Vercel deployments and CI\u002FCD","Vercel deployment and CI\u002FCD expert guidance. Use when deploying, promoting, rolling back, inspecting deployments, building with --prebuilt, or configuring CI workflow files for Vercel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5056,5059,5060,5063],{"name":5057,"slug":5058,"type":15},"CI\u002FCD","ci-cd",{"name":21,"slug":22,"type":15},{"name":5061,"slug":5062,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},"2026-04-06T18:56:22.054263",{"slug":5066,"name":5066,"fn":5067,"description":5068,"org":5069,"tags":5070,"stars":26,"repoUrl":27,"updatedAt":5075},"env-vars","manage Vercel environment variables","Vercel environment variable expert guidance. Use when working with .env files, vercel env commands, OIDC tokens, or managing environment-specific configuration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5071,5072,5073,5074],{"name":5008,"slug":5009,"type":15},{"name":5061,"slug":5062,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:56:28.150777",29,{"items":5078,"total":5241},[5079,5097,5109,5126,5137,5150,5166,5180,5192,5211,5221,5231],{"slug":5080,"name":5080,"fn":5081,"description":5082,"org":5083,"tags":5084,"stars":5094,"repoUrl":5095,"updatedAt":5096},"next-cache-components-adoption","enable and migrate to Next.js Cache Components","Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the `cacheComponents` flag, work through a flood of blocking-prerender \u002F instant validation errors, run the `cache-components-instant-false` codemod, or decide between opting routes out with `export const instant = false` and fixing them in place.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5085,5086,5089,5092,5093],{"name":5023,"slug":5024,"type":15},{"name":5087,"slug":5088,"type":15},"Frontend","frontend",{"name":5090,"slug":5091,"type":15},"Migration","migration",{"name":4996,"slug":4997,"type":15},{"name":9,"slug":8,"type":15},141208,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fnext.js","2026-07-24T05:38:30.118542",{"slug":5098,"name":5098,"fn":5099,"description":5100,"org":5101,"tags":5102,"stars":5094,"repoUrl":5095,"updatedAt":5108},"next-cache-components-optimizer","optimize Next.js cache components","Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components \u002F PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next\u002Fplaywright instant() e2e and work it to green, one verified route at a time; the shipped test then guards against regression. Use when asked to make a route's navigation instant (its static shell commits immediately), fix a route whose static shell isn't prerendered\u002Fserved\u002Fprefetched, grow a route's static shell or fix its slow first paint, diagnose which Suspense boundary keeps a route out of its static shell, or write the instant() e2e guard for one. Requires Next.js 16.3+ with cacheComponents; directs an upgrade if older.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5103,5104,5105,5106,5107],{"name":5023,"slug":5024,"type":15},{"name":5087,"slug":5088,"type":15},{"name":4996,"slug":4997,"type":15},{"name":5029,"slug":5030,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:31:10.674078",{"slug":5110,"name":5110,"fn":5111,"description":5112,"org":5113,"tags":5114,"stars":5094,"repoUrl":5095,"updatedAt":5125},"next-dev-loop","verify Next.js runtime behavior","Verify Next.js runtime behavior after editing app code. Use this skill to confirm a change actually works in a running app — not just that it compiles or type-checks. Combines \u002F_next\u002Fmcp (Next.js's view) with agent-browser (the browser's view). Requires a running `next dev`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5115,5118,5119,5120,5121,5122],{"name":5116,"slug":5117,"type":15},"Debugging","debugging",{"name":5087,"slug":5088,"type":15},{"name":5012,"slug":5013,"type":15},{"name":4996,"slug":4997,"type":15},{"name":9,"slug":8,"type":15},{"name":5123,"slug":5124,"type":15},"Web Development","web-development","2026-05-22T06:45:28.627735",{"slug":5127,"name":5127,"fn":5128,"description":5129,"org":5130,"tags":5131,"stars":5094,"repoUrl":5095,"updatedAt":5136},"next-partial-prefetching-adoption","adopt Partial Prefetching in Next.js apps","Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the `partialPrefetching` flag, opt routes in with `export const prefetch = 'partial'`, audit `\u003CLink prefetch={true}>` calls, or resolve the link-prefetch-partial and instant-shell-url-data insights.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5132,5133,5134,5135],{"name":5087,"slug":5088,"type":15},{"name":4996,"slug":4997,"type":15},{"name":5029,"slug":5030,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:31:11.591864",{"slug":5138,"name":5138,"fn":5139,"description":5140,"org":5141,"tags":5142,"stars":5147,"repoUrl":5148,"updatedAt":5149},"turborepo","manage monorepos with Turborepo","Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\ndependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\nvariables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\nUse when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\nmonorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\nor has apps\u002Fpackages directories.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5143,5144,5145],{"name":5057,"slug":5058,"type":15},{"name":5029,"slug":5030,"type":15},{"name":5146,"slug":5138,"type":15},"Turborepo",30809,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fturborepo","2026-07-30T05:32:14.920116",{"slug":5151,"name":5151,"fn":5152,"description":5153,"org":5154,"tags":5155,"stars":5163,"repoUrl":5164,"updatedAt":5165},"add-function-examples","add AI function examples for testing","Guide for adding new AI function examples, for testing specific features against the actual provider APIs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5156,5159,5162],{"name":5157,"slug":5158,"type":15},"AI SDK","ai-sdk",{"name":5160,"slug":5161,"type":15},"Testing","testing",{"name":9,"slug":8,"type":15},25670,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai","2026-04-06T18:55:51.318866",{"slug":5167,"name":5167,"fn":5168,"description":5169,"org":5170,"tags":5171,"stars":5163,"repoUrl":5164,"updatedAt":5179},"add-harness-package","add AI SDK harness packages","Guide for adding new AI SDK harness packages. Use when creating a new @ai-sdk\u002Fharness-\u003Cname> package that adapts a coding-agent runtime to HarnessV1.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5172,5173,5174,5177,5178],{"name":5040,"slug":5041,"type":15},{"name":5157,"slug":5158,"type":15},{"name":5175,"slug":5176,"type":15},"Harness","harness",{"name":5046,"slug":5047,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:29:19.858737",{"slug":5181,"name":5181,"fn":5182,"description":5183,"org":5184,"tags":5185,"stars":5163,"repoUrl":5164,"updatedAt":5191},"add-provider-package","add new provider packages to AI SDK","Guide for adding new AI provider packages to the AI SDK. Use when creating a new @ai-sdk\u002F\u003Cprovider> package to integrate an AI service into the SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5186,5187,5190],{"name":5157,"slug":5158,"type":15},{"name":5188,"slug":5189,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:47.45549",{"slug":5193,"name":5193,"fn":5194,"description":5195,"org":5196,"tags":5197,"stars":5163,"repoUrl":5164,"updatedAt":5210},"adr-skill","create and maintain architecture decision records","Create and maintain Architecture Decision Records (ADRs) optimized for agentic coding workflows. Use when you need to propose, write, update, accept\u002Freject, deprecate, or supersede an ADR; bootstrap an adr folder and index; consult existing ADRs before implementing changes; or enforce ADR conventions. This skill uses Socratic questioning to capture intent before drafting, and validates output against an agent-readiness checklist.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5198,5201,5204,5207],{"name":5199,"slug":5200,"type":15},"ADR","adr",{"name":5202,"slug":5203,"type":15},"Architecture","architecture",{"name":5205,"slug":5206,"type":15},"Documentation","documentation",{"name":5208,"slug":5209,"type":15},"Engineering","engineering","2026-04-06T18:55:50.043694",{"slug":5158,"name":5158,"fn":5212,"description":5213,"org":5214,"tags":5215,"stars":5163,"repoUrl":5164,"updatedAt":5220},"build AI features with Vercel AI SDK","Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: \"AI SDK\", \"Vercel AI SDK\", \"generateText\", \"streamText\", \"add AI to my app\", \"build an agent\", \"tool calling\", \"structured output\", \"useChat\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5216,5217,5218,5219],{"name":5040,"slug":5041,"type":15},{"name":5157,"slug":5158,"type":15},{"name":4979,"slug":4980,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:48.739463",{"slug":5222,"name":5222,"fn":5223,"description":5224,"org":5225,"tags":5226,"stars":5163,"repoUrl":5164,"updatedAt":5230},"capture-api-response-test-fixture","capture API response test fixtures","Capture API response test fixture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5227,5228,5229],{"name":5188,"slug":5189,"type":15},{"name":5160,"slug":5161,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:56.374433",{"slug":5232,"name":5232,"fn":5233,"description":5234,"org":5235,"tags":5236,"stars":5163,"repoUrl":5164,"updatedAt":5240},"develop-ai-functions-example","develop AI SDK function examples","Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples\u002Fai-functions\u002Fsrc to validate provider support, demonstrate features, or create test fixtures.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5237,5238,5239],{"name":5157,"slug":5158,"type":15},{"name":5160,"slug":5161,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:55.088956",68]