Choose Arcjet protections
Load this skill when you need to pick rules. Then load @arcjet/skills#protect
or @arcjet/skills#guard to implement them.
| Problem | Rule | Where |
|---|---|---|
| Bots, scrapers, automated clients | detectBot (allow or deny, not both) |
Request only |
| SQLi / XSS / common probes | shield (mode: "LIVE") |
Request only |
| Cost / abuse quotas | tokenBucket, fixedWindow, slidingWindow |
Request and Guard |
| Jailbreaks, instruction overrides | detectPromptInjection (binary; no threshold) |
Request and Guard |
| Card / email / phone / IP in text | sensitiveInfo / localDetectSensitiveInfo |
Request and Guard |
| Names, addresses, gov IDs | same rules + @arcjet/sensitive-info-rampart |
Server runtime |
| Unsafe / abusive text | moderateContent |
Guard only |
| Signup spam, disposable email | validateEmail + protectSignup |
Request only |
| VPN / Tor / country / IP lists | filter |
Request only |
| Dangerous tool calls | Guard per-tool label + rate limits |
Guard only |
Token bucket: variable-cost AI (requested per call). Fixed window: hard cap.
Sliding window: no boundary burst. Request rate limits default to IP; set
characteristics: ["userId"] for a user key. Guard rate limits always need
key and bucket.
Default sensitive-info backend matches four structured types. Rampart-only
entities never match without backend: rampart().
capture() records that an action happened. It is not a protection rule.
Remote bot and filter rules can be managed with the CLI or MCP without a
redeploy — load @arcjet/skills#cli or @arcjet/skills#mcp.