Lovely RouterДокументация
Получить ключ
Справочник API

Эндпоинты браузера

Все эндпоинты /v1/browser для запусков, секретов в хранилище, файлов и профилей — с параметрами, лимитами, ответами и ошибками.

API браузерного агента находится под https://lovelyrouter.com/v1/browser. Аутентифицируйте каждый запрос API-ключом в виде Authorization: Bearer $LOVELY_API_KEY (Аутентификация). Тела запросов и ответов — JSON, кроме загрузки файлов и скриншотов. Запуски оплачиваются с предоплаченного баланса; см. Режимы, модели и цены.

Пошаговое введение — в обзоре браузерного агента.

Объект запуска#

Запуск — это одна задача для агента. Каждый эндпоинт запусков возвращает этот объект. Поля с пометкой только API отсутствуют в данных вебхуков.

Атрибуты

idstring

Уникальный id: brun_ и 24 символа.

objectstring

Всегда browser_run.

statusstring

running, waiting_for_human, succeeded, failed, timed_out или stopped.

goalstring

Отправленная вами цель.

start_urlstring

URL, с которого начался запуск.

enginestring

Всегда chromium.

modestring

fast или accurate.

modelstring | null

Модель, выбранная через model, или null для включённых моделей.

model_usdnumber

Только если вы выбрали model: сколько уже стоили её токены, включая надбавку 20%.

stepsinteger

Записанные на данный момент шаги, включая паузы для человека. Паузы не тарифицируются.

max_stepsinteger

Лимит шагов запуска.

billable_time_sinteger

Секунды сверх включённой минуты каждого шага и каждой паузы на данный момент.

time_usdnumber

Стоимость billable_time_s по $0.005 за минуту.

current_urlstring

Страница, на которой находится браузер или находился в момент завершения запуска.

answerstring | null

Ответ агента после завершения. Запуски, дошедшие до max_steps, тоже получают ответ по последней странице.

dataobject | array | null

Структурированный вывод после завершения запуска, если вы передали output_schema или цель просила структуру. См. Структурированный вывод.

data_errorstring

Есть только при сбое структурированного вывода, с причиной.

errorstring | null

Почему запуск не завершился успешно, например reached the step limit (50), blocked by the website, no human response within 30 minutes, stopped by the user.

needsobject | null

Чего ждёт запуск, когда status равен waiting_for_human. Иначе null.

profile_savedobject | null

С save_profile — профиль, сохранённый при завершении запуска: id, name и cookies (число сохранённых cookie).

usageobject

decision_calls и llm_calls: сколько вызовов моделей сделал агент. Для информации; входит в цену шага.

created_atstring

Когда начался запуск (ISO 8601).

finished_atstring | null

Когда запуск завершился.

tracearray

Только с ?trace=1. По записи на шаг: step, url, action (например click:e12, type:e3, choose:e5, secret:e4:shop_password, upload:e9, back, done, или ask, approval, handoff для пауз), description, ms (длительность) и error (null или причина сбоя шага).

charge_usdnumber | null

Только API. Стоимость запуска после расчёта, который происходит через несколько секунд после его завершения. До этого null.

reserved_usdnumber

Только API. Сумма, зарезервированная, пока запуск идёт; 0 после расчёта.

The run object
{
  "id": "brun_3f9a1c7e0b2d4e6f8a9b0c1d",
  "object": "browser_run",
  "status": "succeeded",
  "goal": "Find the price of the book \"A Light in the Attic\" and whether it is in stock.",
  "start_url": "https://books.toscrape.com/",
  "engine": "chromium",
  "mode": "fast",
  "model": null,
  "steps": 2,
  "max_steps": 50,
  "billable_time_s": 0,
  "time_usd": 0,
  "current_url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
  "answer": "\"A Light in the Attic\" costs £51.77 and is in stock (22 available).",
  "data": null,
  "error": null,
  "needs": null,
  "profile_saved": null,
  "usage": { "decision_calls": 3, "llm_calls": 1 },
  "created_at": "2026-10-11T09:30:00.000Z",
  "finished_at": "2026-10-11T09:30:07.000Z",
  "trace": [
    {
      "step": 1,
      "url": "https://books.toscrape.com/",
      "action": "click:e54",
      "description": "click link \"A Light in the ...\" → https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
      "ms": 2140,
      "error": null
    },
    {
      "step": 2,
      "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
      "action": "done",
      "description": "Read the result and wrote the answer",
      "ms": 2875,
      "error": null
    }
  ],
  "charge_usd": 0.012,
  "reserved_usd": 0
}

