Справочник SDK

Два SDK, один продукт: anti-detect-browser на npm и antibrow на PyPI. Они используют общий каталог кэша, формат профилей и аккаунт, поэтому профиль, созданный в одном, открывается в другом и в приложении для ПК. В любом случае вы запускаете профиль и получаете настоящие объекты Playwright по CDP, так что уже написанные селекторы, проверки и трейсы продолжают работать. Windows, macOS и Linux. Локальные профили не ограничены на любом тарифе; платные тарифы добавляют параллелизм, облачную синхронизацию, управляемые прокси и Live View.

Node 18 или новее.

npm install anti-detect-browser
import { AntiDetectBrowser } from 'anti-detect-browser'

const ab = new AntiDetectBrowser({ key: 'your-api-key' })

const { page, context, browser } = await ab.launch({
  profile: 'account-01',
  label: 'account-01',
})

// Plain Playwright from here.
await page.goto('https://example.com')
await page.getByRole('button', { name: 'Sign in' }).click()

await browser.close()

Python от 3.9 до 3.13. Команда playwright install не нужна - SDK управляет собственным движком, а не встроенными браузерами Playwright, - но пакет playwright необходим для его клиентской библиотеки.

pip install antibrow

python -m antibrow login      # stores your API key
python -m antibrow install    # downloads the engine (optional: the first launch does it)
from antibrow import launch

browser = launch(profile="account-01")

# Plain Playwright from here.
page = browser.new_page()
page.goto("https://example.com")
page.get_by_role("button", name="Sign in").click()

browser.close()

Как контекстный менеджер, с прокси и подходящим часовым поясом:

from antibrow import launch

with launch(
    profile="scraper-eu",
    headless=True,
    proxy="http://user:pass@gate.example.com:8080",
    geoip=True,                # timezone and WebRTC follow the proxy exit
) as browser:
    page = browser.new_page()
    page.goto("https://example.com")
    print(browser.timezone, browser.public_ip)

Асинхронно - для агентов и параллельных обходов. Блокирующая подготовительная работа выполняется в отдельном потоке, поэтому event loop никогда не простаивает:

import asyncio
from antibrow import launch_async

async def main():
    browser = await launch_async(profile="agent-01")
    page = await browser.new_page()
    await page.goto("https://example.com")
    print(await page.title())
    await browser.close()

asyncio.run(main())

new AntiDetectBrowser(options)

keystringrequiredAPI-ключ. Обменивается на короткоживущий лицензионный токен движка.
serverstringoptionalБазовый URL сервера лицензий. По умолчанию - облачный сервер.
cacheDirstringoptionalКорневой каталог для движков и профилей. По умолчанию ~/.anti-detect-browser.
relayUrlstringoptionalEndpoint релея Live View.
proxyHoststringoptionalХост, используемый при привязке управляемого прокси.
notify(message) => voidoptionalКолбэк прогресса для загрузок и запусков.

launch(options)

profilestringrequiredИмя профиля и одновременно имя каталога на диске. Используйте то же имя, чтобы повторно использовать личность.
labelstringoptionalМетка, отображаемая в окне браузера.
colorstringoptionalЦвет темы в hex.
tagsstring[]optionalТеги, сохраняемые вместе с профилем.
proxystringoptionalСобственный прокси: protocol://user:pass@host:port
proxyIdstringoptionalID управляемого прокси. Активирует его и учитывает месячную квоту.
headlessbooleanoptionalЗапуск без видимого окна. См. примечание о платформах ниже.
userDataDirstringoptionalПереопределяет каталог профиля.
liveViewboolean | optionsoptionalТранслирует сессию. Опции: quality, maxWidth, maxHeight, everyNthFrame.
updateKernelBeforeLaunchbooleanoptionalСначала проверяет и устанавливает обновление движка.
deviceType'desktop' | 'android'optionalСимулирует Android-телефон - работает на этой же машине, а не на физическом устройстве, и оно не требуется. Бесплатно на любом тарифе. Только для новых профилей; существующий профиль сохраняет свой тип устройства.
realFingerprintbooleanoptionalБерёт личность из библиотеки отпечатков реальных устройств вместо генерации новой. Только платные тарифы - запрос с Бесплатного тарифа будет отклонён. Только для новых профилей.

headless зависит от платформы. В Windows окно перемещается за пределы экрана. В Linux требуется Xvfb. В macOS сейчас это не действует, и окно отображается. Лучше сказать об этом здесь, чем обнаружить это позже.

