sk_, rk_, pk_ keys) is rate-limited per key with a fixed window of 5,000 requests per 60 seconds. The ceiling is intentionally generous — it exists to stop runaway retry loops and hostile bursts, not to shape normal SDK, agent, dashboard, or docs-playground traffic.
What that means
When the limit is hit
Exceeding the per-key window returns429:
Anonymous request protection
Requests with no valid ArcenPay key (anonymous scraping, an unauthenticated curl, unknown-origin browsers) are covered by Arcjet shield + bot detection. This prevents anonymous abuse of the API while never touching key-verified traffic.Shield/bot protection is only active in
NODE_ENV=production with a real ARCJET_KEY. In development, Arcjet runs in dry-run mode.Best practices
- Reuse one key per integration. The limit is per key; spreading traffic across many keys to evade it is not supported.
- Cache access decisions. Entitlement results are stable within a billing period:
- React SDK hooks already cache for 30 seconds (
useCompanyEntitlements). - For server checks, cache
checkEntitlement/checkFlagresults for 30–60 seconds when acceptable.
- React SDK hooks already cache for 30 seconds (
- Batch reads. Use
GET /api/v1/entitlements(all features in one call) instead of many/checkcalls. - Use embed tokens for customer-scoped reads. Browser reads (hooks,
ArcenEmbed) authenticate with the customer’s access token for a clean, scoped session.
Related
- Authentication — key types and the endpoint auth matrix
- Errors — the
429error response and handling patterns

