> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scrapegraphai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Rate limits by plan

> Requests per minute and concurrent job limits for each plan

ScrapeGraphAI enforces rate limits to ensure reliable performance for all users. Limits vary by plan.

## Limits overview

| Plan | Requests per minute | Concurrent crawls | Monitors | Monthly credits |
| - | - | - | - | - |
| Free | 10 | 1 | 1 | 500 |
| Starter | 100 | 3 | 5 | 10,000 |
| Growth | 500 | 15 | 25 | 100,000 |
| Pro | 5,000 | 50 | 100 | 750,000 |
| Enterprise | Custom | Custom | Custom | Custom |

For full pricing details, see [Plans & Pricing](/knowledge-base/account/pricing).

<Note>
  Contact [support](mailto:contact@scrapegraphai.com) for custom limits or high-volume plans.
</Note>

## What counts as a request?

Each API call to any v2 endpoint (`/api/extract`, `/api/scrape`, `/api/search`, `/api/crawl`, `/api/monitor`, …) counts as one request toward your rate limit. Polling a crawl or monitor status endpoint does **not** count toward the limit.

## Rate limit headers

Every API response includes headers that show your current rate limit status:

```
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1709123456
```

* `X-RateLimit-Limit` — maximum requests allowed per minute
* `X-RateLimit-Remaining` — requests remaining in the current window
* `X-RateLimit-Reset` — Unix timestamp when the limit resets

## Handling the 429 response

When you exceed the rate limit, the API returns HTTP `429 Too Many Requests`. In the v2 SDK this surfaces as `res.status === "error"` — the SDK does not raise. Retry with exponential backoff:

```python theme={null}
import time
from scrapegraph_py import ScrapeGraphAI

sgai = ScrapeGraphAI()

def extract_with_backoff(url, prompt, max_retries=5):
    for i in range(max_retries):
        res = sgai.extract(prompt, url=url)
        if res.status == "success":
            return res
        if "rate_limit" not in (res.error or "").lower():
            return res  # non-rate-limit error — don't retry
        wait = 2 ** i
        print(f"Rate limited — retrying in {wait}s")
        time.sleep(wait)
    raise RuntimeError("Exceeded max retries")
```

See the [rate limiting troubleshooting guide](/knowledge-base/troubleshooting/rate-limiting) for a JavaScript example and more tips.

## Increasing your limits

* **Upgrade your plan** from the [dashboard](https://scrapegraphai.com/dashboard) to get higher limits immediately.
* **Enterprise customers** can request custom rate limit configurations by contacting [support](mailto:contact@scrapegraphai.com).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.