Что возвращает launch()

pagePageНастоящий Playwright Page.
contextBrowserContextНастоящий Playwright BrowserContext, подключённый через CDP.
browser{ close() }Удобный хендлер, но НЕ Playwright Browser. У него есть только close() и больше ничего.
profileDirstringГде этот профиль хранится на диске.
sessionKeystringИдентифицирует сессию, используется Live View.
viewUrlstringURL кабинета для просмотра сессии в реальном времени.

browser - это не Playwright Browser. Это хендлер, у которого есть только метод close(). Профиль работает как persistent context, поэтому browser.newContext() и browser.contexts() не существуют, а context.browser() возвращает null. Используйте тот context, который вам передали.

openProfile(options)

Низкоуровневая точка входа, на которой построен launch(). Используйте её, когда нужен сам объект сессии напрямую, гео по выходному IP, колбэки синхронизации архива или переключатели движка для конкретного профиля.

import { openProfile } from 'anti-detect-browser'

const session = await openProfile({
  key: 'your-api-key',
  profileName: 'account-01',
  proxyUrl: 'http://user:pass@host:5001',
  onProgress: (m) => console.log(m),
})

console.log(session.geo)   // { ip, country, countryCode, city, timezone }

const page = session.context.pages()[0] ?? await session.context.newPage()
await page.goto('https://example.com')

await session.close()
profileNamestringrequiredИмя профиля. Также подкаталог кэша.
keystringoptionalAPI-ключ. Обязателен, если не передан licenseToken.
licenseTokenstringoptionalЗаранее полученный лицензионный токен, используется вместо запроса нового.
serverstringoptionalБазовый URL сервера лицензий.
proxyUrlstringoptionalURL прокси. Часовой пояс, локаль и геолокация следуют за его выходным IP.
labelstringoptionalМетка в адресной строке. По умолчанию - profileName.
headlessbooleanoptionalСм. примечание о платформах под launch().
cacheDirstringoptionalКорневой каталог кэша.
profileDirstringoptionalЯвный каталог профиля. Имеет приоритет над cacheDir + profileName.
kernelVersionstringoptionalТолько для новых профилей. Существующие сохраняют версию, записанную в их persona.
updateKernelBeforeLaunchbooleanoptionalСначала проверяет обновление движка.
deviceType'desktop' | 'android'optionalСимулирует Android-телефон - работает на этой машине, а не на физическом устройстве, и оно не требуется. Бесплатно на любом тарифе. Только для новых профилей.
realFingerprintbooleanoptionalБерёт личность из библиотеки отпечатков реальных устройств вместо генерации новой. Только платные тарифы. Только для новых профилей.
canvasNoisebooleanoptionalШум Canvas и WebGL. Off отключает его для этого профиля.
apiLog'off' | 'curated' | 'all'optionalВедёт журнал вызовов API рядом с профилем.
webauthnCapturebooleanoptionalЗахватывает и воспроизводит passkeys. По умолчанию включено.
archiveGetUrlstringoptionalPresigned URL для восстановления состояния профиля.
getArchivePutUrl() => PromiseoptionalРазрешается после завершения работы. Предпочтительнее, чем archivePutUrl.
archivePutUrlstringoptionalPresigned URL для загрузки. Presign редко переживает сессию браузера.
onProgress(message) => voidoptionalКолбэк прогресса.
onArchiveSync(event) => voidoptionalСобытия синхронизации: phase download|upload, state start|done|error.

Сессия, которую она возвращает

contextBrowserContextPlaywright context, подключённый к работающему движку.
close() => PromiseЗакрывает браузер. Запускает выгрузку архива, если она настроена.
onExit(cb) => voidРегистрирует колбэк на случай, если браузер закроется сам.
profileDirstringГде этот профиль хранится на диске.
wsEndpointstringWebSocket-endpoint CDP.
geoProxyGeo?Гео по выходному IP при привязанном прокси: ip, country, countryCode, city, timezone.
archiveUploadPromise?Awaitable-хендлер для выгрузки после завершения.

launch(profile="default", **options)

Запускает движок и возвращает готовый к работе хендлер. launch_async() принимает точно такие же опции.

