The fastest browser agent API we've tested

An AI agent that uses the web for you

Send a task and a URL. A real Chrome browser clicks, types, fills forms, logs in and returns the answer, plus structured JSON in your schema.

9.1s
median task, end to end
$0.006
per step in fast mode, no run fee
JSON
output in your schema
5.4×
faster than a leading browser agent

One request in, JSON out

Request
curl https://lovelyrouter.com/v1/browser/runs \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "goal": "Get the top 3 stories on the front page",
    "start_url": "https://news.ycombinator.com/",
    "output_schema": { "stories": [{ "title": "string", "url": "string", "points": "integer" }] }
  }'
Result (GET /v1/browser/runs/{id}?wait=30)
{
  "id": "brun_8f3c…",
  "status": "succeeded",
  "steps": 1,
  "answer": "The top 3 stories are …",
  "data": {
    "stories": [
      { "title": "Bitwarden Dual License Model", "url": "https://community.bitwarden.com/…", "points": 95 },
      { "title": "Talorys – A self-hosted personal AI agent…", "url": "https://github.com/rociiu/talorys", "points": 57 },
      { "title": "REA Reverse – Engineer Anything", "url": "https://rea.tools/", "points": 498 }
    ]
  },
  "charge_usd": 0.006
}

Hand it to your AI agent

Copy this prompt into Claude Code, Cursor, Codex or any coding agent. It tells the agent where the docs are and how to use your API key.

Use the Lovely Router browser agent API: a real browser that clicks, types, fills forms and logs in for a task, and returns an answer plus JSON in a schema I choose.

- Docs (read first): https://lovelyrouter.com/docs/browser-agent.md and https://lovelyrouter.com/docs/api/browser.md
- Start a run: POST https://lovelyrouter.com/v1/browser/runs with `{"goal": "...", "start_url": "https://...", "output_schema": {...}}`. Put every value the task needs in the goal. It returns 202 at once; poll the `poll` path (or stream `events`) until the run ends, then read `answer` and `data`.
- Billed per step (fast mode by default). Set `max_steps` to cap a run. For unattended runs send `"human": false`; by default the agent pauses before purchases, sending or deleting (`approve`).
- If you support MCP, you can instead connect the server https://lovelyrouter.com/mcp (Streamable HTTP, same key; https://lovelyrouter.com/docs/tools/mcp.md) and use suggest_tools, get_tool and run_tool.
- Auth: read my API key from the LOVELY_API_KEY environment variable and send it as `Authorization: Bearer $LOVELY_API_KEY`. Never print or commit the key. If it is not set, ask me to create one at https://lovelyrouter.com/app/keys.
- Billing is prepaid: every call is charged to my balance, so test with a small request before running anything large.
- Every docs page is plain Markdown; the full index is https://lovelyrouter.com/llms.txt.

My task: <describe the site and what the agent should do or extract>

Built for real websites

Watch it live

Stream each action, every finished step and the browser screen while the agent works, in the console or over the API.

Structured JSON output

Pass an output schema and get validated JSON in data, taken only from the pages the agent visited — including real link URLs.

Logins and 2FA

Write-only vault secrets, typed only on the sites you allow. TOTP seeds become 6-digit codes; save the session so later runs start signed in. The model never sees a value.

Human in the loop

The agent can ask you a question, wait for your approval before a purchase, or hand you a Live View for a CAPTCHA.

File uploads

Upload your files once; the agent picks the right one for each upload field (your CV, not your tax return).

Checks before submitting

Before it clicks submit, the agent compares every field with your task and fixes wrong or pre-filled values.

The fastest browser agent API we've tested

5× faster and a fraction of the cost. The same six public tasks on 2026-10-10, timed end to end from the start request to the result, with default settings. The other agent is the most-used pay-per-step browser agent on the Apify Store.

TaskLovely RouterLeading browser agentFaster by
Hacker News top story3.7s · $0.00622.5s · $0.0386.1×
Product page two clicks deep7.3s · $0.01863.7s · $0.0958.7×
Book price lookup8.9s · $0.00938.2s · $0.0384.3×
Wikipedia search and read9.9s · $0.01879.5s · $0.1148.0×
Log in, then read the page12.1s · $0.03352.7s · $0.1054.4×
3-step insurance quote form (17 fields)21.3s · $0.126199.6s · $0.9889.4×

