Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions browsers/concurrency-and-limits.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,33 @@ Three separate limits shape a scaled workload, and they're easy to confuse. Conc

## Concurrency

One org-wide limit covers every browser you're running, whether created on demand with `browsers.create()` or reserved in a [browser pool](/browsers/pools). The full limit is available to either API in any mix.
Each [region](/browsers/regions) has its own concurrent browser limit. In a region, one limit covers every browser you're running there, whether created on demand with `browsers.create()` or reserved in a [browser pool](/browsers/pools) in that region. The full limit is available to either API in any mix.

| Limit | Developer | Hobbyist | Start-Up | Enterprise |
| --- | --- | --- | --- | --- |
| Concurrent browsers | 5 | 10 | 150 | Custom |
| Concurrent browsers in `us-east` | 5 | 10 | 150 | Custom |
| Concurrent browsers in `eu-west` | — | — | 150 | 150 or custom |
| Concurrent browsers in `ap-southeast` | — | — | 150 | 150 or custom |
| App invocations | 5 | 10 | 50 | Custom |
| App invocations (per app) | 5 | 10 | 20 | Custom |
| Managed auth health check interval | 6 hours minimum | 1 hour minimum | 20 minutes minimum | Custom |

Limits are org-wide unless stated otherwise.
Concurrent browser limits apply per region. The other limits are org-wide.

Browsers in one region don't count against another region's limit. On Start-Up, for example, you can run 150 browsers in `us-east` and another 150 in `eu-west` at the same time. A raised limit applies only to the region it was raised in, so if you need more capacity outside `us-east`, ask for it in that region.

Two things count against the concurrent browser limit that people don't expect:

- **Reserved pool capacity counts whether or not it's acquired.** A pool sized to 40 browsers uses 40 of your limit for as long as it exists.
- **Reserved pool capacity counts whether or not it's acquired.** A pool sized to 40 browsers uses 40 of the limit in the pool's region for as long as it exists.
- **Browsers in [standby](/browsers/standby) count.** Standby stops usage charges, not the concurrency slot. Delete the browser to release it.

Set per-project caps if you're splitting one org limit across teams or environments — see [project concurrency limits](/info/projects#concurrency-limits).
When a region is at its limit, creating a browser or growing a pool there returns `429 Too Many Requests` with code `region_limit_exceeded`. Delete a browser or shrink a pool in that region to free capacity, or run the work in another region you have capacity in.

Set per-project caps if you're splitting your limits across teams or environments — see [project concurrency limits](/info/projects#concurrency-limits). A project cap counts the project's browsers in every region combined.

## Rate limits

Kernel enforces per-organization rate limits on API requests. Browser creation is rate limited separately from concurrency: the create rate caps how fast you can create browsers, not how many you may run.
Kernel enforces per-organization rate limits on API requests. Browser creation is rate limited separately from concurrency: the create rate caps how fast you can create browsers, not how many you may run. Each region has its own browser create rate, so creating browsers in one region doesn't use up your create rate in another. Other rate-limited endpoints share one org-wide limit.

{/* TODO: add the per-plan browser-create rate table once the numbers are confirmed. */}