profilestr"default"Имя профиля и одновременно имя каталога на диске. То же имя - та же личность, cookies и хранилище.
headlessboolFalseЗапуск без видимого окна. См. примечание о платформах ниже.
proxystr | dictNoneprotocol://user:pass@host:port либо структура Playwright {"server", "username", "password"}.
geoipboolTrueОпределяет выходной IP прокси через сам прокси и приводит часовой пояс и WebRTC в соответствие с ним. Без прокси не действует.
timezonestrNoneПринудительно задаёт часовой пояс IANA, переопределяя определение по гео.
api_keystrenv or key fileAPI-ключ. При отсутствии используется ANTIBROW_API_KEY, затем ~/.antibrow/license.key.
serverstrhostedБазовый URL сервера лицензий.
cache_dirstr | Path~/.anti-detect-browserКорневой каталог для движков и профилей.
profile_dirstr | PathNoneТочный каталог профиля. Имеет приоритет над cache_dir и profile.
kernel_versionstrnewestТолько для новых профилей. Существующие сохраняют версию, зафиксированную в их persona.
labelstrprofile nameМетка в адресной строке для различения окон.
argslist[str]NoneДополнительные флаги Chromium.
proxy_auth"native" | "extension""native"Как отвечать на запрос учётных данных прокси. Native обрабатывает их внутри сетевого стека без загрузки расширения.
license_tokenstrNoneИспользует заранее полученный токен вместо обращения к серверу.
license_providercallableNoneВозвращает токен от собственного эмитента.
update_kernelboolFalseПроверяет обновление движка и устанавливает его перед запуском.
device_type'desktop' | 'android'NoneСимулирует Android-телефон - работает на этой машине, а не на физическом устройстве, и оно не требуется. Бесплатно на любом тарифе. Только для новых профилей; существующий профиль сохраняет свой тип устройства.
real_fingerprintboolFalseБерёт личность из библиотеки отпечатков реальных устройств вместо генерации новой. Только платные тарифы - на Бесплатном тарифе вызовет исключение. Только для новых профилей.
reuse_initial_pageboolTrueПозволяет первому вызову new_page() вернуть исходную пустую вкладку Chromium вместо открытия второй.
timeoutfloat120.0Сколько секунд ждать запуска браузера.
on_progresscallableNoneПолучает строки прогресса для загрузок и запусков.

headless зависит от платформы. В Windows окно перемещается за пределы экрана, потому что у настоящего headless-режима Chromium есть собственный отпечаток. В Linux запускайте в обычном режиме под Xvfb. В macOS сейчас это не действует, и окно отображается.

Хендлер Antibrow

Обращения к атрибутам делегируются в Playwright BrowserContext, поэтому хендлер ведёт себя как context, и не нужно сначала обращаться к .context.

browser = launch(profile="account-01")

# Attribute lookups fall through to the Playwright BrowserContext,
# so anything you would call on a context works on the handle.
browser.add_init_script("...")
browser.add_cookies([...])
browser.pages
new_page()PageНастоящий Playwright Page. Первый вызов переиспользует исходную пустую вкладку Chromium; используйте context.new_page(), если всегда нужна новая.
contextBrowserContextИсходный Playwright BrowserContext. Каждый профиль персистентный, поэтому context.browser() равен null.
browserBrowserИсходный Playwright Browser, то есть CDP-соединение.
pagePageПервая страница, создаётся по требованию.
cdp_urlstrhttp://127.0.0.1:PORT - то, что нужно crawl4ai и puppeteer.connect.
cdp_endpointstrWebSocket-endpoint CDP.
profile_dirPathГде этот профиль хранится на диске.
personaPersonaЗафиксированная личность: UA, GPU, экран, сиды.
timezonestrЧасовой пояс браузера, определённый по прокси, если geoip включён.
public_ipstr | NoneВыходной IP прокси, если он был определён.
kernel_versionstrВерсия движка, к которой привязан этот профиль.
pidint | NonePID процесса движка.
planLaunchPlanВсё, что было определено для этого запуска. plan.redacted_args() маскирует секреты, поэтому его безопасно вставлять в баг-репорт.
close()NoneЗакрывает браузер и завершает дерево процессов.

Другие точки входа

from antibrow import (
    launch_async, launch_persistent_context,
    launch_persistent_context_async, prepare_launch,
)

browser = await launch_async(profile="p1")           # asyncio twin of launch()
context = launch_persistent_context(profile="p1")    # a literal Playwright BrowserContext
plan    = prepare_launch(profile="p1")               # resolve everything, start nothing

