Справочник 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)
key | string | required | API-ключ. Обменивается на короткоживущий лицензионный токен движка. |
server | string | optional | Базовый URL сервера лицензий. По умолчанию - облачный сервер. |
cacheDir | string | optional | Корневой каталог для движков и профилей. По умолчанию ~/.anti-detect-browser. |
relayUrl | string | optional | Endpoint релея Live View. |
proxyHost | string | optional | Хост, используемый при привязке управляемого прокси. |
notify | (message) => void | optional | Колбэк прогресса для загрузок и запусков. |
launch(options)
profile | string | required | Имя профиля и одновременно имя каталога на диске. Используйте то же имя, чтобы повторно использовать личность. |
label | string | optional | Метка, отображаемая в окне браузера. |
color | string | optional | Цвет темы в hex. |
tags | string[] | optional | Теги, сохраняемые вместе с профилем. |
proxy | string | optional | Собственный прокси: protocol://user:pass@host:port |
proxyId | string | optional | ID управляемого прокси. Активирует его и учитывает месячную квоту. |
headless | boolean | optional | Запуск без видимого окна. См. примечание о платформах ниже. |
userDataDir | string | optional | Переопределяет каталог профиля. |
liveView | boolean | options | optional | Транслирует сессию. Опции: quality, maxWidth, maxHeight, everyNthFrame. |
updateKernelBeforeLaunch | boolean | optional | Сначала проверяет и устанавливает обновление движка. |
deviceType | 'desktop' | 'android' | optional | Симулирует Android-телефон - работает на этой же машине, а не на физическом устройстве, и оно не требуется. Бесплатно на любом тарифе. Только для новых профилей; существующий профиль сохраняет свой тип устройства. |
realFingerprint | boolean | optional | Берёт личность из библиотеки отпечатков реальных устройств вместо генерации новой. Только платные тарифы - запрос с Бесплатного тарифа будет отклонён. Только для новых профилей. |
headless зависит от платформы. В Windows окно перемещается за пределы экрана. В Linux требуется Xvfb. В macOS сейчас это не действует, и окно отображается. Лучше сказать об этом здесь, чем обнаружить это позже.
Что возвращает launch()
page | Page | Настоящий Playwright Page. | |
context | BrowserContext | Настоящий Playwright BrowserContext, подключённый через CDP. | |
browser | { close() } | Удобный хендлер, но НЕ Playwright Browser. У него есть только close() и больше ничего. | |
profileDir | string | Где этот профиль хранится на диске. | |
sessionKey | string | Идентифицирует сессию, используется Live View. | |
viewUrl | string | URL кабинета для просмотра сессии в реальном времени. | |
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() profileName | string | required | Имя профиля. Также подкаталог кэша. |
key | string | optional | API-ключ. Обязателен, если не передан licenseToken. |
licenseToken | string | optional | Заранее полученный лицензионный токен, используется вместо запроса нового. |
server | string | optional | Базовый URL сервера лицензий. |
proxyUrl | string | optional | URL прокси. Часовой пояс, локаль и геолокация следуют за его выходным IP. |
label | string | optional | Метка в адресной строке. По умолчанию - profileName. |
headless | boolean | optional | См. примечание о платформах под launch(). |
cacheDir | string | optional | Корневой каталог кэша. |
profileDir | string | optional | Явный каталог профиля. Имеет приоритет над cacheDir + profileName. |
kernelVersion | string | optional | Только для новых профилей. Существующие сохраняют версию, записанную в их persona. |
updateKernelBeforeLaunch | boolean | optional | Сначала проверяет обновление движка. |
deviceType | 'desktop' | 'android' | optional | Симулирует Android-телефон - работает на этой машине, а не на физическом устройстве, и оно не требуется. Бесплатно на любом тарифе. Только для новых профилей. |
realFingerprint | boolean | optional | Берёт личность из библиотеки отпечатков реальных устройств вместо генерации новой. Только платные тарифы. Только для новых профилей. |
canvasNoise | boolean | optional | Шум Canvas и WebGL. Off отключает его для этого профиля. |
apiLog | 'off' | 'curated' | 'all' | optional | Ведёт журнал вызовов API рядом с профилем. |
webauthnCapture | boolean | optional | Захватывает и воспроизводит passkeys. По умолчанию включено. |
archiveGetUrl | string | optional | Presigned URL для восстановления состояния профиля. |
getArchivePutUrl | () => Promise | optional | Разрешается после завершения работы. Предпочтительнее, чем archivePutUrl. |
archivePutUrl | string | optional | Presigned URL для загрузки. Presign редко переживает сессию браузера. |
onProgress | (message) => void | optional | Колбэк прогресса. |
onArchiveSync | (event) => void | optional | События синхронизации: phase download|upload, state start|done|error. |
Сессия, которую она возвращает
context | BrowserContext | Playwright context, подключённый к работающему движку. | |
close | () => Promise | Закрывает браузер. Запускает выгрузку архива, если она настроена. | |
onExit | (cb) => void | Регистрирует колбэк на случай, если браузер закроется сам. | |
profileDir | string | Где этот профиль хранится на диске. | |
wsEndpoint | string | WebSocket-endpoint CDP. | |
geo | ProxyGeo? | Гео по выходному IP при привязанном прокси: ip, country, countryCode, city, timezone. | |
archiveUpload | Promise? | Awaitable-хендлер для выгрузки после завершения. | |
launch(profile="default", **options)
Запускает движок и возвращает готовый к работе хендлер. launch_async() принимает точно такие же опции.
profile | str | "default" | Имя профиля и одновременно имя каталога на диске. То же имя - та же личность, cookies и хранилище. |
headless | bool | False | Запуск без видимого окна. См. примечание о платформах ниже. |
proxy | str | dict | None | protocol://user:pass@host:port либо структура Playwright {"server", "username", "password"}. |
geoip | bool | True | Определяет выходной IP прокси через сам прокси и приводит часовой пояс и WebRTC в соответствие с ним. Без прокси не действует. |
timezone | str | None | Принудительно задаёт часовой пояс IANA, переопределяя определение по гео. |
api_key | str | env or key file | API-ключ. При отсутствии используется ANTIBROW_API_KEY, затем ~/.antibrow/license.key. |
server | str | hosted | Базовый URL сервера лицензий. |
cache_dir | str | Path | ~/.anti-detect-browser | Корневой каталог для движков и профилей. |
profile_dir | str | Path | None | Точный каталог профиля. Имеет приоритет над cache_dir и profile. |
kernel_version | str | newest | Только для новых профилей. Существующие сохраняют версию, зафиксированную в их persona. |
label | str | profile name | Метка в адресной строке для различения окон. |
args | list[str] | None | Дополнительные флаги Chromium. |
proxy_auth | "native" | "extension" | "native" | Как отвечать на запрос учётных данных прокси. Native обрабатывает их внутри сетевого стека без загрузки расширения. |
license_token | str | None | Использует заранее полученный токен вместо обращения к серверу. |
license_provider | callable | None | Возвращает токен от собственного эмитента. |
update_kernel | bool | False | Проверяет обновление движка и устанавливает его перед запуском. |
device_type | 'desktop' | 'android' | None | Симулирует Android-телефон - работает на этой машине, а не на физическом устройстве, и оно не требуется. Бесплатно на любом тарифе. Только для новых профилей; существующий профиль сохраняет свой тип устройства. |
real_fingerprint | bool | False | Берёт личность из библиотеки отпечатков реальных устройств вместо генерации новой. Только платные тарифы - на Бесплатном тарифе вызовет исключение. Только для новых профилей. |
reuse_initial_page | bool | True | Позволяет первому вызову new_page() вернуть исходную пустую вкладку Chromium вместо открытия второй. |
timeout | float | 120.0 | Сколько секунд ждать запуска браузера. |
on_progress | callable | None | Получает строки прогресса для загрузок и запусков. |
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(), если всегда нужна новая. | |
context | BrowserContext | Исходный Playwright BrowserContext. Каждый профиль персистентный, поэтому context.browser() равен null. | |
browser | Browser | Исходный Playwright Browser, то есть CDP-соединение. | |
page | Page | Первая страница, создаётся по требованию. | |
cdp_url | str | http://127.0.0.1:PORT - то, что нужно crawl4ai и puppeteer.connect. | |
cdp_endpoint | str | WebSocket-endpoint CDP. | |
profile_dir | Path | Где этот профиль хранится на диске. | |
persona | Persona | Зафиксированная личность: UA, GPU, экран, сиды. | |
timezone | str | Часовой пояс браузера, определённый по прокси, если geoip включён. | |
public_ip | str | None | Выходной IP прокси, если он был определён. | |
kernel_version | str | Версия движка, к которой привязан этот профиль. | |
pid | int | None | PID процесса движка. | |
plan | LaunchPlan | Всё, что было определено для этого запуска. 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 --forceCLI и окружение
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_KEY | API-ключ. 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/archive | Presigned URL для синхронизации состояния профиля. Presign для PUT недолговечен, поэтому запрашивайте его в момент выгрузки, а не при запуске. | ||
GET /api/v1/devices/pick?os=android|windows | Берёт один отпечаток из библиотеки отпечатков реальных устройств. Только платные тарифы (403 на Бесплатном). Возвращает { device }. | ||
GET /api/v1/proxies | Назначенные вам управляемые прокси, а также месячная квота. | ||
GET /api/v1/account | Тариф, лимит параллелизма и использование. | ||
Хотите управлять браузером из AI-агента, а не писать код? Те же профили доступны через MCP-сервер.