Aurorium Local API v1 Local API позволяет локальным скриптам управлять профилями Aurorium, браузерными сессиями, папками, прокси и cookies. Сервер запускается вместе с desktop-приложением и доступен только на том же компьютере.
Документация описывает Local API версии v1. Версия API указывается в базовом URL: /api/v1. На данный момент Local API не поддерживает работу с командными профилями. Поддержка командных профилей запланирована в будущих релизах. # Быстрый стартЗапустите Aurorium и войдите в аккаунт. Откройте раздел Automation → API и сгенерируйте API key. Сохраните ключ сразу: backend показывает его только один раз. Передавайте ключ во всех запросах через Authorization: Bearer <api_key>. bash curl "http://127.0.0.1:50325/api/v1/health" \
-H "Authorization: Bearer $AURORIUM_API_KEY"Базовый URL:
text http://127.0.0.1:50325/api/v1Сервер слушает только 127.0.0.1, а не внешний сетевой интерфейс. Текущий порт фиксирован: 50325.
# Формат ответаУспех и прикладные ошибки возвращаются в едином envelope:
json {
"code": 0,
"msg": "success",
"data": {},
"request_id": "req_0d30b83f3fbb43e6a2e1b255e21d24b8"
}code = 0 означает успех.code != 0 означает прикладную ошибку; проверять только HTTP status недостаточно.request_id следует сохранять в логах интеграции для диагностики.Обычно сервер возвращает HTTP 200 даже при прикладной ошибке. Если JSON body превышает 5 MiB, API возвращает code: 1001 с msg: "request body too large". Пример ошибки:
json {
"code": 1201,
"msg": "profile not found",
"data": null,
"request_id": "req_7f3ab37ea65048f99ebd0fdbe6f4da63"
}# Общие параметрыСписочные методы принимают:
Параметр По умолчанию Ограничение page1минимум 1 page_size50максимум 200; большие значения ограничиваются до 200
Формат списочного data:
json {
"list": [],
"page": 1,
"page_size": 50,
"total": 0
}# Обзор методовМетод Путь Назначение GET /healthГотовность приложения и соединение с cloud GET /versionВерсии приложения и API GET /profileСписок не-архивных профилей POST /profileСоздание профиля GET /profile/:idДетали профиля PATCH /profile/:idЧастичное обновление профиля DELETE /profile/:idУдаление профиля GET /folderСписок папок POST /folderСоздание папки PUT /folder/:idПереименование папки DELETE /folder/:idУдаление папки GET /browser/statusСтатус запуска профиля GET /browser/activeЗапущенные профили POST /browser/startЗапуск профиля с CDP POST /browser/stopОстановка профиля POST /browser/stop-allОстановка локальных профилей POST /proxy/checkПроверка прокси PUT /profile/:id/proxyЗамена прокси профиля GET /profile/:id/cookiesЭкспорт cookies POST /profile/:id/cookies/importИмпорт cookies GET /deviceУстройства аккаунта GET /catalogДопустимые fingerprint-значения
# System# GET /healthВозвращает локальную готовность приложения, состояние cloud-соединения и ID текущего устройства.
json {
"ready": true,
"cloud_connected": true,
"device_id": "device-id-or-null"
}Авторизация обязательна даже для health-check.
# GET /versionjson {
"app_version": "0.3.1",
"core_version": null,
"api_version": "v1"
}core_version пока не реализован и всегда возвращает null.
# Profiles# GET /profileQuery-параметры:
Параметр Значения Описание folder_idObjectId Фильтр по папке namestring Поиск по имени statusall, running, idleПо умолчанию all page, page_sizeinteger Пагинация
Элемент списка:
json {
"profile_id": "507f1f77bcf86cd799439011",
"name": "Automation profile",
"folder_id": null,
"status": "idle",
"location": null,
"os": "windows",
"os_version": "Windows 11",
"core": "chrome",
"core_version": "134",
"description": "",
"created_at": "2026-07-24T10:00:00Z",
"updated_at": "2026-07-24T10:00:00Z"
}Архивные профили не возвращаются. Фильтр running|idle применяется клиентом только к уже полученной странице, поэтому total и заполненность страницы могут не соответствовать отфильтрованному списку.
# POST /profileМинимальный запрос:
json {
"name": "Automation profile"
}Поддерживаемые поля:
Поле Тип Обязательное Примечание namestring да Непустое имя descriptionstring нет По умолчанию "" folder_idstring или null нет Mongo ObjectId; null — без папки tagsarray нет По умолчанию [] osstring нет windows, macos, linuxos_versionstring нет Подсказка версии ОС для генератора fingerprint (напр. "11", "Tahoe"). Если не задано — выводится автоматически (из реальной ОС хоста либо случайным подбором из каталога). Не валидируется против /catalog; произвольное значение принимается как есть. Рекомендуемые значения смотрите в /catalog is_armboolean нет Подсказка ARM-архитектуры для генерации fingerprint. Если не задано — выводится автоматически из GPU-вендора (Apple/Qualcomm → true) proxyobject нет Inline proxy, формат ниже proxy_idstring нет Ссылка на существующий proxy; proxy имеет приоритет launch_argumentsstring нет Аргументы запуска одной строкой start_pagestring нет Стартовая страница fingerprintobject нет Частичные overrides
Пример с прокси:
json {
"name": "Profile with proxy",
"os": "windows",
"proxy": {
"type": "socks5",
"host": "127.0.0.1",
"port": 1080,
"user": "login",
"password": "secret"
}
}Создание асинхронно на backend. Local API ждёт событие завершения и обычно возвращает полную модель профиля; если повторное чтение не удалось, может вернуться только profile_id.
# GET /profile/:idВозвращает элемент из списка с дополнительными объектами proxy и fingerprint.
Пароль прокси никогда не возвращается открытым текстом; при наличии он заменяется на ******.
# PATCH /profile/:idЧастично обновляет:
json {
"name": "New name",
"description": "Updated through API",
"folder_id": null,
"fingerprint": {
"timezone_mode": "manual",
"timezone": "Europe/Moscow"
}
}Пустой body является успешной no-op операцией.
Метаданные (name, description, folder_id) применяются сразу. Изменения fingerprint применяются сразу, если профиль остановлен; если профиль запущён — они откладываются до следующего запуска и перечисляются в deferred_fields. Каждый ключ соответствует переданному полю в форме fingerprint.<имя_поля>. Метаданные в deferred_fields не попадают никогда.
Пример для запущенного профиля, которому передали timezone_mode и timezone:
json {
"profile_id": "507f1f77bcf86cd799439011",
"deferred_fields": ["fingerprint.timezone_mode", "fingerprint.timezone"]
}Для остановленного профиля deferred_fields всегда пустой:
json {
"profile_id": "507f1f77bcf86cd799439011",
"deferred_fields": []
}# DELETE /profile/:idQuery force=true останавливает профиль, запущенный на текущем устройстве, перед удалением. Без force такой профиль возвращает 1203.
json {
"profile_id": "507f1f77bcf86cd799439011",
"deleted": true
}Удаление идемпотентно для синтаксически корректного ObjectId: backend-ошибка «не найдено» сейчас трактуется как уже удалённый профиль.
# FingerprintОбъект fingerprint в POST/PATCH поддерживает частичное обновление следующих полей:
Поле Тип/значения timezone_modeauto, manualtimezonestring или null language_modeauto, manuallanguagesstring[]; используется первый элемент languagestring; сокращённая альтернативная форма screen_resolutionstring webrtc_modereal, replacecanvas_noiseboolean webgl_image_noiseboolean webgl_vendorstring или null webgl_rendererstring или null audio_noiseboolean client_rects_noiseboolean hardware_concurrencynumber device_memorynumber do_not_trackdefault, trueos_versionstring dns_modereal, manualdns_serverstring или null geolocation{mode, latitude, longitude, accuracy}media_devices{audio_inputs, audio_outputs, video_inputs}
Допустимые взаимосвязанные значения OS, GPU, CPU, RAM, экрана, timezone и language следует получать через /catalog.
# Folders# GET /folderПоддерживает name, page, page_size.
json {
"folder_id": "507f1f77bcf86cd799439012",
"name": "QA",
"profile_count": 3,
"system": false
}# POST /folder# PUT /folder/:idjson { "name": "QA automation" }# DELETE /folder/:idПрофили не удаляются вместе с папкой: backend переносит их в системную папку (командные профили) или в состояние без папки (личные профили).
json {
"folder_id": "507f1f77bcf86cd799439012",
"deleted": true,
"moved_profiles": 3,
"moved_to": null
}moved_profiles и moved_to вычисляются до удаления в best-effort режиме и могут быть неточными при проблемах чтения cloud-состояния.
# Browser lifecycle# GET /browser/status?profile_id=:idВозвращает idle или running, устройство запуска и доступные локальные координаты процесса.
# GET /browser/activeQuery scope:
this_device — локально запущенные профили, значение по умолчанию;account — профили на всех устройствах аккаунта по cloud registry.Поддерживает стандартную пагинацию.
# POST /browser/startjson {
"profile_id": "507f1f77bcf86cd799439011",
"headless": false,
"open_urls": ["https://example.com"],
"launch_args": ["--window-size=1280,800"],
"load_extensions": true
}Успешный ответ:
json {
"profile_id": "507f1f77bcf86cd799439011",
"already_running": false,
"debug_port": 51432,
"ws": "ws://127.0.0.1:51432/devtools/browser/...",
"webdriver": null,
"pid": 12345,
"lease": {
"device_id": "device-id",
"device_name": "Workstation",
"is_current_device": true
}
}Повторный запуск на текущем устройстве идемпотентен. Запуск на другом устройстве возвращает 1204. Если нужное ядро отсутствует или требует загрузки, Local API возвращает 1304; автоматического скачивания через этот метод сейчас нет.
# POST /browser/stopjson { "profile_id": "507f1f77bcf86cd799439011" }Остановка идемпотентна и возвращает was_running.
# POST /browser/stop-allОстанавливает все профили на текущем устройстве:
json {
"stopped": ["507f1f77bcf86cd799439011"],
"count": 1
}# ProxyФормат inline proxy:
Поле Тип Примечание typestring http, socks4, socks5, ssh, no_proxyhoststring Обязательно, кроме no_proxy portinteger/string 1..65535, кроме no_proxyuserstring Опционально passwordstring Опционально refresh_urlstring Опционально
# POST /proxy/checkПередайте ровно один источник: proxy или profile_id.
json {
"proxy": {
"type": "http",
"host": "proxy.example.com",
"port": 8080
}
}json {
"ok": true,
"exit_ip": "203.0.113.10",
"country": "DE",
"city": "Frankfurt",
"latitude": 50.11,
"longitude": 8.68,
"timezone": null,
"latency_ms": null
}# PUT /profile/:id/proxyBody — непосредственно proxy object без обёртки proxy:
json {
"type": "no_proxy"
}Для запущенного профиля изменение откладывается до следующего запуска и ответ содержит deferred_fields: ["proxy"].
# CookiesCookie имеет плоский формат:
json {
"domain": ".example.com",
"name": "session",
"value": "value",
"path": "/",
"expires": 1790000000,
"http_only": true,
"secure": true,
"same_site": "lax"
}expires — Unix time в секундах; 0 или null означает session cookie. same_site: unspecified, no_restriction, lax, strict.
# GET /profile/:id/cookiesСначала читает локальную Chromium SQLite, при её отсутствии пытается получить cookies из cloud.
# POST /profile/:id/cookies/importjson {
"clear": true,
"cookies": [
{
"domain": ".example.com",
"name": "session",
"value": "value"
}
]
}clear=true по умолчанию заменяет cookies;clear=false объединяет их с существующей cloud-копией;профиль должен быть остановлен на всех устройствах; каждая принимаемая cookie должна иметь как минимум domain и name. # Devices# GET /deviceВозвращает пагинированный список:
json {
"device_id": "device-id",
"device_name": "Workstation",
"platform": "windows",
"is_current_device": true,
"online": true,
"last_seen": "2026-07-24T10:00:00Z",
"running_profiles": 1,
"running_profile_ids": ["507f1f77bcf86cd799439011"]
}# Catalog# GET /catalogВозвращает разрешённые fingerprint-значения и зависимости GPU → CPU/RAM/screen. Query os=windows|macos|linux ограничивает ответ одной ОС.
Catalog зависит от cloud; при недоступности возвращается 1701.
# Коды ошибокКод Значение 0 Успех 1001 Некорректный JSON или тело запроса слишком большое 1002 Неизвестный endpoint или HTTP method 1003 Отсутствующий или недействительный API key 1101 Отсутствует обязательный параметр 1103 Недопустимое значение или формат параметра 1201 Профиль не найден 1202 Профиль архивирован 1203 Профиль запущен на этом устройстве 1204 Профиль запущен на другом устройстве 1301 Не удалось запустить browser core 1304 Browser core отсутствует или загружается 1401 Некорректная конфигурация proxy 1402 Проверка proxy не пройдена 1501 Папка не найдена 1503 Нельзя удалить системную папку 1601 Некорректный формат cookies 1602 Импорт cookies запрещён для запущенного профиля 1701 Cloud недоступен 1901 Внутренняя ошибка
# Минимальный пример на JavaScriptjs const baseUrl = "http://127.0.0.1:50325/api/v1";
const token = process.env.AURORIUM_API_KEY;
async function aurorium(path, options = {}) {
const response = await fetch(`${baseUrl}${path}`, {
...options,
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
...options.headers,
},
});
const result = await response.json();
if (result.code !== 0) {
throw new Error(`[${result.code}] ${result.msg}; ${result.request_id}`);
}
return result.data;
}
const profiles = await aurorium("/profile?page_size=10");
console.log(profiles.list);# СовместимостьВерсия API включена в URL: /api/v1. Числовые коды ошибок заявлены стабильными в пределах major API version. Добавление необязательных полей в ответ не должно ломать интеграции; клиентам следует игнорировать неизвестные поля. Ломающие изменения требуют нового major URL (/api/v2) либо явно согласованного периода миграции.