print(plan.redacted_args())   # the command line with the token and proxy password masked

prepare_launch() определяет точный исполняемый файл, аргументы, persona и часовой пояс, которые использовал бы запуск, не запуская процесс - поэтому именно его стоит вызывать для тестов, сухих прогонов и баг-репортов.

Управление профилями

Локальные профили не требуют вызова API для создания: запуск несуществующего имени создаёт его. Серверные функции ниже - для профилей с облачной синхронизацией, это функция платных тарифов.

import {
  listProfiles, getProfileDir, defaultCacheDir,
  getOrCreateProfile, deleteProfile,
} from 'anti-detect-browser'

// Local profiles are directories on disk. Unlimited on every plan.
listProfiles()                // string[] of profile names
getProfileDir('account-01')   // absolute path to that profile
defaultCacheDir()             // ~/.anti-detect-browser by default

// Cloud-synced profiles talk to the server and need an API key.
const p = await getOrCreateProfile({ key, name: 'account-01', tags: ['ads'] })
await deleteProfile({ key, id: p.id })

Профиль - это каталог, содержащий persona.json (личность, записывается один раз и никогда не перегенерируется), fp-config.json (та же persona, сериализованная для движка, перезаписывается при каждом запуске) и user-data/ (собственное состояние Chromium). Корень кэша общий с Node SDK и приложением для ПК, поэтому профиль, созданный здесь, появится и там.

from antibrow import list_profiles, profile_dir, default_cache_dir

# Local profiles are directories on disk. Unlimited on every plan, and
# launching a name that does not exist creates it.
list_profiles()                # ['account-01', 'account-02']
profile_dir("account-01")      # Path to that profile
default_cache_dir()            # ~/.anti-detect-browser by default

# Or point at an exact directory, e.g. a volume mounted into CI:
launch(profile_dir="/data/profiles/account-01")

Облачная синхронизация и Live View сегодня доступны только в Node SDK и приложении для ПК; пакет Python работает только локально. Перенос личности между машинами возможен копированием каталога профиля или экспортом переносимого архива из Node SDK или приложения для ПК.

Профили устройств

Две независимые опции, обе определяются только при первом создании профиля - существующий профиль сохраняет то, что было определено, зафиксированным в его persona.

  • deviceType: 'android' симулирует полноценное окружение Android-телефона - user agent, Client Hints, сенсорный ввод, экран - которое работает на той же машине с Windows, macOS или Linux. Оно не работает на телефоне, и физическое устройство не требуется. Бесплатно на любом тарифе, включая Бесплатный.
  • realFingerprint: true берёт личность из библиотеки отпечатков реальных устройств - пула отпечатков, собранных с реальных физических машин, - вместо локальной генерации. Только платные тарифы - запрос с Бесплатного тарифа получает от сервера 403, а не молчаливый откат к сгенерированной личности. Работает с любым типом устройства.
// A simulated Android phone - runs on this same Windows/macOS/Linux
// machine, not on a physical device, and needs none. Free on every
// plan. Only takes effect the first time this profile is created.
await ab.launch({ profile: 'mobile-01', deviceType: 'android' })

// Draw the identity from a real captured device instead of generating
// one. Paid plans only - a Free-plan key gets a 403. Works for either
// device type, and also only applies at first creation.
await ab.launch({ profile: 'captured-01', realFingerprint: true })

// Combine both: an Android identity pulled from the captured library.
await ab.launch({
  profile: 'captured-mobile-01',
  deviceType: 'android',
  realFingerprint: true,
})
# A simulated Android phone - runs on this same Windows/macOS/Linux
# machine, not on a physical device, and needs none. Free on every
# plan. Only takes effect the first time this profile is created.
browser = launch(profile="mobile-01", device_type="android")

# Draw the identity from a real captured device instead of generating
# one. Paid plans only - a Free-plan key raises. Works for either
# device type, and also only applies at first creation.
browser = launch(profile="captured-01", real_fingerprint=True)

Для Android нужен движок 151.0.7922.72 или новее. SDK скачивает его автоматически при первой необходимости. Уже установленный более старый движок молча не используется - вместо этого запуск отклоняется, потому что конфигурация Android на движке без поддержки мобильных устройств дала бы профиль, чей user agent заявляет Android, а Client Hints - всё ещё desktop.

