---
title: "Migrate from Multilogin to Scalebrowser"
description: "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."
canonical: "https://scalebrowser.net/docs/migrate/multilogin"
last_modified: "2026-11-14T17:26:55.000Z"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://scalebrowser.net/llms.txt
> Use this file to discover all available pages before exploring further.

# 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 `stealthfox` profile 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](/docs/concepts#tier).

## Start a profile and attach

Start the profile through the daemon and hand its `cdp_ws` to Puppeteer:

```ts
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](/docs/cdp#get-a-connection).

[Migrate from Playwright or Puppeteer](/docs/migrate/playwright) 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 with `POST /v1/bulk/profiles` ([Groups, presets & bulk](/docs/fleet)). 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](/docs/profiles).
- **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](#logins) below is how a new profile gets signed in.
- **Proxies and extensions are added again.** See [Proxies](#proxies) below and [Extensions](/docs/extensions).

> **Note**
>
> **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](/docs/account/plans#the-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 with `credential_store`. An agent then signs in with `credential_fill` and never sees the password. Store the 2FA setup key beside it, and the daemon computes the six-digit codes itself. See [Credentials & logins](/docs/credentials).

## 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](/docs/proxies#one-address-one-profile).

## Next

- [Quickstart](/docs/quickstart): a running daemon and a first profile in five steps.
- [Direct CDP](/docs/cdp): the endpoint, and the `debug_port` field.
- [Credentials & logins](/docs/credentials): storing a login so an agent signs in without seeing it.
- [Migrate overview](/docs/migrate): the two steps, and what maps to what.
