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

# Limits

> Check API rate limits, browser capacity, and proxy traffic.

A `429` response can mean several different things. Read its `code` before deciding whether to wait, stop a browser, or check your account quota.

| Limit                 | Error code                        | What restores capacity                         |
| --------------------- | --------------------------------- | ---------------------------------------------- |
| API requests          | `rate_limits_reached`             | Requests age out of the minute or hour window. |
| Running browsers      | `parallel_browsers_limit_reached` | A browser stops.                               |
| Shared proxy traffic  | `shared_traffic_limit_reached`    | Traffic allowance resets or changes.           |
| Premium proxy traffic | `premium_traffic_limit_reached`   | Traffic allowance is replenished or changes.   |

## Requests per minute and per hour

Profile API calls are subject to minute and hour limits. Responses report the allowance and remaining requests:

```text theme={null}
X-Ratelimit-Limit: 60
X-Ratelimit-Limit-Hour: 1000
X-Ratelimit-Remaining: 58
X-Ratelimit-Remaining-Hour: 921
```

These numbers are examples; read the headers for your account. Either window can block a request. Waiting one minute is not enough when the hour window is exhausted.

Use bounded backoff with jitter and reduce the request rate after `rate_limits_reached`. Avoid frequent polling of account or session endpoints when an application record can answer the same question.

## Parallel browsers

Running browsers count against the slot limit even if the worker that started them has crashed. `GET /users/browser-limits` reports the current count and, on capped accounts, the available slots; see [concurrency](/concurrency#check-available-capacity) for the response and how to use it. Availability can change immediately, so your application must still handle a rejected start.

## Traffic

Shared and premium proxy traffic have separate quota endpoints:

```bash theme={null}
curl "$SURFSKY_API_BASE_URL/proxies/shared/quota" \
  -H "X-Cloud-Api-Token: $SURFSKY_API_TOKEN"
curl "$SURFSKY_API_BASE_URL/proxies/premium/quota" \
  -H "X-Cloud-Api-Token: $SURFSKY_API_TOKEN"
```

Quota availability and response fields depend on your plan. In particular, `premium_quota_not_applicable` means the plan has no premium quota to report.

Using another tier requires that tier to be enabled for your account. A different proxy may also change the site's behavior or invalidate a login tied to an IP. Choose it deliberately. See [proxy selection](/proxies#choosing-the-tier).

Reduce unnecessary downloads with [request blocking](/proxies#proxy-blacklist) or [shared cache](/shared-cache), and measure the effect on completed jobs.

## Stored objects

| Object                           | Limit                                               |
| -------------------------------- | --------------------------------------------------- |
| Persistent profiles              | Plan-dependent; `profiles_limit_reached` when full. |
| Uploaded extensions              | 100 per account.                                    |
| Extensions loaded in one browser | 5.                                                  |

Deleting a profile also deletes its saved state. Export anything you need before deleting it.

<span id="what-your-plan-allows" />

## Check your plan

```bash theme={null}
curl "$SURFSKY_API_BASE_URL/users/plan" \
  -H "X-Cloud-Api-Token: $SURFSKY_API_TOKEN"
```

Use the dashboard and account endpoints for current allowances. See [errors](/errors) for response codes and [troubleshooting](/troubleshooting) for failed jobs.