Экспорт и импорт

Профили экспортируются в переносимый архив .fpprofile на любом тарифе, включая Бесплатный, потому что возможность уйти не должна быть платной функцией. Архив несёт отпечаток, cookies, хранилище, закладки и passkeys. Относитесь к файлу как к учётным данным: всё, что может его открыть, входит в систему под этой личностью.

import { exportProfileArchive, importProfileArchive, getProfileDir } from 'anti-detect-browser'
import { writeFileSync, readFileSync } from 'node:fs'

// Carries the fingerprint, cookies, storage, bookmarks and passkeys.
const buf = exportProfileArchive(getProfileDir('account-01'), meta)
writeFileSync('account-01.fpprofile', buf)

// Restore it into another machine's profile directory.
importProfileArchive(readFileSync('account-01.fpprofile'), getProfileDir('account-01'))

Прокси

Передайте proxy для собственного прокси или proxyId для управляемого. В любом случае движок определяет часовой пояс, локаль и геолокацию по выходному IP, поэтому браузер не сообщает ваше собственное время через чужой адрес - это самый частый способ, которым выдаёт себя правильно настроенный прокси. При привязанном прокси openProfile() возвращает geo с описанием этого выхода. Получение управляемого прокси бесплатно; квота учитывается при запуске с ним.

Прокси с авторизацией работают как есть - укажите учётные данные в URL (http, https или socks5), и движок сам отвечает на запрос: HTTP и HTTPS 407 внутри сетевого стека, SOCKS5 - согласованием по RFC 1929. В chrome://extensions ничего не загружается - это именно тот демаскирующий признак, которого не должно быть у антидетект-браузера, - а учётные данные никогда не доходят до процесса рендерера. См. Управляемые прокси.

С geoip=True (по умолчанию) выходной IP определяется через прокси перед запуском, а его часовой пояс записывается в отпечаток - поэтому браузер не сообщает ваше собственное время через чужой адрес, что является самым частым способом, которым выдаёт себя правильно настроенный прокси.

launch(proxy="http://user:pass@gate.example.com:8080")
launch(proxy="socks5://user:pass@127.0.0.1:1080")
launch(proxy={"server": "http://gate.example.com:8080", "username": "u", "password": "p"})

browser = launch(profile="p1", proxy="socks5://user:pass@127.0.0.1:1080")
print(browser.public_ip, browser.timezone)   # 203.0.113.7 America/Los_Angeles

Учётные данные обрабатываются внутри движка: HTTP и HTTPS 407 - в сетевом стеке, SOCKS5 - согласованием по RFC 1929. В chrome://extensions ничего не загружается - это именно тот демаскирующий признак, которого не должно быть у антидетект-браузера. См. Управляемые прокси.

Интеграции с фреймворками

Каждая интеграция работает одинаково: SDK запускает браузер, а вы передаёте его CDP-endpoint тому, что должно им управлять. Playwright вообще не требует прослойки - хендлер уже является context.

browser = launch(profile="agent-01")

browser.cdp_url        # http://127.0.0.1:54321        - crawl4ai, puppeteer.connect
browser.cdp_endpoint   # ws://127.0.0.1:54321/devtools/browser/...

# browser-use
Agent(task="...", llm=llm, browser=Browser(cdp_url=browser.cdp_url))

# crawl4ai
AsyncWebCrawler(config=BrowserConfig(cdp_url=browser.cdp_url, headless=False))

# Scrapling
DynamicFetcher.fetch("https://example.com", cdp_url=browser.cdp_endpoint)

Selenium не может подключиться к endpoint, работающему только по CDP, без подходящего chromedriver, поэтому привязки для Selenium сегодня нет. Если вы переходите с него, Playwright - самый короткий путь. Хотите управлять браузером из AI-агента? См. MCP-сервер.

Live View

Транслируйте работающую сессию в кабинет. Только платные тарифы.

const { page, viewUrl } = await ab.launch({
  profile: 'account-01',
  liveView: { quality: 60, maxWidth: 1280, everyNthFrame: 2 },
})

console.log(viewUrl)   // open in the dashboard to watch the session

Обновления движка

Движок скачивается при первом использовании и кэшируется в каталоге кэша. Новые профили используют текущую версию по умолчанию; существующий профиль сохраняет версию, записанную в его persona, поэтому его отпечаток не меняется незаметно после обновления.

await ab.checkKernelUpdates()

