tenant_user and is gated by that user’s Account Kit (browser must be enabled). Enable or disable it per kit, and optionally require human approval for autonomous signup.
CLI First
How it works
| Capability | What it does | Cost |
|---|---|---|
session create | Open a live cloud browser scoped to allowed_domains | 0 credits (time floor at close) |
navigate | Go to a URL (allowlist + SSRF enforced) | 1 credit |
act | Natural-language action (click/fill/scroll) | 1 credit |
extract | Pull structured data from the page (read-only) | 1 credit |
observe | List candidate elements/actions (read-only) | 1 credit |
screenshot | Capture the page (short-lived signed URL) | 1 credit |
signup | Autonomous account creation + credential vaulting | 4 credits |
login | Autonomous re-authentication from the vault | 3 credits |
Autonomous signup & login
This is the core workflow: an agent that needs an account on a third-party service can create one and reuse it later, without ever handling the password itself.Signup
signup opens a scoped, write-enabled session, fills the registration form with the user’s identity (email + name) and a strong generated password, submits, and stores { email, password } in the user’s encrypted Vault under the key login:<service>. The password is never returned to the agent or sent to the model.Approval (optional)
Because signup creates a real account under the user’s identity, it is approval-gated by default. When gated, the call returns
status: "pending_approval" (HTTP 202) and runs only after a human approves it. Toggle this per Account Kit.Secrets never reach the model. The password is filled via Stagehand variable substitution (
%password% is a placeholder; the real value is substituted locally and is never logged or sent to the LLM). Signup uses the tenant user’s profile email as the account email — point it at a provisioned inbox so verification emails can be received. Set it with the profile primitive (client.forUser(id).profile.setEmail(...), or profile.set_email from the agent toolset).If you already have a working email/password for the service, store it with saveCredential (POST .../browser/credentials) instead of typing it via act; a later login then pulls it from the Vault server-side.Saved logins (Tier B)
For services where a human must log in once (SSO, 2FA, CAPTCHAs), open ahuman_login session, complete the login in the dashboard live view, then save_login to persist it as a reusable, encrypted vendor-side context. naive stores only an opaque pointer — never the cookies or credentials. Later sessions reopen already-logged-in by name (--context-name), gated by a human-created grant (default-deny; an agent can use a saved login but never create the grant or revoke it).
Live view
From the dashboard, open a user’s Browser tab to see their sessions. For an active session you can watch it stream in real time and click Take control to interact directly — this is how a human completes the one-time login for a saved-login context, or steps in to solve a CAPTCHA.Safety
- Domain allowlist (default-deny). Every session must pass
allowed_domains; pass['*']to browse unrestricted (not recommended — no DNS-rebinding protection). An SSRF denylist (private/loopback/metadata hosts, non-http(s) schemes) always applies. - Writes are gated. Destructive/submit actions are rejected unless the session was opened with
allow_writes. - No secrets in instructions. Never put passwords in an
act/extractinstruction — the autonomous signup/login flow handles credentials server-side. - Read-restricted saved logins. On a logged-in (context-backed) session,
extract/observe/screenshotare disabled unless a human opened it withallow_extract, and their output is redacted.