Every request to api.ferrlens.com is counted against the caller's IP address. There is no per-account quota yet: signing in does not change the limit.

The bucket

Each IP has a token bucket. A request costs one token.

Setting Default
Burst (bucket size) 30 requests
Refill 0.5 tokens per second (30 per minute)

A new IP starts with a full bucket, so a short burst of up to 30 requests goes through immediately. After that you are limited to the refill rate. GET /health is not counted.

Response headers

Every counted response carries:

Header Meaning
x-ratelimit-limit Bucket size
x-ratelimit-remaining Tokens left after this request

When you are throttled

The API answers 429 Too Many Requests with a Retry-After header (whole seconds until a token is available, at least 1) and a JSON body:

{
  "code": "RATE_LIMITED",
  "message": "too many requests - slow down and retry",
  "retry_after_secs": 2
}

Wait Retry-After seconds and retry. x-ratelimit-remaining is 0 on a throttled response.

Things to know

  • Some endpoints do more work per request than others. A link check still costs one token, but it runs for up to 60 seconds.
  • IPs behind a shared NAT share a bucket.