One command reaches four Bright Data product families
Bright Data CLI wraps scraping, search, structured datasets, scraper generation, and a remote browser in the brightdata command, with bdata as an alias. It is most useful when a team already chose Bright Data and wants fewer one-off API scripts. Output can go to stdout or a file as JSON, CSV, NDJSON, HTML, markdown, or screenshots, depending on the command. Redirected output switches to machine-friendly formatting, which makes the client practical in shell pipelines and coding-agent tasks.
The checkout we measured was modest: 91 files, about 19,695 lines of source, and 1 MB before dependencies. That narrow footprint matches the product's role. It coordinates remote services instead of shipping a crawler engine or browser. The MIT license covers the client code, while the useful work happens against Bright Data APIs under the account's service terms and credit model.
The free allowance does not cover every command
The README states that new accounts receive 5,000 recurring monthly credits for Unlocker, SERP, Web Scraper, and Scraper Studio use. It also draws an important boundary: proxy products and Browser API sessions are outside that monthly pool. The browser gets a separate one-time trial, and adding a payment method changes the available bonus. Anyone estimating cost should map each command to its product rather than treating the CLI as one flat service.
Authentication is flexible for ordinary commands. You can use browser login, GitHub CLI login, a key argument, or BRIGHTDATA_API_KEY. The first login checks for cli_unlocker and cli_browser zones and creates missing ones. That convenience changes account state, so operators who manage zones centrally should review the initial setup before telling every developer to run it.
What happened when we ran it
Our sandbox installed 88 pnpm packages in 14 seconds and used 65 MB on disk. The build completed in 13 seconds, and the test command completed successfully in 15 seconds. We ran commit f02f2b4 in an unprivileged Debian container with 3 CPUs, 8 GB of RAM, Node.js 22, and no secrets.
Those results cover the client repository, not the paid APIs behind it. We did not authenticate, create zones, spend credits, open a hosted browser, or judge extraction accuracy. The repository had one CI workflow, no Dockerfile, and no top-level tests directory, although its declared test command passed in our environment. A buyer still needs a small live trial using representative sites, countries, and output formats.
Browser sessions trade local state for fewer reconnects
The browser command starts a lightweight local daemon and keeps a remote session available across open, snapshot, click, type, network, cookie, and screenshot calls. Named sessions can run separately, and the default idle timeout is 600,000 milliseconds. Accessibility-tree snapshots use element references for later actions, with compact and interactive modes intended to reduce the text an agent must read.
This is useful for iterative automation, but it creates state that a single HTTP request does not have. Scripts need to close sessions, choose idle limits, and handle the daemon's IPC timeout. Changing country on an existing session reconnects the browser. Browser API billing also sits outside the recurring 5,000-credit pool, so a loop that looks local at the terminal can consume a different remote allowance.
Scraper repair stops for approval by default
The AI scraper flow can create a collector from a URL and description, then run it against one or many URLs. When a scraper returns bad data, scraper heal proposes an in-place change and normally stops at an approval state. Its output includes preview rows and a dashboard link. Approval and rejection are separate commands, while --auto-approve removes that pause. The default is the safer choice for production collectors because a generated selector change can be inspected before it replaces working behavior.
Remote timing still matters. Create and heal operations can hit an account concurrency cap of 3 jobs, after which the CLI uses retry delays. Single scraper jobs default to a 600-second polling timeout, and batches default to 3,600 seconds. A command can therefore remain active far longer than our 13-second local build. CI jobs need explicit time budgets, saved result envelopes, and a recovery plan for half-built collectors.
Pipeline shortcuts omit some dataset controls
The pipelines command provides named inputs for more than 40 platforms, which is convenient for a LinkedIn profile, Amazon product, or YouTube comment job. Open issue 12 documents a harder case: its reporter could not express X and LinkedIn discovery modes, date windows, record limits, raw snapshot metadata, or exact submitted inputs through those shortcuts. They had to call the dataset API directly to reproduce Control Panel work.
That gap matters for versioned ETL. A friendly command is enough for a one-URL probe, while a repeatable collection may need the precise request, snapshot identifier, error records, and stop conditions. An open pull request proposes a generic dataset trigger, but an unmerged change is not a current feature. Use the pipeline layer only after confirming that it exposes every parameter your job must preserve.
MCP installation has a separate credential rule
The CLI can install Bright Data's MCP server into Claude Code, Cursor, or Codex and can install related agent skills. The repository had 6,406 stars, 7 combined issues and pull requests, and a last push dated August 17, 2026. Release v0.3.5 arrived that day and changed failed browser-login flows to return exit code 1, a small behavior that matters in unattended setup.
One setup inconsistency remains documented: brightdata add mcp uses the key saved by brightdata login and does not read BRIGHTDATA_API_KEY or the global key option. Environment-only deployments must perform a saved login or write the MCP configuration themselves. Bright Data CLI is a good control surface for an existing Bright Data account. It is a poor substitute for owning the collection runtime or for auditing every dataset request at the API level.

