Skip to content

Usage

Minimal usage example: start a quick browser profile via API

This example authenticates, fetches built-in proxy credentials, and launches a quick (ephemeral) browser profile. It is taken directly from the official quick_profile_proxy example.

The Multilogin X desktop app must be running before executing this script.

python
import requests
import json
import hashlib

USERNAME = "your@email.com"
PASSWORD = "YourPassword"

# Step 1: Sign in and get a bearer token
# The password is sent as an MD5 hash
signin_url = "https://api.multilogin.com/user/signin"

payload = json.dumps({
    "email": USERNAME,
    "password": hashlib.md5(PASSWORD.encode("UTF-8")).hexdigest()
})
headers = {
    "Content-Type": "application/json",
    "Accept": "application/json"
}

resp = requests.post(signin_url, headers=headers, data=payload, verify=False)
token = resp.json()["data"]["token"]

auth_headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": f"Bearer {token}"
}

# Step 2: Get proxy connection details from Multilogin built-in proxy
proxy_url = "https://profile-proxy.multilogin.com/v1/proxy/connection_url"

proxy_payload = {
    "country": "us",
    "region": "",
    "city": "",
    "protocol": "socks5",
    "sessionType": "sticky",
    "IPTTL": 0,
    "quality": "medium"
}

proxy_resp = requests.post(
    proxy_url,
    headers=auth_headers,
    data=json.dumps(proxy_payload),
    verify=False
)

if proxy_resp.status_code != 201:
    raise Exception(f"Proxy fetch failed: {proxy_resp.status_code} {proxy_resp.text}")

proxy_data = proxy_resp.json()["data"].split(":")
proxy_info = {
    "host": proxy_data[0],
    "type": "socks5",
    "port": int(proxy_data[1]),
    "username": proxy_data[2],
    "password": proxy_data[-1]
}

# Step 3: Start a quick (ephemeral) browser profile via the local launcher API
# The desktop app exposes this endpoint on loopback
launch_url = "https://launcher.mlx.yt:45001/api/v2/profile/quick"

profile_payload = json.dumps({
    "browser_type": "mimic",
    "os_type": "macos",
    "is_headless": False,
    "proxy": proxy_info,
    "parameters": {
        "flags": {
            "audio_masking": "mask",
            "fonts_masking": "mask",
            "geolocation_masking": "mask",
            "geolocation_popup": "allow",
            "graphics_masking": "mask",
            "graphics_noise": "mask",
            "localization_masking": "mask",
            "media_devices_masking": "mask",
            "navigator_masking": "mask",
            "ports_masking": "mask",
            "screen_masking": "mask",
            "timezone_masking": "mask",
            "webrtc_masking": "mask",
            "proxy_masking": "custom"
        },
        "fingerprint": {}
    }
})

launch_resp = requests.post(launch_url, headers=auth_headers, data=profile_payload, verify=False)
print(launch_resp.status_code, launch_resp.json())

What this does

  1. Authenticates with https://api.multilogin.com and gets a JWT bearer token.
  2. Fetches a SOCKS5 sticky-session US residential proxy from Multilogin's built-in proxy pool.
  3. Sends a POST to the local launcher at https://launcher.mlx.yt:45001/api/v2/profile/quick to spin up a Mimic (Chromium) browser with all fingerprint masking flags enabled and the proxy wired in.
  4. The browser window opens on the desktop. You can then connect to it via CDP (Chromium DevTools Protocol) for Playwright or Puppeteer automation if needed.

Quick profile vs. stored profile

  • Quick profile (/api/v2/profile/quick): ephemeral, disposable, not saved to the dashboard. Best for one-off automation runs.
  • Stored profile (/api/v2/profile/start): persistent profile with saved cookies, fingerprint, and proxy config. Best for long-lived accounts.

Browser type options

ValueBrowser
mimicChromium-based (Mimic)
stealthfoxFirefox-based (Stealthfox)

OS type options

windows, macos, linux, android