Создание запуска#

POST/v1/browser/runs

Начинает запуск и сразу возвращает 202 с объектом запуска. Агент работает в фоне; следите за ним через поток событий, Получение запуска или вебхук. Старт запуска резервирует его максимальную стоимость на вашем балансе (как работает резерв).

В ответе также есть poll — готовый путь для проверки статуса с ?wait=30, events — поток событий запуска, и webhook_secret, если вы передали webhook. webhook_secret возвращается только здесь (или в первом событии потокового старта).

С "stream": true ответ вместо этого — 200 с потоком событий запуска от начала и до завершения. См. События и экран в реальном времени.

Параметры тела запроса

goalstringОбязательно

Что сделать, простыми словами, со всеми значениями, которые нужны задаче. До 4 000 символов. См. Как писать работающие цели.

start_urlstringОбязательно

Первая страница, которую нужно открыть. URL http или https.

modestringПо умолчанию fast

fast ($0.006 за шаг) или accurate ($0.012 за шаг: при сомнениях также смотрит на скриншоты и может выполнять код страницы только для чтения). См. Режимы.

max_stepsintegerПо умолчанию 50

Лимит шагов, от 1 до 100. Значения вне диапазона приводятся к его границам. Запуск оплачивается только за сделанные шаги.

output_schemaobject

JSON Schema (draft 2020-12) или сокращённая запись вроде {"title": "string", "items": [{"name": "string"}]} для JSON в data. До 20 КБ.

approvestringПо умолчанию risky

Когда делать паузу для подтверждения перед действием, которое что-то отправляет (кнопка отправки, кнопка покупки/бронирования/оплаты/отправки/удаления или Enter в форме, не являющейся поиском): risky (только покупки, заказы, отправка, удаление, заявки), submit (каждое такое действие) или none. Любое другое значение возвращает 400.

humanbooleanПо умолчанию true

Может ли агент задавать вопросы и передавать браузер человеку. Задайте false для запусков без присмотра.

