You don’t change your automation stack for any of them. The point is that your agent gets a
signed-in browser and never holds the password.
Open a live session (CDP)
POST /v1/registrations/:id/session opens a remote browser on the account’s logged-in profile and
returns a CDP URL. Connected accounts use the same call with the connection id.
puppeteer.connect({ browserWSEndpoint: cdpUrl }).
One live session per identity, and it is mutually exclusive with runs — both drive the same
browser profile. Always close the session when you’re done (
DELETE /v1/registrations/:id/session, idempotent): it holds a real remote browser and consumes browser
minutes until you close it or its own expiresAt passes.Freshness and auto re-login
Cookies expire and apps log you out, sogetSession will not hand you a browser it can’t vouch for.
Freshness is measured by recency of the last confirmed login — the moment a register, login, or
connect run completed for that account:
- Within the freshness window (about 10 minutes by default), the session is opened straight away and you get it in seconds.
- Older, and Sente queues a re-login first: the vaulted credentials, plus a code from the account’s own inbox (created accounts) or a server-computed TOTP code (connected accounts with a seed). The browser you get back was just confirmed logged in. Expect this to take a minute.
healed: true when a re-login happened.
Pass maxStaleSec to widen or tighten the window for one call, or verify: false
(CLI --no-verify) to skip the check entirely and take whatever the profile holds.
This is recency, not inspection: Sente does not probe the page to test whether you’re still signed
in. A cold call can therefore re-login on cookies that were in fact still valid. It costs a minute;
it never returns a session it hasn’t just confirmed.
409s carrying the id you need to poll:
If the healing run itself ends
blocked — email MFA on a connected account, a CAPTCHA, a wall — the
SDK call raises with that run attached: open its liveViewUrl, clear the step, resume, and retry.
See Human takeover.
Export the session — keep your own stack
POST /v1/registrations/:id/session/export returns the logged-in browser state (cookies +
localStorage) as a standard Playwright storageState. Load it into your own browser, on your own
infrastructure: no CDP connection to Sente, no changes to your existing automation.
getSession (same 409 SESSION_STALE /
SESSION_PENDING contract), so the state you get was just confirmed logged in. It works for created
and connected accounts alike. If a session is already open, the export is taken from it; otherwise
one is opened for the export and closed again.
The live view
Every session — and every blocked run — carries aliveViewUrl: an
interactive browser page a person can open to watch or take over. It is how a human enters an MFA
code, solves a CAPTCHA, or clicks a confirm-before-submit final button. Treat the URL as sensitive:
anyone with it controls that browser while the session is open. A blocked run holds its live view
for about 10 minutes; after that the session is torn down and the URL stops working.
Which shape to use
Next steps
Human takeover
What to do when a healing re-login blocks on a person.
Audit trail
Every session open, close, and export is recorded — query it via
GET /v1/audit-events.Security model
Why your agent never receives the password, and what the browser agent does see.
API reference: registrations
Exact request bodies, response fields, and status codes for the session endpoints.
