# Rate limits and quotas

Each plan has two limits, both enforced per **account** (all keys of an account share them):

- a **per-minute** rate: requests per minute, counted per endpoint (each endpoint has its own minute bucket); exceeding it returns `429` with `error.code = rate_limited` and `Retry-After: 60`;
- a **monthly quota**: requests counted over a **30-day** window that starts with your first request and resets when it expires (not a calendar month); exceeding it returns `429` with `error.code = quota_exceeded`.

`GET https://twitterscore.io/api/v1/limits` returns the plan limits, what is used and when the window resets. The call itself is counted.

The exact numbers per plan are on the [pricing page](https://twitterscore.io/api/prices). Successful responses are cached server-side for a short time per query, so repeating the same request is cheap.

## Being a good client

- Back off on `429` using `Retry-After`; do not retry in a tight loop.
- Use `bulk_scores_check` (up to 50 accounts per call) instead of many single calls.
- Cache results on your side: data changes once a day.