Oxylabs Browser Agent: natural language browsing through the oxylabs-ai-studio Python package
AI Browser Agent is an advanced Browser AI tool developed by Oxylabs AI Studio that automates real user browsing tasks using natural language instructions.
At a glance
- What is it?
- The browser-agent-py repository documents a hosted browser automation API that takes a URL, a plain English prompt and an output format, then returns JSON, Markdown, HTML or a PNG screenshot. It removes selector maintenance but moves control of the browsing session to a remote service.
- Who is it for?
- Adopt Browser Agent if you want extraction from JavaScript-heavy pages and are willing to send the target URL, prompt and any credentials the flow requires to a hosted API billed in credits. Do not adopt it if you need deterministic replay, an offline or self-hosted runtime, or a project with a published licence and release history; this repository has neither.
- Can I use it commercially?
- Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
- Is it still maintained?
- Yes. The repository last received commits 167 days ago.
- What is it written in?
- GitHub does not report a main language for this repository.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The problem: selectors break, and multi-step flows need a browser
A scraper that reads a price from a product page usually starts as one CSS selector. It stops working when the markup changes, when the price is injected after a client-side fetch, or when the page demands a cookie consent click before anything renders. The README frames Browser Agent against exactly that class of work, contrasting it with Puppeteer and Selenium, which it says rely on "writing selectors and scripts for every action." The project's answer is to replace the selector with an instruction. You supply a starting URL and a prompt such as the README's example about opening a pricing page, accepting cookies and extracting product names with prices, and the service performs the clicking, typing, scrolling and extraction. The intended user is a Python developer who needs data from an interactive site and does not want to own a headless browser fleet, a proxy pool and a selector test suite. It is a poor fit for anyone whose requirement is a reproducible script that behaves identically on every run, because a natural language instruction is not a specification.
What actually runs: a hosted agent behind a thin Python client
The repository is a client, not an engine. The README's installation step is pip install oxylabs-ai-studio, and the code imports BrowserAgent from oxylabs_ai_studio.apps.browser_agent. The constructor takes an api_key string. That shape tells you where the work happens: the Python package is a wrapper around a remote service, and the browsing itself is performed by Oxylabs infrastructure. The data flow documented in the README is short. You call run() with a url and a user_prompt. The service browses, optionally using a step list of actions the README names as click, type, navigate, wait and extract. It then returns a result object whose data field holds the payload. For JSON output the payload is parsed into the shape of the schema you supplied; for a screenshot it is a base64 string that the README's second example decodes with base64.b64decode and writes to screenshot.png. The geo_location parameter, given in ISO2 format, is the one visible lever over how the session is routed, which implies a proxy layer sits between the agent and the target site. None of this is inspectable from the repository, and the README does not describe the browser version, the model driving the actions, or how the step list is interpreted when it conflicts with the prompt.
Getting a first request running, and the parameters that matter
The README states the prerequisites plainly: an API key, and Python 3.10 or above. A free trial with 1000 credits is offered through the registration link. The minimal path is three lines of setup and one call. Construct BrowserAgent with your key, then call run with url, user_prompt and output_format. The README's first example goes further and calls generate_schema first, passing a prompt such as "game name, platform, review stars and price" and printing the result, then feeding that schema into run alongside output_format="json". The parameter table lists url and user_prompt as mandatory, output_format as defaulting to markdown with json, markdown, html and screenshot as the accepted values, schema as mandatory when JSON is selected, and geo_location as optional. Two details in that table are worth reading twice. The first is that JSON without a schema is not a valid combination, so the schema is not a convenience. The second is that the default output is markdown, which means a call that omits output_format returns prose-formatted text rather than structured fields. The README's output sample shows the JSON envelope as an object with a type field and a content object, with the extracted records nested inside a key named after the schema, games in that example.
Where the abstraction leaks: detection, cost and unverifiable behaviour
The README's FAQ concedes the main limitation in one sentence: sites with advanced bot detection "may require advanced setup." That is the honest version of a claim the marketing copy elsewhere softens. An agent that clicks and types like a user is still an automated client, and the parameters exposed in this SDK do not include anything for solving challenges or tuning fingerprint behaviour beyond geo_location. The second limitation is economic and structural. Every run consumes credits against an account, and the browsing happens on someone else's machines, so latency and failure modes are outside your control. There is no documented retry policy, no timeout parameter, and no way from this client to inspect intermediate page state; you get the final payload or an error. The third limitation is about the repository itself. The material supplied lists no licence and no releases, and the primary language field is unknown even though the examples are Python. For a dependency you intend to pin, that is a gap. You can read the README and the PyPI page it links to, but you cannot read the licence file or a changelog.
Against Puppeteer and Selenium: different failure modes, not just less code
The README's own comparison is that traditional frameworks require selectors and scripts per action, while the agent takes natural language and adds what it calls organic browsing. The practical difference is where breakage lands. A Selenium or Puppeteer script fails loudly at a known line when a selector stops matching, and you fix one line. A prompt-driven agent can silently produce a plausible but wrong result: the search box it found may not be the one you meant, and the price it reports may come from a different variant of the product. The README's JSON example even shows review_stars as null while the other fields are populated, which is a reminder that schema conformance and correctness are separate properties. The trade is real in both directions. Scripts give you determinism and a free runtime; the agent gives you resilience to markup changes and no selector maintenance, at the cost of per-run billing and result verification. Playwright sits closer to the script side of that divide; a hosted extraction API with a fixed schema sits closer to the agent side but gives up the interactive step list. Browser Agent's distinguishing feature within that second group is the combination of a step sequence and a prompt in the same call.
Maintenance, versioning and the licence question
Your maintenance burden splits in two. On your side there is almost nothing to maintain: the integration is a constructor and a run call, and the README does not describe any local browser binary, driver or configuration file to keep current. On the vendor side, changes to the service, the accepted schema dialect or the credit pricing reach you without a package upgrade, which is convenient until it is not. The repository shows a last push in April 2026 and no retrieved releases, so there is no changelog to consult before upgrading oxylabs-ai-studio. The licence field is empty in the material provided, which means you cannot determine from this repository whether the client code is permissively licensed, and you should not assume it is. The README also points to a separate JavaScript SDK for JS users, so a mixed stack can share the same hosted service. Because the terms of the API key govern usage and billing, the licence of the client package is a smaller question than the service agreement, but it is still a question you should answer before vendoring the code. Nothing here is legal advice; read the actual licence and terms.
Editorial conclusion
Adopt Browser Agent if you want extraction from JavaScript-heavy pages and are willing to send the target URL, prompt and any credentials the flow requires to a hosted API billed in credits. Do not adopt it if you need deterministic replay, an offline or self-hosted runtime, or a project with a published licence and release history; this repository has neither. Verify three things before writing production code: the exact billing rules of the 1000-credit trial, whether the schema object returned by generate_schema matches what run() accepts, and whether your target site's Terms of Service permit automated interaction.
Community notes