if (await ab.hasKernelUpdate()) {
  await ab.updateKernel(undefined, (m) => console.log(m))
}

// Or fold it into a launch:
await ab.launch({ profile: 'account-01', updateKernelBeforeLaunch: true })
# Fold the check into a launch:
launch(profile="account-01", update_kernel=True)

# Or from the CLI:
#   python -m antibrow install --force

CLI и окружение

python -m antibrow install [--version 150.0.7871.182] [--force]   # get the engine
python -m antibrow info                                           # engines, profiles, license
python -m antibrow login [--key ab_live_...]                      # store an API key
python -m antibrow version                                        # SDK and default engine version

antibrow ... тоже работает, как консольный скрипт. info - первое, что стоит запустить, если что-то не так: команда выводит каталог кэша, все версии движка с их статусом установки, все профили с версией, к которой они привязаны, и откуда был взят ваш API-ключ.

ANTIBROW_API_KEYAPI-ключ. ANTI_DETECT_BROWSER_KEY тоже принимается, поэтому одна переменная покрывает оба SDK.
ANTIBROW_LICENSE_TOKENЗаранее полученный лицензионный токен. Полностью пропускает обращение к серверу.
ANTIBROW_CACHE_DIRКорень для движков и профилей. По умолчанию ~/.anti-detect-browser.
ANTIBROW_SERVERБазовый URL сервера лицензий.

Docker

Linux-движок работает в обычном режиме под Xvfb, потому что у настоящего headless-режима Chromium есть собственный отпечаток. Этот образ работает и на linux/amd64, и на linux/arm64; подходящая сборка выбирается по CPU контейнера.

FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
      xvfb libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
      libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
      libgbm1 libasound2 libpango-1.0-0 libcairo2 fonts-liberation ca-certificates \
    && rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir antibrow
COPY script.py .
CMD ["xvfb-run", "-a", "python", "script.py"]

Смонтируйте каталог кэша как volume (-v antibrow-cache:/root/.anti-detect-browser), чтобы движок и профили сохранялись между запусками, иначе каждый контейнер будет скачивать движок заново.

Ошибки

from antibrow import AntibrowError, ConcurrencyLimitError, LicenseError

try:
    browser = launch()
except ConcurrencyLimitError:
    ...   # the plan's simultaneous-browser cap is in use
except LicenseError:
    ...   # no API key, or the server rejected it
except AntibrowError:
    ...   # engine download, unsupported platform, proxy, launch failure
AntibrowErrorБазовый класс. От него наследуются все намеренные ошибки.
LicenseErrorНет API-ключа, либо сервер его отклонил.
ConcurrencyLimitErrorЛимит одновременных браузеров тарифа уже исчерпан.
KernelDownloadErrorНе удалось скачать или распаковать движок.
LaunchErrorДвижок запустился, но так и не сообщил рабочий CDP-endpoint.
ProxyErrorНе удалось разобрать строку прокси или определить выходной узел.
UnsupportedPlatformErrorДля этой ОС и CPU нет сборки движка.

API сервера

Оба SDK вызывают их за вас, поэтому напрямую они нужны редко. Они приведены здесь для тех, кто интегрируется без SDK. Авторизация через Authorization: Bearer <api-key>.

POST /api/v1/engine/sessionВыдаёт сессию движка для запуска.
GET /api/v1/profilesСписок профилей с облачной синхронизацией.
POST /api/v1/profilesСоздаёт профиль с облачной синхронизацией.
GET /api/v1/profiles/:nameПолучает один профиль. Ограничение: 1 запрос в минуту на профиль.
DELETE /api/v1/profiles/:nameУдаляет профиль с облачной синхронизацией и его сохранённый архив.
GET/PUT /api/v1/profiles/:name/archivePresigned URL для синхронизации состояния профиля. Presign для PUT недолговечен, поэтому запрашивайте его в момент выгрузки, а не при запуске.
GET /api/v1/devices/pick?os=android|windowsБерёт один отпечаток из библиотеки отпечатков реальных устройств. Только платные тарифы (403 на Бесплатном). Возвращает { device }.
GET /api/v1/proxiesНазначенные вам управляемые прокси, а также месячная квота.
GET /api/v1/accountТариф, лимит параллелизма и использование.

Хотите управлять браузером из AI-агента, а не писать код? Те же профили доступны через MCP-сервер.