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 carriesRateLimit-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:
Captured example
Captured example
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/protocolsand/v1/solana/coveragefor 60 s). - Don’t set
freshness_seconds=0routinely: it forces a refresh scan each time and can hitcold_scan_limit. - Spread a large wallet list over time; watch
RateLimit-Remainingand pause onRetry-After.
Access during the alpha
The API runs in private alpha with an access token (the server-sidePRIVATE_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.