aexaex
Guides

Limits & quotas

Limits & quotas

These are the hard ceilings and caps that bound a run, a workspace, and a single request. Every value is mirrored from a single source-of-truth constant in the platform's limits module; this page is hand-maintained against those constants. If a value here ever disagrees with the constant, the constant wins.

Each row is named by its source-of-truth constant. For the values that apply when you omit an option, see Defaults. For product/policy boundaries (what aex does and does not promise), see Limits.

Each row is tagged with its source:

  • aex policy — an aex platform ceiling, the same for every workspace.
  • Workspace default — a per-workspace value with a configurable override.

And whether you can raise it: per-run option, per-plan, or no.

Run scope

LimitValueSourceRaisable?Constant
Maximum run timeout8 hours (also the default when timeout is omitted)aex policyPer plan (billing-driven)RUN_MAX_TIMEOUT_MS
Minimum run timeout1 minuteaex policyNo (floor)RUN_MIN_TIMEOUT_MS
Per-call exec timeout (default)30 minutesaex policyPer-call via the tool call's timeoutMsRUN_DEFAULT_EXEC_TIMEOUT_MS
MCP connect timeout (default)30 secondsaex policyPer-port via connectTimeoutMsRUN_DEFAULT_MCP_CONNECT_TIMEOUT_MS
MCP call timeout (default)30 minutesaex policyPer-port via callTimeoutMsRUN_DEFAULT_MCP_CALL_TIMEOUT_MS
Per-session spend capNone by default; when set, the session is stopped once its spend would exceed the capaex policyPer-session via overrides.maxSpendUsd (a positive USD amount)
Max agent iterations (turns) per run20 by default; hard ceiling 200aex policyPer-session via overrides.maxTurns (a positive integer, clamped to the ceiling)RUN_DEFAULT_MAX_TURNS / RUN_MAX_TURNS_CEILING

Output capture (per run)

Files stream from the container to object storage one at a time. When a cap is reached, remaining files are dropped and counted in the summary, never silently lost.

LimitValueSourceRaisable?Constant
Capture wall-clock budget1 houraex policyNo (hard ceiling)RUN_CAPTURE_DEFAULT_TIMEOUT_MS
Max files captured50,000aex policyNo (hard ceiling)RUN_CAPTURE_MAX_FILES
Max bytes per captured file500 GB (decimal)aex policyNo (hard ceiling)RUN_CAPTURE_MAX_FILE_BYTES
Max total captured bytes500 GB (decimal)aex policyNo (hard ceiling)RUN_CAPTURE_MAX_TOTAL_BYTES

Tool output caps (per run)

LimitValueSourceRaisable?Constant
web_fetch returned body500 KB (UTF-8)aex policyPer-call via max_bytesREQUEST_WEB_FETCH_DEFAULT_MAX_BYTES
bash_output per-read body1 MB (UTF-8)aex policyNo (hard ceiling)RUN_BASH_BG_OUTPUT_MAX_BYTES
grep max file size (larger files skipped — use bash grep)25 MBaex policyNo (hard ceiling)RUN_TOOL_GREP_MAX_FILE_BYTES
head/tail max file size (larger files rejected — use bash head/tail)100 MBaex policyNo (hard ceiling)RUN_TOOL_HEAD_TAIL_MAX_FILE_BYTES
grep/glob files visited per recursive walk (then truncates with a notice)100,000aex policyNo (hard ceiling)RUN_TOOL_WALK_MAX_FILES

Subagents (per run lineage)

LimitValueSourceRaisable?Constant
Max subagent depth (subagent tool)5 (a depth-5 lineage may not spawn deeper)aex policyNo public per-run override (subagents run in-process)RUN_MAX_PUBLIC_SUBAGENT_DEPTH
Concurrent child runs per lineage root1000 live (non-terminal); hard ceiling 4096aex policyNo public per-run override (subagents run in-process)RUN_DEFAULT_MAX_CONCURRENT_CHILD_RUNS

Retention (per run)

LimitValueSourceRaisable?Constant
Per-run metadata record TTL24 hoursaex policyNo (hard ceiling)RUN_KV_RECORD_TTL_SECONDS
Per-run secret-envelope TTL24 hoursaex policyNo (hard ceiling)RUN_KV_SECRET_TTL_SECONDS

Sandbox (managed runtime)

