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

# Limits

> Every size, count, rate, and time limit you can hit in Managed Agents, with the error you get and where each is explained.

This page collects every limit you can run into, grouped by area. When a request goes over one, the error's `details` usually reports the limit and the measured value, so your code can react without parsing the message.

## Account and access

| Limit | Value | Details |
| - | - | - |
| API key name | 100 characters | [API keys](/recursion/api-keys) |
| API key lifetime | 365 days. Every key expires. | [API keys](/recursion/api-keys) |
| Live organizations per tenant | 100 | [Organizations and roles](/recursion/organizations-and-roles) |
| Organization name | 40 characters | [Organizations and roles](/recursion/organizations-and-roles) |
| Tenant name | 100 characters | [Organizations and roles](/recursion/organizations-and-roles) |

## Requests

| Limit | Value | When exceeded |
| - | - | - |
| Request rate per allowance | 300 requests per 60 seconds. All your API keys share one allowance, and console use has its own. | `429 rate_limit_exceeded` with `Retry-After`. |
| Open event streams | Bounded by service capacity. | `503 service_unavailable`. |
| `Idempotency-Key` | 1 to 256 visible ASCII characters, one header value | `400 invalid_request`. |
| Idempotency key retention | About 24 hours for a completed request. An abandoned in-progress key can be reused after about 1 hour. | After that, the same key starts a new request. |
| Session list page token | Valid for 1 hour, with the same filters and `limit` | `400 invalid_request` on `page_token`. |

