Log in once. Run authenticated sessions at scale.
Stop rebuilding login flows for every automation run. Authenticated Profiles capture browser authentication state once – cookies, localStorage, and IndexedDB – so every session after starts already signed in.
What you can do with Authenticated Profiles
Authenticated Profiles move login state out of your scripts and into the session launch layer. Your authentication process stays clean. User identity is verified once. Workers can scale without credential sprawl.
Browserless.saveProfile after login and save cookies, localStorage, and IndexedDB – the full authentication state – to a named profile scoped to your API token.?profile=<name> at launch so every session starts from the same saved state. No repeated login flows, no coordination between workers.What changes in your automation workflow
Unlike most authenticated browser automation, Authenticated Profiles doesn’t force you to repeat the authentication process on every run or keep a fragile live session alive.
The old pattern
Authenticated Profiles
?profile=vendor-dashboard?profile=vendor-dashboard?profile=vendor-dashboardOne session never scales
A long-running session might feel like the easier option, but it creates a ceiling on concurrency and makes strong authentication harder to maintain.
Before
- Login state is tied to one live session or machine
- Parallel work needs multiple logins or fragile session sharing
- Routing and concurrency get harder as you scale
- Session changes can mutate the auth state you depend on
- Login logic ends up inside every script
Authenticated Profiles
- Login state saved as a portable, reusable profile
- One profile fans out to many isolated authenticated sessions
- Any eligible worker can hydrate the same profile
- Each session gets a clean copy – changes stay isolated
- Authentication becomes a launch-time option
Get started with Authenticated Profiles
Profile creation needs a CDP-capable client – Puppeteer, Playwright, or raw CDP – because Browserless.saveProfile is a CDP method. Once a profile exists, use it from BrowserQL, REST endpoints, and WebSocket connections.
Launch a creation session
Call POST /profile with a name for the profile. You’ll get back a WebSocket URL to connect to and a stop URL to terminate the session early. The creation session expires after 10 minutes if you don’t save before then.
curl -X POST "https://production-sfo.browserless.io/profile?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "vendor-dashboard" }'Connect and authenticate
Connect to the returned WebSocket URL and complete the login with a CDP-capable client. For CAPTCHAs, two-factor authentication, or login flows that are hard to script, hand off the creation session to a human via a live URL.
const browser = await puppeteer.connect({ browserWSEndpoint: session.connect });
const page = await browser.newPage();
await page.goto('https://app.example.com/login');
await page.type('#email', process.env.APP_EMAIL);
await page.type('#password', process.env.APP_PASSWORD);
await page.click('button[type="submit"]');
await page.waitForNavigation();Save the profile
Once the browser holds the authenticated state, send the Browserless.saveProfile CDP method. Browserless captures cookies, localStorage, and IndexedDB from the live browser – the full authentication state for that session – and stores it under the profile name. The name you pass to Browserless.saveProfile is what gets stored. The name in Step 1 is advisory and doesn’t have to match.
const cdp = await page.target().createCDPSession();
const result = await cdp.send('Browserless.saveProfile', { name: 'vendor-dashboard' });
await browser.close();
// { ok: true, profileId: '...', name: 'vendor-dashboard', cookieCount: 15, originCount: 1 }Use the profile in any session
Pass ?profile=<name> on any browser-launching request and Browserless loads the captured state before your code runs. The profile works across WebSocket connections, REST endpoints, BrowserQL, and Persisted Sessions – await browser.connect() is the only thing between your worker and a fully authenticated session.
const browser = await puppeteer.connect({
browserWSEndpoint: `wss://production-sfo.browserless.io?token=${TOKEN}&profile=vendor-dashboard`,
});
const page = await browser.newPage();
await page.goto('https://app.example.com/dashboard'); // already logged inHow to get the most out of Authenticated Profiles
Wherever a browser needs to access a secure web application behind a login, Authenticated Profiles remove the overhead of getting it there. Here are the most common patterns.
Use Authenticated Profiles with AI agents
Browserless’s MCP integration and Authenticated Profiles give AI agents access to the real, logged-in web, so agents can navigate authenticated web applications, retrieve data from account-gated pages, and run parallel workflows without handling user credentials on every call.
Start with one login, scale to many sessions
Authenticated Profiles are available on Browserless today. Sign up free – no credit card required.