Pricing

Fast
$0.006
per browser step
Accurate
$0.012
per browser step

Accurate also looks at screenshots when unsure and can run read-only code to read data.

  • ✓ No run fee, no subscription
  • ✓ AI models included — no LLM key needed
  • ✓ Structured JSON output included
  • ✓ Pay only for steps taken
  • Each step includes 1 minute; time beyond that (e.g. waiting for your approval) costs $0.005/min
  • Pick any of our models: its tokens at normal price × 1.2
Example taskStepsFastAccurate
Read a value from a page1–3$0.006–$0.018$0.012–$0.036
Search a site and read a result2–6$0.012–$0.036$0.024–$0.072
Log in and read account data4–8$0.024–$0.048$0.048–$0.096
Fill and submit a long multi-step form15–25$0.090–$0.150$0.180–$0.300

API reference

Same API keys and balance as the rest of Lovely Router. Base URL https://lovelyrouter.com

POST /v1/browser/runsStart a run (202). Returns the run with its id.
GET /v1/browser/runs/{id}/eventsLive events (Server-Sent Events): what the agent is doing, each step, the run's state and, with ?screen=1, the browser screen.
GET /v1/browser/runs/{id}?wait=30Status; long-polls up to 50 s until it changes. &trace=1 adds the steps.
POST /v1/browser/runs/{id}/replyAnswer a question, approve or deny, or finish a takeover.
POST /v1/browser/runs/{id}/takeoverTake the browser over in Live View.
POST /v1/browser/runs/{id}/stopStop a run; you pay for the steps taken.
GET /v1/browser/runs/{id}/screenshotThe browser screen now, or the latest one kept.
PUT /v1/browser/vault/{name}Store a write-only secret: {"value", "kind": "password|username|text|totp", "origins"}.
PUT /v1/browser/files/{name}Upload a file (raw body, up to 10 MB) the agent may attach.
GET /v1/browser/profilesSaved sessions (cookies + local storage).

Run parameters

goalWhat to do, in plain words, with every value the task needs (required).
start_urlThe first page to open (required).
output_schemaJSON Schema, or shorthand like {"title": "string", "items": [{"name": "string"}]}. The result comes back in data. Without a schema, data is filled only when the goal itself describes a format.
mode"fast" (default, $0.006/step) or "accurate" ($0.012/step): when unsure it also looks at a screenshot of the page, and it can run read-only code to read data. Higher success on hard sites and widgets.
max_stepsStep limit, 1–100 (default 50). You pay only for steps taken.
approvePause for your approval before submitting: "risky" (default: purchases, sending), "submit" (every form) or "none".
human_timeout_minutesHow long the agent waits for you (an answer, an approval, a CAPTCHA), 1–1440 minutes (default 30). The run ends as timed_out if nobody replies.
secretsNames of vault secrets the agent may type (PUT /v1/browser/vault/{name}). The model sees only names.
ephemeral_secretsPer-run secrets that are never stored: {"name": {"value", "kind", "origins"}}.
filesNames of uploaded files the agent may attach to upload fields, or "*".
profile / save_profileStart from saved cookies, or save them when the run ends, so later runs start logged in.
allowed_domainsHostnames the browser may visit, e.g. ["example.com", "*.example.com"].
webhookHTTPS URL notified when the run waits for you or finishes (signed with x-lovely-signature).
stream / screenstream: true returns the run's live events (Server-Sent Events) until it ends, instead of a 202; screen: true adds the browser screen.
model / max_model_usdOptional model from GET /v1/models (e.g. claude-sonnet-5.5) for the agent's thinking, writing and extraction. Its tokens are billed at the model's normal price × 1.2, on top of the step price. max_model_usd caps that spend.

A run ends as succeeded, failed, timed_out or stopped, and may pause as waiting_for_human. The result has answer (text), data (JSON or null), steps and charge_usd.

FAQ

Try it on your own task

Run it in the console, watch every step, then copy the API call.

Get a key