human_timeout_minutesnumberПо умолчанию 30` (`5` для запуска

Сколько каждая пауза ждёт ответа, от 1 до 1 440 минут. Значения вне диапазона приводятся к его границам. Затем запуск завершается как timed_out.

secretsarray

Имена секретов из хранилища, которые агент может вводить.

ephemeral_secretsobject

Секреты только для этого запуска, удаляются при его завершении. Отображение имени (те же правила, что для имён в хранилище) в:

filesarray | string

Имена или id загруженных файлов, которые агент может прикреплять, или "*" для всех.

profilestring

Имя или id сохранённого профиля, с которого нужно начать.

save_profilestring

Сохранить cookie и локальное хранилище сессии под этим именем при завершении запуска. До 64 символов.

allowed_domainsarray

Имена хостов, которые может посещать браузер, например "example.com" или "*.example.com". До 50.

webhookstring

URL https, который получает события run.waiting и run.finished.

modelstring

Id модели из GET /v1/models, например claude-sonnet-5.5, для рассуждений, написания текста и извлечения данных агентом. Её токены оплачиваются по обычной цене плюс 20%.

max_model_usdnumber

С model: максимум, который могут стоить её токены, включая надбавку. По умолчанию — оценка по max_steps и ценам модели.

streambooleanПо умолчанию false

true возвращает поток событий запуска (text/event-stream) вместо JSON с 202.

screenbooleanПо умолчанию false

Со stream: добавить события frame с экраном браузера.

curl https://lovelyrouter.com/v1/browser/runs \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "goal": "Find the price of the book \"A Light in the Attic\" and whether it is in stock.",
    "start_url": "https://books.toscrape.com/"
  }'
Response
{
  "id": "brun_3f9a1c7e0b2d4e6f8a9b0c1d",
  "object": "browser_run",
  "status": "running",
  "goal": "Find the price of the book \"A Light in the Attic\" and whether it is in stock.",
  "start_url": "https://books.toscrape.com/",
  "engine": "chromium",
  "mode": "fast",
  "model": null,
  "steps": 0,
  "max_steps": 50,
  "billable_time_s": 0,
  "time_usd": 0,
  "current_url": "https://books.toscrape.com/",
  "answer": null,
  "data": null,
  "error": null,
  "needs": null,
  "profile_saved": null,
  "usage": { "decision_calls": 0, "llm_calls": 0 },
  "created_at": "2026-10-11T09:30:00.000Z",
  "finished_at": null,
  "poll": "/v1/browser/runs/brun_3f9a1c7e0b2d4e6f8a9b0c1d?wait=30",
  "events": "/v1/browser/runs/brun_3f9a1c7e0b2d4e6f8a9b0c1d/events",
  "charge_usd": null,
  "reserved_usd": 0.445
}

Получение запуска#

GET/v1/browser/runs/{id}

Возвращает объект запуска. С wait запрос удерживается, пока не изменится статус запуска (или вид паузы) либо пока не пройдёт wait секунд, а затем возвращает текущее состояние. Пока запуск в состоянии waiting_for_human, ответ приходит сразу.

Параметры запроса

waitintegerПо умолчанию 0

Сколько секунд удерживать запрос, пока запуск в состоянии running, до 50.

tracestring

1 добавляет trace — список шагов на данный момент.

curl "https://lovelyrouter.com/v1/browser/runs/brun_3f9a1c7e0b2d4e6f8a9b0c1d?wait=30&trace=1" \
  -H "Authorization: Bearer $LOVELY_API_KEY"

Ответ — объект запуска, с trace, если вы передали trace=1.

Поток событий запуска#

GET/v1/browser/runs/{id}/events

Возвращает события запуска в реальном времени как Server-Sent Events (text/event-stream), пока запуск не завершится. Первое событие — объект запуска с trace; затем activity (что агент делает сейчас), step (каждый завершённый шаг), run (после каждого шага, а также при начале и конце паузы) и, со screen, frame (экран браузера). Последние события — завершённый запуск с charge_usd и end. Уже завершённый запуск сразу присылает своё событие run и end. Строки, начинающиеся с :, — комментарии для поддержания соединения. См. События и экран в реальном времени.

Параметры запроса

screenstring

1 добавляет события frame: data (JPEG браузера в base64) и at. Одно при подключении, затем при каждом изменении страницы, не чаще примерно 4 в секунду.

Событиеdata
runОбъект запуска с charge_usd и reserved_usd; в первом есть trace
activitystep, kind (starting, reading, waiting, deciding, thinking, checking, acting, answering, extracting) и text
stepОдна запись trace
framedata (JPEG в base64) и at
endid
cURL
curl -N "https://lovelyrouter.com/v1/browser/runs/brun_3f9a1c7e0b2d4e6f8a9b0c1d/events?screen=1" \
  -H "Authorization: Bearer $LOVELY_API_KEY"
Response
event: run
data: {"id":"brun_3f9a1c7e0b2d4e6f8a9b0c1d","object":"browser_run","status":"running","steps":1,"trace":[…],…}

event: frame
data: {"data":"/9j/4AAQSkZJRgABAQ…","at":"2026-10-11T09:30:03.120Z"}

event: activity
data: {"step":2,"kind":"answering","text":"Reading the result and writing the answer"}

event: step
data: {"step":2,"url":"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html","action":"done","description":"Read the result and wrote the answer","ms":2875,"error":null}

event: run
data: {"id":"brun_3f9a1c7e0b2d4e6f8a9b0c1d","status":"succeeded","answer":"\"A Light in the Attic\" costs £51.77 and is in stock (22 available).","charge_usd":0.012,…}

event: end
data: {"id":"brun_3f9a1c7e0b2d4e6f8a9b0c1d"}

Список запусков#

GET/v1/browser/runs

Возвращает 50 последних запусков браузерного агента, сначала новые, в краткой форме. Полное состояние даёт получение запуска.

ПолеЗначение
idId запуска
billing_statusrunning, пока запуск не рассчитан, затем succeeded, failed, timed_out или stopped
goalПервые 200 символов цели
stepsОплаченные шаги, 0, пока запуск не рассчитан
created_atКогда начался запуск
cURL
curl https://lovelyrouter.com/v1/browser/runs \
  -H "Authorization: Bearer $LOVELY_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "id": "brun_3f9a1c7e0b2d4e6f8a9b0c1d",
      "billing_status": "succeeded",
      "goal": "Find the price of the book \"A Light in the Attic\" and whether it is in stock.",
      "steps": 2,
      "created_at": "2026-10-11T09:30:00.000Z"
    }
  ]
}

Ответ запуску#

POST/v1/browser/runs/{id}/reply

Отвечает запуску в состоянии waiting_for_human. Отправляйте ровно один вид ответа, соответствующий needs.kind. Возвращает 200 с объектом запуска, status которого снова running. См. Человек в контуре.

Параметры тела запроса

answerstring

Для question: текст, который прочитает агент. До 2 000 символов.

secretstring

Для question: значение, которое агент введёт на текущем сайте, не видя его. До 4 096 символов. Его можно ввести в любое текстовое поле на этом сайте, включая поля пароля и PIN.

approveboolean

Для approval: true — разрешить агенту нажать кнопку, false — отказать.

denyboolean

Для approval: true равнозначно "approve": false.

reasonstring

При отказе: почему, чтобы агент прочитал. До 500 символов.

doneboolean

Для takeover: true, когда человек закончил. Агент продолжает с текущей страницы.

failedboolean

Для takeover: true, когда человек не смог закончить.

notestring

С done или failed: что сделал человек, чтобы агент прочитал. До 500 символов.

Ошибки: 400, если тело не соответствует ни одной форме ответа, 409 This run is not waiting for a reply и 409 This run is waiting for a reply of kind "question" (или approval, takeover), если ответ не соответствует паузе.

cURL
curl https://lovelyrouter.com/v1/browser/runs/brun_5b7d9f1a3c5e7a9b1d3f5a7c/reply \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{"secret": "481923"}'
Reply bodies
{"answer": "Use the billing address."}
{"approve": true}
{"approve": false, "reason": "Wrong delivery date"}
{"done": true, "note": "Solved the CAPTCHA"}
{"failed": true, "note": "The site asked for a phone call"}

Перехват управления#

POST/v1/browser/runs/{id}/takeover

Просит запуск передать вам браузер после текущего шага. Возвращает 202 с объектом запуска. Следующий статус показывает waiting_for_human с needs.kind, равным takeover, и live_view_url. Верните управление ответом {"done": true}.

Если запуск ждёт ответа на вопрос или подтверждения, перехват начнётся после того, как вы ответите. Завершённый запуск возвращает 409 с This run has finished.

Параметры тела запроса

instructionsstring

Показывается как prompt паузы. До 500 символов. По умолчанию: The user asked to take over the browser.

cURL
curl https://lovelyrouter.com/v1/browser/runs/brun_5b7d9f1a3c5e7a9b1d3f5a7c/takeover \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{"instructions": "I will pick the delivery slot myself."}'

Остановка запуска#

POST/v1/browser/runs/{id}/stop

Останавливает запуск. Он завершается как stopped на границе следующего шага или сразу, если ждёт человека. Возвращает 202 с объектом запуска в прежнем состоянии; следующий статус показывает stopped. Остановленный запуск оплачивает сделанные шаги и не возвращает data.

cURL
curl -X POST https://lovelyrouter.com/v1/browser/runs/brun_3f9a1c7e0b2d4e6f8a9b0c1d/stop \
  -H "Authorization: Bearer $LOVELY_API_KEY"

Получение скриншота#

GET/v1/browser/runs/{id}/screenshot

Возвращает JPEG (image/jpeg) браузера. Пока у запуска открыт браузер, это экран в текущий момент; иначе — последний сохранённый: страница в момент начала паузы для человека или финальная страница завершённого запуска. Этот путь содержится в needs.screenshot. Если скриншота нет, возвращает 404 с No screenshot yet. Чтобы следить за экраном непрерывно, подпишитесь на поток событий запуска с screen=1.

cURL
curl https://lovelyrouter.com/v1/browser/runs/brun_5b7d9f1a3c5e7a9b1d3f5a7c/screenshot \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -o screen.jpg

Сохранение секрета#

PUT/v1/browser/vault/{name}

Сохраняет секрет, доступный только для записи, или заменяет секрет с этим именем. Агент может вводить его только на перечисленных origin, а модель никогда его не видит. См. Логины, секреты и профили.

Параметры пути

namestringОбязательно

От 1 до 64 символов: строчные a-z, 0-9, _, ., -, начиная с буквы или цифры.

Параметры тела запроса

valuestringОбязательно

Секрет, до 4 КБ (для больших значений возвращается 413). Для totp: seed в base32 (16+ символов из A-Z, 2-7).

kindstringПо умолчанию password

password (только поля пароля), username или text (текстовые поля, но не поля пароля) либо totp (вводится как текущий 6-значный код).

originsarrayОбязательно

От 1 до 20 origin, например https://github.com или https://*.example.com. Только https, кроме http://localhost и http://127.0.0.1.

cURL
curl -X PUT https://lovelyrouter.com/v1/browser/vault/github_password \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{"value": "correct-horse-battery-staple", "kind": "password", "origins": ["https://github.com"]}'
Response
{ "name": "github_password", "kind": "password", "origins": ["https://github.com"], "stored": true }

Список секретов#

GET/v1/browser/vault

Выводит ваши секреты по именам, без значений.

cURL
curl https://lovelyrouter.com/v1/browser/vault \
  -H "Authorization: Bearer $LOVELY_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "name": "github_password",
      "kind": "password",
      "origins": ["https://github.com"],
      "created_at": "2026-10-11T09:00:00.000Z",
      "updated_at": "2026-10-11T09:00:00.000Z",
      "last_used_at": "2026-10-11T09:12:31.000Z"
    }
  ]
}

Удаление секрета#

DELETE/v1/browser/vault/{name}

Удаляет секрет. Запуски, в которых он указан, больше не смогут его вводить. Если секрета нет, возвращает 404 с No such secret.

cURL
curl -X DELETE https://lovelyrouter.com/v1/browser/vault/github_password \
  -H "Authorization: Bearer $LOVELY_API_KEY"
Response
{ "deleted": "github_password" }

Загрузка файла#

PUT/v1/browser/files/{name}

Загружает файл, который агент может прикреплять к формам, или заменяет файл с этим именем (сохраняя его id). Отправьте «сырые» байты в теле, а тип файла — в Content-Type. См. Загрузка файлов.

Параметры пути и запроса

namestringОбязательно

В пути, в URL-кодировке. От 1 до 128 символов: буквы, цифры, пробелы и . _ - ( ) + ,, начиная с буквы, цифры или _.

descriptionstring

Параметр запроса. Что это за файл, чтобы агенту было проще выбрать. До 300 символов.

Файлы ограничены 10 МБ (413) и 100 штуками на аккаунт (409 file limit reached (100); delete some first).

cURL
curl -X PUT "https://lovelyrouter.com/v1/browser/files/Maria_Garcia_CV_2026.pdf?description=Resume" \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/pdf" \
  --data-binary @Maria_Garcia_CV_2026.pdf
Response
{
  "id": "file_7a3c9e1b5d2f8a4c6e0b",
  "name": "Maria_Garcia_CV_2026.pdf",
  "mime": "application/pdf",
  "bytes": 84213,
  "sha256": "5f2b8c…",
  "description": "Resume",
  "created_at": "2026-10-11T09:20:44.000Z",
  "last_used_at": null
}

Загрузка файла через форму#

POST/v1/browser/files

То же, что Загрузка файла, но как multipart/form-data. Возвращает тот же объект файла.

Поля формы

filefileОбязательно

Сам файл. Его тип берётся из типа содержимого части.

namestring

Имя, под которым его сохранить. По умолчанию — имя загруженного файла.

descriptionstring

Что это за файл. До 300 символов.

cURL
curl https://lovelyrouter.com/v1/browser/files \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -F "file=@Maria_Garcia_CV_2026.pdf;type=application/pdf" \
  -F "description=Resume"

Список файлов#

GET/v1/browser/files

Выводит ваши загруженные файлы, отсортированные по имени. last_used_at — когда запуск в последний раз прикреплял файл.

cURL
curl https://lovelyrouter.com/v1/browser/files \
  -H "Authorization: Bearer $LOVELY_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "id": "file_7a3c9e1b5d2f8a4c6e0b",
      "name": "Maria_Garcia_CV_2026.pdf",
      "mime": "application/pdf",
      "bytes": 84213,
      "sha256": "5f2b8c…",
      "description": "Resume",
      "created_at": "2026-10-11T09:20:44.000Z",
      "last_used_at": "2026-10-11T09:47:10.000Z"
    }
  ]
}

Удаление файла#

DELETE/v1/browser/files/{name}

Удаляет файл по имени или id. Если файла нет, возвращает 404 с No such file.

cURL
curl -X DELETE https://lovelyrouter.com/v1/browser/files/Maria_Garcia_CV_2026.pdf \
  -H "Authorization: Bearer $LOVELY_API_KEY"
Response
{ "deleted": "Maria_Garcia_CV_2026.pdf" }

Список профилей#

GET/v1/browser/profiles

Выводит ваши сохранённые сессии, сначала недавно обновлённые. Запуск создаёт или обновляет профиль через save_profile и начинает с профиля через profile. origins — сайты, для которых в профиле есть cookie или локальное хранилище; bytes — его размер.

cURL
curl https://lovelyrouter.com/v1/browser/profiles \
  -H "Authorization: Bearer $LOVELY_API_KEY"
Response
{
  "object": "list",
  "data": [
    {
      "id": "prof_4c1e9a7b2d0f3e5a8b6c",
      "name": "shop-login",
      "origins": ["https://shop.example.com"],
      "bytes": 18342,
      "created_at": "2026-10-10T16:02:11.000Z",
      "updated_at": "2026-10-11T09:15:40.000Z",
      "last_used_at": "2026-10-11T09:14:58.000Z"
    }
  ]
}

Удаление профиля#

DELETE/v1/browser/profiles/{id}

Удаляет профиль по id или имени. Если профиля нет, возвращает 404 с No such profile.

cURL
curl -X DELETE https://lovelyrouter.com/v1/browser/profiles/shop-login \
  -H "Authorization: Bearer $LOVELY_API_KEY"
Response
{ "deleted": "shop-login" }

Ошибки#

Ошибки возвращают JSON-тело с type и понятным человеку message. В сообщениях указано поле, в котором ошибка. См. также Ошибки.

СтатусtypeКогда
400invalid_request_errorТело или параметр некорректны, например "goal" is required (max 4,000 characters), Unknown vault secret(s): …, Unknown file(s): …, Unknown profile "…".
401authentication_errorAPI-ключ отсутствует, недействителен, отозван или просрочен.
402insufficient_quotaБаланс меньше резерва запуска, или резерв превысит лимит расходов ключа.
404not_foundВ вашем аккаунте нет такого запуска, секрета, файла, профиля или скриншота.
409invalid_request_errorЗапуск не ждёт этого ответа, уже завершился, или у вас уже 100 файлов.
413invalid_request_errorФайл больше 10 МБ или секрет в хранилище больше 4 КБ.
429rate_limit_exceededУже идут 10 запусков (браузерного агента и инструментов данных вместе).
502tool_unavailableЗапуск не удалось начать. Плата не взята; попробуйте снова.
503tool_unavailableБраузерный агент временно недоступен.
Error
{
  "error": {
    "type": "invalid_request_error",
    "message": "\"start_url\" must be an http(s) URL"
  }
}