Why Automate Antidetect Browsers?
Automation allows you to scale from managing a few accounts to hundreds or thousands:
- Scale operations β create, launch, and manage profiles programmatically
- Save time β automate repetitive tasks like login, posting, data collection
- Reduce errors β eliminate human mistakes in multi-account workflows
- Run 24/7 β schedule tasks to run automatically
All major antidetect browsers expose a Local API that lets you control profiles programmatically and connect automation frameworks (Playwright, Selenium, Puppeteer) to launched browser instances.
MoreLogin
API Base URL: http://127.0.0.1:40000
API Docs: guide.morelogin.com
MoreLogin's Local API lets you create, start, stop profiles and connects seamlessly with Puppeteer, Selenium, and Playwright.
Node.js + Puppeteer
const axios = require('axios');
const puppeteer = require('puppeteer');
const BASE = 'http://127.0.0.1:40000';
async function main() {
// 1. Create a browser profile
const createResp = await axios.post(BASE + '/api/env/create/quick', {
name: 'automation-profile'
});
const envId = createResp.data.data.envId;
console.log('Created profile:', envId);
// 2. Start the profile
const startResp = await axios.post(BASE + '/api/env/start', {
envId: envId
});
const { debugPort } = startResp.data.data;
console.log('Debug port:', debugPort);
// 3. Connect Puppeteer
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:' + debugPort,
defaultViewport: null
});
// 4. Automate
const page = await browser.newPage();
await page.goto('https://www.google.com');
console.log('Page title:', await page.title());
// 5. Cleanup
await browser.disconnect();
await axios.post(BASE + '/api/env/close', { envId });
console.log('Profile closed.');
}
main().catch(console.error);
Python + Selenium
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
BASE = "http://127.0.0.1:40000"
# 1. Create a browser profile
resp = requests.post(f"{BASE}/api/env/create/quick", json={
"name": "automation-profile"
})
env_id = resp.json()["data"]["envId"]
print(f"Created profile: {env_id}")
# 2. Start the profile
resp = requests.post(f"{BASE}/api/env/start", json={
"envId": env_id
})
data = resp.json()["data"]
debug_port = data["debugPort"]
webdriver_path = data["webdriver"]
print(f"Debug port: {debug_port}, WebDriver: {webdriver_path}")
# 3. Connect Selenium
options = Options()
options.debugger_address = f"127.0.0.1:{debug_port}"
service = Service(executable_path=webdriver_path)
driver = webdriver.Chrome(service=service, options=options)
# 4. Automate
driver.get("https://www.google.com")
print(f"Page title: {driver.title}")
# 5. Cleanup
driver.quit()
requests.post(f"{BASE}/api/env/close", json={"envId": env_id})
print("Profile closed.")
Key API Endpoints
| Endpoint | Method | Description |
|---|---|---|
| /api/env/create/quick | POST | Quick create a profile |
| /api/env/start | POST | Start a profile (returns debugPort) |
| /api/env/close | POST | Close a profile |
| /api/env/page | POST | List all profiles |
| /api/env/updateProxy/batch | POST | Batch update proxy settings |
AdsPower
API Base URL: http://local.adspower.com:50325
API Docs: localapi-doc-en.adspower.com
AdsPower uses a Local API that runs alongside the desktop application.
Node.js + Puppeteer
const axios = require('axios');
const puppeteer = require('puppeteer');
const BASE = 'http://local.adspower.com:50325';
async function main() {
// 1. Create a profile
const createResp = await axios.post(BASE + '/api/v1/user/create', {
group_id: '0',
user_proxy_config: {
proxy_soft: 'no_proxy'
}
});
const profileId = createResp.data.data.id;
console.log('Created profile:', profileId);
// 2. Start the profile
const startResp = await axios.get(
BASE + '/api/v1/browser/start?user_id=' + profileId
);
const { ws } = startResp.data.data;
console.log('WebSocket endpoint:', ws.puppeteer);
// 3. Connect Puppeteer
const browser = await puppeteer.connect({
browserWSEndpoint: ws.puppeteer,
defaultViewport: null
});
// 4. Automate
const page = (await browser.pages())[0];
await page.goto('https://www.google.com');
console.log('Page title:', await page.title());
// 5. Cleanup
await browser.disconnect();
await axios.get(BASE + '/api/v1/browser/stop?user_id=' + profileId);
console.log('Profile closed.');
}
main().catch(console.error);
Python + Selenium
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
BASE = "http://local.adspower.com:50325"
# 1. Start the profile
resp = requests.get(f"{BASE}/api/v1/browser/start?user_id=YOUR_PROFILE_ID")
data = resp.json()["data"]
selenium_address = data["ws"]["selenium"]
webdriver_path = data["webdriver"]
# 2. Connect Selenium
options = Options()
options.debugger_address = selenium_address
service = Service(executable_path=webdriver_path)
driver = webdriver.Chrome(service=service, options=options)
# 3. Automate
driver.get("https://www.google.com")
print(f"Page title: {driver.title}")
# 4. Cleanup
driver.quit()
requests.get(f"{BASE}/api/v1/browser/stop?user_id=YOUR_PROFILE_ID")
Key API Endpoints
| Endpoint | Method | Description |
|---|---|---|
| /api/v1/user/create | POST | Create a new profile |
| /api/v1/browser/start | GET | Start a profile (returns WS endpoint) |
| /api/v1/browser/stop | GET | Stop a profile |
| /api/v1/browser/active | GET | Check browser status |
| /api/v1/user/list | GET | List all profiles |
| /api/v1/user/delete | POST | Delete a profile |
GoLogin
API Base URL: https://api.gologin.com
Automation Port: Profile-specific debugging port
GoLogin provides both a cloud REST API and local debugging ports.
Node.js + Playwright
const { chromium } = require('playwright');
const axios = require('axios');
const API_TOKEN = 'YOUR_API_TOKEN';
const BASE = 'https://api.gologin.com';
async function main() {
// 1. Start profile via API
const startResp = await axios.post(
BASE + '/browser/start-profile',
{ profileId: 'YOUR_PROFILE_ID' },
{ headers: { Authorization: 'Bearer ' + API_TOKEN } }
);
const { wsUrl } = startResp.data;
console.log('WebSocket URL:', wsUrl);
// 2. Connect Playwright
const browser = await chromium.connectOverCDP(wsUrl);
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();
// 3. Automate
await page.goto('https://www.google.com');
console.log('Page title:', await page.title());
await page.screenshot({ path: 'screenshot.png' });
// 4. Cleanup
await browser.close();
}
main().catch(console.error);
Key API Endpoints
| Endpoint | Method | Description |
|---|---|---|
| /browser/profiles | GET | List all profiles |
| /browser/start-profile | POST | Start a profile |
| /browser/stop-profile | POST | Stop a profile |
| /browser/fingerprint | GET | Get fingerprint settings |
| /browser/proxy | PUT | Update proxy settings |
Multilogin
API Base URL: https://api.multilogin.com / http://127.0.0.1:35000
Requires: Active subscription + API token
Multilogin provides both a cloud API and local automation interface.
Node.js + Playwright
const { chromium } = require('playwright');
const axios = require('axios');
const MLX_BASE = 'https://api.multilogin.com';
const TOKEN = 'YOUR_API_TOKEN';
async function main() {
// 1. Start a profile
const resp = await axios.post(
MLX_BASE + '/profile/start',
{
profileId: 'YOUR_PROFILE_ID',
browserType: 'mimic' // or 'stealthfox'
},
{ headers: { Authorization: 'Bearer ' + TOKEN } }
);
const { port } = resp.data;
// 2. Connect Playwright via CDP
const browser = await chromium.connectOverCDP(
'http://127.0.0.1:' + port
);
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();
// 3. Automate
await page.goto('https://www.google.com');
console.log('Title:', await page.title());
// 4. Cleanup
await browser.close();
}
main().catch(console.error);
Key API Endpoints
| Endpoint | Method | Description |
|---|---|---|
| /profile/start | POST | Start a profile |
| /profile/stop | POST | Stop a profile |
| /profile/create | POST | Create a new profile |
| /profile/remove | DELETE | Delete a profile |
Dolphin Anty
API Base URL: http://localhost:3001
API Docs: Dolphin Anty Documentation
Dolphin Anty exposes a local API for profile automation.
Node.js + Puppeteer
const axios = require('axios');
const puppeteer = require('puppeteer');
const BASE = 'http://localhost:3001';
async function main() {
// 1. Start the profile
const startResp = await axios.get(
BASE + '/v1.0/browser_profiles/' + 'YOUR_PROFILE_ID' + '/start?automation=1'
);
const { wsEndpoint, port } = startResp.data.automation;
console.log('WS Endpoint:', wsEndpoint);
// 2. Connect Puppeteer
const browser = await puppeteer.connect({
browserWSEndpoint: wsEndpoint,
defaultViewport: null
});
// 3. Automate
const page = (await browser.pages())[0];
await page.goto('https://www.google.com');
console.log('Title:', await page.title());
// 4. Cleanup
await browser.disconnect();
await axios.get(
BASE + '/v1.0/browser_profiles/' + 'YOUR_PROFILE_ID' + '/stop'
);
}
main().catch(console.error);
Key API Endpoints
| Endpoint | Method | Description |
|---|---|---|
| /v1.0/browser_profiles | GET | List profiles |
| /v1.0/browser_profiles/:id/start | GET | Start a profile |
| /v1.0/browser_profiles/:id/stop | GET | Stop a profile |
| /v1.0/browser_profiles | POST | Create a profile |
| /v1.0/browser_profiles/:id | PATCH | Update a profile |
Octo Browser
API Base URL: http://localhost:58888
API Docs: Octo Browser Documentation
Octo Browser provides a local REST API for automation integration.
Node.js + Puppeteer
const axios = require('axios');
const puppeteer = require('puppeteer');
const BASE = 'http://localhost:58888';
async function main() {
// 1. Start the profile
const startResp = await axios.post(BASE + '/api/profiles/start', {
uuid: 'YOUR_PROFILE_UUID',
headless: false,
debug_port: true
});
const { ws_endpoint } = startResp.data;
// 2. Connect Puppeteer
const browser = await puppeteer.connect({
browserWSEndpoint: ws_endpoint,
defaultViewport: null
});
// 3. Automate
const page = (await browser.pages())[0];
await page.goto('https://www.google.com');
console.log('Title:', await page.title());
// 4. Cleanup
await browser.disconnect();
await axios.post(BASE + '/api/profiles/stop', {
uuid: 'YOUR_PROFILE_UUID'
});
}
main().catch(console.error);
Key API Endpoints
| Endpoint | Method | Description |
|---|---|---|
| /api/profiles/start | POST | Start a profile |
| /api/profiles/stop | POST | Stop a profile |
| /api/profiles | GET | List profiles |
| /api/profiles | POST | Create a profile |
Automation Comparison
| Feature | MoreLogin | AdsPower | GoLogin | Multilogin | Dolphin Anty | Octo Browser |
|---|---|---|---|---|---|---|
| API Type | Local REST | Local REST | Cloud REST | Cloud + Local | Local REST | Local REST |
| Default Port | 40000 | 50325 | Cloud | 35000 | 3001 | 58888 |
| Puppeteer | β | β | β | β | β | β |
| Selenium | β | β | β | β | β | β |
| Playwright | β | β | β | β | β | β |
| CLI Tool | β | β | β | β | β | β |
| MCP Support | β | β | β | β | β | β |
| RPA Builder | β | β | β | β | β | β |
Best Practices
- Add random delays between actions (500-3000ms) to mimic human behavior
- Use page.waitForSelector() instead of fixed timeouts
- Handle errors gracefully β profiles can disconnect unexpectedly
- Always close profiles after automation to free resources
- Batch operations β when managing many profiles, use batch APIs where available
- Save session data β export cookies after successful logins for reuse