Lovely RouterDocs
Get a key
Browser agent

Modes, models & pricing

Choose fast or accurate mode, optionally run the agent on a model you pick, and see exactly how a run is reserved and charged.

A browser agent run is billed per step at its mode's price. Models are included. Time beyond one minute per step, mostly spent waiting for a person, is billed per minute. If you pick your own model, its tokens are billed on top. Prices on this page are current; the browser agent page always shows the live step price.

ItemPrice
Step in fast mode (default)$0.006
Step in accurate mode$0.012
Run feeNone
Included time1 minute per step
Time beyond that$0.005 per minute, prorated to the second
Your own modelIts tokens at the model's normal price, plus 20%
Structured outputIncluded

Choose a mode#

Set mode when you start a run. Both modes use the same browser and the same API.

fastaccurate
Price per step$0.006$0.012
How it reads pagesPage text and controlsPage text and controls, plus a screenshot of the page when it is unsure
Reading dataFrom the page textCan also run read-only JavaScript on the page to pull out long tables, lists, counts and link targets
Good forLookups, searches, logins, most formsDate pickers, maps, custom widgets, long tables, sites where fast mode fails

Start with fast. It is quicker and handles most tasks. Switch a task to accurate when fast mode fails on it: on our 78-task benchmark of real websites, accurate mode completed more tasks.

curl https://lovelyrouter.com/v1/browser/runs \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "goal": "Find the opening hours of the Louvre on Tuesdays in December 2026.",
    "start_url": "https://www.louvre.fr/en",
    "mode": "accurate"
  }'

The Python and Node.js samples on this page use the API, H and headers setup from Run your first task. The run object reports the mode it ran in as mode. Any value other than fast or accurate returns 400.

In accurate mode, the agent stops taking screenshots once it has typed a secret into the page, because a screenshot can't be scrubbed the way text can.

Use your own model#

By default the agent runs on models that are included in the step price. To use a model you prefer, pass its id from GET /v1/models as model:

cURL
curl https://lovelyrouter.com/v1/browser/runs \
  -H "Authorization: Bearer $LOVELY_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "goal": "Compare the three plans on the pricing page and tell me which one includes SSO and what it costs per month.",
    "start_url": "https://example.com/pricing",
    "model": "claude-sonnet-5.5",
    "max_model_usd": 0.60
  }'

Your model does the agent's thinking when it is unsure of the next step, writes the text it types into fields, writes the final answer and extracts data. The agent keeps its own fast model for choosing routine steps.

How it is billed:

  • Steps cost the usual step price for the mode.
  • Model tokens are billed as ordinary API requests at the model's normal price, from your balance. They appear in Logs under the run's API key.
  • A 20% surcharge on those token charges is added to the run's charge_usd.

The hold covers the surcharge, not the tokens themselves, so keep enough balance for the model's requests while the run is live.

model_usd in the run object shows what the model has cost so far, tokens plus surcharge.

max_model_usd caps that amount (tokens plus surcharge, in USD). If you leave it out, a budget is estimated from max_steps and the model's prices. When the model's spend nears the budget, the run stops with status failed and the error reached the model budget ($0.6000); raise max_model_usd. Part of the budget is kept free for the final answer and data extraction.

With your own model, the agent does not use screenshots, even in accurate mode.

If the model can't be used for the browser agent, the request returns 400 with Model "…" is not available. Use a model id from GET /v1/models.

Time and waiting#

Every billed step includes one minute. A step takes a few seconds, so agent work alone almost never goes past it. Time is billed when the browser stays open longer:

  • Waiting for a person. Each pause (a question, an approval, a handover, a takeover) also includes one minute. Beyond that, the wait costs $0.005 per minute until you reply or the run times out.
  • A slow step. A step that takes longer than a minute, for example on a very slow page, is billed for the excess.

billable_time_s and time_usd in the run object show the billable time and its cost so far, including a wait in progress. To cap waiting costs, lower human_timeout_minutes: a run that waits longer ends as timed_out.

How the hold works#

When a run starts, it reserves (holds) the most it can cost. The hold is deducted from your balance right away. When the run ends, it is charged for what it used and the rest of the hold comes back.

The hold is the sum of:

  1. Steps: max_steps × the mode's step price.
  2. One wait: (human_timeout_minutes − 1) × $0.005, if the run can pause for a person. A run can pause unless you set both "human": false and "approve": "none".
  3. Model surcharge: one sixth of the model budget (the 20% surcharge part of it), only when you pass model.
Run settingsHold
Defaults: fast, 50 steps, can pause, 30-minute timeout$0.30 + $0.145 = $0.445
"mode": "accurate", other defaults$0.60 + $0.145 = $0.745
"max_steps": 20, "human_timeout_minutes": 5$0.12 + $0.02 = $0.14
"max_steps": 20, "human": false, "approve": "none"$0.12
Defaults plus "model": "claude-sonnet-5.5", "max_model_usd": 0.60$0.445 + $0.10 = $0.545

reserved_usd in the run object shows the hold while the run is live and 0 once it is settled. If your balance is below the hold, the start request returns 402. Lower max_steps or human_timeout_minutes, or top up. It also returns 402 if the hold would take the API key past its spend limit.

What a run is charged#

When a run ends, whatever its status, its charge is:

  • steps taken × the mode's step price, not counting pauses for a person, and at most max_steps
  • plus billable time × $0.005 per minute
  • plus the 20% surcharge on your own model's tokens, if you passed model

The charge never exceeds the hold. A run that fails or that you stop pays for the steps it took. charge_usd shows the charge once the run is settled, a few seconds after it ends.

Cost examples#

TaskModeBilled stepsExtraCharge
Read a value from a pagefast2none$0.012
Search a site and read a resultfast5none$0.030
Same search on a hard siteaccurate6none$0.072
Log in, answer a 2FA question after 3 minutes, read account datafast72 billable minutes, $0.010$0.052
Fill and submit a long multi-step formfast20none$0.120
Same form with "model": "claude-sonnet-5.5", $0.20 of tokensfast20$0.04 surcharge$0.160, plus $0.20 in API requests
A question nobody answers, 30-minute timeoutfast4about 29 billable minutes, $0.145about $0.17, status timed_out

See what you spent#

  • charge_usd, billable_time_s, time_usd and model_usd on the run object.
  • Usage & logs: browser agent runs appear with your other tool spend. Your own model's requests appear in Logs like any other API call.
  • Credits & billing: balance, top-ups and holds.