Автоматизация
Локальный API, ключи и вызовы
- 50325
- Порт по умолчанию на 127.0.0.1
- 26
- Ходов в локальном API
- 8
- Прав, которые несёт ключ сервера
- 13
- Событий, о которых придёт вызов
Где работает интерфейс
Локальный API это небольшой веб-сервер внутри программы. Ваши программы на той же машине зовут его по петле и получают ответ.
Всё, с чем он работает, лежит у вас на диске: профили, куки, движок и мост прокси. Пропала сеть, а ваши сценарии зовут по-прежнему, и сама программа держится без сети сутки.
Вести профили из своей программы
Перечислить, создать, запустить, остановить и удалить, не трогая окно.
Подключить Puppeteer, Playwright или Selenium
В ответ вы получаете адрес отладки именно этого профиля.
Запускать сохранённые сценарии снаружи
Ваше расписание или сборочный сервер запускает сценарий по названным профилям.
Дать работать помощнику ИИ
Через встроенный сервер MCP помощник ИИ берёт те же ходы, и интерфейс должен быть включён.
Переключатель и токен
Интерфейс выключен, пока вы его не включите, потому что включение открывает порт. При первом запуске программа выписывает себе случайный токен, 24 байта в виде 48 знаков, в файл, доступный только вашей учётной записи.
Токен вы передаёте тремя путями: параметром в адресе, своим заголовком или общим заголовком доступа. Обновив токен, вы остановите каждый сценарий со старым, поэтому программа сперва спрашивает подтверждение.
- 1
Откройте экран «Для программистов»
На нём переключатель, адрес, токен и список ходов.
- 2
Нажмите «Включить локальный API»
Вы должны увидеть «Запущен», а если обычный порт занят, панель назовёт тот, который взяла.
- 3
Скопируйте адрес и токен
Панель даёт готовую строку вызова с вашим собственным токеном внутри.
- 4
Наведите на него свой сценарий
Каждый ваш вызов, кроме хода состояния, несёт токен, а на неверный вы получите 401.

