Перейти к содержанию
← На главную

Локальный 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].