--- title: Limits description: Overview of your organization's resource limits and usage. --- [Daytona Limits ↗](https://app.daytona.io/dashboard/limits) provide an overview of your organization's [resources](#resources), [sandbox limits](#sandbox-limits), and [rate limits](#rate-limits). Daytona uses a [tier-based](#tiers) system where organizations are placed into tiers based on verification status, with each tier providing access to a specific compute pool and rate limits. For information on spending and wallet management, see [billing](/docs/en/billing). ## Resources Resources are shared across all running sandboxes. The number of sandboxes you can run at once depends on their individual usage. Organizations are automatically placed into a tier based on verification status and have access to a compute pool consisting of: - **Compute**: the total CPU cores available - **Memory**: the total RAM available - **Storage**: the total disk space available ## Sandbox limits Sandbox limits provides an overview of resource limits per sandbox. - **Compute**: the maximum number of vCPUs per sandbox - **Memory**: the maximum amount of memory per sandbox in GiB - **Storage**: the maximum amount of storage per sandbox in GiB Sandboxes count against these limits based on their [lifecycle state](/docs/sandboxes#sandbox-lifecycle): stopped, paused, archived, and deleted sandboxes free reserved CPU and memory, while disk quota depends on the sandbox type and state. ## Disk quota Disk quota and [sandbox billing](/docs/en/billing#sandbox-billing) are separate: a sandbox can be billed for reserved disk without counting against your organization's storage limit. The table below details which states occupy disk quota for [container sandboxes](/docs/en/sandboxes#create-sandboxes) and [VM sandboxes](/docs/en/sandboxes#vm-sandboxes). | **State** | **Container Sandbox** | **VM Sandbox
(Linux VM and Windows)** | **Description** | | --------- | --------------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Stopped | ✓ | ✗ | Stopped container sandboxes occupy disk quota until archived. Stopped VM sandboxes free the quota: their state is offloaded to a storage layer, which keeps resume fast while releasing quota. | | Paused | ✗ | ✗ | Paused VM sandboxes free the disk quota. Supported for [**VM sandboxes**](/docs/en/sandboxes#vm-sandboxes) only. | | Archived | ✗ | ✗ | [**Archiving**](/docs/en/sandboxes#archive-sandboxes) moves the container filesystem to object storage, frees the quota, and stops billing. Supported for [**container sandboxes**](/docs/en/sandboxes#create-sandboxes) only. VM sandboxes have no archive state because stopping or pausing them already frees the quota. | ## Rate limits Rate limits control how many API requests you can make within a specific time window. These limits are applied based on your tier, authentication status, and the type of operation you're performing. Rate limits for general authenticated requests are tracked per organization. | **Tier** | **General Requests
(per min)** | **Sandbox Creation
(per min)** | **Sandbox Lifecycle
(per min)** | | ---------- | ------------------------------------ | ------------------------------------ | ------------------------------------- | | Tier 1 | 10,000 | 300 | 10,000 | | Tier 2 | 20,000 | 400 | 20,000 | | Tier 3 | 40,000 | 500 | 40,000 | | Tier 4 | 50,000 | 600 | 50,000 | | Enterprise | Custom | Custom | Custom | ### Rate limit headers Daytona includes rate limit information in API response headers. Header names include a suffix based on which rate limit is triggered (e.g., `-anonymous`, `-authenticated`, `-sandbox-create`, `-sandbox-lifecycle`): | Header Pattern | Description | | --------------------------------------- | ------------------------------------------------------------------------- | | **`X-RateLimit-Limit-{throttler}`** | Maximum number of requests allowed in the time window | | **`X-RateLimit-Remaining-{throttler}`** | Number of requests remaining in the current window | | **`X-RateLimit-Reset-{throttler}`** | Time in seconds until the rate limit window resets | | **`Retry-After-{throttler}`** | Time in seconds to wait before retrying (included when limit is exceeded) | ### Rate limit errors Daytona [Python](/docs/python-sdk), [TypeScript](/docs/en/typescript-sdk), [Ruby](/docs/ruby-sdk) and [Go](/docs/go-sdk) SDKs raise or throw a `DaytonaRateLimitError` exception (Python) or error (TypeScript, Ruby and Go) when you exceed a rate limit. The rate limit error response is a JSON object with the following properties: - **`statusCode`**: the HTTP status code of the error - **`message`**: the error message - **`error`**: the error type ```json { "statusCode": 429, "message": "Rate limit exceeded", "error": "Too Many Requests" } ``` All errors include [**`headers`**](#rate-limit-headers) and status code properties, allowing access to rate limit headers directly from the error object. Headers support case-insensitive access: ```typescript try { await daytona.create() } catch (error) { if (error instanceof DaytonaRateLimitError) { console.log(error.headers?.get('x-ratelimit-remaining-sandbox-create')) console.log(error.headers?.get('X-RateLimit-Remaining-Sandbox-Create')) // also works } } ``` ```python try: daytona.create(snapshot="my-snapshot") except DaytonaRateLimitError as e: print(e.headers['x-ratelimit-remaining-sandbox-create']) print(e.headers['X-RateLimit-Remaining-Sandbox-Create']) # also works ``` ```ruby begin daytona.create rescue Daytona::Sdk::Error => e puts "Error: #{e.message}" end ``` ```go sandbox, err := daytona.Create(ctx, nil) if err != nil { var rateLimitErr *errors.DaytonaRateLimitError if errors.As(err, &rateLimitErr) { fmt.Println(rateLimitErr.Headers.Get("x-ratelimit-remaining-sandbox-create")) fmt.Println(rateLimitErr.Headers.Get("X-RateLimit-Remaining-Sandbox-Create")) // also works } } ``` ## Tiers Limits are applied to your organization's default region. To unlock higher limits, complete the following verification steps in the [Daytona Dashboard ↗](https://app.daytona.io/dashboard/limits): | **Tier** | **Resources (vCPU / RAM / Storage)** | **Access Requirements** | | -------- | ------------------------------------ | ------------------------------------------------------- | | Tier 1 | 10 / 10GiB / 30GiB | Email verified | | Tier 2 | 100 / 200GiB / 300GiB | Credit card linked, $25 top-up | | Tier 3 | 250 / 500GiB / 2000GiB | $500 top-up | | Tier 4 | 500 / 1000GiB / 5000GiB | $2000 top-up every 30 days | | Custom | Custom | Contact [support@daytona.io](mailto:support@daytona.io) | [Network limits](/docs/en/network-limits) are automatically applied based on your organization's billing tier. ## Limits Limits provide an overview of tiers and their corresponding resource and rate limits. | **Tier** | **Compute (vCPU)** | **Memory (GiB)** | **Storage (GiB)** | **API Requests (minutes)** | **Sandbox Creation (minutes)** | **Sandbox Lifecycle (minutes)** | | -------------- | ------------------ | ---------------- | ----------------- | -------------------------- | ------------------------------ | ------------------------------- | | **1** | 10 | 20 | 30 | 10,000 | 300 | 10,000 | | **2** | 100 | 200 | 300 | 20,000 | 400 | 20,000 | | **3** | 250 | 500 | 2,000 | 40,000 | 500 | 40,000 | | **4** | 500 | 1,000 | 5,000 | 50,000 | 600 | 50,000 | | **Enterprise** | Custom | Custom | Custom | Custom | Custom | Custom | ## Best practices To work effectively within rate limits, always handle `429` errors gracefully with proper retry logic. When you receive a rate limit error, implement exponential backoff and wait progressively longer between retries (1s, 2s, 4s, 8s, etc.) to avoid overwhelming the API. **Monitor [rate limit headers](#rate-limit-headers)** (e.g., `X-RateLimit-Remaining-{throttler}`, `X-RateLimit-Reset-{throttler}`) to track your consumption and implement proactive throttling before hitting limits. These headers are available on all error objects via the `headers` property. **Cache API responses** that don't frequently change, such as [sandbox lists](/docs/sandboxes#list-sandboxes) (when relatively static), [available regions](/docs/regions), and [snapshot information](/docs/snapshots). This reduces unnecessary API calls and helps you stay well within your limits. **Batch and optimize operations** by creating multiple sandboxes in parallel (within rate limits) rather than sequentially. Consider reusing existing sandboxes when possible instead of creating new ones for every task. **Efficiently manage sandbox lifecycle** to reduce API calls. [Archive sandboxes](/docs/sandboxes#archive-sandboxes) instead of deleting and recreating them, stop sandboxes when not in use rather than deleting them, and leverage [auto-stop intervals](/docs/sandboxes#auto-stop-interval) to automatically manage running sandboxes without manual intervention. **Implement request queuing** to prevent bursts that exceed limits, and use [webhooks](/docs/webhooks) instead of polling for state changes to avoid unnecessary API calls. Set up monitoring and alerts for `429` errors in your application logs so you can proactively address rate limiting issues before they impact your users.