Почему страница не дозвонится
Привязка к петле похожа на границу. Границей она не является: страницы, которые вы открываете, работают на этом же компьютере и до того же адреса дотянутся.
Поэтому со страницы в браузере до него не дозвониться: программа узнаёт такой вызов и отвечает отказом. Доменное имя, наведённое на петлю, тоже не поможет: оно приходит под своим именем и получает отказ.
За той же проверкой стоит и ход состояния
Ходы и один конверт
В ответе вы найдёте три поля: код, содержимое и сообщение. При удаче код равен нулю, а при отказе вы получаете причину. Особняком стоит вопрос о состоянии интерфейса: он отвечает своей короткой формой и полей содержимого с сообщением не несёт.
Ветвитесь по коду в конверте, а не по состоянию HTTP: состоянием отвечают отказы на входе, а отказ по существу приходит двухсотым с ненулевым кодом. Тело больше мегабайта интерфейс не обрезает: ответ 413 с payload_too_large, а загрузка куки, одноразовый профиль и ввоз принимают до 16 МБ.
- Вызов
- curl -H x-api-token:YOUR_TOKEN http://127.0.0.1:50325/api/v1/browser/list
- Конверт
- { code: 0, msg: success, data: { list: [ ... ] } }
- Один профиль
- profileId, name, scenario, group, fingerprintTemplate, tags, notes, status, lastUsedAt, launches, runTimeMs, running
- Его поле прокси
- protocol, host, port. Ни логина, ни пароля
- Неверный токен
- HTTP 401, { code: -401, msg: unauthorized }
- Вызов со страницы
- HTTP 403, { code: -403, msg: forbidden }
На незнакомый путь вы получите 404. Токен можно везти и параметром адреса, и в заголовке доступа.
| Ход | Способ | Что делает |
|---|---|---|
| /status | GET | Говорит, что программа поднята, и называет версию. Единственный ход без токена. |
| /api/v1/browser/list | GET | Ваши профили, каждый со своим нынешним состоянием. |
| /api/v1/profile/list | GET, POST | Тот же набор с отбором, порядком и страницами; POST берёт длинный список номеров телом. |
| /api/v1/profile/quick | POST | Заводит одноразовый профиль и открывает его; после закрытия он удаляется. |
| /api/v1/browser/start | POST | Открывает профиль и отвечает адресом отладки. Профиль, закреплённый за ядром, которого на этом компьютере нет, не открывается и отвечает kernel_missing, а если выбран встроенный движок или ARMANOS Browser не запустился, kernel_builtin. |
| /api/v1/browser/stop | POST | Закрывает все окна профиля и говорит, сколько закрыл. |
| /api/v1/browser/active | GET | Номера профилей, открытых прямо сейчас. |
| /api/v1/profile/create | POST | Создаёт профиль через те же ворота нормы, что и окно. Без presetId его заполняет заготовка по умолчанию этого компьютера, а присланное в теле сильнее; presetId none даёт профиль без заготовки. Заготовка, которую нельзя применить, отвечает preset_not_found, preset_no_free_proxy или preset_password_needs_account. |
| /api/v1/profile/update | POST | Меняет только присланные поля, с теми же проверками, что у окна. Где эта версия программы не может менять ручные значения и ядро профиля аккаунта, ответ fp_edit_paused. |
| /api/v1/profile/delete | POST | Кладёт профиль в корзину. |
| /api/v1/profile/unlock | POST | Открывает закрытый паролем профиль на один запуск или до закрытия ARMANOS. |
| /api/v1/profile/lock | POST | Сразу закрывает профиль с паролем снова. |
| /api/v1/profile/password | POST | Ставит или меняет пароль профиля. |
| /api/v1/profile/password/remove | POST | Снимает пароль, если назван нынешний. |
| /api/v1/profile/code | GET | Нынешний разовый код для профиля с сохранённым ключом 2FA. |
| /api/v1/profile/cookies | GET | Куки одного профиля, в JSON или в тексте Netscape. |
| /api/v1/profile/cookies/export | POST | Куки до 100 профилей с ответом по каждому. |
| /api/v1/profile/cookies/import | POST | Загружает куки в профиль, открытый или закрытый. |
| /api/v1/profile/export | POST | Настройки прямо в ответе или полные архивы с сессией, до 100 профилей. |
| /api/v1/profile/import | POST | Возвращает профили из настроек или архивов с ответом по каждому. |
| /api/v1/proxy/list | GET | Узлы, порты и логины сохранённой библиотеки вместе с итогом последней проверки, но никогда пароли. |
| /api/v1/preset/list | GET | Заготовки этого компьютера: номер для presetId в profile/create и какая из них по умолчанию. |
| /api/v1/flow/list | GET | Сохранённые сценарии с числом шагов в каждом. |
| /api/v1/flow/run | POST | Запускает сценарий по названным вами профилям. |
| /api/v1/app/state | GET | Вошла ли программа и кем, движок, открытые профили и видеокарта. |
| /api/v1/app/login | POST | Входит в аккаунт кодом из кабинета, почтой с паролем или ключом аккаунта. |
Запуск профиля из программы
Номер профиля можно передать и в теле, и в строке запроса: оба примера ниже передают его строкой запроса, и переделывать их не придётся. Можно попросить прогон без окна, а если не просить ничего, решает настройка самого профиля.
Три движка, три ответа
Что вернётся, зависит от движка. На ARMANOS Browser у каждого профиля свой адрес отладки, отделённый от всех остальных.
Движок ARMANOS Browser
Порт и адрес сокета только для этого профиля. Подключайте свою библиотеку прямо к нему.
Встроенный движок
Один общий порт на всю программу, названный в ответе вместе с предупреждением, что он общий.
Ни того, ни другого
Вы получаете ответ о том, что адреса отладки нет и почему, а не пустое поле.
Интерфейс проходит те же ворота
Интерфейс это не чёрный ход. Профиль, созданный вызовом, проходит ту же проверку лицензии и нормы, что и созданный кнопкой в окне, и запустить его без лицензии не выйдет ни там, ни там.
Запуская сценарий, вы получите обратно номера профилей, которых программа не знает, а если в работу не взят ни один, это отказ, а не удача.
Удаление через интерфейс это корзина
Ключи сервера и их права
Токен выше ведёт одну установку на одном компьютере. Ключ сервера это другое: он говорит с нашим сервером откуда угодно и окна браузера не открывает никогда.
Ключ вы видите один раз, при создании, а у себя мы держим ровно столько, чтобы отличать ваши ключи друг от друга. Ключи входят в платные тарифы, живых можно держать 20, а смена тарифа доходит до ключа за минуту.
| Право | Что открывает |
|---|---|
| profiles:read | Список профилей и поиск по нему: отбор, порядок и страницы. |
| profiles:write | Создать, править и удалить профиль. |
| browser:run | Отметить профиль открытым или закрытым на сервере, без права его править. |
| proxies:read | Сохранённый список прокси, без паролей. |
| proxies:write | Создать, править и удалить прокси, если роль человека это позволяет. |
| flows:read | Список сохранённых сценариев. |
| logs:read | То, что показывают вкладки «Действия», «Сессии профилей» и «Журнал IP», и правила подозрений. |
| app:signin | Входить в программу ARMANOS на сервере, устройством, которое занимает место. По умолчанию не отмечено; вход ключом не выпускает ключей, не меняет пароль и не трогает оплату. |
Вызовы вашего сервера
Вызов это наш сервер, который зовёт ваш, когда в вашем пространстве что-то произошло. Подписки заводит человек, вошедший паролем, а не ключ, и новая заводится только после повторного ввода пароля и числа второго шага, если он включён. Держать их можно до десяти.
Каждый вызов подписан, и поля с именами, похожими на доступы, до вашего приёмника не доезжают. Код приглашения или ссылка на смену пароля не уезжают на чужой сервер.
Профили
profile.create, profile.update, profile.delete, profile.start, profile.stop, profile.transfer.accept
Прокси
proxy.create, proxy.update, proxy.delete
Ключи
apikey.create, apikey.revoke
Команда
team.invite, team.remove
Деньги
plan.change
Как выглядит доставка
К неудачам доставка честна: три попытки, повтор при ошибке сервера, при отказе «слишком часто» и когда ответа не было вовсе, и последнее состояние вы видите на самой подписке. После пятнадцати неудач подряд подписка выключает сама себя.
- Способ
- POST, Content-Type application/json
- X-Armanos-Event
- profile.start
- X-Armanos-Timestamp
- Секунды Unix, они же часть подписи
- X-Armanos-Signature
- sha256=... HMAC от времени и тела
- Тело
- { id, event, createdAt, data }
- Доставка
- Хотя бы один раз. Храните id и отбрасывайте повторы
За переадресацией мы не идём: ответ, наводящий обратно на петлю, отменил бы проверку адреса. Пробная отправка помечена как проба, чтобы у вас не завёлся призрачный профиль.
Адрес сверяется перед каждой отправкой
Чего это не делает
- Локальный API дотягивается только до той копии ARMANOS, что стоит на этом компьютере. Хода из облака, открывающего у вас окно, нет, и ключ сервера ничего не запускает: он лишь отмечает профиль занятым и пишет журнал.
- Локальный токен один на весь интерфейс. У него нет ни прав по ходам, ни срока годности, и его обновление разом останавливает все ваши сценарии.
- У локального API нет своего предела запросов. Он доверяет машине, на которой работает, поэтому от чужого вызова вас там берегут только проверка на страницу и токен.
- Ключом сервера нельзя завести ни ключ, ни подписку, а любой ход без объявленного права закрыт ключу целиком. Корзина, показ отпечатка, смена и проверка прокси, правка сценариев доступны только входу паролем.
- Доставка вызова идёт «хотя бы один раз», и в теле едут лишь поля, оставшиеся после вырезания доступов. Ваш приёмник обязан отбрасывать повторы по id и сам запрашивать предмет, когда события ему мало.
Как проверить
Каждое утверждение на этой странице взято из файла, который можно открыть, и почти каждое держит стенд, который исполняется.
- Локальный API отвергает запросы со следами страницы, и /status стоит за той же проверкой
- apps/desktop/src/lib/local-api.js · apps/desktop/test/local-api-gate.js
- Незащищённый порт отладки уровня программы открывается только для встроенного движка
- apps/desktop/src/main/main.js · apps/desktop/test/cdp-port-only-when-needed.js
- Токен случаен на каждой установке, а интерфейс изначально выключен
- apps/desktop/src/lib/api-config.js · apps/desktop/src/main/main.js
- Ключи сервера платные, и каждое право охраняет настоящий ход
- apps/server/src/api-keys/api-keys.service.ts · apps/server/test/ключи-платные.js · apps/server/test/права-ключей-живые.js
- Вызовы подписаны, их нельзя навести внутрь нашей сети, а неудачи записываются
- apps/server/src/webhooks/webhook-dispatch.service.ts · apps/server/test/webhooks.js · apps/web/test/webhooks-web.js
Вопросы
- Что будет, если обычный порт уже занят?
- Сервер возьмёт свободный порт, а панель его назовёт. Ваши сценарии по-прежнему смотрят на старый адрес, поэтому после перезапуска читайте панель, а не полагайтесь на 50325. Сервер MCP ищет новый порт сам.
- По какому ответу видно, что кончилась оплата, а не права?
- 402 означает, что кончилось оплаченное время, 401 что ключ негоден или отозван, 403 что не хватает права. Три разных кода, чтобы программа действовала, а не гадала.
- Может ключ завести другой ключ?
- Нет. Ключи и подписки заводит только человек, вошедший паролем, поэтому один утёкший ключ не наплодит новых. А новый ключ и новая подписка к тому же заводятся только после повторного ввода своего пароля и числа второго шага, если он включён. Блокировка учётной записи гасит её ключи на ближайшем вызове.
- Что дают два набора для разработчика?
- Один для Node и один файл для Python, который не тянет ничего вне стандартной библиотеки. Оба берут ключ и адрес из окружения, сдаются через 30 секунд и возвращают типизированные ошибки, а не сообщение, которое могут перевести.
- Как проверить подпись вызова у себя?
- Оба набора несут эту проверку: она сравнивает за постоянное время и отвергает всё старше 300 секунд. Без неё любой, кто узнал ваш адрес, пришлёт вам выдуманное событие.
- Видно ли в журнале, что это сделал сценарий, а не человек?
- Да. Когда вызов приходит через ключ, в строке журнала вы увидите и номер ключа, поэтому один утёкший ключ не означает отзыв всех остальных.
Читать дальше
MCP для помощников ИИ
Встроенный сервер, который отдаёт помощнику ИИ те же самые ходы.
Сборщик сценариев
Те самые сценарии, которые вы запускаете снаружи.
Расписание
Работает внутри программы по часам, если своё писать не хочется.
Тарифы и цены
В каких тарифах есть ключи и сколько стоит место или лишний профиль.
Включите и позовите уже сегодня
Экран «Для программистов» есть в каждой сборке. Включите в программе локальный API и наведите свой сценарий на 127.0.0.1.