Skip to main content

Limits

When the per-IP budget is spent you get 429 RATE_LIMITED with details.reason: "per_ip_rate". When a request would start a new scan and your IP has already started 20 this hour, you get 429 with details.reason: "cold_scan_limit"; wallets that already have a snapshot still load.

Headers

Every rate-limited response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds until the window resets). A 429 adds Retry-After. CORS exposes all of them to browsers. A captured 429:
GET /v1/solana/coverage → 429 (captured 2026-11-12 from local error-rate-limited)

Staying within the limit

  • Poll the job (1 unit), not the wallet (5 units), after a 202.
  • Cache responses per Cache-Control (/v1/solana/protocols and /v1/solana/coverage for 60 s).
  • Don’t set freshness_seconds=0 routinely: it forces a refresh scan each time and can hit cold_scan_limit.
  • Spread a large wallet list over time; watch RateLimit-Remaining and pause on Retry-After.

Access during the alpha

The API runs in private alpha with an access token (the server-side PRIVATE_API_TOKEN gate): every /v1/* route except /v1/health needs Authorization: Bearer <token>. Request a token at <CONTACT_EMAIL>. Keep it server-side in public apps: anyone with the token spends your limits. There are no API keys or paid tiers in v1; the limits above apply per IP to everyone.