Not flagged as a bot.
Chrome’s own emulation sets the device. 0% on CreepJS.
Browser infrastructure for portal automation
Payer portals, EHRs and registries are built to stop bots. Oya is a real browser with the automation inside it: your agents sign in like staff, and a run recorded once replays forever with no model in the loop.
Or sign in by hand, once
Everyone elseheadless Chrome over CDP
Oyaa real browser, signed in
import { Oya } from "@oya-ai/browser";
const browser = await new Oya().browser.start(); // a real browser, already signed in
await browser.goto(PORTAL_URL);
const result = await browser.play("eligibility-check", { memberId }); // no model in the loopYour browser. Your choice.
The portal reality
Payer portals, EHRs, registries and state boards. The last mile is a person in a browser, and your product stops where they start.
Headless Chrome driven over the debugging protocol is the shape anti-bot vendors look for. The task is fine. The browser gives you away.
SSO, passkeys, a code to a mailbox. Scripted logins break first and break constantly, and a retried password locks the account.
An agent that reasons through the same eight steps every night is paying to rediscover them, and drifting each time it does.
Playbooks
Save the run that worked. Replay it with new inputs and no LLM in the loop. When the portal moves, the agent repairs the step and leaves a draft for a person to promote.
browser.toPlaybook("portal-request-review")The agent does the task once. You keep the steps.
The hard way
The automation lives inside it, not attached over the debugging protocol.
See the numbersChrome’s own emulation sets the device. 0% on CreepJS.
Log in by hand. Every browser after that starts signed in.
A hash-chained audit trail. Allow-list the hosts a browser may reach.
See it run
Ask in plain language. When the run works, save it: the steps, the selectors and the inputs become a playbook that replays with no model in the loop, and exports as a Playwright module you own.
Recorded in the Oya browser. The boxes are the page as the agent reads it.
Start browsers on your own machines or in your own cloud, watch a run as it happens, take the mouse when a portal asks for a code, and read the audit trail afterwards.
The Oya console, self-hosted.
Already running browsers in the cloud?
| A cloud browser SDK | Oya | |
|---|---|---|
| What you connect to | Headless Chrome over the debugging protocol | A real headful browser with the automation inside it |
| The tenth run of the same task | Another full model pass | A recorded playbook, replayed with no model |
| Signing in | Script the login, or paste cookies | Sign in by hand once; the persona carries cookies and localStorage |
| Where it runs | Their cloud | Their cloud, your cloud, or your own machines |
| What you keep if you leave | The code you wrote against their SDK | Your playbooks, as Playwright modules |
Every playbook exports as a Playwright module you can read, diff and keep. Self-host the control plane and the run never leaves your cloud.
Get the full exampleimport { Oya } from "@oya-ai/browser";
const oya = new Oya(); // Set OYA_API_KEY.
const { PORTAL_URL, PORTAL_USERNAME, PORTAL_PASSWORD } = process.env;
if (!PORTAL_URL || !PORTAL_USERNAME || !PORTAL_PASSWORD) {
throw new Error("Set your test portal URL and credentials.");
}
const secrets = { username: PORTAL_USERNAME, password: PORTAL_PASSWORD };
const playbookName = "portal-request-review";
// First run: let the agent do the task, then store its playbook.
{
await using browser = await oya.browser.start();
await browser.goto(PORTAL_URL);
await browser.ask(
"If needed, log in with {{username}} and {{password}}. " +
"Open New Request for {{customerName}}. Stop before submitting.",
{ data: { customerName: "Alex Example" }, secrets },
);
await browser.toPlaybook(playbookName);
} // The first browser stops here; the playbook stays saved.
// Later: run the saved playbook on a new browser with new inputs.
await using replay = await oya.browser.start();
await replay.goto(PORTAL_URL);
await replay.play(playbookName, {
customerName: "Sam Example",
...secrets, // Replay remembers which variables are secret.
});Fictional inputs.
Start a browser in a minute. Record the run your team already does by hand. Move the whole thing into your own cloud when the data says it has to stay there.