Script completed
Wall time 1.5 seconds
Output:

Terms of Service – Browserless (https://www.browserless.io/terms-of-service)
citeturn1search0 [wordlim: 200] Crawled: 5 days ago; In no case shall browserless.io, Inc., our directors, officers, employees, affiliates, agents, contractors, interns, suppliers, service providers or licensors be liable for any injury, loss, claim, or any direct, indirect, incidental, punitive, special, or consequential damages of any kind, including, without limitation lost profits, lost revenue, lost savings, loss of data, replacement costs, or any similar damages, whether based in contract, tort (including negligence), strict liability or otherwise, arising from your use of any of the service or any products procured using the service, or for any other claim related in any way to your use of the service or any product, including, but not limited to, any errors or omissions in any content, or any loss or damage of any kind incurred as a result of the use of the service or any content (or product) posted, transmitted, or otherwise made available via the service, even if advised of their possibility. ... You agree to indemnify, defend and hold harmless browserless.io, Inc. and our parent, subsidiaries, affiliates, partners, officers, directors, agents, contractors, licensors, service providers, subcontractors, suppliers, interns and employees, harmless from any claim or demand, including reasonable attorneys' fees, made by any third-party due to or arising out of your breach of these Terms of Service or the documents they incorporate by reference, or your violation of any law or the rights of a third-party.

# Terms of Service

## Contents

  * Overview
  * 1. Online terms
  * 2. General conditions
  * 3. Accuracy of information
  * 4. Service modifications
  * 5. Products and services
  * 6. Billing information
  * 7. Third-party links
  * 8. User comments
  * 9. Personal information
  * 10. Errors and omissions
  * 11. Prohibited uses
  * 12. Disclaimer of warranties
  * 13. Indemnification
  * 14. Severability
  * 15. Termination
  * 16. Entire agreement
  * 17. Governing law
  * 18. Changes to terms
  * 19. Contact information

## Overview

This website is operated by browserless.io, Inc. Throughout the site, the terms “we”, “us” and “our” refer to browserless.io, Inc. browserless.io, Inc. offers this website, including all information, tools and services available from this site to you, the user, conditioned upon your acceptance of all terms, conditions, policies and notices stated here.

By visiting our site and/ or purchasing something from us, you engage in our “Service” and agree to be bound by the following terms and conditions (“Terms of Service”, “Terms”), including those additional terms and conditions and policies referenced herein and/or available by hyperlink.

These Terms of Service apply to all users of the site, including without limitation users who are browsers, vendors, customers, merchants, and/ or contributors of content. Please read these Terms of Service carefully before accessing or using our website. By accessing or using any part of the site, you agree to be bound by these Terms of Service.

If you do not agree to all the terms and conditions of this agreement, then you may not access the website or use any services. If these Terms of Service are considered an offer, acceptance is expressly limited to these Terms of Service.

Any new features or tools which are added to the current site shall also be subject to the Terms of Service. You can review the most current version of the Terms of Service at any time on this page.

We reserve the right to update, change or replace any part of these Terms of Service by posting updates and/or changes to our website. It is your responsibility to check this page periodically for changes. Your continued use of or access to the website following the posting of any changes constitutes acceptance of those changes.

## SECTION 1 – Online terms

By agreeing to these Terms of Service, you represent that you are at least the age of majority in your state or province of residence, or that you are the age of majority in your state or province of residence and you have given us your consent to allow any of your minor dependents to use this site. You may not use our products for any illegal or unauthorized purpose nor may you, in the use of the Service, violate any laws in your jurisdiction (including but not limited to copyright laws). You must not transmit any worms or viruses or any code of a destructive nature. A breach or violation of any of the Terms will result in an immediate termination of your Services.

## SECTION 2 – General conditions

We reserve the right to refuse service to anyone for any reason at any time. You understand that your content (not including credit card information), may be transferred unencrypted and involve (a) transmissions over various networks; and (b) changes to conform and adapt to technical requirements of connecting networks or devices. Credit card information is always encrypted during transfer over networks. You agree not to reproduce, duplicate, copy, sell, resell or exploit any portion of the Service, use of the Service, or access to the Service or any contact on the website through which the service is provided, without express written permission by us. The headings used in this agreement are included for convenience only and will not limit or otherwise affect these Terms.

## SECTION 3 – Accuracy, completeness and timeliness of information

We are not responsible if information made available on this site is not accurate, complete or current. The material on this site is provided for general information only and should not be relied upon or used as the sole basis for making decisions without consulting primary, more accurate, more complete or more timely sources of information. Any reliance on the material on this site is at your own risk. This site may contain certain historical information. Historical information, necessarily, is not current and is provided for your reference only. We reserve the right to modify the contents of this site at any time, but we have no obligation to update any information on our site. You agree that it is your responsibility to monitor changes to our site.

## SECTION 4 – Modifications to the service and prices

Prices for our products are subject to change without notice. We reserve the right at any time to modify or discontinue the Service (or any part or content thereof) without notice at any time. We shall not be liable to you or to any third-party for any modification, price change, suspension or discontinuance of the Service.

## SECTION 5 – Products and services

Certain products or services may be available exclusively online through the website. We have made every effort to describe as accurately as possible the nature of our products that appear at the site. We reserve the right, but are not obligated, to limit the sales of our products or Services to any person, geographic region or jurisdiction. We may exercise this right on a case-by-case basis. We reserve the right to limit the quantities of any products or services that we offer. All descriptions of products or product pricing are subject to change at anytime without notice, at the sole discretion of us. We reserve the right to discontinue any product at any time. Any offer for any product or service made on this site is void where prohibited. We do not warrant that the quality of any products, services, information, or other material purchased or obtained by you will meet your expectations, or that any errors in the Service will be corrected.

## SECTION 6 – Accuracy of billing and account information

We reserve the right to refuse any order you place with us. We may, in our sole discretion, limit or cancel quantities purchased per person, per household or per order. These restrictions may include orders placed by or under the same customer account, the same credit card, and/or orders that use the same billing and/or shipping address.

In the event that we make a change to or cancel an order, we may attempt to notify you by contacting the e-mail and/or billing address/phone number provided at the time the order was made. We reserve the right to limit or prohibit orders that, in our sole judgment, appear to be placed by dealers, resellers or distributors.

You agree to provide current, complete and accurate purchase and account information for all purchases made at our site. You agree to promptly update your account and other information, including your email address and credit card numbers and expiration dates, so that we can complete your transactions and contact you as needed.

## SECTION 7 – Third-party links

Certain content, products and services available via our Service may include materials from third-parties. Third-party links on this site may direct you to third-party websites that are not affiliated with us.

We are not responsible for examining or evaluating the content or accuracy and we do not warrant and will not have any liability or responsibility for any third-party materials or websites, or for any other materials, products, or services of third-parties.

We are not liable for any harm or damages related to the purchase or use of goods, services, resources, content, or any other transactions made in connection with any third-party websites.

Please review carefully the third-party's policies and practices and make sure you understand them before you engage in any transaction. Complaints, claims, concerns, or questions regarding third-party products should be directed to the third-party.

## SECTION 8 – User comments, feedback and other submissions

If, at our request, you send certain specific submissions (for example contest entries) or without a request from us you send creative ideas, suggestions, proposals, plans, or other materials, whether online, by email, by postal mail, or otherwise (collectively, 'comments'), you agree that we may, at any time, without restriction, edit, copy, publish, distribute, translate and otherwise use in any medium any comments that you forward to us.

We are and shall be under no obligation (1) to maintain any comments in confidence; (2) to pay compensation for any comments; or (3) to respond to any comments.

We may, but have no obligation to, monitor, edit or remove content that we determine in our sole discretion are unlawful, offensive, threatening, libelous, defamatory, pornographic, obscene or otherwise objectionable or violates any party's intellectual property or these Terms of Service.

You agree that your comments will not violate any right of any third-party, including copyright, trademark, privacy, personality or other personal or proprietary right. You further agree that your comments will not contain libelous or otherwise unlawful, abusive or obscene material, or contain any computer virus or other malware that could in any way affect the operation of the Service or any related website.

You may not use a false e-mail address, pretend to be someone other than yourself, or otherwise mislead us or third-parties as to the origin of any comments. You are solely responsible for any comments you make and their accuracy.

We take no responsibility and assume no liability for any comments posted by you or any third-party.

## SECTION 9 – Personal information

Your submission of personal information through the site is governed by our Privacy Policy.

## SECTION 10 – Errors, inaccuracies and omissions

Occasionally there may be information on our site or in the Service that contains typographical errors, inaccuracies or omissions that may relate to product descriptions, pricing, promotions, offers, and availability. We reserve the right to correct any errors, inaccuracies or omissions, and to change or update information or cancel orders if any information in the Service or on any related website is inaccurate at any time without prior notice (including after you have submitted your order). We undertake no obligation to update, amend or clarify information in the Service or on any related website, including without limitation, pricing information, except as required by law. No specified update or refresh date applied in the Service or on any related website, should be taken to indicate that all information in the Service or on any related website has been modified or updated.

## SECTION 11 – Prohibited uses

In addition to other prohibitions as set forth in the Terms of Service, you are prohibited from using the site or its content:

(a) for any unlawful purpose;
(b) to solicit others to perform or participate in any unlawful acts;
(c) to violate any international, federal, provincial or state regulations, rules, laws, or local ordinances;
(d) to infringe upon or violate our intellectual property rights or the intellectual property rights of others;
(e) to harass, abuse, insult, harm, defame, slander, disparage, intimidate, or discriminate based on gender, sexual orientation, religion, ethnicity, race, age, national origin, or disability;
(f) to submit false or misleading information;
(g) to upload or transmit viruses or any other type of malicious code that will or may be used in any way that will affect the functionality or operation of the Service or of any related website, other websites, or the Internet;
(h) to collect or track the personal information of others;
(i) to spam, phish, pharm, pretext, spider, crawl, or scrape;
(j) for any obscene or immoral purpose; or
(k) to interfere with or circumvent the security features of the Service or any related website, other websites, or the Internet.

We reserve the right to terminate your use of the Service or any related website for violating any of the prohibited uses.

## SECTION 12 – Disclaimer of warranties; limitation of liability

We do not guarantee, represent or warrant that your use of our service will be uninterrupted, timely, secure or error-free. We do not warrant that the results that may be obtained from the use of the service will be accurate or reliable.

You agree that from time to time we may remove the service for indefinite periods of time or cancel the service at any time, without notice to you. You expressly agree that your use of, or inability to use, the service is at your sole risk.

The service and all products and services delivered to you through the service are (except as expressly stated by us) provided 'as is' and 'as available' for your use, without any representation, warranties or conditions of any kind, either express or implied, including all implied warranties or conditions of merchantability, merchantable quality, fitness for a particular purpose, durability, title, and non-infringement.

In no case shall browserless.io, Inc., our directors, officers, employees, affiliates, agents, contractors, interns, suppliers, service providers or licensors be liable for any injury, loss, claim, or any direct, indirect, incidental, punitive, special, or consequential damages of any kind, including, without limitation lost profits, lost revenue, lost savings, loss of data, replacement costs, or any similar damages, whether based in contract, tort (including negligence), strict liability or otherwise, arising from your use of any of the service or any products procured using the service, or for any other claim related in any way to your use of the service or any product, including, but not limited to, any errors or omissions in any content, or any loss or damage of any kind incurred as a result of the use of the service or any content (or product) posted, transmitted, or otherwise made available via the service, even if advised of their possibility.

Because some states or jurisdictions do not allow the exclusion or the limitation of liability for consequential or incidental damages, in such states or jurisdictions, our liability shall be limited to the maximum extent permitted by law.

## SECTION 13 – Indemnification

You agree to indemnify, defend and hold harmless browserless.io, Inc. and our parent, subsidiaries, affiliates, partners, officers, directors, agents, contractors, licensors, service providers, subcontractors, suppliers, interns and employees, harmless from any claim or demand, including reasonable attorneys' fees, made by any third-party due to or arising out of your breach of these Terms of Service or the documents they incorporate by reference, or your violation of any law or the rights of a third-party.

## SECTION 14 – Severability

In the event that any provision of these Terms of Service is determined to be unlawful, void or unenforceable, such provision shall nonetheless be enforceable to the fullest extent permitted by applicable law, and the unenforceable portion shall be deemed to be severed from these Terms of Service, such determination shall not affect the validity and enforceability of any other remaining provisions.

## SECTION 15 – Termination

The obligations and liabilities of the parties incurred prior to the termination date shall survive the termination of this agreement for all purposes. These Terms of Service are effective unless and until terminated by either you or us. You may terminate these Terms of Service at any time by notifying us that you no longer wish to use our Services, or when you cease using our site. If in our sole judgment you fail, or we suspect that you have failed, to comply with any term or provision of these Terms of Service, we also may terminate this agreement at any time without notice and you will remain liable for all amounts due up to and including the date of termination; and/or accordingly may deny you access to our Services (or any part thereof).

## SECTION 16 – Entire agreement

The failure of us to exercise or enforce any right or provision of these Terms of Service shall not constitute a waiver of such right or provision. These Terms of Service and any policies or operating rules posted by us on this site or in respect to The Service constitutes the entire agreement and understanding between you and us and govern your use of the Service, superseding any prior or contemporaneous agreements, communications and proposals, whether oral or written, between you and us (including, but not limited to, any prior versions of the Terms of Service). Any ambiguities in the interpretation of these Terms of Service shall not be construed against the drafting party.

## SECTION 17 – Governing law

These Terms of Service and any separate agreements whereby we provide you Services shall be governed by and construed in accordance with the laws of 23207 NE 192ND CT Battle Ground, WA, 98604, United States.

## SECTION 18 – Changes to terms of service

You can review the most current version of the Terms of Service at any time at this page. We reserve the right, at our sole discretion, to update, change or replace any part of these Terms of Service by posting updates and changes to our website. It is your responsibility to check our website periodically for changes. Your continued use of or access to our website or the Service following the posting of any changes to these Terms of Service constitutes acceptance of those changes.

## SECTION 19 – Contact information

Questions about the Terms of Service should be sent to us at support@browserless.io.--------------------------------------------------------------------------------
Privacy Policy – Browserless (https://www.browserless.io/privacy-policy)
citeturn1search1 [wordlim: 200] Crawled: 3 days ago; If after you opt-in, you change your mind, you may withdraw your consent for us to contact you, for the continued collection, use or disclosure of your information, at anytime, by contacting us at support@browserless.io or mailing us at: browserless.io, Inc. ... We may disclose your personal information if we are required by law to do so or if you violate our Terms of Service.

# Privacy Policy

## Contents

  * TL;DR
  * 1. Your information
  * 2. Consent
  * 3. Disclosure
  * 4. Payment
  * 5. Third-party services
  * 6. Security
  * 7. Age of consent
  * 8. Changes to policy
  * Contact information

## TL;DR

At browserless we really only care about one thing: rock-solid headless performance. We don't care about tracking your sessions, sending you frequent newsletters, or tracking you across the web. The only information we retain, as a part of signing up, is your email address. When you cancel your account, and the billing period expires, we automatically destroy this information so it isn't kept around.

Like most other online services we use 3rd-party systems to help us out. As of right now we use Stripe for helping us with processing payments and subscriptions, SendGrid for sending transactional email (like when sessions are being queued), DigitalOcean for providing infrastructure, and run our own analytics site via Fathom on our own hardware.
Browserless does not monitor, store, retain, or resell the content of the pages you visit or the detailed nature of your sessions. However, if at any time you are found to be in violation of our terms of service, your account will be suspended.

## SECTION 2 – Consent

### How do you get my consent?

When you provide us with personal information to complete a transaction, verify your credit card, place an order, we imply that you consent to our collecting it and using it for that specific reason only. If we ask for your personal information for a secondary reason, like marketing, we will either ask you directly for your expressed consent, or provide you with an opportunity to say no.

### How do I withdraw my consent?

If after you opt-in, you change your mind, you may withdraw your consent for us to contact you, for the continued collection, use or disclosure of your information, at anytime, by contacting us at support@browserless.io or mailing us at: browserless.io, Inc. 23207 NE 192ND CT Battle Ground, WA, 98604, United States

## SECTION 3 – Disclosure

We may disclose your personal information if we are required by law to do so or if you violate our Terms of Service.

## SECTION 4 – Payment

When you initially provide or update your payment information, we transmit it via an encrypted connection to our Payment Processor, Stripe. Stripe uses and processes your payment information in accordance with Stripe's Privacy Policy. We don't store your payment information, other than your zip code and country, which we require for billing and to comply with tax and other government regulations.

## SECTION 5 – Third-party services

In general, the third-party providers used by us will only collect, use and disclose your information to the extent necessary to allow them to perform the services they provide to us. However, certain third-party service providers, such as payment gateways and other payment transaction processors, have their own privacy policies in respect to the information we are required to provide to them for your purchase-related transactions. --------------------------------------------------------------------------------
Security, Compliance & Trust Center | Browserless (https://www.browserless.io/trust)
citeturn1search2 [wordlim: 200] Published: 3 months ago; Crawled: yesterday; Browserless does not pursue legal action against researchers who act in good faith and follow responsible disclosure practices. ... For more information about how Browserless handles data and service terms, please refer to our published policies:

# Browserless Trust Center

Security, Compliance & Privacy

Security, reliability, and privacy are core to how Browserless operates. Our platform is built with strong security controls, industry-recognized certifications, and operational processes designed to protect customer data and ensure reliable service.

Browserless maintains independent security certifications, documented operational procedures, and privacy safeguards that meet the expectations of modern SaaS customers and enterprise security teams.

Last updated: March 30, 2026

## Contents

  * Compliance & Certifications
  * Security Practices
  * Privacy & Data Protection
  * Business Continuity & Reliability
  * Vendor & Data Lifecycle Management
  * Security FAQ
  * Responsible Disclosure
  * Contact Security

## Compliance & Certifications

Browserless maintains independent certifications and compliance programs that validate our security controls and operational practices.

### Do you have an incident response process?

Yes. Browserless maintains documented incident response procedures and dedicated support processes for handling security incidents.

### Have you experienced any recent security breaches?

Browserless has not reported any recent breaches or security incidents related to customer data.

### Do you have a disaster recovery plan?

Yes. Browserless maintains a documented Business Continuity and Disaster Recovery (BCDR) plan, which is regularly tested to ensure operational readiness.

### Do you use AI or machine learning systems?

Browserless does not process customer data through AI or machine learning systems. Our platform executes browser automation as directed by your code without analyzing or learning from session content.

## Responsible Disclosure

Browserless welcomes responsible security research from the community. If you believe you have discovered a security vulnerability in our platform or infrastructure, we encourage you to report it promptly.

To submit a report, please email security@browserless.io with a detailed description of the vulnerability, including steps to reproduce the issue where possible. We ask that you allow us a reasonable window to investigate and address the issue before any public disclosure.

We aim to acknowledge all reports within 72 hours and will work with reporters to establish appropriate remediation timelines. Browserless does not pursue legal action against researchers who act in good faith and follow responsible disclosure practices.

## Contact Security

For more information about how Browserless handles data and service terms, please refer to our published policies:

Privacy Policy | Terms of Service

For security questions, compliance documentation requests, or vulnerability disclosures, please contact: security@browserless.io--------------------------------------------------------------------------------
Web Scraping API with Puppeteer & Playwright | Browserless (https://www.browserless.io/scraping)
citeturn1search3 [wordlim: 200] Crawled: yesterday; Stealth routes, captcha solving, and BrowserQL's CDP-level control combine to bypass Cloudflare, Datadome, and other bot detectors. ...       https://production-sfo.browserless.io/scrape?

Web Scraping

# Scrape any site at scale. From simple pages to sites that fight back.

Send a URL and get structured data. Connect Puppeteer or Playwright for full control, or reach for BrowserQL when bot detection is the whole problem. We handle the infrastructure either way.

Start scraping freeSee pricing

## Pick the right tool for the target

Start here

Smart Scrape API

Send a URL, get structured JSON back. Built for the 80% of scraping jobs where you just need the data, no browser code, no parsing libraries, no infrastructure.

  * JSON output, no parsing required
  * Handles dynamic, JavaScript-rendered content
  * One API call per page

Explore Smart Scrape

When sites fight back

BrowserQL

A stealth automation runtime for sites protected by Cloudflare, Datadome, or nested-iframe CAPTCHAs. Step up to BQL when Smart Scrape or standard Puppeteer/Playwright get blocked.

  * Bypass major bot detectors
  * Auto-click CAPTCHAs inside iframes
  * Zero automation fingerprints
--------------------------------------------------------------------------------
Smart Scrape API | Browserless Documentation (https://docs.browserless.io/rest-apis/smart-scrape)
citeturn1search4 [wordlim: 200] Crawled: last week; Smart Scrape only solves captchas that gate access to the page itself — for example, a Cloudflare Turnstile interstitial or a reCAPTCHA that blocks the page from loading. ... If you need to submit a form behind a captcha, use BrowserQL with the `solve` mutation instead.

The pipeline stops as soon as a strategy succeeds. The `strategy` field in the response tells you which approach was used, and the `attempted` array shows the full sequence of strategies tried.

Captcha handling scope

Smart Scrape only solves captchas that gate access to the page itself — for example, a Cloudflare Turnstile interstitial or a reCAPTCHA that blocks the page from loading. In these cases the browser solves the challenge automatically so the underlying content can be returned.

Captchas that are embedded in a form on the page (e.g., a reCAPTCHA next to a "Submit" button on a contact or signup form) are not solved. Smart Scrape fetches and returns the rendered page but does not fill, interact with, or submit forms, so form-submission captchas are left untouched in the returned HTML. If you need to submit a form behind a captcha, use BrowserQL with the `solve` mutation instead.

## Request body

Field  | Type  | Required  | Default  | Description
--- | --- | --- | --- | ---
`url`  | `string`  | Yes  | -  | The URL to scrape. Must be `http://` or `https://`.
`formats`  | `string[]`  | No  | `["html"]`  | Output formats to include. Options: `"html"`, `"markdown"`, `"screenshot"`, `"pdf"`, `"links"`.
`proxy`  | `string`  | No  | `"residential"`  | Proxy network to route the scrape through: `"residential"` (6 units/MB) or `"datacenter"` (2 units/MB).

--------------------------------------------------------------------------------
Browserless Overview | Browserless Documentation (https://docs.browserless.io/overview/intro)
citeturn1search5 [wordlim: 200] Crawled: last week; Browserless provides managed headless browsers for automation. ... BrowserQL GraphQL API for stealth-first automation with built-in CAPTCHA solving, fingerprint evasion, and a web IDE.

# Introduction

## What is Browserless?

Browserless provides managed headless browsers for automation. Connect Puppeteer, Playwright, or Selenium over WebSocket, or use REST and GraphQL APIs for scraping, screenshots, and PDFs. Run it in our cloud or self-host with Docker. We handle the browser infrastructure so you don't have to.

Before you start

Sign up for a free account and copy your API token from the Browserless dashboard. You'll pass it as the `?token=` query parameter on every request.

## Get started

Not sure which to pick? See the API Comparison.

BrowserQL GraphQL API for stealth-first automation with built-in CAPTCHA solving, fingerprint evasion, and a web IDE. Best for bypassing sophisticated bot detection.BaaS v2 Connect Puppeteer or Playwright to managed browsers over WebSocket. Drop in a single connection URL and your existing code runs in the cloud.REST APIs HTTP endpoints for screenshots, PDFs, scraping, and content extraction. No browser libraries required. Best for simple, stateless operations.AI & Agent Integrations Pre-built integrations with LLM frameworks, MCP servers, agent frameworks, AI SDKs, and no-code tools including n8n, Zapier, Browser Use, Vercel AI SDK, and LangChain.Enterprise Self-host with Docker or let Browserless manage a private deployment on your cloud provider, with real-time monitoring and enterprise-grade security controls.--------------------------------------------------------------------------------
Smart Scrape: Adaptive Web Scraping API | Browserless (https://www.browserless.io/feature/scraper-api)
citeturn1search6 [wordlim: 200] Crawled: yesterday; Browserless's smart scraper automatically escalates from fast HTTP fetching to headless browsers and captcha solving as required. ...       const url = `https://production-sfo.browserless.io/smart-scrape?

Smart Scrape API

# Scrape any URL.
Let Browserless figure out the rest.

The Smart Scrape API adapts to any challenge automatically, escalating from fast HTTP fetching to headless browsers and captcha solving as needed.

Sign up freeSee our docs

## How our Smart Scraper works

Browserless's smart scraper automatically escalates from fast HTTP fetching to headless browsers and captcha solving as required.

Start fast and adapt

Smart Scrape API starts with the fastest, cheapest approach and moves to more powerful strategies if needed.

Exactly what you want

The API stops as soon as it has your data, or you can add a timeout query parameter for more control.

All in a single request

Specify whether you want HTML, Markdown, screenshots, PDFs, or extracted link outputs.

## How Smart Scrape adapts

With a simple request, our scraper API will find the right web scraping method, stop when successful, and share full details of the approaches used.

1

### Fast HTTP fetch

A lightweight HTTP request that mimics a real browser's network fingerprint, handling the majority of static and server-rendered sites in under 2 seconds.

Fastest

↓It's blocked by datacenter IP detection

2

### Proxied HTTP fetch

The same request retried through a residential proxy, bypassing datacenter IP blocks without the overhead of launching a full browser.

Proxied

↓The page requires JavaScript rendering

3

### Headless browser

A full stealth browser renders the page, handling single-page apps, client-rendered content, and any site that needs JavaScript to load its data.

Headless

↓CAPTCHA or bot challenge detected

4

### Browser and CAPTCHA solving

Automatically detects and solves most CAPTCHA categories, Cloudflare Turnstile, and others before extracting your data.

Full unlock

## One request. Five output formats.

Pass the formats you need in a single request. Smart Scrape returns all of them together.

html

The full rendered HTML of the page, always included in the content field regardless of other formats requested.
--------------------------------------------------------------------------------
Frequently Asked Questions - Browserless (https://www.browserless.io/faq)
citeturn1search7 [wordlim: 200] Crawled: yesterday; ### Is Browserless suitable for automated testing?

# Frequently Asked Questions

Everything you need to know about Browserless

## Getting Started

### How do I get started with Browserless?

### What is an API key and how do I use it?

### Do I need to install Chrome or Chromium on my server?

### Can I test Browserless before committing to a paid plan?

## Pricing & Billing

### What is a unit and how is it calculated?

### What happens if I exceed my plan's unit allowance?

### Can I upgrade or downgrade my plan at any time?

### Do you offer annual billing discounts?

### How do refunds work?

## Technical

### Which browsers and versions do you support?

### What is concurrency and how does it work?

### What are the timeout limits for browser sessions?

### Can I use proxy servers with Browserless?

### How does Browserless handle CAPTCHAs?

## Use Cases

### Can I use Browserless for web scraping?

### Is Browserless suitable for automated testing?

### Can I generate PDFs and screenshots with Browserless?

## Enterprise

### What is included in the Enterprise plan?

### Can I self-host Browserless?

### What kind of SLA do you offer?

## Still have questions?

Can't find the answer you're looking for? Our support team is here to help.

Contact SupportView Pricing

Looking for more resources? Check out our documentation, GitHub repository.--------------------------------------------------------------------------------
Changelog - Browserless (https://www.browserless.io/changelog)
citeturn1search8 [wordlim: 200] Crawled: yesterday;       "wss://production-sfo.browserless.io? ... ## Run Browser Use on Browserless with built-in CAPTCHA solving ...   * `/smart-scrape` intelligently extracts content with automatic CAPTCHA solving and proxy rotation.
And when a step does fail, the error messages now tell you what actually went wrong.

Learn more about agentic browsing →

Other updates

Bug fixes

`May 2026`

## Run Browser Use on Browserless with built-in CAPTCHA solving

Browser Use is the open-source Python library that lets AI agents drive a browser. You can now run it on our cloud infrastructure with native CAPTCHA solving wired in. When your agent hits a reCAPTCHA, Cloudflare Turnstile, or DataDome challenge, Browserless solves it in the background and the agent picks up where it left off. We're the only browser infrastructure provider with CAPTCHA solving integrated directly into Browser Use.

Image: Browser Use x Browserless

To turn it on, point Browser Use at our WebSocket URL with two query parameters: `solveCaptchas=true` and `integrations=browseruse`. Available on all plans. Requires `browser-use >= 0.12.0`.

Read the Browser Use + Browserless guide →

## Agentic browsing in the Browserless MCP

Now your AI assistant can drive a real browser end-to-end. The new `browserless_agent` MCP tool gives the model a stateful browser session and a snapshot-driven view of the page, so the assistant can navigate, click, type, and react to what it sees over multiple turns instead of returning one-shot scrapes. Plug it into Claude Desktop, Cursor, VS Code, Windsurf, or any MCP-compatible client.

Cookies, `localStorage`, and navigation history persist across the model's turns, so a single agent run can log in, paginate through results, and finish a multi-step task without losing state.

Learn more about Agentic browsing →

--------------------------------------------------------------------------------
Puppeteer & Playwright Browser Automation | Browserless (https://www.browserless.io/automation)
citeturn1search9 [wordlim: 200] Crawled: yesterday; Use stealth settings to avoid triggering bot detection, our /unblock API to get past it, or leverage automated captcha solving to keep your automations running.cite4†See Docs†docs.browserless.io --------------------------------------------------------------------------------
CAPTCHA Solving | Browserless Documentation (https://docs.browserless.io/baas/bot-detection/captchas)
citeturn1search10 [wordlim: 200] Crawled: last week;       browserWSEndpoint: `wss://production-sfo.browserless.io/stealth? ... CAPTCHA solving integrates with Browserless live URL sessions for hybrid automation workflows.
--------------------------------------------------------------------------------
Browserless Pricing: Simple, Usage-Based Plans (https://www.browserless.io/pricing)
citeturn1search11 [wordlim: 200] Crawled: yesterday;   * Automatic captcha solving ...   * Access to screen recording ... Everything you need to run browser automation at scale, without the headaches.


There’s a sharp distinction emerging: Browserless can replace the browser farm, but its flagship “unblock” path conflicts with this project’s existing no-evasion rule. I’m checking whether the plain Chrome + persistent Latvian residential session + human handoff path is viable without stealth or automated CAPTCHA solving—and whether their terms actually permit the use case.


exec

Input: const r = await tools.web__run({search_query:[{q:"site:docs.browserless.io liveURL hybrid automation human takeover browser session iframe devtoolsFrontendUrl"},{q:"site:docs.browserless.io \"Hybrid Automations\" liveURL human-in-the-loop"},{q:"site:docs.browserless.io session API devtoolsFrontendUrl persisted session human interaction"}],"response_length":"long"}); text(r);


Question: site:docs.browserless.io liveURL hybrid automation human takeover browser session iframe devtoolsFrontendUrl ...

site:docs.browserless.io "Hybrid Automations" liveURL human-in-the-loop

site:docs.browserless.io session API devtoolsFrontendUrl persisted session human interaction


Script completed
Wall time 1.4 seconds
Output:

Hybrid Automation | Browserless Documentation (https://docs.browserless.io/baas/monitor-sessions/hybrid-automation)
citeturn2search0 [wordlim: 200] Crawled: 6 days ago; Hybrid automation lets you pause an automated script, hand control to a human via a secure live URL, and resume automation once they finish. ... Advanced Hybrid Automation Configurations Configure stream quality, viewport control, event handling, and programmatic session management Screen Recording Capture browser sessions as WebM video files Session Replay Record DOM-based sessions viewable in your dashboard

# Hybrid Automation

Hybrid automation lets you pause an automated script, hand control to a human via a secure live URL, and resume automation once they finish. Use it for login flows, 2FA, CAPTCHAs, or any step that requires human judgment.

Prerequisites

  * A paid Browserless plan (Prototyping, Starter, Scale, or Enterprise) – Hybrid Automation is not available on the free plan
  * A Browserless API token from your account dashboard
  * Puppeteer or Playwright installed locally

Image: hybrid automation preview

## How It Works

Create a `liveURL` through CDP and Browserless returns a one-time link that opens in a browser tab, with no API token embedded. For advanced patterns like multi-stage workflows, read-only monitoring, and bandwidth optimization, see Advanced Hybrid Automation Configurations.

Behavior  | Default  | Override
--- | --- | ---
Viewport  | Resizes to match the end user's screen  | `resizable: false` to keep the current viewport
Interaction  | Click, type, scroll, touch, and tap enabled  | `interactable: false` to block all input (view-only mode)
Stream quality  | Full quality compressed video  | `quality: 1-100` to reduce bandwidth (useful for mobile)
Tab scope  | Only the page used to create the URL  | `showBrowserInterface: true` to stream all tabs (may increase CAPTCHA challenges)
Events  | None  | Listen for `Browserless.liveComplete` and `Browserless.captchaFound`

## Basic Implementation

  * Puppeteer
  * Playwright

    `import puppeteer from 'puppeteer-core';
    const browser = await puppeteer.connect({
      browserWSEndpoint: 'wss://production-sfo.browserless.io?token=YOUR_API_TOKEN_HERE',
    });
    const page = await browser.newPage();
    await page.goto('https://practicetestautomation.com/practice-test-login/');
    const cdp = await page.createCDPSession();
    const { liveURL } = await cdp.send('Browserless.liveURL');
    console.log('Share this URL:', liveURL);
    // Wait for the user to complete their tasks
    await new Promise((r) => cdp.on('Browserless.liveComplete', r));
    // Continue automation...
    await browser.close();
    `

    `import { chromium } from 'playwright-core';
    const browser = await chromium.connectOverCDP(
      'wss://production-sfo.browserless.io/chromium/stealth?token=YOUR_API_TOKEN_HERE'
    );
    const [context] = await browser.contexts();
    const page = await context.newPage();
    await page.goto('https://practicetestautomation.com/practice-test-login/');
    const cdpSession = await context.newCDPSession(page);
    const { liveURL } = await cdpSession.send('Browserless.liveURL');
    console.log('Share this URL:', liveURL);
    // Wait for the user to complete their tasks
    await new Promise((r) => cdpSession.on('Browserless.liveComplete', r));
    // Continue automation...
    await browser.close();
    `

## Close LiveURL Programmatically

This script detects whether the user closed the LiveURL tab manually or if a specific selector appeared on the page, and then programmatically closes the LiveURL session.

  * Puppeteer
  * Playwright

    `import puppeteer from "puppeteer-core";
    const browser = await puppeteer.connect({
      browserWSEndpoint: `wss://production-sfo.browserless.io?token=YOUR_API_TOKEN_HERE`,
    });
    const page = await browser.newPage();
    await page.goto("https://practicetestautomation.com/practice-test-login/");
    const cdp = await page.createCDPSession();
    const { liveURL, liveURLId } = await cdp.send("Browserless.liveURL", {
      timeout: 300000,
    });
    console.log("Share this URL:", liveURL);
    // Close when user finishes manually OR login succeeds
    const result = await Promise.race([
      new Promise((r) => cdp.on("Browserless.liveComplete", () => r("user_closed"))),
      page.waitForSelector("h1.post-title", { timeout: 0 }).then(async () => {
        await cdp.send("Browserless.closeLiveURL", { liveURLId });
        return "login_detected";
      }),
    ]);
    console.log(`LiveURL closed via: ${result}`);
    await browser.close();
    `

    `import { chromium } from "playwright-core";
    const browser = await chromium.connectOverCDP(
      `wss://production-sfo.browserless.io?token=YOUR_API_TOKEN_HERE`
    );
    const [context] = browser.contexts();
    const page = await context.newPage();
    await page.goto("https://practicetestautomation.com/practice-test-login/");
    const cdpSession = await context.newCDPSession(page);
    const { liveURL, liveURLId } = await cdpSession.send("Browserless.liveURL", {
      timeout: 300000,
    });
    console.log("Share this URL:", liveURL);
    // Close when user finishes manually OR login succeeds
    const result = await Promise.race([
      new Promise((r) => cdpSession.on("Browserless.liveComplete", () => r("user_closed"))),
      page.waitForSelector("h1.post-title", { timeout: 0 }).then(async () => {
        await cdpSession.send("Browserless.closeLiveURL", { liveURLId });
        return "login_detected";
      }),
    ]);
    console.log(`LiveURL closed via: ${result}`);
    await browser.close();
    `

## End-User Authentication

LiveURL links authenticate using a short-lived `?i=<id>` parameter that is unique to the session. This ID expires automatically after the LiveURL timeout elapses or when `Browserless.closeLiveURL` is called. LiveURL paths do not require your API token. Do not embed your token in LiveURL links shared with end users.

## Network Endpoints & VPN/Proxy Tips

The LiveURL page loads over HTTPS and then upgrades a same-origin WebSocket to stream frames and input. When diagnosing corporate firewalls, VPNs, or upstream proxies, both of the URLs below must be reachable from the end user's browser:

Surface  | URL pattern  | Protocol
--- | --- | ---
LiveURL page  | `https://<your-browserless-host>/live/index.html?i=<id>`  | HTTPS
LiveURL stream  | `wss://<your-browserless-host>/live/<id>`  | WebSocket (WSS, TLS)

For the Browserless-managed fleet, `<your-browserless-host>` resolves to `production-sfo.browserless.io`, `production-lon.browserless.io`, or `production-ams.browserless.io` depending on the region you connected to. Self-hosted Enterprise deployments use the same `/live/*` paths on whatever host they are deployed to.

If end users report an intermittent `Couldn't establish a secure connection to the server.` error on the LiveURL page:

  * Allowlist WebSockets to `/live/*`, not just HTTPS. Some VPNs and TLS-inspecting proxies pass HTTPS traffic but terminate WebSocket upgrades, which produces exactly this error.
  * Some VPN exit nodes interfere with specific regions. Switching VPN node/region – or routing LiveURL traffic directly – usually resolves it when the failure is tied to a particular upstream proxy.
  * The server sends WebSocket pings every 15s to keep the connection alive through idle-timeout-sensitive middleboxes. The LiveURL page also retries the initial WebSocket handshake up to 4 times with short backoff before showing a terminal error, so transient interference generally recovers without a refresh.
  * Prefer a stable region close to the end user (`production-sfo`, `production-lon`, `production-ams`) for the underlying Browserless connection. The LiveURL WSS runs on the same host, so a closer region reduces the number of hops where VPN/proxy interference can occur.

## FAQ & Troubleshooting

Why am I getting a `403 Forbidden` error?

Your API token is missing or expired. Pass it as a `?token=` query parameter in the WebSocket or HTTP URL. Verify the token in your account dashboard.

My script works locally but fails on Browserless

Local browser settings may differ from the Browserless environment. Use `launch` parameters to match your local setup (viewport, user agent, timezone). See launch parameters for the full list.

## Next steps

Advanced Hybrid Automation Configurations Configure stream quality, viewport control, event handling, and programmatic session managementScreen Recording Capture browser sessions as WebM video filesSession Replay Record DOM-based sessions viewable in your dashboard

Previous Supported Mobile DevicesNext Screen Recording

  * How It Works
  * Basic Implementation
  * Close LiveURL Programmatically
  * End-User Authentication
  * Network Endpoints & VPN/Proxy Tips
  * FAQ & Troubleshooting
  * Next steps
--------------------------------------------------------------------------------
Advanced Hybrid Automation Configurations | Browserless Documentation (https://docs.browserless.io/baas/advanced-configurations/hybrid-automation-configurations)
citeturn2search1 [wordlim: 200] Crawled: last week; This page is the comprehensive reference for all `Browserless.liveURL` options and advanced patterns. ... Try automated CAPTCHA solving first, then fall back to a live URL for human intervention if the solver fails. ... Implement retry logic for production hybrid automation. ...           console.log(`Live session attempt ${attempt} failed:`, error.message);

# Advanced Hybrid Automation Configurations

This page is the comprehensive reference for all `Browserless.liveURL` options and advanced patterns. It covers bandwidth tuning, viewport control, recording integration, CAPTCHA fallback handling, multi-stage workflows, and error recovery.

If you are new to hybrid automation, start with the Hybrid Automation guide.

Prerequisites

  * A Browserless API token from your account dashboard
  * Puppeteer or Playwright installed locally

## Bandwidth and Quality Optimization

Fine-tune live sessions for different network conditions and device capabilities.

  * Puppeteer
  * Playwright

    `const { liveURL } = await cdp.send('Browserless.liveURL', {
      quality: 30,        // Optimized for mobile/slow connections
      type: 'jpeg',       // Better compression than PNG
      timeout: 300000,    // 5 minutes for complex workflows
    });
    `

    `const { liveURL } = await cdpSession.send('Browserless.liveURL', {
      quality: 30,        // Optimized for mobile/slow connections
      type: 'jpeg',       // Better compression than PNG
      timeout: 300000,    // 5 minutes for complex workflows
    });
    `

## Advanced Viewport Control

Control viewport behavior and browser UI visibility for live sessions.

By default, the live URL viewport resizes to match the end user's screen. Set `resizable: false` to lock the browser at its current viewport dimensions. The live URL client preserves the aspect ratio.

  * Puppeteer
  * Playwright

    `const { liveURL } = await cdp.send('Browserless.liveURL', {
      resizable: false,      // Maintain fixed viewport
      interactable: true,    // Allow user interaction
      showBrowserInterface: false, // Hide browser tabs and UI
    });
    `

    `const { liveURL } = await cdpSession.send('Browserless.liveURL', {
      resizable: false,      // Maintain fixed viewport
      interactable: true,    // Allow user interaction
      showBrowserInterface: false, // Hide browser tabs and UI
    });
    `

### Multi-Tab Workflows

For workflows involving multiple tabs or separate windows, set `showBrowserInterface: true` to stream all open tabs. End users can switch between tabs as needed. This option injects UI overlay code into the page, which may increase CAPTCHA challenge likelihood on some sites.

  * Puppeteer
  * Playwright

    `const { liveURL } = await cdp.send('Browserless.liveURL', {
      showBrowserInterface: true, // Show all tabs and browser UI
      quality: 50,
      timeout: 300000, // 5 minutes for complex workflows
    });
    `

    `const { liveURL } = await cdpSession.send('Browserless.liveURL', {
      showBrowserInterface: true, // Show all tabs and browser UI
      quality: 50,
      timeout: 300000, // 5 minutes for complex workflows
    });
    `

## Mobile Viewers

LiveURL links work when the end user opens them on a phone or tablet, but support is limited to single-touch interaction:

  * Touch input: A single-finger tap maps to a mouse click, and a single-finger drag maps to mouse scroll. Multi-touch gestures (including pinch-to-zoom and two-finger pan) are not forwarded to the remote browser.
  * Virtual keyboard: When the LiveURL is opened on a device identified as mobile by its user agent, Browserless automatically injects an on-screen keyboard into the remote page so end users can type.
  * Remote viewport: With the default `resizable: true`, the remote browser's viewport is set to the end user's device width and height, which can cause target sites to render their mobile layout. Use `resizable: false` to keep the viewport you set in your automation script; the stream will be letterboxed to fit the device while preserving aspect ratio.
  * Local zoom: The LiveURL page does not disable the browser's native pinch-zoom, so end users can zoom the LiveURL page itself, but this only scales the local canvas — it does not zoom the remote page.
  * Bandwidth: Lower `quality` (for example `quality: 30`) and keep `type: 'jpeg'` to reduce data usage on cellular connections.

## Read-Only Monitoring Sessions

Create view-only sessions for compliance monitoring or training by setting `interactable: false`. The viewer sees the browser but cannot click, type, or interact.

  * Puppeteer
  * Playwright

    `const { liveURL } = await cdp.send('Browserless.liveURL', {
      interactable: false, // View-only mode
      quality: 80,         // Higher quality for monitoring
      timeout: 1800000,    // 30 minutes for extended monitoring
    });
    // Share with compliance team or supervisors
    console.log('Monitoring URL (read-only):', liveURL);
    `

    `const { liveURL } = await cdpSession.send('Browserless.liveURL', {
      interactable: false, // View-only mode
      quality: 80,         // Higher quality for monitoring
      timeout: 1800000,    // 30 minutes for extended monitoring
    });
    // Share with compliance team or supervisors
    console.log('Monitoring URL (read-only):', liveURL);
    `

## Session Recording Integration

Combine screen recording with live sessions to capture an audit trail. Set `record=true` as a query parameter when connecting to the browser endpoint. See Screen Recording for full details.

  * Puppeteer
  * Playwright

    `// Start recording before creating live session
    await cdp.send('Browserless.startRecording');
    const { liveURL } = await cdp.send('Browserless.liveURL', {
      timeout: 300000
    });
    // Wait for session completion
    await new Promise(resolve => cdp.on('Browserless.liveComplete', resolve));
    // Save recording (see recording docs for details)
    const recording = await cdp.send('Browserless.stopRecording');
    fs.writeFileSync('audit-trail.webm', Buffer.from(recording.value, 'binary'));
    `

    `// Start recording before creating live session
    await cdpSession.send('Browserless.startRecording');
    const { liveURL } = await cdpSession.send('Browserless.liveURL', {
      timeout: 300000
    });
    // Wait for session completion
    await new Promise(resolve => cdpSession.on('Browserless.liveComplete', resolve));
    // Save recording (see recording docs for details)
    const recording = await cdpSession.send('Browserless.stopRecording');
    fs.writeFileSync('audit-trail.webm', Buffer.from(recording.value, 'binary'));
    `

## CAPTCHA Handling with Hybrid Fallback

Try automated CAPTCHA solving first, then fall back to a live URL for human intervention if the solver fails. Listen for the `Browserless.captchaFound` event to trigger this flow. For full CAPTCHA solver documentation, see CAPTCHA Solving.

  * Puppeteer
  * Playwright

    `// Set up CAPTCHA detection before navigation
    cdp.on('Browserless.captchaFound', async () => {
      console.log('CAPTCHA detected, attempting automatic solve');
      const { solved } = await cdp.send('Browserless.solveCaptcha');
      if (!solved) {
        // Fall back to human intervention
        const { liveURL } = await cdp.send('Browserless.liveURL', {
          timeout: 120000 // 2 minutes for CAPTCHA solving
        });
        console.log('Manual CAPTCHA solving needed:', liveURL);
      }
    });
    `

    `// Set up CAPTCHA detection before navigation
    cdpSession.on('Browserless.captchaFound', async () => {
      console.log('CAPTCHA detected, attempting automatic solve');
      const { solved } = await cdpSession.send('Browserless.solveCaptcha');
      if (!solved) {
        // Fall back to human intervention
        const { liveURL } = await cdpSession.send('Browserless.liveURL', {
          timeout: 120000 // 2 minutes for CAPTCHA solving
        });
        console.log('Manual CAPTCHA solving needed:', liveURL);
      }
    });
    `

## Multi-Stage Workflows

Chain multiple hybrid sessions for complex business processes. Each stage alternates between automated steps and human handoffs.

  * Puppeteer
  * Playwright

    `const multiStageWorkflow = async () => {
      const browser = await puppeteer.connect({
        browserWSEndpoint: 'wss://production-sfo.browserless.io?token=YOUR_TOKEN'
      });
      try {
        const page = await browser.newPage();
        const cdp = await page.createCDPSession();
        await page.goto('https://practice.expandtesting.com/inputs');
        await page.waitForSelector('input[name="input-number"]');
        // Stage 1: User fills the number input via liveURL
    };
    `

    `const multiStageWorkflow = async () => {
      const browser = await playwright.chromium.connectOverCDP(
        'wss://production-sfo.browserless.io?token=YOUR_TOKEN'
      );
      try {
        const context = browser.contexts()[0];
        const page = await context.newPage();
        const cdpSession = await context.newCDPSession(page);
        await page.goto('https://practice.expandtesting.com/inputs');
        await page.waitForSelector('input[name="input-number"]');
        // Stage 1: User fills the number input via liveURL
        let { liveURL } = await cdpSession.send('Browserless.liveURL', {
          timeout: 180000 // 3 minutes for number entry
        });
        console.log('Stage 1 - Enter a number:', liveURL);
        await new Promise(resolve => cdpSession.on('Browserless.liveComplete', resolve));
        // Stage 2: Automated filling of text and password fields
        await page.fill('input[name="input-text"]', 'Automated text entry');
        await page.fill('input[name="input-password"]', 'SecurePass123');
        console.log('Stage 2 - Automated text and password fields completed');
        // Stage 3: User fills the date input via liveURL
        ({ liveURL } = await cdpSession.send('Browserless.liveURL', {
          timeout: 300000 // 5 minutes for date selection
        }));
        console.log('Stage 3 - Select a date:', liveURL);
        await new Promise(resolve => cdpSession.on('Browserless.liveComplete', resolve));
        console.log('Multi-stage workflow completed successfully');
      } finally {
        await browser.close();
      }
    };
    `

## Error Recovery and Resilience

Implement retry logic for production hybrid automation. This helper retries on transient failures but exits immediately on permanent errors like invalid tokens or rate limits.

    `import puppeteer from 'puppeteer-core';
    const createResilientLiveSession = async (cdp, options = {}) => {
      const { timeout = 300000, quality = 50, maxRetries = 2 } = options;
      for (let attempt = 1; attempt <= maxRetries; attempt++) {
        try {
          const { liveURL, liveURLId } = await cdp.send('Browserless.liveURL', {
            timeout,
            quality,
            type: 'jpeg'
          });
          console.log(`Live session created on attempt ${attempt}`);
          return { liveURL, liveURLId };
        } catch (error) {
          console.log(`Live session attempt ${attempt} failed:`, error.message);
          // Don't retry on permanent errors
          if (error.message.includes('Invalid token') ||
              error.message.includes('Rate limit exceeded')) {
--------------------------------------------------------------------------------
Screen Recording | Browserless Documentation (https://docs.browserless.io/baas/monitor-sessions/screen-recording)
citeturn2search2 [wordlim: 200] Crawled: last week; See the DevTools Protocol reference. ...         const { liveURL } = await cdp.send('Browserless.liveURL', { ... Hybrid Automation Enable human-in-the-loop workflows with shareable LiveURL sessions Session Replay Capture DOM-based recordings viewable in your dashboard
Most libraries use this CDP command under the hood when updating viewport size. See the DevTools Protocol reference.

Avoid Resizing During Recording

Do not change the viewport size while recording is in progress. Mid-recording viewport changes can distort rendered content and produce a visibly stretched or otherwise unusual recording.

## Recording with LiveURL

You can combine Screen Recording with LiveURL to create human-in-the-loop recording workflows. This captures a WebM video file while a human interacts with the browser in real time. For full LiveURL documentation, see Hybrid Automation.

    `import puppeteer from 'puppeteer-core';
    import fs from 'fs';
    const token = 'YOUR_API_TOKEN_HERE';
    const queryParams = new URLSearchParams({
      token,
      timeout: 180000,
      headless: true,
    }).toString();
    (async () => {
      let browser = null;
      try {
        // Connect with recording enabled
        browser = await puppeteer.connect({
--------------------------------------------------------------------------------
Live Debugger | Browserless Documentation (https://docs.browserless.io/enterprise/live-debugger)
citeturn2search3 [wordlim: 200] Crawled: last week;   * Browser DevTools integration ... For Puppeteer and Playwright, use the Hybrid automation feature to: ...   * Allow human intervention in automation workflows ...   * Live view of the browser session in the right panel
  * Control over browser-specific parameters (headless, stealth, etc.)
  * Tab-based layout with code-saving capabilities
  * Save your code to disk as a Node.js project

In your Browserless account, the debugger link appears in the menu under the `Resources` section:

Image: Account Menu

The Live Debugger interface:

Image: Account Menu

From here, connect to your worker's WebSocket endpoints, set custom launch flags, and configure session parameters.

## Alternative Debugging Approaches

### Hybrid Feature in v2

For Puppeteer and Playwright, use the Hybrid automation feature to:

  * Stream remote headless browsers to users via a shareable URL
  * Detect when CAPTCHAs are found on the page
  * Allow human intervention in automation workflows
  * Continue automation after human interaction is complete

### BrowserQL Editor

For real-time session viewing and debugging, use the BrowserQL Editor, which provides:

  * Live view of the browser session in the right panel
--------------------------------------------------------------------------------
liveURL | Browserless Documentation (https://docs.browserless.io/bql-schema/operations/mutations/live-url)
citeturn2search4 [wordlim: 200] Crawled: 2 weeks ago; Returns a fully-qualified, user-shareable live-URL for streaming the web-browser to an end-user, optionally interactive. ... Once the time is reached, the end-user will receive a prompt that the session has closed

# liveURL

Returns a fully-qualified, user-shareable live-URL for streaming the web-browser to an end-user, optionally interactive.

**Set 30 second timer for interaction**

    `mutation CreateLiveURL {
      goto(url: "https://example.com") {
        status
      }
      liveURL {
        liveURL
      }
    }
    `

**Maintain the current browsers viewport and don't resize it**

    `mutation CreateLiveURL {
      goto(url: "https://example.com") {
        status
      }
      liveURL(resizable: false) {
        liveURL
      }
    }
    `

**Don't allow interaction at all**

    `mutation CreateLiveURL {
      goto(url: "https://example.com") {
        status
      }
      liveURL(interactable: false) {
        liveURL
      }
    }
    `

**Low quality for better bandwidth**

    `mutation CreateLiveURL {
      goto(url: "https://example.com") {
        status
      }
      liveURL(quality: 20 type: jpeg) {
        liveURL
      }
    }
    `

**Field Definition:**

    `liveURL(
      timeout: Float
      interactable: Boolean = true
      type: LiveURLStreamType = jpeg
      quality: Int = 70
      resizable: Boolean = true
      showBrowserInterface: Boolean = false
      compressed: Boolean = true
      emulateComponents: Boolean = true
    ): LiveURLResponse
    `

### Arguments

#### `liveURL.timeout` ● `Float` scalar

The maximum time allowed for the browser to remain alive. Once the time is reached, the end-user will receive a prompt that the session has closed

#### `liveURL.interactable` ● `Boolean` scalar

Whether the session is interactable or not. Set to "false" to not allow click and mouse events to be forwarded through to the end-user

#### `liveURL.type` ● `LiveURLStreamType` enum

The binary-type of the streamed imaged. "jpeg" will consumer lower bandwidth and useful low bandwidth networks and devices. "png" is a much higher quality but will consume considerably more bandwidth.
--------------------------------------------------------------------------------
Watching Sessions | Browserless Documentation (https://docs.browserless.io/enterprise/watching-sessions)
citeturn2search5 [wordlim: 200] Crawled: 6 days ago;       return fetch("https://api.browserless.io/graphql", { ...         console.log(`Open: ${session.devtoolsFrontendUrl} in your browser! ...         console.log(`Open: ${session.devtoolsFrontendUrl} in your browser!
### Selecting Modules

The examples use `puppeteer` or `playwright`, but you can use any library including Selenium. Puppeteer and Playwright have the best support.

The underlying GraphQL query retrieves session properties. Only `devtoolsFrontendUrl` is used in these examples. The other fields are included for reference.

    `query getSessions($id: String!, $apiToken: String!) {
      sessions(apiToken: $apiToken, id: $id) {
        description
        devtoolsFrontendUrl
        id
        title
        url
        id
        browserId
        browserWSEndpoint
      }
    }
    `

This query retrieves sessions by API token and id. The response looks like:

    `{
      "data": {
        "sessions": [
          {
            "id": null,
            "initialConnectURL": "wss://YOUR_CONTAINER_URL_HERE/firefox/playwright/?token=YOUR_API_TOKEN_HERE",
            "isTempDataDir": true,
            "launchOptions": {},
            "numbConnected": 1,
            "routePath": ["/firefox/playwright", "/firefox/playwright"],
            // ...
          }
        ]
      }
    }
    `

> In all of our returned links we omit your API token, so you'll need to add it to the link manually to visit it. This is done for security purposes.

For questions or help with setup, contact us. The Docker configuration reference covers environment variables that affect session behavior.

--------------------------------------------------------------------------------
Browsers as a Service | Browserless Documentation (https://docs.browserless.io/baas/start)
citeturn2search6 [wordlim: 200] Crawled: last week;   * LiveURL: Hand off a browser session to a human for interaction, then resume automation. ... Creating a Session Learn how to establish browser sessions with Puppeteer or Playwright for your automation needs.Avoiding bot detection Learn techniques and strategies to bypass sophisticated bot detection systems and CAPTCHAs.Using Hybrid Automation Combine automated scripts with human intervention for complex workflows and debugging scenarios.
BaaS offloads all of that. Browserless manages the browser pool, handles resource isolation between sessions, and keeps the runtime up to date. Your automation scales without the infrastructure burden.

## Key Features

  * Persistent sessions: Reconnect to the same browser across requests and maintain state between operations.
  * Stealth mode: Enable bot detection evasion by passing stealth launch parameters in the connection URL.
  * LiveURL: Hand off a browser session to a human for interaction, then resume automation.
  * Regional load balancing: Distribute sessions across multiple geographic regions.
  * Launch parameters: Control timeouts, concurrency limits, and queuing behavior.

## Browser Endpoints

Six browsers are available. Connect by changing the path in your WebSocket URL:

Path  | Browser  | Notes
--- | --- | ---
`/chromium`  | Chromium  | Open-source build. Recommended for most automation tasks.
`/chrome`  | Chrome  | Google Chrome binary. --------------------------------------------------------------------------------
Browser Agent | Browserless Documentation (https://docs.browserless.io/mcp/browser-agent)
citeturn2search7 [wordlim: 200] Crawled: last week; `liveURL { timeout?, interactable?, quality?, type?, resizable?}`  | Open a shareable live view of the browser that a human can watch or interact with. ... The browser agent provides a live browser session where the AI can perform multi-step interactions, making it better suited for complex, dynamic workflows. ... AI integrations overview all supported AI frameworks and tools BQL overview use BrowserQL for advanced browser automation

### Session

Method  | Purpose
--- | ---
`liveURL { timeout?, interactable?, quality?, type?, resizable? }`  | Open a shareable live view of the browser that a human can watch or interact with.
`close`  | End the browser session.

## Batching

When multiple actions share the same page state (for example filling a form), they can be batched into a single tool call using the `commands` array. This is significantly faster than invoking the tool once per step.

    `{
      "commands": [
        { "method": "type", "params": { "selector": "input#email", "text": "user@example.com" } },
        { "method": "type", "params": { "selector": "input#password", "text": "secret" } },
        { "method": "click", "params": { "selector": "input#remember-me" } },
        { "method": "click", "params": { "selector": "button[type='submit']" } }
      ]
    }
    `

Batching is safe for actions that don't change the page (`type`, `hover`, `scroll`, `checkbox`, non-navigating `select`). Page-changing actions — `click` on a link or submit button, `goto`, or anything that triggers navigation — should be the last command in the batch, because the next command would execute against the old DOM.
--------------------------------------------------------------------------------
Docker Configuration Reference | Browserless Documentation (https://docs.browserless.io/enterprise/docker/config)
citeturn2search8 [wordlim: 200] Crawled: last week; Forces all sessions to use same cache unless overridden per-session  | OS temp dir  | `/user_data` ... When setting custom directories like `DOWNLOAD_DIR` or `DATA_DIR`, ensure you mount corresponding volumes in your Docker configuration to persist data across container restarts. ... When using a load balancer or reverse proxy (like NGINX) in front of Browserless, you need to configure the external address so Browserless can generate correct external URLs (e.g., in the `/sessions` API). ...         "devtoolsFrontendUrl": "/devtools/inspector.html?
    docker run -p 3000:3000 \
      -e "LOG_LEVEL=info" \
      -e "LOG_FORMAT=json" \
      -e "OTEL_ENABLED=true" \
      -e "OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318" \
      registry.browserless.io/browserless/browserless/enterprise:latest
    `

### External Address Configuration

When using a load balancer or reverse proxy (like NGINX) in front of Browserless, you need to configure the external address so Browserless can generate correct external URLs (e.g., in the `/sessions` API).

Variable  | Description  | Example
--- | --- | ---
`EXTERNAL`  | Fully-qualified external URL for link generation  | `https://browserless.company.com`

Legacy Support

The `PROXY_URL` environment variable is still supported for backward compatibility but is deprecated. Use `EXTERNAL` for new deployments.

See the NGINX Load Balancing guide for complete proxy setup instructions.

Example:

    `# Configure external address for proper link generation in /sessions API
    docker run -p 3000:3000 \
      -e "EXTERNAL=https://browserless.company.com" \
      registry.browserless.io/browserless/browserless/enterprise:latest
    `

The `/sessions` API will return properly formatted URLs:

    `[
      {
        "description": "",
        "devtoolsFrontendUrl": "/devtools/inspector.html?wss=browserless.company.com/devtools/page/C6962B3428FC8E42CDA6484AB5B57EAC",
        "id": "C6962B3428FC8E42CDA6484AB5B57EAC",
        "title": "Example Domain",
        "type": "page",
        "url": "https://www.example.com/",
        "webSocketDebuggerUrl": "wss://browserless.company.com/devtools/page/C6962B3428FC8E42CDA6484AB5B57EAC",
        "browserId": "b519351a-355e-47d5-82cc-7c240cfa40f3",
        "browserWSEndpoint": "wss://browserless.company.com/devtools/browser/b519351a-355e-47d5-82cc-7c240cfa40f3",
        "port": "42169",
        "trackingId": null
      }
    ]
    `

--------------------------------------------------------------------------------
ReconnectionResponse | Browserless Documentation (https://docs.browserless.io/bql-schema/types/objects/reconnection-response)
citeturn2search9 [wordlim: 200] Crawled: last week; The response received after attempting to reconnect a BrowserQL session ...       devtoolsFrontendUrl: String ... Please note that token information is not returned by this API and might be required
--------------------------------------------------------------------------------
Browserless GraphQL API | Browserless Documentation (https://docs.browserless.io/enterprise/private-deployment/graphql-api)
citeturn2search10 [wordlim: 200] Crawled: 2 weeks ago; The Browserless GraphQL API exposes queries for monitoring fleet health, session activity, and unit consumption on your dedicated fleet. ...       "query": "{ sessions(apiToken: \"YOUR_API_TOKEN_HERE\") { description devtoolsFrontendUrl live kill title type url trackingId browserId browserWSEndpoint browserWSEndpointClient } }",
--------------------------------------------------------------------------------
Responses | Browserless Documentation (https://docs.browserless.io/bql-schema/responses)
citeturn2search11 [wordlim: 200] Crawled: last week; Represents the response structure for reconnecting to a browser session. ... `devtoolsFrontendUrl`  | `String`  | The fully-qualified URL of the devtools resources for remotely loading Chrome's developer tools.


Input: const r = await tools.exec_command({cmd:"rg -n \"class Browser|BrowserHub|browserWSEndpoint|puppeteer|playwright|noVNC|needs_solve|directRefresh|onDemand\" src desktop server.ts package.json ops tools --glob '!**/node_modules/**'","workdir":"/home/Messier82/projects/car-parts-comparator-poc","yield_time_ms":10000,"max_output_tokens":16000}); text(r.output);


Script completed
Wall time 0.3 seconds
Output:

rg: server.ts: No such file or directory (os error 2)
rg: tools: No such file or directory (os error 2)
package.json:43:    "puppeteer-core": "^25.3.0",
desktop/main.ts:8:import { ElectronBrowserHub } from "./electronBrowserHub.js";
desktop/main.ts:24:let browser: ElectronBrowserHub | null = null;
desktop/main.ts:55:  browser = new ElectronBrowserHub({
desktop/ipc.ts:4:import type { ElectronBrowserHub } from "./electronBrowserHub.js";
desktop/ipc.ts:10:  browser: ElectronBrowserHub;
desktop/electronBrowserHub.ts:5:export interface ElectronBrowserHubOptions {
desktop/electronBrowserHub.ts:19:export class ElectronBrowserHub implements BrowserFetcher {
desktop/electronBrowserHub.ts:30:  constructor(private readonly options: ElectronBrowserHubOptions = {}) {
src/server.ts:6:import { BrowserHub } from "./core/browserHub.js";
src/server.ts:33:const browser = new BrowserHub(config.browser);
src/server.ts:36:  // BrowserHub already keeps the challenged page in front for the noVNC UI.
src/core/registry.ts:12:import { refreshExactProduct } from "./directRefresh.js";
src/core/registry.ts:17:// - onDemand (routed through the resident headful browser): trodo (JSON API via
src/core/registry.ts:18://   BrowserHub.fetchJson), rd24 + euautodalas + autodoc (server-rendered HTML via
src/core/registry.ts:19://   BrowserHub.fetchPageHtml) are Cloudflare-walled — a warm residential session usually
src/core/registry.ts:20://   passes the managed challenge non-interactively, noVNC solve is the cold fallback. ic24
src/core/registry.ts:21://   (BrowserHub.fetchOriginHtml) is NOT Cloudflare-walled but only serves prices to a warm
src/core/registry.ts:37:// remains scoped by adapter id inside directRefresh until it needs its own module.
src/core/browserErrors.ts:2: * Thrown by BrowserHub when the resident browser hits a Cloudflare interactive
src/core/browserErrors.ts:5: * (the noVNC page), which the UI opens so the user can tap through the challenge.
src/core/browserErrors.ts:7: * Kept in its own tiny module (no puppeteer import) so SearchService can catch it
src/adapters/ic24.ts:11:// (BrowserHub.fetchOriginHtml warms the homepage first, then same-origin-fetches the search
src/adapters/ic24.ts:12:// URL) — same mechanism as trodo, minus any challenge. It rides onDemand purely for the warm
src/adapters/ic24.ts:63:  fetchMode: "onDemand", // routes through the resident browser for its warm session (no CF)
src/adapters/handler.ts:50:  directRefreshTimeoutMs: 45000,
src/adapters/autodoc.ts:7:// by M2 behind a Cloudflare managed challenge → onDemand (walled) store, fetched by
src/adapters/autodoc.ts:8:// navigating the resident headful browser (BrowserHub.fetchPageHtml).
src/adapters/autodoc.ts:12:// noVNC solve remains the fallback if a cold session ever needs interaction.
src/adapters/autodoc.ts:40:  fetchMode: "onDemand",
src/core/offerRefresh.ts:2:import { DirectRefreshParseError } from "./directRefresh.js";
src/core/offerRefresh.ts:21:      adapter.directRefreshTimeoutMs ?? adapter.timeoutMs,
src/adapters/rd24.ts:13:// onDemand (walled) store fetched by navigating the resident headful browser to the
src/adapters/rd24.ts:14:// search page (BrowserHub.fetchPageHtml). Live-verified 2026-07-12: the warm browser on
src/adapters/rd24.ts:16:// the noVNC flow stays as the cold-session fallback. parse() is unchanged and the 2026-07-10
src/adapters/rd24.ts:39:  fetchMode: "onDemand",
src/adapters/euautodalas.ts:7:// original probe, moved behind a Cloudflare managed challenge by M2 → onDemand (walled)
src/adapters/euautodalas.ts:8:// store, fetched by navigating the resident headful browser (BrowserHub.fetchPageHtml).
src/adapters/euautodalas.ts:10:// (200, "148 rezultāti" for W71252); noVNC solve is the cold-session fallback.
src/adapters/euautodalas.ts:35:  fetchMode: "onDemand",
src/adapters/trodo.ts:7:// (BrowserHub) so a human-earned cf_clearance rides the same-origin request.
src/adapters/trodo.ts:28:// the noVNC stream; the API SEARCH() above then returns JSON on the retry.
src/adapters/trodo.ts:59:  fetchMode: "onDemand",
src/core/search.ts:19:  /** Walled (onDemand) store hit a Cloudflare challenge; the UI opens `solveUrl`
src/core/search.ts:20:   *  (noVNC) for the user to clear it, then retries. See WALLED-STORES.md. */
src/core/types.ts:150:  directRefreshTimeoutMs?: number;
src/core/types.ts:153:   * "onDemand": gated behind a Cloudflare challenge — fetched via the resident browser
src/core/types.ts:156:  fetchMode?: "auto" | "onDemand";
src/core/config.ts:16:  /** noVNC page the UI opens when a challenge must be solved by a human. */
src/core/config.ts:22:   * they hit a Cloudflare challenge on every fetch — exercises the noVNC solve
src/core/config.ts:23:   * overlay end-to-end without a real challenge. See BrowserHub.
src/core/browserHub.ts:2: * BrowserHub — the seam between onDemand ("walled") adapters and the resident
src/core/browserHub.ts:5: * It connects to that Chrome over CDP (puppeteer-core `connect`, no browser is
src/core/browserHub.ts:14: * outcome and the UI opens the noVNC stream for the user to solve it once.
src/core/browserHub.ts:16: * NOTE: this module is only exercised when an onDemand adapter is enabled AND the
src/core/browserHub.ts:20:import puppeteer, { type Browser, type Page } from "puppeteer-core";
src/core/browserHub.ts:24:export interface BrowserHubOptions {
src/core/browserHub.ts:27:  /** noVNC page the UI opens when a challenge must be solved. */
src/core/browserHub.ts:41:   * human-facing page and throws ChallengeRequiredError. Lets us exercise the noVNC
src/core/browserHub.ts:54:export class BrowserHub implements BrowserFetcher {
src/core/browserHub.ts:67:  constructor(private readonly opts: BrowserHubOptions) {}
src/core/browserHub.ts:96:    this.browser = await puppeteer.connect({ browserURL: this.opts.browserURL });
src/core/browserHub.ts:115:   * solve a challenge on it, in which case keep it and bring it to the FRONT so the noVNC
src/core/browserHub.ts:150:   * so when the user opens the noVNC stream the widget is on screen to solve. Without
src/core/browserHub.ts:281:   * so the noVNC stream shows exactly what the user must solve. No solvePage needed.


Input: const r = await tools.exec_command({cmd:"sed -n '1,370p' src/core/browserHub.ts; sed -n '1,210p' src/core/config.ts; sed -n '1,190p' desktop/electronBrowserHub.ts","workdir":"/home/Messier82/projects/car-parts-comparator-poc","yield_time_ms":10000,"max_output_tokens":24000}); text(r.output);