Как включить

  1. Откройте Multiaccount и войдите в аккаунт с тарифом от 6 месяцев.
  2. Вкладка «Настройки» → поле «Порт API». По умолчанию 40080, как в примерах Сферы. Если этот порт занят (например, запущена сама Сфера), укажите другой, от 1024 до 65535.
  3. Нажмите «Включить». Рядом появится адрес API, например http://127.0.0.1:40080. Порт запоминается, и при следующих запусках программы API включается сам.

Запросы отправляются из любого языка: Python, Node.js, Postman, curl. Тело запроса — JSON. Ключи и токены не нужны.

API принимает запросы только с этого компьютера. Запросы со страниц сайтов (JavaScript в любом браузере, в том числе внутри профилей) отклоняются, поэтому сайт не может управлять вашими профилями.

Быстрый старт

Схема всегда одна: создать или выбрать профиль, запустить его командой /sessions/start, получить debug_port и подключиться к браузеру по этому порту.

Python + Playwright
import requests
from playwright.sync_api import sync_playwright

API = "http://127.0.0.1:40080"

profile = requests.post(f"{API}/sessions/create_quick").json()
start = requests.post(f"{API}/sessions/start", json={"uuid": profile["uuid"]}).json()

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(f"http://127.0.0.1:{start['debug_port']}")
    page = browser.contexts[0].new_page()
    page.goto("https://example.com")
    print(page.title())

requests.post(f"{API}/sessions/stop", json={"uuid": profile["uuid"]})
Node.js + Puppeteer
const puppeteer = require('puppeteer-core');
const API = 'http://127.0.0.1:40080';

// Часть команд отвечает пустым телом, поэтому JSON разбираем, только если он есть.
const post = (path, body = {}) =>
  fetch(API + path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) })
    .then(r => r.text()).then(t => (t ? JSON.parse(t) : null));

(async () => {
  const profile = await post('/sessions/create_quick');
  const { debug_port } = await post('/sessions/start', { uuid: profile.uuid });
  const browser = await puppeteer.connect({ browserURL: `http://127.0.0.1:${debug_port}`, defaultViewport: null });
  const page = await browser.newPage();
  await page.goto('https://example.com');
  console.log(await page.title());
  browser.disconnect();
  await post('/sessions/stop', { uuid: profile.uuid });
})();
Python + Selenium
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

options = webdriver.ChromeOptions()
options.debugger_address = f"127.0.0.1:{debug_port}"  # порт из /sessions/start
driver = webdriver.Chrome(service=Service("chromedriver.exe"), options=options)
driver.get("https://example.com")

Для Selenium нужен chromedriver той же основной версии, что и браузер Multiaccount. Версию браузера показывает адрес http://127.0.0.1:<debug_port>/json/version; chromedriver для неё — на сайте Chrome for Testing. driver.quit() отключает Selenium, а браузер остаётся открытым: остановите профиль командой /sessions/stop.

Профили

uuid профиля — это его номер в Multiaccount, строкой: "68296437". Где в Сфере есть выбор между uuid и uuids, работают оба.

Статусы: stopped остановлен, running запущен кнопкой, automationRunning запущен через API, warmup идёт прогрев.

GET

/sessions

Список профилей. Тело необязательное.

statusпоказать только профили с этим статусом
proxy_infotrue — добавить прокси каждого профиля
Ответ
[{"name":"Avito 5","proxy":{"ip":"p12345.clearproxy.ru","port":"8181","protocol":"http"},"status":"stopped","uuid":"56164867"},
 {"name":"1","proxy":{"protocol":"direct"},"status":"automationRunning","uuid":"68296437"}]

В JavaScript fetch не отправляет тело у GET. Чтобы отфильтровать по статусу, отберите профили из полного списка у себя или используйте библиотеку, которая это умеет (axios, http). Параметры в адресе (/sessions?status=stopped) программа не читает: такой запрос вернёт весь список.

GET

/sessions/{uuid}

Подробности профиля: устройство, прокси, язык, часовой пояс, WebRTC.

Ответ
{"device":{"browser_version":"156.0.8078.80","cpu":"8","mode":"common",
  "noises":{"audio":"fake","canvas":"fake","clientRects":"direct","doNotTrack":"direct",
            "mediaDevices":"fake","webgl":"fake","webglNoise":"fake","webgpu":"direct"},
  "os":"windows","os_version":"10","ram":"8","screen":"2560x1440","type":"desktop",
  "webgl":"NVIDIA, NVIDIA GeForce GTX 1060"},
 "name":"Shop 12",
 "proxy":{"connection":{"protocol":"http"},"geolocation":"RU (Russia)","language":"ru-RU",
          "publicIp":"31.173.83.49","timezone":"Europe/Moscow: +0300"},
 "status":"stopped","webrtc":{"state":true,"value":"adaptive"}}