Each run executes in an ephemeral Linux container sized by the runtime preset. A few behaviours are worth knowing before you rely on the filesystem or RAM:

  • Only /workspace persists across turns of the same session. Everything outside /workspace is reset between turns and is gone when the session ends — write deliverables and any state you want to survive a turn under /workspace.
  • The image is minimal. Declare OS/language packages with environment.packages so they are present deterministically at boot. A runtime install inside the agent (pip install, apt-get) is best-effort and non-persistent (reset next turn), and pip is subject to PEP 668 (externally-managed-environment) — prefer environment.packages, or a virtualenv you create under /workspace.
  • /proc/meminfo reports the HOST's RAM, not your preset's. Your actual memory ceiling is the preset's memoryMb (e.g. shared-0.25x-1gb = 1 GB, the default; shared-4x-12gb = 12 GB). The presets are the SSoT in packages/contracts/src/runtime-sizes.ts; see Defaults.
  • The agent loop is bounded by maxTurns (default 20, ceiling 200) — a documented, per-run-overridable limit (see the Run scope table above and overrides.maxTurns), not a silent cutoff.

Workspace scope

LimitValueSourceRaisable?Constant
Workspace storage cap500 GB (decimal; admins uncapped — not a customer entitlement)Workspace defaultPer-plane via env AEX_WORKSPACE_STORAGE_CAP_BYTESWORKSPACE_DEFAULT_STORAGE_CAP_BYTES
Max concurrent runs per workspacePlan-based: 5 live (non-terminal) root runs on the free plan, 50 on Pro, 200 on Team; hard platform ceiling 200. One more submit past the cap fails with 429 workspace_concurrency_exceeded (see Errors). Subagent children are governed separately by the per-lineage caps below. Read your effective cap from aex.whoami().limits.maxConcurrentRuns.Workspace default (per plan)Per-plan (upgrade) or per-workspace override (contact support), clamped to the 200 ceilingPLANS[planKey].maxConcurrentRuns / WORKSPACE_MAX_CONCURRENT_RUNS_CEILING
Monthly workspace spend cap$250 per rolling UTC calendar month by default; 0 = unlimited. A submit past the cap fails with 402 workspace_spend_cap_exceeded (see Errors).Workspace defaultPer-workspace override (contact support)WORKSPACE_DEFAULT_SPEND_CAP_USD
Skill bundle max compressed size (.zip)10 GiB (enforced at upload by the SDK and re-enforced server-side)aex policyNo (hard ceiling)SKILL_BUNDLE_LIMITS.maxCompressedBytes
Skill bundle max decompressed size (sum of uncompressed file sizes)50 MBaex policyNo (hard ceiling)SKILL_BUNDLE_LIMITS.maxDecompressedBytes
Skill bundle max file entries1,000Workspace defaultPer-workspace (plan/env)WORKSPACE_SKILL_BUNDLE_MAX_FILES
Skill bundle max directory depth (a/b/c/d = 4)16Workspace defaultPer-workspace (plan/env)WORKSPACE_SKILL_BUNDLE_MAX_DEPTH
Skill bundle max entry path length512 charactersWorkspace defaultNo (hard ceiling)WORKSPACE_SKILL_BUNDLE_MAX_PATH_LENGTH
File.mountPath max length512 charactersWorkspace defaultNo (hard ceiling)WORKSPACE_MOUNT_PATH_MAX_LENGTH

Rate limits (per workspace, per minute)

Run submission has its own platform-enforced velocity cap: 120 submits per minute per workspace by default (0 = disabled). Past it, POST /runs fails with 429 workspace_submit_rate_exceeded (see Errors). It is overridable per-plane via AEX_WORKSPACE_SUBMIT_RATE_PER_MIN or per-workspace via support.

The dashboard mutation actions below default as listed; each is overridable per-plane via the matching AEX_RATE_LIMIT_<ACTION>_PER_MINUTE env var.

ActionDefault per minuteSourceConstant
Run cancel30Workspace defaultWORKSPACE_RATE_LIMIT_DEFAULTS
Run delete30Workspace defaultWORKSPACE_RATE_LIMIT_DEFAULTS
Signed output link120Workspace defaultWORKSPACE_RATE_LIMIT_DEFAULTS
API key create10Workspace defaultWORKSPACE_RATE_LIMIT_DEFAULTS
API key delete30Workspace defaultWORKSPACE_RATE_LIMIT_DEFAULTS

Introspecting your effective caps

aex.whoami() (CLI: aex whoami) returns a limits object carrying the workspace's effective values for the caps above — maxConcurrentRuns, submitRatePerMinute, spendCapUsd, plus the live monthSpendUsd, balanceUsd, balanceGraceFloorUsd, and paymentMethodStatus — resolved by the same code the admission gates use, so you can anticipate a 429/402 before submitting. See Authentication and Errors.

Request Scope

LimitValueSourceRaisable?Constant
Signed output URL TTL300 secondsaex policyPer-call via expiresSecondsREQUEST_PRESIGN_URL_DEFAULT_TTL_SECONDS
Event-stream connection ticket TTL60 secondsaex policyPer-mint via ttlMsREQUEST_TICKET_DEFAULT_TTL_MS

On this page