Expand Down
2 changes: 1 addition & 1 deletion browsers/pools.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ A few constraints to weigh before moving a workload onto a browser pool:
- **No GPU browsers.** GPU-accelerated browsers are on-demand only. Use `browsers.create()` for WebGL, video, or canvas-heavy work.
- **One fixed configuration per browser pool**, with `start_url` the only setting you can override per acquisition — see [Create a browser pool](#create-a-browser-pool).
- **A profile set on the browser pool loads read-only**, and a browser pool holds one at a time — see [Per-user profiles with browser pools](#per-user-profiles-with-browser-pools) for how to persist state per user.
- **Browser pool capacity counts against your [concurrency limit](/browsers/concurrency-and-limits#concurrency)** whether or not its browsers are acquired, though idle pooled browsers aren't billed.
- **Browser pool capacity counts against the [concurrency limit](/browsers/concurrency-and-limits#concurrency) of the pool's region** whether or not its browsers are acquired, though idle pooled browsers aren't billed.
- **Plan-gated.** Browser pools are available on the Start-Up and Enterprise plans.

## Create a browser pool
Expand Down
17 changes: 16 additions & 1 deletion browsers/regions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,26 @@ fmt.Println(browsers.Items)

Browser pool lists support the same filter. Omit it to list resources across all regions. The returned browser and pool objects include their `region`; requests to get or delete a resource by ID don't need a region parameter.

## Limits per region

Each region has its own [concurrency limit](/browsers/concurrency-and-limits#concurrency) and browser create rate. A browser counts against the limits of the region it runs in, and a browser pool's capacity counts against its region's concurrency limit. Usage in one region doesn't reduce what you can run in another.

| Region | Start-Up | Enterprise |
| --- | --- | --- |
| `us-east` | 150 concurrent browsers | Custom |
| `eu-west` | 150 concurrent browsers | 150 concurrent browsers, or custom |
| `ap-southeast` | 150 concurrent browsers | 150 concurrent browsers, or custom |

By default, each region's browser create rate matches your plan's rate in `us-east`. Raised limits, for concurrency or create rate, are set per region. A higher `us-east` limit doesn't carry over to other regions, so if you need more in `eu-west` or `ap-southeast`, [contact us](https://calendly.com/d/d3tn-5kp-5yt) for that region.

When a region is at its concurrency limit, creating a browser or growing a pool there returns `429` with code `region_limit_exceeded`. If your organization has no limits in a region, creating a browser, pool, or Managed Auth connection there returns `403` with code `region_limit_required`.

[Project concurrency caps](/info/projects#concurrency-limits) count a project's browsers in every region combined.

## What stays global

- **Profiles and extensions** aren't tied to a region. You can reuse your existing [profiles](/browsers/profiles) and [extensions](/browsers/extensions) with browsers in any region within the same project.
- **Proxy configurations** can be reused across regions. Browser region chooses where the browser runs; [proxy location](/proxies/overview) controls the exit IP websites see.
- **Concurrency and rate limits** apply across all regions combined, not separately in each region. Browser pool capacity counts toward the same [concurrency limit](/browsers/concurrency-and-limits#concurrency).

<Warning>
Regional browsers reduce interaction latency; they don't provide a data residency guarantee. Profiles, replays, and session metadata aren't confined to the browser's selected region and may be stored or processed in the US.
Expand Down
10 changes: 5 additions & 5 deletions info/projects.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ A **Project** is a named container for Kernel resources inside an organization.

- **Isolate environments** — keep `production` resources apart from `staging` or experiments.
- **Scope access** — issue API keys that can only see resources in one project.
- **Concurrency limits** — set an org-wide default cap for every project, or override it per project, so one team or environment can't exhaust your org quota.
- **Concurrency limits** — set an org-wide default cap for every project, or override it per project, so one team or environment can't exhaust your org's capacity.

## The default project

Expand Down Expand Up @@ -301,7 +301,7 @@ if err := client.Projects.Delete(ctx, "proj_abc123"); err != nil {

Kernel caps how many browsers can run at once, at two levels. A single limit covers both on-demand browsers (`browsers.create()`) and [browser pools](/browsers/pools) — standalone sessions and pool capacity count against the same cap.

- **Organization limit** — the total concurrent browsers allowed across your whole organization, determined by your plan. See [concurrency and limits](/browsers/concurrency-and-limits#concurrency) for each plan's limit. Every browser session and every browser in a browser pool counts against it.
- **Regional limits** — the concurrent browsers your organization can run in each [region](/browsers/regions#limits-per-region), determined by your plan. See [concurrency and limits](/browsers/concurrency-and-limits#concurrency) for each plan's limits. Every browser session and every browser in a browser pool counts against the limit of the region it runs in.
- **Per-project limits** — optional caps on individual projects, so one team or environment can't consume the entire org limit.

Per-project caps come from two places:
Expand All @@ -313,15 +313,15 @@ A project's effective cap resolves in this order:

1. The project's explicit override, if set.
2. Otherwise, the organization's default project cap, if set.
3. Otherwise, no per-project cap — only the organization limit applies.
3. Otherwise, no per-project cap — only the regional limits apply.

A per-project cap never lets a project exceed your organization's concurrency limit.
A per-project cap counts the project's browsers in every region combined. Regional limits still apply on top of it, so a project can't run more in a region than your organization's limit there. The org-wide default cap can't be set above your `us-east` limit.

Concurrency limits control how many browsers can run at once. To control monthly usage cost instead, see [Spending Caps](/info/spending-caps).

| Method | Path | Description |
| --- | --- | --- |
| `GET` | `/org/limits` | Get the effective org concurrency limit, current usage, available capacity, and default per-project cap |
| `GET` | `/org/limits` | Get your `us-east` concurrency limit, current usage, and available capacity, and the default per-project cap |
| `PATCH` | `/org/limits` | Set the default per-project cap (send `0` to clear it) and return the updated limits and usage |
| `GET` | `/org/projects/{id}/limits` | Get a single project's limit overrides |
| `PATCH` | `/org/projects/{id}/limits` | Set a single project's limit overrides (send `0` to clear a cap) |
Expand Down
Loading