publicIp и geolocation — по последнему запуску или проверке прокси в этом сеансе программы.

POST

/sessions/create_quick

Новые профили, как кнопкой «Создать профиль»: свой отпечаток у каждого и прокси из ваших прокси Multiaccount (как они раздаются — в разделе «Прокси»).

countсколько создать, 1–1000
Без count — один объект
{"name":"Profile 8","uuid":"18745525"}
С count — список
[{"name":"Profile 9","uuid":"101065771"},
 {"name":"Profile 10","uuid":"63048013"}]
DELETE

/sessions

или POST /sessions/delete

Удалить профили, как кнопкой «Удалить». Запущенный профиль сначала остановите, иначе ответ 409.

uuid или uuidsодин профиль или список
Ответ
{"uuids":["101065771","63048013"]}

Запуск и остановка

POST

/sessions/start

Запустить профиль и получить порт для подключения. Ответ приходит, когда браузер готов. Перед запуском программа, как и кнопка ЗАПУСК, меняет IP мобильного прокси со ссылкой смены и проверяет, что прокси отвечает.

uuidпрофиль
debug_portжелаемый порт, 1024–65535. Если занят, берётся свободный: используйте порт из ответа
disable_imagestrue — не загружать картинки
chromium_argsдополнительные ключи Chromium одной строкой, например "--disable-notifications"
allow_same_proxytrue — запустить, даже если этот прокси уже работает в другом профиле
Запрос
{"uuid":"18745525","debug_port":9333}
Ответ
{"debug_port":9333,"uuid":"18745525"}

Уже запущенный профиль не перезапускается: в ответе порт его браузера.

POST

/sessions/stop

Закрыть браузер. Ответ приходит, когда браузер закрылся, поэтому сразу после него профиль можно снова запускать. Если за 15 секунд браузер не закрылся, он завершается принудительно.

Если браузер закроет сам скрипт (browser.close() в Puppeteer) или человек крестиком окна, программа это увидит: статус станет stopped, куки и вкладки сохранятся, как при обычном закрытии. browser.close() в Playwright и driver.quit() в Selenium браузер не закрывают, а только отключают скрипт: профиль останавливают этой командой.

uuid или uuidsодин профиль или список
POST

/sessions/force_stop

Завершить процесс браузера сразу, не дожидаясь закрытия вкладок. Для зависшего браузера.

POST

/sessions/run_one_time

Создать и сразу запустить одноразовые профили. После остановки браузера профиль удаляется вместе со всеми данными, восстановить их нельзя.

countсколько, 1–100
disable_images, chromium_args, allow_same_proxyкак у /sessions/start
Ответ: uuid → порт
{"89261155":9225,"40490559":9226}
POST

/sessions/start_warmup

Прогрев: в отдельной вкладке по очереди открываются сайты, на каждом — ещё несколько переходов по его ссылкам. Если профиль не был запущен, браузер закроется после прогрева. Пока идёт прогрев, статус профиля warmup.

uuidпрофиль
urlsсвой список адресов. Если не задан, берётся url_count популярных сайтов (поиск, новости, справочные), без маркетплейсов и соцсетей
url_countсколько сайтов, по умолчанию 7
time_per_urlсекунд на каждой странице, по умолчанию 3
view_depthсколько страниц смотреть на каждом сайте, по умолчанию 3

Прокси

Новые профили получают свои прокси

Профили из create_quick и run_one_time получают ваши купленные прокси Multiaccount поровну. Первым идёт прокси, на котором сейчас не работает ни один браузер. Среди таких выбирается тот, у которого меньше всего профилей. Если у вас 10 прокси и профилей на них ещё нет, 10 новых профилей получат по одному.

Ваши собственные прокси из списка в программе сами по себе не раздаются: вы можете держать их под определённые аккаунты. Такой прокси назначается явно, по номеру. Если купленных прокси нет, новый профиль создаётся без прокси.

Один прокси — один работающий браузер

Мобильный прокси меняет IP при каждом запуске профиля. Если на одном прокси работают два браузера, запуск второго меняет IP и первому, а сайты видят оба профиля с одного адреса. Поэтому запуск через API на прокси, который уже работает в другом профиле, получает отказ 409 с именем этого профиля:

Ответ 409
{"error":"Прокси p12345.clearproxy.ru:8181 уже работает в профиле «Profile 6» (33854437): сайты свяжут профили по IP, а смена IP при запуске сменит её и там. Дайте профилю свой прокси (/sessions/connection) или передайте \"allow_same_proxy\": true"}

Если общий прокси нужен намеренно, передайте "allow_same_proxy": true, как при согласии на вопрос кнопки ЗАПУСК.

GET

/proxies

только в Multiaccount

Прокси из списка программы. Логины и пароли не возвращаются.

Ответ
[{"change_ip":true,"id":"337908","ip":"p12345.clearproxy.ru","name":"p12345.clearproxy.ru",
  "port":"8181","profiles":3,"protocol":"http","running":1}]
change_ipможно менять IP
profilesсколько профилей с этим прокси
runningсколько из них сейчас запущено
POST

/sessions/connection

Задать профилю прокси. У запущенного профиля новый прокси действует со следующего запуска.

Прокси из списка программы (только в Multiaccount)
{"uuid":"18745525","proxy_id":"337908"}
Свой прокси
{"uuid":"18745525","type":"socks5","ip":"45.12.0.7","port":1080,"login":"user","password":"pass"}
Свой мобильный прокси со ссылкой смены IP (только в Multiaccount)
{"uuid":"18745525","type":"http","ip":"45.12.0.7","port":8000,"login":"user","password":"pass",
 "change_ip_url":"https://provider.example/api/changeip?key=..."}
Без прокси
{"uuid":"18745525","type":"direct"}
typehttp, socks5, direct или notSet (оба — без прокси)
login, passwordнеобязательные: прокси без пароля тоже работают
change_ip_urlссылка продавца для смены IP. С ней IP меняется при каждом запуске профиля и по /sessions/change_ip
Ответ
{"uuid":"18745525"}
POST

/sessions/change_ip

только в Multiaccount

Сменить IP прокси профиля сейчас, как кнопкой в строке профиля. Новый IP появляется через несколько секунд.

Ответ
{"message":"IP скоро изменится","uuid":"18745525"}

Если свободных IP у продавца нет, ответ 502 с его текстом, например «Не нашли свободный IP, попробуйте через несколько минут».

POST

/sessions/check_proxy

Проверить, что прокси профиля работает, и узнать выходной IP. Результат виден и в строке профиля в программе.

uuid или uuidsдля списка ответ — массив
Работает
{"ip":"31.173.83.49","result":"Success",
 "timezone":"Europe/Moscow","uuid":"18745525"}
Не отвечает
{"error":"Прокси не отвечает",
 "result":"Failed","uuid":"18745525"}

Настройки профиля

Отпечаток, язык, часовой пояс и user-agent меняются только у остановленного профиля, как в окне программы. Если профиль запущен или открыт в окне настроек, ответ 409.

POST

/sessions/set_name

uuid, nameновое имя. Ответ — пустое тело
POST

/sessions/set_description

uuid, descriptionполе «Примечание». Ответ — пустое тело
POST

/sessions/geo

timezoneчасовой пояс, например Europe/Berlin; auto — по IP прокси
languageязыки браузера, например "de-DE,de;q=0.9,en;q=0.8"
latitude, longitudeсохраняются в поле «Геолокация» профиля
Запрос
{"uuid":"18745525","timezone":"Europe/Berlin","language":"de-DE,de;q=0.9,en;q=0.8"}
POST

/sessions/set_fingerprints

gpuвидеокарта из списка программы, например "NVIDIA, GeForce GTX 1060"
ram, cpu_coresпамять в ГБ и число ядер
canvas, webgl, media_devicesfake — подменять, direct — настоящие значения
browserтолько chrome

audio, webgpu и client_rects из скриптов Сферы принимаются без ошибки, но ничего не меняют. Ответ — пустое тело.

POST

/sessions/set_useragent

Подходит только user-agent Chrome для Windows 10/11 (Windows NT 10.0; Win64; x64): остальной отпечаток профиля — такой же Chrome, и другая система в одной строке выдала бы подмену. Версию Chrome программа ставит по встроенному браузеру.

POST

/sessions/set_misc

restore_open_tabsоткрывать вкладки прошлого сеанса при запуске (и кнопкой тоже)
disable_imagesне загружать картинки во всех запусках профиля

Остальные флаги Сферы принимаются без ошибки и пропускаются. Ответ — пустое тело.

Куки

POST

/sessions/import_cookies

Добавить куки в профиль. Запущенному профилю они ставятся сразу, остановленному — при следующем запуске.

