Migrate from Multilogin to Scalebrowser
Move from Multilogin X: attach your Puppeteer or Selenium code to a profile on your own machine, create the profiles fresh, and store their logins again.
Multilogin X automation starts a profile through its launcher and attaches Puppeteer or Selenium to the browser that comes up. A Scalebrowser profile hands out a DevTools address of the same kind, so the code that drives the page stays. What changes is where the profile is defined: here it is created on your own machine, fresh, and its logins are made again.
Where the profile is defined
In Multilogin X a profile is created through their cloud API inside a workspace folder, with a browser type (mimic or stealthfox) and an operating system (windows, macos, linux or android). It is started through the launcher on 127.0.0.1:45001 with a bearer token (read from their API and command-line tool, June 2026).
A Scalebrowser profile is a row in the daemon's database on your machine, with its browser directory beside it. Two of the choices above have no equivalent here:
- One browser. Every profile runs the Chromium-based engine we build and sign, so a
stealthfoxprofile has nothing to map to. - One operating system, the machine's own. Today that is Windows. A profile built for another system is refused at start with
4005, because an engine rendering on one system while claiming another contradicts itself. See Tier.
Start a profile and attach
Start the profile through the daemon and hand its cdp_ws to Puppeteer:
import puppeteer from 'puppeteer-core';
import { ScalebrowserClient } from '@scalebrowser/sdk';
const sb = new ScalebrowserClient({
baseUrl: 'http://127.0.0.1:8787',
token: process.env.SCALEBROWSER_TOKEN,
});
const profileId = 'prf_7d2a…';
const started = await sb.startProfile(profileId);
try {
const browser = await puppeteer.connect({
browserWSEndpoint: started.cdp_ws,
defaultViewport: null,
});
const [page] = await browser.pages();
await page.goto('https://example.com');
// … your code, unchanged …
await browser.disconnect();
} finally {
await sb.stopProfile(profileId);
}defaultViewport: null keeps Puppeteer from giving every page an 800 by 600 viewport that no longer matches the window. Disconnecting leaves the browser running, and it keeps holding one of your plan's browsers until you stop the profile.
Selenium needs a chromedriver of your own. None ships with Scalebrowser. Point it at 127.0.0.1:<debug_port> as its debugger address, with debug_port taken from the start response. The port is new at every start. See Direct CDP.
Migrate from Playwright or Puppeteer covers the rest of an attached browser, including Playwright and what to do for sites that grade input.
What carries over, and what does not
Your code after the connect carries over. The profiles and everything in them do not, because nothing is imported from Multilogin:
- Profiles are created fresh. Make them one at a time in the app or with
POST /v1/profiles, or many at once from a preset withPOST /v1/bulk/profiles(Groups, presets & bulk). A group is a flat label, so a folder becomes a group. - Each new profile draws its own identity. There are no fingerprint settings to copy across: the identity comes from the profile's seed, and its GPU, screen, fonts and voices are your machine's own. See Profiles & personas.
- Cookies and logins start empty. Session import opens only a bundle that a Scalebrowser profile exported, and the credential bundle works the same way. Logins below is how a new profile gets signed in.
- Proxies and extensions are added again. See Proxies below and Extensions.
Count your profiles before you recreate a large fleet. Your plan sets how many profiles you keep and, separately, how many browsers run at the same time. A batch that would pass the profile number creates nothing and answers 4014. See Plans & limits.
Logins
Two ways, and you can mix them per site:
- Sign in by hand once. Start the profile with a window, sign in, and stop it. Cookies and storage stay in the profile's browser directory between starts.
- Store the login in the profile's vault. With Add login on the profile's page in the app, with
PUT /v1/profiles/:id/credentials/:platform, or from an agent withcredential_store. An agent then signs in withcredential_filland never sees the password. Store the 2FA setup key beside it, and the daemon computes the six-digit codes itself. See Credentials & logins.
Proxies
Store each proxy once, as http, socks5 or a provider gateway, and assign it to the profile: in the app, with PATCH /v1/profiles/:id and a proxy_id, or for many profiles at once with POST /v1/bulk/assign-proxy. Under the default geo_mode, a profile takes its timezone and language from the country its proxy exits in.
One exit address belongs to one profile. A second profile that draws an address another profile owns is refused at start with 4013. A provider gateway gives every profile its own address from one account. See Proxies & exits.
Next
- Quickstart: a running daemon and a first profile in five steps.
- Direct CDP: the endpoint, and the
debug_portfield. - Credentials & logins: storing a login so an agent signs in without seeing it.
- Migrate overview: the two steps, and what maps to what.