Before you start
The local API is part of the paid plans (Solo and up). It runs inside the Multime app while the app is open, and it only listens on your own computer:
- Address:
http://127.0.0.1:50325by default, the same port AdsPower uses. If AdsPower is also running, one of them can't use the port; change Multime's port on the API page in the app. - API key: required by default. Copy it from the API page and send it as
Authorization: Bearer <key>, or add?api_key=<key>to the URL. You can turn the key requirement off on the same page, but keep it on if other people or programs use your computer. - Web pages can't call it. Requests that come from a browser page are refused, so a website you visit can't open or read your profiles. Call the API from a script or a terminal.
- Team members: a VA can use the API on their own computer only if the owner gave them the "Use the local API" permission. Their calls go to the owner's workspace and follow the same permissions as the app.
Every response is JSON in the same shape AdsPower uses: {"code": 0, "msg": "success", "data": {…}} on success and {"code": -1, "msg": "<what went wrong>"} on failure. Check code before you read data.
Start and stop a profile
| Endpoint | Method | What it does |
|---|---|---|
/api/v1/browser/start |
GET or POST | Opens a profile and returns how to connect to it |
/api/v1/browser/stop |
GET or POST | Closes a profile |
/api/v1/browser/active |
GET or POST | Says whether a profile is open, with its connection details |
/api/v1/browser/local-active |
GET or POST | Lists every profile open on this computer |
/status |
GET | Checks that Multime is running (no key needed) |
Pick the profile with user_id (the profile ID shown in Multime) or serial_number (the No. column). browser/start also takes:
open_tabs: a list of URLs to open instead of the profile's usual start pages, or1to open no tabs.headless:1to start the browser without a window.
A successful browser/start returns:
{
"code": 0,
"msg": "success",
"data": {
"ws": { "puppeteer": "ws://127.0.0.1:53110/devtools/browser/…", "selenium": "127.0.0.1:53110" },
"debug_port": "53110",
"webdriver": "/path/to/chromedriver"
}
}
webdriver is the path to a chromedriver that sits next to the profile's browser engine, when Multime finds one. When it's empty, use a chromedriver of the same Chrome version as the engine.
Connect your automation
Puppeteer (Node.js)
const res = await fetch('http://127.0.0.1:50325/api/v1/browser/start?serial_number=12', {
headers: { Authorization: `Bearer ${process.env.MULTIME_API_KEY}` }
}).then((r) => r.json())
if (res.code !== 0) throw new Error(res.msg)
const browser = await puppeteer.connect({ browserWSEndpoint: res.data.ws.puppeteer, defaultViewport: null })
const [page] = await browser.pages()
await page.goto('https://example.com')
Playwright (Node.js)
const browser = await chromium.connectOverCDP(`http://127.0.0.1:${res.data.debug_port}`)
const context = browser.contexts()[0]
const page = context.pages()[0] ?? (await context.newPage())
Selenium (Python)
import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
r = requests.get("http://127.0.0.1:50325/api/v1/browser/start",
params={"user_id": "PROFILE_ID"},
headers={"Authorization": "Bearer YOUR_KEY"}).json()
opts = webdriver.ChromeOptions()
opts.add_experimental_option("debuggerAddress", r["data"]["ws"]["selenium"])
driver = webdriver.Chrome(service=Service(r["data"]["webdriver"]), options=opts)
Close the profile with /api/v1/browser/stop when the script is done, so its cookies and tabs are saved and the profile is free for your team again. Don't close the browser from the script with browser.close() while you still need Multime to save the session.
Manage profiles and groups
| Endpoint | Method | What it does |
|---|---|---|
/api/v1/user/list |
GET or POST | Lists profiles. Filters: user_id, serial_number, group_id (0 = ungrouped). Paging: page, page_size (up to 100). Sort: user_sort |
/api/v1/user/create |
POST | Creates a profile and returns its id and serial_number |
/api/v1/user/update |
POST | Changes a profile; send only the fields you want to change |
/api/v1/user/delete |
POST | Moves up to 100 profiles (user_ids) to Trash |
/api/v1/user/regroup |
POST | Moves profiles (user_ids) to a group (group_id, 0 = no group) |
/api/v1/group/list |
GET or POST | Lists groups, with an optional group_name filter |
/api/v1/group/create |
POST | Creates a group (group_name, optional remark) |
/api/v1/group/update |
POST | Renames a group or changes its remark |
user/create and user/update accept the usual AdsPower fields: name, remark, group_id, open_urls, domain_name, username, password, fakey (a 2FA secret), cookie, user_proxy_config or proxyid (a saved proxy, or random), and fingerprint_config. Multime adds tags and custom_no. Profile creation follows your plan's profile limit, the same as in the app.
Multime implements the endpoints above, not every endpoint in AdsPower's API. Test an existing script on a test profile before you point it at real accounts.
Native API for everything else
POST /api/v2/rpc with {"method": "<name>", "args": [ … ]} calls Multime's own methods, the same ones the app uses: for example profiles.list, profiles.get, proxies.list or browser.running. Methods that change how Multime itself is set up or protected (team settings, engines, API and app settings, opening files or other apps) can't be called this way.