Skip to content

Rate Limits

ATS Screener implements rate limiting to protect the free-tier LLM APIs and prevent abuse.

LimitValueScope
Requests per minute10Per IP address
Requests per day200Per IP address

Rate limiting is enforced at the SvelteKit server endpoint level:

  1. Each request is tracked by client IP address (via x-forwarded-for)
  2. If the per-minute limit is exceeded, subsequent requests receive 429 Too Many Requests
  3. If the daily limit is exceeded, requests are blocked until the window resets

All API responses include:

X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Cache-Control: no-store

When you receive a 429 response, the body distinguishes which window was hit and the response includes a Retry-After header set to the seconds-until-reset for that window:

HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json
{
"error": "rate limit exceeded: too many requests this minute. retry after 60s.",
"retryAfter": 60
}

The error string ends with either too many requests this minute (per-minute window) or daily limit reached (per-day window). The retryAfter field (seconds) and the Retry-After header always match; clients can use either.

Best practices:

  • Honor the Retry-After header (it is the exact reset window for the limit you tripped)
  • Cache results locally to avoid redundant requests (the server also caches identical inputs in-memory; see the _cached flag in endpoints)
  • Implement exponential backoff for transient 5xx errors (rate-limit 429s should use Retry-After directly)
  • For high-volume use, self-host with your own API keys

When self-hosting, rate limits are configurable. The actual bottleneck becomes your LLM provider’s free tier:

ProviderModelRPMRPDTPMTPD
GoogleGemma 3 27B3014,40015K-
GroqLlama 3.3 70B301,00012K100K

For the latest limits, see the official documentation: