---
title: Limits
description: "Capability profile, concurrency, upload caps, request and response body sizes, and account quotas."
---

## Capability profile

`http-sync-v0`: one `fetch` handler, optional `scheduled` and `queue` handlers, `env.*` bindings, buffered request and response bodies, no WebSockets. See [The handler](/docs/concepts/handler) for the handler contract and [Runtime compatibility](/docs/concepts/compatibility) for tested APIs and npm packages.

## Concurrency

Each sprout process runs one request at a time. More than two or three requests in flight add latency, not throughput, because a deployment is one process. To scale a [standalone binary](/docs/get-started/standalone), run several copies behind `SO_REUSEPORT`.

## Size limits

| Limit | Default | Notes |
| --- | --- | --- |
| Sprout upload | 16 MiB | |
| Assets | 64 MiB | Up to 4096 files. |
| Inbound request body | 1 MiB | `SB_REQUEST_BODY_MAX`. A larger body gets a `413` before the handler runs. |
| Outbound `fetch()` response body | 32 MiB | `SB_FETCH_MAX_BYTES`. The body is held in memory whole. |
| R2 direct upload | 100 MiB | Per upload URL, set with `maxBytes` up to 5 GiB. See [R2](/docs/bindings/r2#large-files). |
| Secret value | 8 KiB | |

:::warning
[R2](/docs/bindings/r2) `put` and `get` hold the whole object in memory. Use direct transfer URLs or multipart uploads for large files.
:::

## Account quotas

| Scope | Default |
| --- | --- |
| Per account | 50 projects, 100 storage resources |
| Per project | 25 retained versions besides the active one, 5 custom domains, 64 secrets |
| Deploys | 10 per minute per account, 20 per minute per IP address |

The platform operator can change these defaults.
