Локальный API
Сверено с контрактом: сентябрь 2026
В разработке. Локального API нет в сборке, которую можно скачать сегодня: в каждом выпущенном Liminal порт не открыт и соединение отклоняется. Эта страница — контракт, по которому он пишется, опубликованный, чтобы скрипт можно было написать заранее. О сроках она не говорит ничего.
Скрипт на той же машине превращает браузер профиля в то, чем можно управлять. Первая версия интерфейса делает одно: отвечает, работает ли Liminal и вошёл ли в него кто-нибудь. Всё, что будет дальше — запуск профиля и адреса, к которым подключаются Puppeteer, Playwright и Selenium, — строится на том же сервисе, том же ключе и том же файле адреса, что описаны здесь.
Как включить
По умолчанию выключен и доступен только с этого компьютера.
- Переключатель
- Откройте
Settings → More Settings → API & Automationи включите Local API. Пока он выключен, никто не слушает: порт не открыт, и скрипт получает отказ в соединении, а не пустой ответ. - Только этот компьютер
- Сервис принимает соединения на
127.0.0.1и больше нигде. Другая машина в вашей сети до него не доберётся, и настройки, которая это открыла бы, нет: скрипт работает рядом с Liminal, а не обращается к нему по сети. - Порт
- По умолчанию
48361— свой порт Liminal, чтобы не столкнуться с другим браузером, который уже слушает на этой машине. Впишите другой или нажмите Random free port, и приложение выберет само. Изменение действует сразу, без перезапуска Liminal. - Если порт занят
- Когда порт не удалось занять, экран показывает Port in use, а файл адреса сообщает
port_in_use. Никто не слушает, пока вы не выберете другой порт, — и скрипт, который читает файл, отличает «выключено» от «не удалось запустить».
Ключ
Один ключ, показан один раз, лежит там, где система хранит секреты.
- Скопируйте, когда он появился
- При включении API выдаёт ключ из
64строчных шестнадцатеричных символов и показывает его один раз. Уйдёте со страницы — он скрыт: показать его снова приложение не может, только выдать новый. - Где он хранится
- В Keychain на macOS и в Credential Manager на Windows — не в файле настроек, не в снимке синхронизации, не в логах и не в файле адреса ниже. Свою копию держите так же, как любой другой секрет, которым пользуется скрипт.
- Как отозвать
- Regenerate key выдаёт новый ключ и сразу перестаёт принимать прежний — без перезапуска приложения и без смены порта. Скрипт, у которого остался старый ключ, получает отказ с первого же запроса.
- Как его передать
- Каждый запрос несёт ключ в одном заголовке:
Authorization: Bearerи сам ключ. Ни параметра в адресе, ни cookie для этого нет, а запрос без заголовка отклоняется так же, как запрос с неверным ключом.
Где скрипт берёт адрес
Приложение пишет свой адрес в файл, чтобы ничего не вводить дважды.
- Файл
- Экран настроек показывает абсолютный путь к
Local API/status.jsonвнутри каталога данных Liminal. Читайте его вместо того, чтобы зашивать порт: он следует и за портом, который вы задали, и за тем, который выбрал Random free port. - Что в нём
- Четыре поля —
enabled, status, address, port— и никаких секретов.{"enabled":true,"status":"running","address":"http://127.0.0.1:48361","port":48361} - Когда API выключен
- Файл остаётся на месте и сообщает об этом:
off, пустой адрес и нулевой порт. Та же форма, другое состояние — скрипт читает один файл и узнаёт всё.{"enabled":false,"status":"off","address":"","port":0} - Он заменяется целиком
- Любое изменение — включили или выключили API, сменили порт, порт не удалось занять — перезаписывает файл атомарно. Скрипт, который читает его в этот момент, видит либо прежнее содержимое, либо новое, но не обрезанную строку.
Запрос статуса
В этой версии один запрос: работает ли Liminal и вошёл ли в него кто-нибудь.
- Вызов
- GET на
/v1/statusпо адресу из файла, с ключом в заголовке.curl -H 'Authorization: Bearer <key>' http://127.0.0.1:48361/v1/status - Ответ
- HTTP
200, версия работающей сборки и признак того, вошёл ли кто-нибудь в приложение. ЛожныйsignedIn— не ошибка: API отвечает, а аккаунт понадобится операциям с профилями, которые появятся позже.{"status":"running","version":"<version>","signedIn":true} - Нет ключа или он отозван
- HTTP
401и кодinvalid_key— он постоянный, и ветвиться нужно по нему. Текст рядом — слова приложения для человека, который читает лог; считайте его текстом, который может измениться, а не частью контракта.{"error":{"code":"invalid_key","message":"Неверный ключ"}} - Обращайтесь ровно так, как написано в файле
- Используйте
127.0.0.1и порт из файла. Запрос, который пришёл с другим именем хоста, ответа не получит, даже если попал на тот же порт: сервис отвечает только на свой адрес. - Что делает прежний Liminal
- Ничего: порт не открыт, и скрипт получает отказ в соединении. Этот отказ и отличает сборку без локального API от сборки, где он выключен: во втором случае файл адреса существует и сообщает
off.
Что эта версия делает и чего не делает
Прямо, чтобы ничего здесь не читалось как обещание, которым оно не является.
- Пока только статус
- Список профилей, запуск и остановка, адрес CDP, к которому подключаются Puppeteer, Playwright и Selenium, — следующий шаг на этом же сервисе. В этой версии их нет, и страница дополнится, когда они появятся.
- На каких тарифах
- На всех, включая бесплатный. Локальный API — не платная ступень: скрипт на своей же машине и есть то, ради чего антидетект-браузер часто берут, и прятать это за тариф значило бы брать деньги за сам способ работы.Тарифы
- Как часто можно спрашивать
- Квоты, привязанной к тарифу, нет. Сервис защищает себя от потока запросов, и написанный под него скрипт этого не заметит.
- Профиль под автоматизацией — тот же профиль
- У него тот же отпечаток, тот же прокси и те же cookies, и в сеть он выходит через свой прокси точно так же, как когда вы открываете его руками. API — это вход, а не второй режим браузера.Данные и безопасность
Выпуск, который превратит эту страницу из контракта в функцию, будет в списке изменений. Вопрос о контракте до этого или значение, которое не совпало с тем, что делает ваша сборка: [email protected].