jsonсписок кук в формате расширений браузера (как у Сферы): domain, name, value, path, secure, httpOnly, sameSite, expirationDate…
file_pathполный путь к файлу на этом компьютере, например "C:\\cookies.txt": такой же JSON или cookies.txt (формат Netscape). Файл программа читает сама, загружать его в запросе не нужно
POST

/sessions/export_cookies

Сохранить куки профилей в папку, по файлу на профиль. folder_path — полный путь к существующей папке. Работает и у запущенного профиля.

Запрос
{"uuids":["18745525"],"folder_path":"C:\\Cookies"}
Ответ
[{"cookie_path":"C:\\Cookies\\Shop 12_02-11-2026.txt",
  "uuid":"18745525"}]

Журнал действий

GET

/sessions/actionlog

Последние 100 действий с профилем, от новых к старым: запуски, остановки, правки, смена прокси, куки, прогрев. Записывает и кнопки программы, и API.

uuidпрофиль
limit, offsetсколько записей и с какой, по умолчанию 50 и 0
action_typesномера действий через запятую: 0 Start, 1 Stop, 2 Edit, 3 ChangeProxy, 5 ImportCookies, 6 ExportCookies, 8 Warmup, 12 ChangeDescription, 13 ForceStop
from_time, to_timeвремя в секундах Unix
user_emailдействия только этого аккаунта
Ответ
{"actions":[{"action":13,"action_name":"ForceStop","data":{},"id":"4980ed66-69bf-40e5-9328-3669b4808e3b",
  "timestamp":1793626511,"user_email":"you@example.com"}],
 "offset":0,"returned_count":1,"session_name":"Shop 12","session_uuid":"18745525","total_count":3}

Аккаунт и программа

POST

/auth/signin

Войти в аккаунт, как кнопкой «Войти». Работает и без входа. С этим аккаунтом на другом компьютере произойдёт выход, как при обычном входе.

Запрос
{"email":"you@example.com","password":"..."}
Ответ
{"message":"Signed in successfully"}
POST

/auth/signout

Выйти из аккаунта. Все браузеры закрываются. Ответ — пустое тело.

POST

/auth/close

Закрыть программу вместе с браузерами. Программа выходит через полсекунды после ответа.

Совместимость со Сферой

Рабочих столов, команд и пресетов в Multiaccount нет: все профили в одном списке. Чтобы скрипты Сферы не ломались, эти команды отвечают одним вариантом по умолчанию.

КомандаОтвет Multiaccount
GET /providersодин пресет «Default provider»
POST /providersвыбрать его можно, другой — 404
GET /desktops, POST /desktopsодин рабочий стол «Desktop»
GET /teamsпустой список
POST /desktops/unlock_stopped_sessionsсписок остановленных профилей с "isLocked":"false"
POST /app/optimize_storage200, ничего не делает
POST /app/api_threads_count/{n}200, ничего не делает: число одновременных запросов программа не ограничивает
POST /sessions/share501: передачи профиля по почте нет, используйте экспорт профиля
PUT /desktops, DELETE /desktops, DELETE /providers501

Ошибки

При ошибке API отвечает JSON с текстом, что не так и как исправить: {"error": "..."}.

КодКогда
400нет обязательного поля или неверное значение
401не выполнен вход в аккаунт
402при входе: тариф не оплачен
403тариф меньше 6 месяцев или запрос пришёл со страницы сайта
404нет такого профиля, прокси или команды
409профиль запущен или открыт в окне настроек; прокси уже работает в другом профиле
500браузер не запустился, в тексте причина (например, прокси не отвечает)
501такой возможности в Multiaccount нет
502ошибка от сервера смены IP или сервера входа
503нет связи с сервером Multiaccount
504браузер не поднялся за 2 минуты

Ограничения

  • Запуск без окна ("headless": true) и подмена Referer (referrer_values) пока не поддерживаются: ответ 501. Запускайте с "headless": false или без этого поля.
  • В chromium_args нельзя передать ключи, которыми управляет программа: папку профиля, порт отладки, прокси, user-agent, язык, --headless.
  • Координаты из /sessions/geo сохраняются в профиле, но браузеру пока не передаются, как и поле «Геолокация» в окне программы: сайты определяют местоположение по IP прокси, а navigator.geolocation не подменяется. Не разрешайте сайтам доступ к геолокации.
  • Selenium: chromedriver, выполняя скрипты, оставляет на странице служебные переменные cdc_…, по которым его узнают системы защиты от ботов. Это свойство самого chromedriver в любом браузере. У Puppeteer и Playwright такого следа нет.