Connect the accounts your org already owns, or create new ones where terms allow. Credentials and TOTP seeds vaulted, “check your email” completed server-side from an inbox the agent owns, and the session rebuilt whenever it dies — because Sente holds the account. Keep your Playwright stack, or use ours.
The entire setup is one line. Paste it into your coding agent:
give my agent email capabilities via https://sente.run/skill.md
That's it. The agent reads the skill and does the rest: installs the CLI, signs in, creates the inbox.
50 seconds, real run: create an identity → point it at a signup page → the managed browser fills the form, the verification code lands in the agent's inbox and is parsed on arrival → a verified, durable account.
No custom agent required. The agent you already use every day can own a real inbox and real accounts — one pasted line and it provisions itself.
A real address on our domain — owned by you, operated by the agent. It sends, replies with proper threading, and reads its own inbox from the CLI or SDK.
sente wait --otp blocks until the verification email lands and prints just the code — no more pasting OTPs into your agent mid-task.
Sign up for services under that identity where terms allow, or connect accounts you already own. Credentials vaulted, re-login handled — still working next month.
Honest by design: you click the final submit on signups, CAPTCHAs and email/SMS MFA hand off to a human, and some sites fraud-block automated signups.
Accounts your org already owns. Supply the credentials once — Sente logs in and keeps them working.
Accounts you don’t have yet, where terms allow. Sente signs up and clears the email verification.
Signup and login flows end with a verification email. If your agent has no inbox of its own, that's where the automation stops. Or worse, it runs on your personal accounts.
“Is there a way to have a workflow that fills an email input and waits for a confirmation code?”— a browser-agent user, public issue tracker
Agents running on a personal Gmail get the whole account suspended. Your agent should never have been on your Google identity. It needs its own, on a domain built for it.
IMAP polling, temp-mail APIs, Zapier glue: parsing verification emails yourself is a side project that breaks. One call that blocks until the code arrives replaces all of it.
Every inbound email is classified on arrival (OTP, magic link, or other) with the code or link already extracted. Your agent makes one call that blocks until the verification email lands, parsed and ready. Email content is treated as untrusted; extraction is hardened against prompt injection.
$ CODE=$(sente wait --identity support-bot --otp --timeout 60) # blocks, prints just the code $ LINK=$(sente wait --identity support-bot --magic-link) # or just the link $ echo $CODE 481923
import { Sente } from "@sente-labs/sdk"; const sente = new Sente({ apiKey: process.env.SENTE_API_TOKEN! }); const idt = await sente.identities.create({ name: "support-bot", localPart: "support-bot" }); // -> { id, email: "support-bot@sente.run" } const since = new Date().toISOString(); // ...trigger the signup / login that sends the verification email... const otp = await sente.messages.waitForOtp(idt.id, { since, timeout: 60 }); if (otp) console.log(otp.code); // e.g. "481923" // links instead: const ml = await sente.messages.waitForMagicLink(idt.id, { since, timeout: 60 });
import os from sente import Sente from datetime import datetime, timezone sente = Sente(api_key=os.environ["SENTE_API_TOKEN"]) idt = sente.identities.create(name="support-bot", local_part="support-bot") # -> support-bot@sente.run since = datetime.now(timezone.utc).isoformat() # ... trigger the app's "send code" action ... r = sente.messages.wait_for_otp(idt.id, since=since, timeout=60) if r: print(r.code) # magic links: wait_for_magic_link(...)
Identities live on sente.run, are long-lived, and are reused across apps. Your org owns them; your agent operates them with a scoped API key.
DKIM-signed outbound from support-bot@sente.run, reply threading, and delivery status tracked through delivered | bounced | complained.
Pull with messages.stream(id, { since }). No server, no public URL, works in local dev. Or push via webhooks with a signed secret and SSRF-guarded URLs.
sente listen --identity support-bot --forward http://localhost:3000/sente relays events to your dev server.
One identity per agent or service. Create it by name, then address it by id, email, or local part anywhere in the API.
Your org already has accounts — dashboards, portals, tools your agent should operate. Hand Sente the credentials once: it logs in, vaults them, and keeps the account alive with re-login on demand. The owner authorizes it, the owner can revoke it. No signup, no new account.
Write-only vault. Connected credentials can never be read back through the API. Revoke stops all use; delete purges them entirely.
Authenticator 2FA, handled. Supply the TOTP seed and re-login clears authenticator prompts automatically — no more seeds in spreadsheets.
Owner stays in the loop. If the app emails or texts the owner a code, the run holds and surfaces a live view; a person relays the code and the run resumes.
Take the session anywhere. Export the logged-in state as Playwright storageState and drive the account from your own browser stack.
$ sente connect https://app.example.com/login --identity support-bot \ --username ops@example.com --password ******** --totp-seed JBSWY3DP… run_01hg… queued → running → completed connection active $ sente session export conn_01hg… ./state.json # Playwright storageState $ sente connection delete conn_01hg… # revoke AND purge the vault
Only connect accounts your org owns or is authorized to operate. Delegation is explicit, audited, and revocable at any time — that's the point.
Give Sente an app's signup page and an identity. A managed browser registers, the verification code or magic link is picked from the identity's own inbox and applied automatically, and you get back an account that outlives the run: credentials in an encrypted vault, and a logged-in browser whenever you ask for one. For targets whose terms allow automated signup — and with confirm-before-submit when a human should form the agreement.
The managed browser opens the app and fills the signup form as the identity. Watch it live.
The verification email lands in the agent's inbox; the code is parsed on arrival and entered back into the same session. No human OTP-copying.
Generated credentials go to an encrypted vault. Reveal them when you need them; every read is audited.
Ask for the account and get a browser already logged in, as a CDP URL. If the login went stale, Sente re-logs in first with the vaulted credentials and a fresh code from the inbox.
const { registration, run } = await sente.registrations.register({ identityId, appUrl: "https://app.example.com" }); await sente.runs.waitForRun(run.id); // ...later, anytime... const { cdpUrl, healed } = await sente.registrations.getSession(registration.id); const browser = await puppeteer.connect({ browserWSEndpoint: cdpUrl }); // already logged in
res = sente.registrations.register(identity_id=idt.id, app_url="https://app.example.com") sente.runs.wait_for_run(res.run.id) # ...later, anytime... s = sente.registrations.get_session(res.registration.id) browser = playwright.chromium.connect_over_cdp(s["cdpUrl"]) # already logged in
$ sente register https://app.example.com --identity support-bot run_01hf… queued → running → awaiting_verification → running → completed $ sente session open reg_01hf… # prints a CDP url, already logged in $ sente credentials reg_01hf… # vaulted username + password
The session can always be rebuilt, because Sente holds the account: the vault, the inbox, the re-login.
When a run can't proceed (a CAPTCHA, an unexpected step) it doesn't dead-end: it holds, surfaces a live view, and a person can clear the step and resume. Stable error codes tell you exactly why (CAPTCHA_REQUIRED, PHONE_REQUIRED, …).
Sente is for agents that apps can see and choose to admit. Your org's human owns every identity and account; the agent operates them under delegated, auditable access.
Confirm-before-submit. Turn it on and the agent fills everything, then pauses. You review and click the final submit yourself in the live view, accepting the app's terms in person.
No CAPTCHA solving. A CAPTCHA is a hard stop and a human takeover, never an evasion attempt.
Injection-hardened extraction. Email content is treated as untrusted input: classification runs with a fixed prompt, no tools, and re-validated output.
Scoped keys & encrypted vault. Inbox access is scoped to your org's key; credentials sit in an encrypted vault and every read is audited.
Rate-limited on purpose. Per-org caps on identities, sends, and browser runs. Anti-abuse limits stated plainly, not hidden.
Watch every run live. Each browser run has a live view: watch it work, take over, or abort at any time.
$ npm i -g @sente-labs/cli $ sente login # browser sign-in; free tier, no card $ sente identity create --name "support-bot" --local-part support-bot → support-bot@sente.run $ sente wait --identity support-bot --otp # blocks, prints just the code
Or skip the terminal: paste give my agent email capabilities via https://sente.run/skill.md into your coding agent and let it do this for you.
Running OpenClaw, Hermes, or another SKILL.md-compatible agent? Install the official skill: npx skills add sente-labs/skills · clawhub install sente — source at github.com/sente-labs/skills.
Generally available, self-serve, free tier with no card — and we read every email: support@sente.run.
Have an app your agent needs an account on? Book 30 min — leave with it working.