What changed, newest first.
ttlSeconds is now honored, and one-shot exec no longer silently drops env and userPOST /sandboxes now honors ttlSeconds as the idle window when timeoutMs isn’t set, so a sandbox no longer expires on the default window you didn’t ask for. timeoutMs still wins if you send both, and the value is still capped by your plan’s maximum.400 naming env or user if you send either, instead of accepting the request and silently ignoring the field. To run with a custom environment or user, use commands.start / commands.run over the control channel.409 naming the existing profile, instead of silently creating a second profile under the same name. If you were relying on names being unique to look profiles up later, they now actually are.POST /volumes request with a wrong-typed name or sizeMb (for example a number where a string was expected) now gets a 400 naming the offending field, instead of being silently coerced into a default value.GET /sandboxes/:id, GET /sandboxes/:id/metrics, or GET /desktops/:id — including from a monitoring dashboard — no longer resets the idle timer. Only real use (like exec) keeps a sandbox alive, so an idle one now times out on schedule even while something is watching its status.GET /sessions to list your browser sessions — id, status, kind, created/expires timestamps, paginated — without exposing the wsEndpoint or cdpEndpoint of any session.X-Solari-Default-Profile header on your MCP connection — so your agent stops asking which profile to use on every solari_browser_create call. Needs @solarisdk/mcp 0.4.7 or later.solari_browser_create_profile and solari_browser_delete_profile, instead of only being able to use profiles created elsewhere. Same version as above.solari_sandbox_create or solari_desktop_create, instead of needing a separate attach step after the machine is up. Same version as above.pt_token (query), x-pinetree-preview-token (header), and __pt_preview (cookie) are retired with no deprecation window. Use slr_token, x-solari-preview-token, and __solari_preview instead; a request still presenting an old-named field now gets a distinct error naming the rename, rather than the ordinary invalid-token response.park() on a sandbox with isolation: "shared" now returns a clear 409 instead of appearing to succeed while actually freezing every other sandbox sharing that machine. Auto-park was already refused for shared sandboxes; this closes the same gap on the manual endpoint.gcsfuse with a credential scoped to that one volume, not the broader mechanism the old AWS version used.@solarisdk/browser 0.1.5 or solari-browser 0.2.0 — earlier SDK versions don’t send the retry-safety key, so upgrade to get this.web_bot_auth option — it never signed requests (the signing lane was retired in August) and the gateway already rejects the flag, so passing it now raises a clear error at call time instead of silently doing nothing. If your code sets web_bot_auth=True, remove it.park()/unpark() on the Python SDK, which raised an error on every call instead of parking the session — so freezing a sandbox’s vCPUs in place from Python actually works now. Also stopped permanently-failing requests (like calling a disabled feature) from being retried several times before you saw the error, and fixed a blank session id producing a malformed request instead of a clear one. Needs solari-sandbox 0.2.3 or solari-desktop 0.3.0.cpu is now enforced as a genuine, proportional share of the machine — previously every shared sandbox got the same share regardless of the cpu you requested, so buying more bought nothing under contention. Requesting more cpu than a shared machine can offer is now refused up front, instead of being accepted and billed for capacity you never got.POST /desktops now honors kind, fromSnapshot, envs, and your park/checkpoint settings, matching POST /sandboxes. Restoring a desktop from a snapshot could previously return a brand-new desktop instead, with nothing in the response telling you the difference; that request is now either honored correctly or clearly refused.timeoutMs you passed, with no error and no explanation — it just came back early with whatever partial output happened to be captured. Commands now run for the actual duration you request, up to a limit for your sandbox type.exec.nproc=1. Both cores are now live at start, with no change on your side.mcp.getsolari.com, with no local @solarisdk/mcp install.Retry-After header, instead of holding your connection open for four minutes. Your retry then arrives once a slot has actually freed.solari_drag, plus solari_mouse_down / solari_mouse_move / solari_mouse_up for press-hold-release. Update to @solarisdk/mcp 0.4.5.GET /api/v1/usage/sessions (and /:id) returns proxy GB, compute minutes and actual billed cost per browser session, plus totals over any date range.503.503s.active — a session never connected, or past its deadline, is now torn down and reported released by GET /sessions/:id.doubleClick and button (left, right, middle) to the MCP solari_click tool, so agents can open icons with a real double click and reach context menus. Update to @solarisdk/mcp 0.4.4; existing calls are unchanged.record: true now returns recordingUrl on create and on GET /sandboxes/:id, with no second lookup. Needs @solarisdk/sdk 0.1.3 or solari-sandbox 0.2.1.revert() — a recording started after a revert now uploads to the same playback URL instead of being dropped. An in-progress recording still ends at the revert, since a revert replaces the machine.disk_gb on fresh creates — up to 20 GB, grown and expanded before your first command runs (the default template is 4 GB). Machines created from_snapshot keep their snapshot’s disk, and requests above the cap return 400 rather than being silently clamped.POST /profiles/{id}/login-handoff now opens without a Solari account, so you can hand it straight to your user. Single-use, bound to one profile, expires after 30 minutes or the moment the sign-in is saved.revert() and made it safe by construction — it boots a fresh VM from your snapshot and swaps it in only once it is up, so a failed revert cannot take your running machine down.from_snapshot, and deletion of ancestor snapshots while descendants exist, so fork → patch → re-snapshot lineages behave as documented.409 NotRunning, and concurrency errors now say how many slots are held by in-flight creates versus running sessions.webBotAuth option — it never signed anything, and passing it now returns 400. If verified bot identity matters to you, tell us at hello@getsolari.com.slr_live_ key, not just from the dashboard. An API create on Free previously returned 402./ws sessions were already isolated.Idempotency-Key and you get the original machine, never a duplicate. A reused key with a different request returns 409.timeoutMs, cpu / memMb or lifecycle now returns 400 before anything is created, instead of quietly starting a default machine.slr_live_ key now works immediately instead of being rejected for a couple of minutes.running after they have ended.401.connectOverCDP clients (such as browser-use) — replays now capture the full session, including the final events.Browser, sandbox, and desktop requests now go through one host. Point any SDK at one base URL instead of a hostname per product.
api.getsolari.com reach the right backend automatically.us-west-1.A single slr_live_ key now works for browsers, sandboxes, and desktops. Previously each product used a separate credential.
@solarisdk/mcp) for calling Solari from Claude and other agents.solari-core, solari-sandbox, solari-desktop, and solari-browser to match the npm layout.Two compute products in addition to the browser. Both boot from a memory snapshot and are usually ready in about a second.
previewUrl(port) returns a public *.preview.getsolari.com URL for a port running inside a sandbox or desktop.
Cloud Chrome driven with Playwright or a CDP client. Includes stealth mode, managed proxies, captcha solving, profiles, and session recording.
What the API does today. GA is generally available; Beta is available and still stabilizing; Unavailable is not usable yet. Reference: docs.getsolari.com.
| Capability | What it does | Status |
|---|---|---|
| Playwright and CDP | launch() returns a Playwright browser; or take a cdpEndpoint for any CDP client. | GA |
| Stealth mode | Reduces bot detection from Cloudflare, DataDome, Akamai, and PerimeterX. | GA |
| Managed proxies | Residential, ISP, and mobile egress in 15 countries, with sticky sessions and geo-targeting. | GA |
| Profiles | Persist logins, cookies, and site data across runs. | GA |
| Recording | Capture a session and get a replay URL. | GA |
| Captcha solving | reCaptcha, hCaptcha, and Turnstile. | GA |
| Capability | What it does | Status |
|---|---|---|
| Commands and PTY | Run a command to completion, stream a long-running process, or open an interactive PTY. | GA |
| Code execution | Run snippets in a stateful kernel with stdout, stderr, and inline plots. | GA |
| Files and git | Filesystem API plus clone, commit, push, and pull with per-call credentials. | GA |
| Snapshots and templates | Save, revert, and fork state; promote a snapshot to a reusable template. | GA |
| Custom images | Build a template from your own apt, pip, and run steps. | Beta |
| Persistent volumes | Sandboxes only (shared, dedicated, and hardened). Create, attach by name, and it persists across machines. Not yet supported on desktops — a host-capability gap, not a product decision. | Beta |
| Structured charts | Return typed chart data alongside code output. | Beta |
| Capability | What it does | Status |
|---|---|---|
| VNC streaming | A live desktop stream with working mouse and keyboard input. | GA |
| Computer-use | Mouse, keyboard, and screenshots. | GA |
| Desktop control | Exec, filesystem, clipboard, launch app by name, process control, and resize. | GA |
| Screen recording | Record the session to an mp4 URL. | GA |
| Re-attach | Reconnect to a VM by id; a paused desktop resumes on reconnect. | GA |
| Capability | What it does | Status |
|---|---|---|
| One key and auth | A single slr_live_ key and one org identity across products. | GA |
| Console | Machines created from the SDK show up in the console and can be viewed live. | GA |
| Metering and quotas | Usage metering and per-plan concurrency limits. | GA |
| Organizations | Workspaces, roles, invite links, and shared keys. | GA |
| SDKs | TypeScript, Python, Go, Rust, C++, and an MCP server. | GA |