See [API conventions](/recursion/api#rate-limits) for retry guidance.

## API version

The API's version is below 1.0.0; the **Endpoints** reference shows the current one. Branch on error `code` values and each operation's published schema, not on `message` text.

## Agents

| Limit | Value | Details |
| - | - | - |
| Agent name | 256 characters | [Agent setup](/recursion/agents) |
| Skills on one agent or session | 100, after groups are expanded and duplicates removed | [Skills](/recursion/skills) |
| `max_concurrent_sessions` | 1 to 10,000, or unset for no cap. Extra root sessions wait as `queued`. | [Usage and cost](/recursion/usage-and-cost) |
| Tags on one agent | 32 | [Agent setup](/recursion/agents) |
| Tags per organization | 200 | [Agent setup](/recursion/agents) |
| Tag label | 32 characters | [Agent setup](/recursion/agents) |
| Tag description | 280 characters | [Agent setup](/recursion/agents) |
| Tag ids in one list filter | 32 | [Agent setup](/recursion/agents) |

## Sessions and events

| Limit | Value | Details |
| - | - | - |
| Custom metadata on a session | 32 pairs. Keys up to 64 characters of letters, digits, `_`, `.`, and `-`. Values 1 to 512 characters. Can't be changed after start. | [Sessions](/recursion/sessions) |
| Metadata filters in one list request | 32 `metadata` pairs and 32 `metadata_key` values | [Session operations](/recursion/session-operations) |
| Referenced sessions | 10 per request. A session keeps the 10 most recent. | [Referenced sessions](/recursion/referenced-sessions) |
| Session list page | 100 by default, 1,000 at most | [Session operations](/recursion/session-operations) |
| Event list page | 100 events by default. A page stops at about 8 MiB, so it can hold fewer. | [Events](/recursion/events) |
| One stream record | The stream's `Content-Type` states the largest record it sends. A larger event arrives as `event_record_too_large`; fetch it with `getSessionEventContent`. | [Events](/recursion/events) |
| Stream keep-alive | A ping every 15 seconds | [Events](/recursion/events) |
| Live snapshot (gestalt) | 5,000 sessions, over a 30-day window (400 days when filtered by `agent_id`) | [Events](/recursion/events) |
| Resource-sample page | 120 buckets by default, 720 at most | [Session operations](/recursion/session-operations) |
| Working root sessions per tenant | A new top-level session is refused with `429 tenant_concurrency_limit` while your tenant already has as many working root sessions as it may (provisioning, queued, or running a turn). `details.limit` gives the cap. Resting sessions, messages, resumes and subagents don't count. | [Sessions](/recursion/sessions) |
| Sandbox provisioning | Fails with `sandbox_provision_timeout` if compute isn't ready within 5 minutes | [Sessions](/recursion/sessions) |

## Deliverables

| Limit | Value | Details |
| - | - | - |
| Files kept per turn | 200 | [Artifacts](/recursion/artifacts) |
| Bytes kept per turn | 512 MiB | [Artifacts](/recursion/artifacts) |
| One deliverable file | 1 GiB on managed computes; 64 MiB on self-hosted workers | [Artifacts](/recursion/artifacts) |
| Files considered in the outputs folder | 10,000 per turn | [Artifacts](/recursion/artifacts) |
| Deliverable file name | 255 characters, no control characters | [Artifacts](/recursion/artifacts) |
| Image shown with `share_file` | PNG, JPEG, or WebP; 5 MiB, 8,192 pixels on a side, and 40 megapixels | [Artifacts](/recursion/artifacts) |
| Images per session | 500 images and 100 MiB, across every tool that returns images | [Artifacts](/recursion/artifacts) |

A file over the per-file size, or with a name that breaks the rules above, isn't kept, and the session records a warning. Files past a turn's file or byte cap wait for the next turn. Download kept files from the session's **Files** tab; see [Files](/recursion/files).

## Tools

| Limit | Value | Details |
| - | - | - |
| MCP server request | 60-second timeout; responses up to 8 MiB | [MCP servers](/recursion/mcp-servers) |

## Integrations

| Limit | Value | Details |
| - | - | - |
| Connections per app | 1 per organization | [Integrations](/recursion/integrations#connect-an-app) |
| Tools on one app's allow-list | 1 to 200. Over the cap or empty, `400 invalid_request` on `resources`. | [Integrations](/recursion/integrations#choose-which-tools-agents-may-use) |
| Tool name | 128 characters | [Integrations](/recursion/integrations#choose-which-tools-agents-may-use) |
| Apps granted to one agent | 25 entries in `built_in_integrations`. Over the cap, `400 invalid_request`. | [Integrations](/recursion/integrations#grant-apps-to-an-agent) |
| Catalog `search` | 200 characters | [Integrations](/recursion/integrations#the-catalog) |
| Session access to an app | Expires within an hour, renewed while the session runs | [Integrations](/recursion/integrations#what-a-session-receives) |
| Skill slots a session with apps uses | 1 of the session's 100 | [Integrations](/recursion/integrations#what-a-session-receives) |
| GitHub repositories in one grant | 500 | [GitHub access](/recursion/github) |
| Native integration connections on one agent | 25 | [Integrations](/recursion/integrations#grant-a-native-integration-to-an-agent) |
| Install link (`state`) | Valid for 15 minutes, once | [Integrations](/recursion/integrations#connect-a-service) |
| Repository and pull request pages | 100 per page | [Integrations](/recursion/integrations#list-github-repositories-and-pull-requests) |
| Slack channel list | 1,000 channels the Slack app is a member of | [Automations](/recursion/automations#slack) |

## Files

| Limit | Value | Details |
| - | - | - |
| One console upload | 1 GiB | Files over 30 MiB are sent in parts. Managed-compute output capture uses the same 1 GiB per-file cap. [Files](/recursion/files) |
| One public REST `uploadFile` file part | 30 MiB | The complete multipart request has a separate 128 KiB framing and form-field allowance. [Files](/recursion/files) |
| Live files per organization | 10 GiB in total. Over it, `413 file_quota_exceeded`. | [Files](/recursion/files) |
| Upload expiry | 1 hour to 90 days, or none | [Files](/recursion/files) |
| Files attached in one request | 500 | [Files](/recursion/files) |
| File list page | 200 by default, 1,000 at most; 100 ids in a `file_ids` lookup | [Files](/recursion/files) |
| Documents named in one message | 512 KiB each and 1 MiB per message | [Files](/recursion/files#show-a-file-to-the-agent-in-a-message) |
| Library files named in one message | 100 blocks and 32 MiB | [Files](/recursion/files#show-a-file-to-the-agent-in-a-message) |

## Automations

| Limit | Value | Details |
| - | - | - |
| Automation name | 256 bytes of UTF-8 text | [Automations](/recursion/automations) |
| Triggers per automation | 20 | [Automations](/recursion/automations) |
| Enabled triggers per event source | 100 across all automations, counting triggers on paused automations. Over it, `409 conflict` on `triggers`. | [Automations](/recursion/automations#receive-events) |
| Opening prompt | 65,536 bytes of UTF-8 text | [Automations](/recursion/automations) |
| Run with input | JSON input up to 64 KiB | [Automations](/recursion/automations) |
| Run defaults | 50 vaults, 500 credentials, 500 files | [Automations](/recursion/automations#set-run-defaults) |
| Run metadata | 16 pairs. Keys up to 64 bytes, values up to 512 bytes. | [Automations](/recursion/automations#set-run-defaults) |
| Schedule catch-up window | 10 seconds to one year, default 15 minutes | [Automations](/recursion/automations#schedule) |
| Schedule jitter | 0 to 540 seconds, default 10 | [Automations](/recursion/automations#schedule) |
| Trigger filters | 100 Slack channels, 100 Slack authors, 100 GitHub repositories, 20 webhook field conditions | [Automations](/recursion/automations#choose-triggers) |
| Custom webhook body | 1 MiB. Larger bodies get `413 payload_too_large`. | [Automations](/recursion/automations#send-a-custom-webhook-delivery) |

## Skills

| Limit | Value | Details |
| - | - | - |
| Skill name | 64 characters | [Skills](/recursion/skills) |
| Skill description | 1,024 characters | [Skills](/recursion/skills) |
| Skill instructions body | 64,000 bytes of UTF-8 after escaping | [Skills](/recursion/skills) |
| Compressed bundle upload | 8 MiB | [Skills](/recursion/skills) |
| Unpacked bundle | 32 MiB | [Skills](/recursion/skills) |
| One file in a bundle | 4 MiB | [Skills](/recursion/skills) |
| Files in a bundle | 500 | [Skills](/recursion/skills) |
| Folder depth in a bundle | 3 levels below the skill root | [Skills](/recursion/skills) |
| Skill list page | 100 by default, 500 at most | [Skills](/recursion/skills) |
| Skill search term | 2 to 256 characters | [Skills](/recursion/skills) |

## Environments

| Limit | Value | Details |
| - | - | - |
| Setup script | 64 KiB | [Environments](/recursion/environments) |
| Setup timeout | 10 to 3,600 seconds. `0` or unset uses 600. | [Environment reference](/recursion/environments-reference) |
| CPU | 250 to 8,000 millicores. Available compute or network policy can impose a lower maximum. | [Environment reference](/recursion/environments-reference) |
| Memory | 1,024 to 32,768 MiB. Available compute or network policy can impose a lower maximum. | [Environment reference](/recursion/environments-reference) |
| GPU sandbox | One GPU, with 8,000 millicores and 32,768 MiB set for you | [Environment reference](/recursion/environments-reference#compute) |
| Sandbox lifetime | 10 to 86,400 seconds when set | [Environment reference](/recursion/environments-reference) |
| Workspace disk | 1 to 100 GiB. Unset uses the default. | [Environment reference](/recursion/environments-reference) |
| Idle stop | 120 to 7,200 seconds (2 hours) when set; `0` uses the default of 30 minutes. With computer use, `0` or at least 600. | [Environment reference](/recursion/environments-reference) |
| Stopped sandbox retention | 3,600 to 2,592,000 seconds when set | [Environment reference](/recursion/environments-reference) |
| Network policy rules | 200 | [Environment reference](/recursion/environments-reference) |
| Setup runs in flight | 1 per environment, and 4 per organization by default. Over the organization cap, `429 setup_run_limit` reports the cap in `details.limit`. | [Environments](/recursion/environments) |
| Setup-run list page | 50 | [Environments](/recursion/environments) |
| Setup-run log kept | 4 MiB per run, plus a 2 KiB `stderr_tail` | [Environments](/recursion/environments) |
| Setup-run log page | 500 lines by default, 2,000 at most | [Environments](/recursion/environments) |
| Setup-run wait | `wait_seconds` accepts 0 to 60, but waits at most 5 seconds | [Environments](/recursion/environments) |
| Setup-run stderr tail | 2 KiB | [Environments](/recursion/environments) |

## Multi-agent

| Limit | Value | Details |
| - | - | - |
| Roster entries | 20, with at most 1 advisor | [Multi-agent](/recursion/multi-agent) |
| `max_depth` | 1 by default, 3 at most | [Multi-agent](/recursion/multi-agent) |
| `max_concurrent_threads` | 8 by default, 25 at most | [Multi-agent](/recursion/multi-agent) |
| `max_threads` | 25 by default, 100 at most | [Multi-agent](/recursion/multi-agent) |

Child sessions don't count toward an agent's `max_concurrent_sessions`.

## Next steps

<CardGroup cols={2}>
  <Card title="Errors" href="/recursion/errors">
    Every error code, its cause, and whether to retry.
  </Card>

  <Card title="API conventions" href="/recursion/api">
    Retries, idempotency, and paging.
  </Card>

  <Card title="Troubleshooting" href="/recursion/troubleshooting">
    Match a symptom to its cause and fix.
  </Card>

  <Card title="Event types and states" href="/recursion/reference">
    Look up every status, event type, and result value.
  </Card>

  <Card title="Pricing" href="/recursion/pricing">
    See what a session hour costs and the purchase amounts credits come in.
  </Card>
</CardGroup>
