Limits and behaviors
Platform behaviors and constraints you'll hit in practice, grouped by area, each with a workaround.
This page collects platform behaviors that aren’t obvious from the API surface. Read it before debugging; most “why is it doing that?” moments are listed here.
Browser sessions
Section titled “Browser sessions”| Behavior | Details | What to do |
|---|---|---|
| Google domains blocked | Navigation to google.com and its subdomains is blocked (URLs merely containing google.com, like redirect params, are fine) | Use a different search engine, e.g. Bing or DuckDuckGo |
chrome:// URLs blocked | Internal browser pages can’t be navigated to | Use API endpoints for browser state (e.g. /tabs for tab info) |
| Max 5 tabs | Opening a sixth tab fails; the last remaining tab can’t be closed | Close tabs you’re done with; reuse a tab by navigating it |
No right_click | Right-click is not supported in browser sessions and returns a not-supported error | Use keyboard shortcuts or in-page UI instead; or use a desktop session |
| Downloads disabled | The browser denies all file downloads | Fetch the file’s URL with a shell curl on a desktop session, or extract content via html() |
| HTML is cached ~2 s | html() responses are cached for 2 seconds per URL | Wait 2 s (or navigate) before re-reading if you need fresh DOM |
| Typing is per-keystroke | type() sends real keystrokes at ~100 characters/second | Budget ~1 s per 100 chars; don’t set tight timeout_ms on long text |
| Navigation waits for network idle | navigate() waits for network idle up to 5 s, then returns anyway | For slow SPAs, add a short wait() and screenshot to confirm rendering |
Desktop sessions
Section titled “Desktop sessions”| Behavior | Details | What to do |
|---|---|---|
| Scrolling is quantized | Scroll deltas snap to ~50 px wheel clicks | Use deltas that are multiples of 50; verify position with a screenshot |
Uploads land in /workspace/uploads | File uploads go there; max 512 MB per file, transferred in 8 MB chunks | Reference uploaded files by that path in shell commands and apps |
| No file-download action | There’s no action that returns a file from the machine | Return small files via shell stdout (base64 file.bin); capture images via screenshots |
Firefox may ignore navigate | Desktop Firefox sometimes doesn’t react to the navigate action | Fall back to hotkey(["ctrl", "l"]), type the URL, press Enter |
Shell cwd is /workspace | exec commands run in /workspace unless you pass cwd | Pass cwd explicitly or use absolute paths |
Sessions
Section titled “Sessions”| Behavior | Details | What to do |
|---|---|---|
| Idle reaping | Sessions terminate after inactivity_timeout_seconds with no activity. Any executed action (screenshots included) or a keepalive call resets the clock, but if you pause between calls longer than the idle window, the session is reaped | Set inactivity_timeout_seconds to 20+ minutes for interactive development; call keep_alive() during long pauses |
| Hard lifetime cap | max_lifetime_seconds always applies, regardless of activity | Set it to cover your longest expected run; save state with persistent=True if you need to resume |
| One action at a time | Actions on a session are serialized; concurrent requests queue and can hit the timeout | Await each action before sending the next; use batch for sequences |
Actions
Section titled “Actions”| Behavior | Details | What to do |
|---|---|---|
| Coordinates are screenshot pixels | x/y are pixel positions in the screenshot’s coordinate space | Take a fresh screenshot before clicking; don’t hardcode coordinates |
| Per-action timeout | Each action accepts a timeout_ms | Raise it for slow operations (long typing, heavy pages) |
| Batch stops on first error | A batch executes in order, stops at the first failure, and returns the results so far | Check executed vs total in the response and resume from the failed action |
Screenshots
Section titled “Screenshots”| Behavior | Details | What to do |
|---|---|---|
| Presigned URLs | Screenshot URLs are presigned and expire after ~7 days | Download images you want to keep when you receive them |
| JPEG format | Screenshots are JPEG-compressed | Fine for vision models and review; don’t expect pixel-exact fidelity |
Concurrency
Section titled “Concurrency”| Behavior | Details | What to do |
|---|---|---|
| Concurrent computer limit | The number of simultaneously running computers is plan-dependent; exceeding it returns a 429 with “Concurrent limit reached” | Delete computers when done, retry with backoff, or upgrade your plan in the dashboard |
See also
Section titled “See also”- Computers: computer lifecycle and actions
- Observability: live view, screencast, and traces
- Shell commands: run terminal commands
- Troubleshooting: common issues and solutions