openapi: 3.0.0
info:
title: Browserless Browser REST APIs Browser WebSocket APIs API
version: 2.49.0
x-logo:
altText: browserless logo
url: ./docs/browserless-logo-inline.svg
description: "# Browserless.io\n\nThis service extends the Browserless open-source image with many features and enhancements for teams automating at scale. Notable features include:\n\n- A Chrome-devtools-protocol based API for extending and enhancing libraries in a cross-language way.\n- A new hybrid-automation toolkit with live session interactivity.\n- Robust session management: connect, reconnect, kill and limit what a browser can do.\n- Bleeding features like multiplexing numerous clients into a single Chrome process in an isolated way.\n- The ability to upload and run custom extensions.\n- Run multiple tokens, with access controls on each.\n- Multi-browser with all the robust capabilities already in the open-source images.\n\nThere's a lot to cover here so let's get started!\n\n# Software Keys\n\nThe Enterprise image supports time-limited software keys that allow usage for a specific period without requiring any external connections or callbacks. These keys are cryptographically secure and cannot be reverse engineered. When a key expires, the container will exit with a semantic error code.\n\n## Using a Software Key\n\nTo use a software key, set the `KEY` environment variable when running the container:\n\n```bash\ndocker run -e KEY=your-generated-key browserless/enterprise\n```\n\n# Using the Browserless Proxy\n\n> The Residential proxy is only available for Enterprise and Cloud plans.\n\nBrowserless comes with a built-in mechanism to proxy to what's called \"residential\" IPs. These are IP addresses are sourced from real-users running a proxy server on their home networking machines. Residential proxying is especially useful for things like bypassing certain bot blockages and more.\n\nUsing a residential proxy is as straightforward as adding a few parameters to your library or API calls. Here's the required parameters and the values they support:\n\n- `?proxy=residential`: Specifies that you want to use the residential proxy for this request. Data-center coming soon.\n- `?proxyCountry=us`: Specifies a country you wish to use for the request. A two-digit ISO code.\n- `?proxySticky=true`: If you want to use the same IP address for the entirety of the session. Generally recommended for most cases.\n- `?proxyPreset=px_gov01`: Website-specific proxy configuration. Use `px_gov01` for government websites to ensure optimal proxy vendor selection.\n\nSimply append these to your connection call, REST API calls, or any library call:\n\n`wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN&proxy=residential&proxyCountry=us&proxySticky`\n\n`https://production-sfo.browserless.io/chromium/unblock?token=YOUR-API-TOKEN&proxy=residential&proxyCountry=us&proxySticky`\n\nPlease do note that using a proxy will increase the amount of units consumed. Every megabyte of data transferred consumes 6 units.\n\n# The Browserless CDP API\n\nIn order to enhance the experience with open source libraries like Puppeteer, we decided to take a new approach to extending these libraries in a language-agnostic way. We call it the Browserless CDP API. Here's a quick list of what it can do:\n\n- Generate and give back live URLs for hybrid automation.\n- Solve Captchas.\n- Return your page's unique identifier created by Chrome.\n- Way more coming!\n\nSince most libraries come with a way to issue \"raw\" CDP commands, it's an easy way to drop-in custom behaviors without having to write and maintain a library. Plus you can continue to enjoy using the same packages you've already come to know.\n\nGetting started with this API is pretty simple. For instance, if you want to use the live viewer for a particular page, simply do the following:\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint = 'wss://production-sfo.browserless.io/chromium';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n const { liveURL } = await cdp.send('Browserless.liveURL');\n\n // liveURL = 'http://localhost:5555/live/?i=98e83bbfd396241a6963425b1feeba2f';\n})();\n```\n\nYou can then visit this URL in any browser to interact with the headless Chrome running someplace else.\n\nSee more below for a full list of the available APIs and features.\n\n## Browserless.liveURL\n\n> This API is available on all plans except the Free plan. [Contact us for more information here.](https://www.browserless.io/contact/)\n\nReturns a fully-qualified URL to load into a web-browser. This URL allows for clicking, typing and other interactions with the underlying page. This URL doesn't require an authorization token, so you're free to share it externally with your own users or employees. If security is a concern, you can set a `timeout` parameter to limit the amount of time this URL is valid for. By default no `timeout` is set and the URL is good as long as the underlying browser is open.\n\nProgrammatic control of the session is also available, so you can close the live session once your code has detected a selector, network call, or whatever else. See the below example for programmatic control.\n\n**Basic example**\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n const { liveURL } = await cdp.send('Browserless.liveURL');\n\n // liveURL = 'https://production-sfo.browserless.io/live/?i=98e83bbfd396241a6963425b1feeba2f';\n})();\n```\n\n**Timeout example**\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n const { liveURL } = await cdp.send('Browserless.liveURL', {\n timeout: 10000, // 10 seconds to connect!\n });\n\n // liveURL = 'https://production-sfo.browserless.io/live/?i=98e83bbfd396241a6963425b1feeba2f';\n})();\n```\n\n**Maintaining the width and height**\n\nBy default, Browserless will dynamically change the width and height of the browser to match an end-users screen. This isn't always ideal and can be disabled by setting a `resizable` value to `false`. When this is done, only your script can alter the width and height of the browser:\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n\n // Width and height will always be 1920x1080\n // and the Live URL will maintain this aspect ratio\n await page.setViewport({ width: 1920, height: 1080 });\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n const { liveURL } = await cdp.send('Browserless.liveURL', {\n resizable: false,\n });\n\n // liveURL = 'https://production-sfo.browserless.io/live/?i=98e83bbfd396241a6963425b1feeba2f';\n})();\n```\n\n**Setting a Quality and Type**\n\nSetting a \"quality\" and \"type\" effects the streamed quality of the live URL's client-side resolution. By default, Browserless sets these to quality: 70 and type of \"jpeg\". You can experiment different settings to get an ideal resolutions while keep latency slow. The closer to 100 quality is, the potential for higher perceived latency.\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n const { liveURL } = await cdp.send('Browserless.liveURL', {\n quality: 70, // Can be 1 - 100. Default is 70\n type: 'jpeg', // Can be 'jpeg' or 'png'. Default is 'jpeg'\n compressed: true, // Whether to compress each frame of the streamed image data\n });\n\n // liveURL = 'https://production-sfo.browserless.io/live/?i=98e83bbfd396241a6963425b1feeba2f';\n})();\n```\n\nIt's also helpful to \"wait\" until the user is done doing what's needed. For that reason, Browserless will fire a custom event when the page is closed as well:\n\n**Wait for close**\n\n> Custom CDP Events are not supported in all libraries, including .NET Playwright.\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n\n const { liveURL } = await cdp.send('Browserless.liveURL');\n\n console.log(liveURL);\n\n // Wait for the Browserless.liveComplete event when the live page is closed.\n // Please not that not all libraries support custom CDP events.\n await new Promise((r) => cdp.on('Browserless.liveComplete', r));\n\n console.log('Done!');\n\n await browser.close();\n})();\n```\n\n**Programmatic Control**\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n\n // Having the liveURLId is required in order to close it later\n const { liveURL, liveURLId } = await cdp.send('Browserless.liveURL');\n\n await page.waitForSelector('.my-selector');\n\n // Calling this CDP API with the \"liveURLId\" will close the session, and terminate the client\n // further usage of the liveURL will fail and no more human-control is possible\n await cdp.send('Browserless.closeLiveURL', { liveURLId });\n\n // Continue to process or interact with the browser, then:\n await browser.close();\n})();\n```\n\nIt's recommended that you double check the page prior to executing further code to make sure the page is where it should be, elements are present, and so forth. This approach makes it easy to solve hard things like second-factor authentication and more in a trivial fashion.\n\n**Read-only LiveURL Sessions**\n\nThe `interactive: false` option allows you to create read-only LiveURL sessions where users can view the browser but cannot interact with it. This is useful for monitoring or demonstration purposes without allowing user input.\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n\n // Create a read-only LiveURL session that users can view but not interact with\n const { liveURL } = await cdp.send('Browserless.liveURL', {\n interactive: false,\n });\n\n console.log('Read-only LiveURL:', liveURL);\n\n await browser.close();\n})();\n```\n\n## Browserless.reconnect\n\n> This API is only available for Enterprise plans. [Contact us for more information here.](https://www.browserless.io/contact/)\n\nReconnecting allows for the underlying Chrome or Chromium process to continue to run for a specified amount of time, and subsequent reconnecting back to it. With this approach you can also \"share\" this connection URL to other clients to connect to the same browser process, allowing you to parallelize via a single Browser process.\n\nOnce a reconnection URL is retrieved, Browserless will intercept close-based commands and stop them from terminating the browser process itself. This prevents clients from accidentally closing the process via `browser.close` or similar.\n\nIn order to use this API, simply call `Browserless.reconnect` as a CDP command. You can, optionally, set a `timeout` or an `auth` property. See the below examples for details\n\n**Basic example with timeout**\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n\n // Allow this browser to run for 10 seconds, then shut down if nothing connects to it.\n // Defaults to the overall timeout set on the instance, which is 5 minutes if not specified.\n const { error, browserWSEndpoint } = await cdp.send('Browserless.reconnect', {\n timeout: 10000,\n });\n\n if (error) throw error;\n\n await browser.close();\n\n // browserWSEndpoint = 'https://production-sfo.browserless.io/reconnect/98e83bbfd396241a6963425b1feeba2f';\n})();\n```\n\nIf you want to enforce authentication, you can pass in an optional `auth` property that clients will need to use in order to connect with. Similar to how authentication works in general, a `token` query-string parameter will need to be applied.\n\n**Authentication example**\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint =\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n\n // Set a custom authentication token that clients have to use in order to connect, or otherwise\n // receive a 401 Response.\n const { error, browserWSEndpoint } = await cdp.send('Browserless.reconnect', {\n auth: 'secret-auth-token',\n });\n\n if (error) throw error;\n\n await browser.close();\n\n // NOTE the URL here doesn't include the auth token!\n // browserWSEndpoint = 'https://production-sfo.browserless.io/reconnect/98e83bbfd396241a6963425b1feeba2f';\n})();\n```\n\n**Recursive Example**\n\n```js\nimport puppeteer from 'puppeteer-core';\n\nconst job = async (reconnectURL) => {\n const browserWSEndpoint =\n reconnectURL ??\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const [page] = await browser.page();\n const cdp = await page.createCDPSession();\n await page.goto('https://example.com');\n\n // Anytime Browserless.reconnect is called, this restarts the timer back to the provided value,\n // effectively \"bumping\" the timer forward.\n const res = await cdp.send('Browserless.reconnect', {\n timeout: 30000,\n });\n\n if (res.error) throw error;\n\n await browser.close();\n\n // Continuously reconnect back...\n return job(res.browserWSEndpoint);\n};\n\njob().catch((e) => console.error(e));\n```\n\n## Browserless.solveCaptcha\n\n> This API is only available for Enterprise and Scale and above plans on Cloud. [Contact us for more information here.](https://www.browserless.io/contact/). Only the `/chrome` and `/chromium` routes support Captcha solving.\n\nBrowserless comes with built-in captcha solving capabilities. We use a variety of techniques to try and mitigate the chances of captchas coming up, but if you happen to run into one you can simply call on our API to solve it.\n\nGiven the amount of possibilities during a captcha solve, the API returns many properties and information in order to help your script be more informed as to what happened. See the below code example for all details and fields returned by the API.\n\nPlease be aware that solving a captcha can take a few seconds up to several minutes, so you'll want to increase your timeouts accordingly for your scripts. Captcha's solved, or attempted to solve, cost 10 units.\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browser = await puppeteer.connect({\n browserWSEndpoint:\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN&timeout=300000',\n });\n\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n await page.goto('https://www.google.com/recaptcha/api2/demo', {\n waitUntil: 'networkidle0',\n });\n\n const {\n // A simple boolean indicating whether the script can proceed\n ok,\n // Whether or not a captcha was found\n captchaFound,\n // A human-readable description of what occurred.\n message,\n // Whether a solve was attempted or not\n solveAttempted,\n // If the Captcha was solved, only true if found AND solved\n solved,\n } = await cdp.send('Browserless.solveCaptcha', {\n // How long to wait for a Captcha to appear to solve.\n // Defaults to 10,000ms, or 10 seconds.\n appearTimeout: 30000,\n });\n\n console.log(message);\n\n if (ok) {\n await page.click('#recaptcha-demo-submit');\n } else {\n console.error(`Error solving captcha!`);\n }\n\n await browser.close();\n})().catch((e) => {\n console.error(e);\n process.exit(1);\n});\n```\n\nIn general, if an `ok` response is sent back from this API, then your script is good to proceed with further actions. If a captcha is to suddenly appears after an action then you might want to listen for the `Browserless.foundCaptcha` event (see below) and retry solving.\n\n## Browserless.foundCaptcha\n\n> This API is only available for Enterprise and Scale and above plans on Cloud. [Contact us for more information here.](https://www.browserless.io/contact/). Only the `/chrome` and `/chromium` routes support Captcha solving.\n\n> Custom CDP Events are not supported in all libraries, including .NET Playwright.\n\nEmitted whenever a captcha widget is found on the page. Useful for checking if there's a captcha and deciding whether or not to proceed with solving.\n\nThe example below stops until a captcha is found, which may or may not be the case with every website out there.\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n// Recaptcha\n(async () => {\n const browser = await puppeteer.connect({\n browserWSEndpoint:\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN&timeout=300000',\n });\n\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n\n await page.goto('https://www.google.com/recaptcha/api2/demo', {\n waitUntil: 'networkidle0',\n });\n\n // Please note that not all libraries support custom CDP events.\n await new Promise((resolve) =>\n cdp.on('Browserless.captchaFound', (params) => {\n console.log('Found a captcha!');\n return resolve();\n }),\n );\n\n const { solved, error } = await cdp.send('Browserless.solveCaptcha');\n console.log({\n solved,\n error,\n });\n\n // Continue...\n await page.click('#recaptcha-demo-submit');\n})().catch((e) => {\n console.error(e);\n process.exit(1);\n});\n```\n\n### Event Parameters\n\n| Parameter | Type | Description |\n| --------- | -------- | ---------------------------------------------- |\n| `type` | `string` | Captcha type (`recaptcha`, `cloudflare`, etc.) |\n| `status` | `string` | Status: `\"found\"` or `\"solving\"` |\n\n## Browserless.captchaAutoSolved\n\n> This API is only available for Enterprise and Scale and above plans on Cloud. [Contact us for more information here.](https://www.browserless.io/contact/). Only the `/chrome` and `/chromium` routes support Captcha solving.\n\n> Custom CDP Events are not supported in all libraries, including .NET Playwright.\n\nEmitted whenever a captcha widget is solved in the page by the auto-solving feature. Note that this event is not emitted when a captcha is solved manually.\n\nTo enable this feature, you need to set the `solveCaptchas` option to `true` in your query parameters while connecting to the browser.\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n// Helper function to wait for a captcha to be solved\nconst waitForCaptchaResolved = (cdp) => {\n return new Promise((resolve) => {\n const onCaptchaFound = (params) => {\n console.log('Captcha found, type:', params.type, params.status);\n cdp.on('Browserless.captchaAutoSolved', resolve);\n };\n\n cdp.on('Browserless.captchaFound', onCaptchaFound);\n });\n};\n\n// Recaptcha\n(async () => {\n const browser = await puppeteer.connect({\n browserWSEndpoint:\n 'wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN&solveCaptchas=true',\n });\n const page = await browser.newPage();\n const cdp = await page.target().createCDPSession();\n\n await page.goto('https://www.google.com/recaptcha/api2/demo', {\n waitUntil: 'networkidle0',\n });\n const captchaEvent = await waitForCaptchaResolved(cdp);\n console.log(captchaEvent);\n\n await browser.close();\n\n // Continue...\n await page.click('#recaptcha-demo-submit');\n})().catch((e) => {\n console.error(e);\n process.exit(1);\n});\n```\n\n### Event Parameters\n\n| Parameter | Type | Description |\n| ------------ | ---------------- | ------------------------------------------- |\n| `autoSolved` | `true` | Whether captcha was auto-solved |\n| `token` | `null \\| string` | Captcha token if solved |\n| `found` | `boolean` | Whether a captcha was found |\n| `solved` | `boolean` | Whether the captcha was successfully solved |\n| `time` | `number` | Time taken to solve (in milliseconds) |\n\n## Browserless.heartbeat\n\n> This API is only available for Enterprise hosted and Starter and above plans on Cloud. [Contact us for more information here.](https://www.browserless.io/contact/).\n\n> Custom CDP Events are not supported in all libraries, including .NET Playwright.\n\nA custom event emitted every several seconds, signaling a live connection. This is useful for a few reasons:\n\n- It ensure that your connection with the browser is still good.\n- Sending data can trigger some load-balancing technologies to not kill the connection.\n\nToday this event is emitted every 30 seconds.\n\n```js\nimport puppeteer from 'puppeteer-core';\n\nconst browserWSEndpoint = `wss://production-sfo.browserless.io/chromium?token=YOUR-API-TOKEN`;\n\n(async () => {\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n await page.goto('https://example.com/');\n const client = await page.createCDPSession();\n\n client.on('Browserless.heartbeat', () => {\n console.log('Browserless.heartbeat');\n });\n})();\n```\n\n## Browserless.pageId\n\n> This API is only available for Enterprise hosted and Starter and above plans on Cloud. [Contact us for more information here.](https://www.browserless.io/contact/).\n\nA simple helper utility to return the page's unique ID. Since most libraries treat this ID as opaque, and some even hide it, knowing the page's ID can be of great help when interacting with other parts of Browserless.\n\n```js\nimport puppeteer from 'puppeteer-core';\n\n(async () => {\n const browserWSEndpoint = 'wss://production-sfo.browserless.io/chromium';\n const browser = await puppeteer.connect({ browserWSEndpoint });\n const page = await browser.newPage();\n const cdp = await page.createCDPSession();\n const { pageId } = await cdp.send('Browserless.pageId');\n\n // pageId = 'ABC12354AFDC123';\n})();\n```\n\nYou can, optionally, try and \"find\" this ID in puppeteer or similar libraries. Given that puppeteer has this property underscored, it's likely to change or be unavailable in the future, and requires the infamous `// @ts-ignore` comment to allow TypeScript compilation.\n\n```ts\nconst getPageId = (page: Page): string => {\n // @ts-ignore\n return page.target()._targetId;\n};\n```\n\n# Changelog\n
\nNote that these changes are only for Browserless' cloud, Enterprise and self-hosted Enterprise deployments. For information on the open-source container please refer to this link.
\n
\nLatest
\n\nv2.95.2
\n\n- Fix in-page WebSocket connections for
/function and /download endpoints being blocked on HTTPS deployments due to mixed-content restrictions. \n
\nv2.95.1
\n\n- Dependency updates.
\n- Add
Browserless.refreshProfile CDP method to update an existing profile's auth state in place without creating a duplicate. \n- Updates to
@browserless.io/browserless at v2.49.0. \n- Reduce production Docker image size by removing development tooling from the final image.
\n
\nv2.95.0
\n\n- Dependency updates.
\n- Fix billing and
Browser Session Ended tracking for persistent session and reconnect WebSocket connections (/session/connect/:id and /reconnect/:id); each WebSocket connection is now billed independently, restoring usage accounting for persistent-session traffic. \n- Add
POST /profile/upload and POST /profile/refresh endpoints to create a profile from a pre-captured auth state or replace an existing profile's state in place, with server-side sanitization of cookies, origins, and IndexedDB plus a diagnostics field describing what was filtered or truncated. \n- Fix LiveURL OAuth login for authenticated profiles, and default the browser type to
stealth when creating a profile without specifying one. \n
\nv2.94.1
\n\n- Dependency updates.
\n- Cap live viewers at 5 per session ID on
/live/<id> and return 429 Too Many Requests once exceeded, freeing slots automatically when viewers disconnect. \n- Include captcha detection and classification in snapshot captures, giving agents better visibility into security challenges encountered during automation.
\n- Add an optional
profile parameter to crawl requests for authenticated scraping; crawls now end early on critical errors, truncate oversized error messages, and return 503 if the profile service is unavailable. \n
\nv2.94.0
\n\n- Updates to
@browserless.io/browserless at v2.48.3. \n- Dependency updates.
\n- Fix agent snapshot generation when pages contain malformed or empty HTML attributes, so snapshots no longer fail on attribute encoding edge cases.
\n- Add an optional
profile parameter to /scrape requests for server-side hydration of authenticated browser profiles; requests that use a profile now require an API token and return clearer validation errors. \n- LiveURL sessions now show distinct end-of-session messages for timeouts versus manual closures, and the message is delivered before the socket disconnects so users actually see it.
\n- Credit limit error messages now link to
https://browserless.io/account/upgrade instead of the generic account page, and have minor grammar fixes. \n
\nv2.93.0
\n\n- Update
@browserless.io/browserless to v2.48.2 \n- Improve proxy city targeting
\n- Add tab management methods for agents
\n
\nv2.92.3
\n\n- Add Akamai captcha solving support.
\n
\nv2.92.2
\n\n- Improve browser fingerprint consistency for CPU architecture and font rendering in Docker images.
\n- Dependency updates
\n
\nv2.92.1
\n\n- Enable agentic browsing for all accounts
\n- Dependency updates
\n
\nv2.92.0
\n\n- Add authenticated profiles: capture a logged-in browser's cookies, localStorage, and IndexedDB once via
Browserless.saveProfile, then reuse on any session with ?profile=<name>. \n- Add HTTP API for profile lifecycle:
POST /profile, GET /profiles, GET|PUT|DELETE /profile/:name. \n
\nv2.91.0
\n\n- Add route for agentic browsing
\n
\nv2.90.6
\n\n- Set default
/crawl scrape timeout to 150s. \n- Add
customer.id to OpenTelemetry resource attributes. \n- Add
Content-Disposition header for PDF API responses. \n- Improve hCaptcha handling by hiding the auto-challenge.
\n- Cache uBOL-home release metadata in the adblock build.
\n
\nv2.90.5
\n\n- Update search limits: Free 1→3, Prototyping 3→5, Starter 5→10, Scale 10→20.
\n- Dependency updates.
\n
\nv2.90.4
\n\n- Improve DataDome captcha solving reliability.
\n
\nv2.90.3
\n\n- Add captcha solving support for browser-use sessions.
\n
\nv2.90.2
\n\n- Add DataDome captcha solving support.
\n- Improve smart-scrape captcha detection and post-challenge navigation.
\n- Add captcha solving support for browser-use sessions.
\n- Improve
/crawl API with enhanced orchestration and documentation. \n- Fix timeout override for applicable routes.
\n- Fix session TTL display for browser sessions.
\n- Bug fixes and improvements.
\n
\nv2.90.1
\n\n- Bug fixes and improvements.
\n
\nv2.90.0
\n\n- New crawl API for scalable web crawling.
\n- Fix BQL
close() overwriting reconnect keepUntil with zero TTL. \n
\nv2.89.2
\n\n- Updates to
@browserless.io/browserless at v2.46.0. \n- Fix 400 errors caused by strict
Record<string,string> types in API schemas. \n- Fix Docker multi-heavy base image tagging.
\n- Dependency updates.
\n
\nv2.89.1
\n\n- Updates to
@browserless.io/browserless at v2.45.0. \n- Fix proxy SSL certificate errors (
ERR_CERT_AUTHORITY_INVALID). \n- Improve proxy vendor health checks and failover reliability.
\n- Harden URL validation against SSRF and DNS rebinding.
\n- Fix session TTL management.
\n- Fix
stopRecording hanging in certain error conditions. \n- Fix recording quality for VHS sessions.
\n- Unify scrape format types across REST API schemas.
\n
\nv2.89.0
\n\n- Add metadata enrichment for
/map endpoint. \n- Add option to transfer base64 instead of binary for recordings.
\n- Fix liveURL blank screen.
\n- Fix bypass CSP for virtual keyboard and emulated
<select>s. \n- Fix high CPU consumption for
/map. \n- Add
--disable-component-extensions-with-background-pages to stealth args. \n
\nv2.88.2
\n\n- Updates to
browserless.io/browserless at v2.43.0. \n
\nv2.88.1
\n\n- New
/map API. \n- Add
emulateComponents option for liveURL. \n- Dependency updates.
\n
\nv2.87.0
\n\n- Deprecate
codes in waitForResponse mutation, favoring statuses instead. \n- Fix
<select /> elements in liveURL view. \n- Enable uploaded extensions cache.
\n- New
/search API. \n
\nv2.86.1
\n\n- Power-scrape endpoint is now smart-scrape.
\n- Improve Turnstile captcha detection and solving.
\n- Improve session replay in reconnect sessions.
\n- Improve stealth chromium for persistent sessions.
\n
\nv2.86.0
\n\n- Updates to
browserless.io/browserless at v2.42.0. \n- Updates NodeJS to
24.14.0. \n- Supports
puppeteer-core version 24.37.5. \n- Dependency updates.
\n- Added support for loading extensions from session metadata.
\n
\nv2.85.1
\n\n- Supports HTTPs third party proxies in BQL
\n- Fixes mobile typing bug in liveURL
\n
\nv2.85.0
\n\n- Updates to
browserless.io/browserless at v2.41.0. \n- Supports
puppeteer-core version 24.37.4. \n- OTEL support.
\n
\nv2.84.2
\n\n- Fix power scraper initialization bug
\n
\nv2.84.1
\n\n- Fix query param validation bug
\n
\nv2.84.0
\n\n- New power scrape endpoint for intelligent content extraction.
\n- Fix external proxies in BQL incorrectly charging proxy units.
\n
\nv2.83.0
\n\n- Fix proxy consumption bug
\n- Fix screencasting video dimensions
\n- Improve docker image size
\n
\nv2.82.1
\n\nv2.82.0
\n\n- Added new proxy vendor.
\n- New
processKeepAlive flag. \n- Fix screencasting video dimensions.
\nliveURL connection issues. \n
\nv2.81.0
\n\n- Updates to
browserless.io/browserless at v2.39.0. \n- Session replay improvements.
\n- Improve proxy mutations in BQL.
\n- Additional captchas support.
\n- Supports
playwright-core versions 1.41.2, 1.42.1, 1.43.1, 1.44.1, 1.45.3, 1.46.1, 1.47.2, 1.48.2, 1.49.1, 1.50.1, 1.51.1, 1.52.0, 1.53.2, 1.54.2, 1.55.1, 1.56.1, 1.57.0 and 1.58.1. \n- Supports
puppeteer-core version 24.36.1. \n
\nv2.80.1
\n\n- Improve CAPTCHA detection and solving.
\n- Support for external proxy server parameter.
\n
\nv2.80.0
\n\n- Updates to
browserless.io/browserless at v2.38.4. \n- Updates NodeJS to
24.13.0. \n- Improve captcha solving performance.
\n- Additional captchas support.
\n- Supports
playwright-core versions 1.41.2, 1.42.1, 1.43.1, 1.44.1, 1.45.3, 1.46.1, 1.47.2, 1.48.2, 1.49.1, 1.50.1, 1.51.1, 1.52.0, 1.53.2, 1.54.2, 1.55.1, 1.56.1 and 1.57.0. \n- Supports
puppeteer-core version 24.36.0. \n
\nv2.79.2
\n\n- Improve CAPTCHA detection and solving.
\n
\nv2.79.1
\n\n- Improve liveURL rendering in high DPI displays.
\n- Bug fixes.
\n
\nv2.79.0
\n\n- Improve CAPTCHA detection mechanism.
\n- Fix bug where deeply nested elements weren't found in nested shadow DOMs
\n
\nv2.78.3
\n\n- Improved BQL proxy URL regeneration on reconnects
\n- Streamlined event logging
\n
\nv2.78.2
\n\n- Improved proxy connection reliability
\n
\nv2.78.1
\n\n- Upgraded browser tracking TTL
\n
\nv2.78.0
\n\n- Improved stealth and bot detection evasion capabilities
\n
\nv2.77.1
\n\n- Fix black screen issue with live urls
\n
\nv2.77.0
\n\n- New
MAX_RECONNECT_TIME launch flag \n- Ensure the WS connection is always closed when using the
/kill endpoint \n- Improve captcha detection
\n- Fix bug in live URL that added an offset to mouse events
\n
\nv2.76.0
\n\n- Improve proxy reliability and performance
\n- Fix third party proxies for BQL
\n- Improve captcha solving performance
\n
\nv2.75.0
\n\n- Improved proxy reliability and performance
\n- Enhanced captcha detection
\n- Better stealth mode compatibility
\n- Session replay improvements
\n
\nv2.74.4
\n\n- Stealth route enhancements
\n- Connection stability improvements
\n
\nv2.74.3
\n\n- Enhanced captcha handling
\n
\nv2.74.2
\n\n- Bug fixes and improvements
\n
\nv2.74.1
\n\n- Added proxy provider configuration options
\n
\nv2.74.0
\n\n- Dependency updates
\n- Improved captcha support for BQL
\n- Performance optimizations
\n
\nv2.73.2
\n\n- Improve Resdential Proxy Quaility
\n
\nv2.73.1
\n\n- Minor improvements in liveURL client
\n
\nv2.73.0
\n\n- Add
proxyLocaleMatch parameter to set browser language based on proxy country \n- Fix BQL session replay
\n
\nv2.72.1
\n\n- Deprecate
verify mutation \n- Improve captcha callback function caller
\n- Improve internal logs
\n
\nv2.72.0
\n\n- Added new proxy vendor
\n- New
solveImageCaptcha mutation \n- Better handle proxy requests that contains cities
\n
\nv2.71.1
\n\n- Fix bug in
/unblock API where it errored if the screenshot parameter was not set \n- Allow all paid accounts to use the screencasting API
\n
\nv2.71.0
\n\n- Implemented new proxy provider
\n- Improved Cloudflare CAPTCHA solver
\n
\nv2.70.2
\n\n- Updated proxy provider priority
\n
\nv2.70.1
\n\n- Improved recaptcha-v3 solver for speed and reliability improvements
\n- Added
/proxy/cities API endpoint for getting a list of supported proxy cities \n- Improved selectors for normal captcha, and Cloudflare captcha
\n
\nv2.70.0
\n\n- Improved recaptcha v3 support
\n- Add fallback between captcha solvers
\n- Improve event logging
\n
\nv2.69.1
\n\n- Dependency updates.
\n- Improved recaptcha v2 support in stealth routes
\n
\nv2.69.0
\n\n- Match the browsers to the stealth endpoints.
\n- Cloudflare captcha tracking improvements
\n
\nv2.68.5
\n\n- Added support for Turnstile Cloudflare captcha
\n- Fixed amplitude attempt events to track Cloudflare captchas correctly
\n- Added captcha subtype to amplitude events
\n
\nv2.68.4
\n\n- clean disk space before building docker images
\n
\nv2.68.3
\n\n- Restore automation of timezone and add proxy city validation changes
\n
\nv2.68.1
\n\n- Dependency updates.
\n- Bug fixes and improvements
\n
\nv2.68.0
\n\n- Dependency updates.
\n- Allow
--disable-bundled-ppapi-flash, --disable-dev-shm-usage, --disable-domain-reliability, --disable-gpu, --disable-speech-api, --disable-webgl, and --wm-window-animations-disabled flags to be used. \n- Improve CAPTCHA solvers.
\n
\nv2.67.1
\n\n- Bug fixes and improvements
\n
\nv2.67.0
\n\n- Updates to
browserless.io/browserless at v2.38.2. \n- Supports
playwright-core versions 1.41.2, 1.42.1, 1.43.1, 1.44.1, 1.45.3, 1.46.1, 1.47.2, 1.48.2, 1.49.1, 1.50.1, 1.51.1, 1.52.0, 1.53.2, 1.54.2, and 1.55.1. \n- Supports
puppeteer-core version 24.26.1. \n- Allow using Brave on BQL
\n- Captcha selector fixes
\n
\nv2.66.2
\n\n- Critical security bug fix
\n
\nv2.66.1
\n\n- Critical security bug fix
\n
\nv2.66.0
\n\n- Revert proxy city and timezone changes
\n- Upgrade Playwright, Puppeteer and Browserless
\n- Upgrade Chrome to 141.0
\n- Support for Capy challenges
\n
\nv2.65.2
\n\n- Improve CAPTCHA detection and solving.
\n
\nv2.65.1
\n\n- Add city database for proxy validation
\n- Validate cities against supported proxy providers
\n- Automate timezone based on proxy location
\n
\nv2.65.0
\n\n- Dependency updates
\n- New
@export directive \n- Fix
timeout in solve captcha mutations \n- Normalize allowed cities for proxies
\n- Fix Amplitude IDs for sessions
\n
\nv2.64.3
\n\n- Fix Amplitude logging error
\n
\nv2.64.1
\n\n- Allow using
solveCaptchas on stealth routes. \n
\nv2.64.0
\n\n- Dependency updates.
\n- New feature: auto solve captcha.
\n- Improve captcha resolution state polling.
\n- Fix captcha solving edge cases.
\n
\nv2.63.3
\n\n- Dependency updates.
\n- Log more event properties on
Captcha Solve Error events. \n- Allow sending
acceptInsecureCerts as query param. \n- Improve captcha-solving parameter sanitation.
\n
\nv2.63.2
\n\n- Dependency updates.
\n- Updates to @browserless.io/browserless 2.37.1.
\n
\nv2.63.1
\n\n- Dependency updates.
\n- Switches to
ioredis for cloud-unit platform. \n
\nv2.63.0
\n\n- Dependency updates.
\n- Major
/stealth route enhancements. \n- Many testing updates for internal stability.
\n- Fixes BrowserQL
goto calls that return a chrome-related error. \n- Other fixes and updates for stealth and captcha solving.
\n
\nv2.62.1
\n\n- Dependency updates.
\n- Better timeout messages on cloud platform.
\n- Other testing fixes.
\n
\nv2.62.0
\n\n- Dependency updates.
\n- Update to @browserless.io/browserless 2.37.0.
\n- Minor build updates and unit-test enhancements.
\n- BrowserQL
click mutation fixes and reliability improvements. \n- Fix /pdf, /screenshot and other REST APIs with requestInterceptors that contain base64 responses.
\n- Other minor fixes and improvements.
\n
\nv2.61.2
\n\n- Dependency updates.
\n- Cleanup of internal docs.
\n- Fixes and issue with /unblock API's
waitForFn properties. \n
\nv2.61.1
\n\n- Dependency updates.
\n- Fixes an issue where /unblock might orphan the browser process.
\n- Logging and analytics improvements in cloud.
\n
\nv2.61.0
\n\n- Dependency updates.
\n- Update to Ubuntu 24.04.
\n- Update @browserless.io/browserless to 2.36.0.
\n- New
switchToWindow BrowserQL API. \n- Stealth enhancements and updates.
\n- Prettier changes on source, logging cleanup.
\n
\nv2.60.1
\n\n- Dependency updates.
\n- BrowserQL documentation updates and enhancements.
\n- Analytical improvements on the cloud-unit platform.
\n
\nv2.60.0
\n\n- Dependency updates.
\n- Replay feature is now shipped for cloud-unit.
\n- Documentation cleanup and updates.
\n- Updated request parsing and parameter handling.
\n- Hybrid URL logging clean up.
\n- Stealth enhancements and improvements.
\n
\nv2.59.0
\n\n- Dependency updates.
\n- Stealth updates to all stealth enabled routes.
\n- Fixes and updates to our captcha-solving capabilities.
\n- Use
npm ci for production builds (prevents unintentional package updates). \n- Other fixes and updates.
\n
\nv2.57.0
\n\n- New fingerprint management and rotation for browserless'
/stealth CDP routes! \n- Updates to browserless.io/browserless@
2.34.1 \n- Supports
playwright-core versions 1.41.2, 1.42.1, 1.43.1, 1.44.1, 1.45.3, 1.46.1, 1.47.2, 1.48.2, 1.49.1, 1.50.1, 1.51.1, 1.52.0, 1.53.1, and 1.54.2. \n- Supports
puppeteer-core version 24.16.2. \n- Captcha solving updates and improvements.
\n
\nv2.56.0
\n\n- Updates to
browserless.io/browserless at v2.34.0. \n- Supports
playwright-core versions 1.41.2, 1.42.1, 1.43.1, 1.44.1, 1.45.3, 1.46.1, 1.47.2, 1.48.2, 1.49.1, 1.50.1, 1.51.1, 1.52.0, 1.53.1, and 1.54.2. \n- Supports
puppeteer-core version 24.16.1. \n- Supports using of Chrome Extensions in cloud-unit products. Please refer to documentation on how to use this new feature.
\n- Sessions API now support interoperability with BrowserQL.
\n- Introduces a new vendor for Captcha Solving.
\n- New environment variables:
\nEXTENSIONS_DIR The directory to store extensions onto. \nLOAD_EXTENSIONS_FROM_CLOUD Whether or not to load extensions from a S3 compatible URL. \nEXTENSIONS_CLOUD_BUCKET The bucket for extensions to be loaded from. \nEXTENSIONS_CLOUD_REGION The region to load extensions from. \nCAPSOLVER_API_KEY An API key to use for when Capsolver is used for captcha solving. \n
\n \n
\nv2.55.0
\n\n- Dependency updates.
\n- Reverts some breaking stealth changes in favor of stability.
\n- Adds a "mode" option in BQL's
removeAttributes parameter for better HTML parsing. \n
\nv2.54.0
\n\n- Dependency updates.
\n- New LiveURL updates that include an optional
showBrowserInterface for rendering all the tabs. \n- Fixes some issues with stealth and headers that Chrome generates.
\n
\nv2.53.1
\n\n- Revert live-URL updates until they're backwards compatible.
\n
\nv2.53.0
\n\n- Dependency updates.g
\n- New
viewport API for BQL. \n- Consolidation of some internal utilities for consistency sake.
\n- Big improvements to the
/stealth routes for CDP libraries. \n- You can
solveCaptcha without specifying the vendor in BQL. \n- Support for proxying through residential proxy providers.
\n- Fixes an issue in BQL that can cause a browser to stay open when navigating.
\nLiveURL can now support multi-tabs workflows. \n- Testing fixes.
\n
\nv2.52.4
\n\n- Fixes an issue when deleting sessions
\n
\nv2.52.3
\n\n- Updates to proxying for future compatibility
\n
\nv2.52.2
\n\n- Fixes an issue where proxying can cause un-necessary latency
\n
\nv2.52.1
\n\n- Fix BQL navigation not filtering out iframe page events.
\n
\nv2.52.0
\n\n- Dependency updates.
\n- Fixes navigation (
goto, back, forward) issues in BQL for goto, forward and backward actions. \nblockConsentModal is now default to false in BQL as it sometimes causes sites to hang indefinitely when loading. \n- New
amazonWaf for BQL captcha solving. \n- New downloading handling forcing all downloads to be in a configurable path by setting a
DOWNLOAD_DIR. \n- Fix
page's created by playwright's context object hanging. \n- Fix issues with CDP-based screen-recording.
\n- Other fixes, improvements, and reliability enhancements.
\n- Bumps
puppeteer-core to 24.12.1. \n- Bumps
playwright-core to 1.54.1. \n- Drops support for
playwright-core at 1.49. \n- Supports:
\n- puppeteer-core:
24.12.1 \n- playwright-core:
1.41.2, 1.42.1, 1.43.1, 1.44.1, 1.45.3, 1.46.1, 1.47.2, 1.48.2, 1.49.1, 1.50.1, 1.51.1, 1.52.0, \n- Chromium:
139.0.7258.5 \n- Firefox:
140.0.2 \n- Webkit:
26.0 \n- Chrome:
138.0.7204.101 (amd64 only) \n- Edge:
138.0.3351.83 (amd64 only) \n
\n \n
\n"
servers: []
tags:
- name: Browser WebSocket APIs
paths:
/:
get:
definitions: {}
description: 'Launch and connect to Chromium with a library like puppeteer or others that work over chrome-devtools-protocol.
**Note:** This endpoint is also available at: `/chromium` for backwards compatibility.'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: integrations
schema:
type: string
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: record
schema:
type: boolean
- in: query
name: replay
schema:
type: boolean
- in: query
name: solveCaptchas
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /
tags:
- Browser WebSocket APIs
/devtools/browser/*:
get:
definitions: {}
description: 'Connect to an already-running Chromium process with a library like
puppeteer, or others, that work over chrome-devtools-protocol. Chromium
must already be launched in order to not return a 404.'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /devtools/browser/*
tags:
- Browser WebSocket APIs
/chrome:
get:
definitions: {}
description: Launch and connect to Chromium with a library like puppeteer or others that work over chrome-devtools-protocol.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: integrations
schema:
type: string
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: record
schema:
type: boolean
- in: query
name: replay
schema:
type: boolean
- in: query
name: solveCaptchas
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chrome
tags:
- Browser WebSocket APIs
/function/connect/*:
get:
definitions: {}
description: Internally used by the POST /function API to connect the underlying client-side code to. Not intended for direct use but documented for completeness and to distinguish between other reconnect style calls.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /function/connect/*
tags:
- Browser WebSocket APIs
/devtools/page/*:
get:
definitions: {}
description: 'Connect to an existing page in Chromium with a library like
chrome-remote-interface or others that work the page websocketDebugger
URL. You can get this unique URL by calling the /json/list API
or by finding the page''s unique ID from your library of choice.'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /devtools/page/*
tags:
- Browser WebSocket APIs
/chrome/playwright:
get:
definitions: {}
description: Connect to Chromium with any playwright style library.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/BrowserServerOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chrome/playwright
tags:
- Browser WebSocket APIs
/chromium:
get:
definitions: {}
description: 'Launch and connect to Chromium with a library like puppeteer or others that work over chrome-devtools-protocol.
**Note:** This endpoint is also available at: `/` for backwards compatibility.'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chromium
tags:
- Browser WebSocket APIs
/chromium/playwright:
get:
definitions: {}
description: 'Connect to Chromium with any playwright style library.
**Note:** This endpoint is also available at: `/playwright/chromium` for backwards compatibility.'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/BrowserServerOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chromium/playwright
tags:
- Browser WebSocket APIs
/edge:
get:
definitions: {}
description: Launch and connect to Chromium with a library like puppeteer or others that work over chrome-devtools-protocol.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: integrations
schema:
type: string
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: record
schema:
type: boolean
- in: query
name: replay
schema:
type: boolean
- in: query
name: solveCaptchas
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /edge
tags:
- Browser WebSocket APIs
/edge/playwright:
get:
definitions: {}
description: Connect to Chromium with any playwright style library.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/BrowserServerOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /edge/playwright
tags:
- Browser WebSocket APIs
/firefox/playwright:
get:
definitions: {}
description: 'Connect to Firefox with any playwright-compliant library.
**Note:** This endpoint is also available at: `/playwright/firefox` for backwards compatibility.'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
additionalProperties: false
type: object
properties:
args:
type: array
items:
type: string
chromiumSandbox:
type: boolean
devtools:
type: boolean
downloadsPath:
type: string
headless:
type: boolean
ignoreDefaultArgs:
anyOf:
- type: array
items:
type: string
- type: boolean
proxy:
type: object
properties:
bypass:
type: string
password:
type: string
server:
type: string
username:
type: string
additionalProperties: false
required:
- server
timeout:
type: number
tracesDir:
type: string
firefoxUserPrefs:
type: object
additionalProperties:
type:
- string
- number
- boolean
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /firefox/playwright
tags:
- Browser WebSocket APIs
/webkit/playwright:
get:
definitions: {}
description: 'Connect to Webkit with any playwright-compliant library.
**Note:** This endpoint is also available at: `/playwright/webkit` for backwards compatibility.'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/BrowserServerOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /webkit/playwright
tags:
- Browser WebSocket APIs
/stealth/bql?(/*):
get:
definitions: {}
description: 'WebSocket endpoint for BrowserQL. Connect to establish a persistent browser
session, then send multiple GraphQL operations as JSON messages. The browser
and page state persist across all messages for the connection duration.
Messages use the same JSON format as the HTTP POST endpoint:
Send: { "query": "mutation { goto(url: \"..\") { status } }", "variables": {} }
Receive: { "data": { "goto": { "status": 200 } } }'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: blockConsentModals
schema:
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: humanlike
schema:
type: boolean
- in: query
name: launch
schema:
description: 'Launch options for the browser, either as a JSON object or a JSON string.
Includes options like `headless`, `args`, `defaultViewport`, etc.
Must be either JSON object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: replay
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /stealth/bql?(/*)
tags:
- Browser WebSocket APIs
/chrome/bql?(/*):
get:
definitions: {}
description: 'WebSocket endpoint for BrowserQL. Connect to establish a persistent browser
session, then send multiple GraphQL operations as JSON messages. The browser
and page state persist across all messages for the connection duration.
Messages use the same JSON format as the HTTP POST endpoint:
Send: { "query": "mutation { goto(url: \"..\") { status } }", "variables": {} }
Receive: { "data": { "goto": { "status": 200 } } }'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: blockConsentModals
schema:
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: humanlike
schema:
type: boolean
- in: query
name: launch
schema:
description: 'Launch options for the browser, either as a JSON object or a JSON string.
Includes options like `headless`, `args`, `defaultViewport`, etc.
Must be either JSON object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: replay
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chrome/bql?(/*)
tags:
- Browser WebSocket APIs
/chromium/bql?(/*):
get:
definitions: {}
description: 'WebSocket endpoint for BrowserQL. Connect to establish a persistent browser
session, then send multiple GraphQL operations as JSON messages. The browser
and page state persist across all messages for the connection duration.
Messages use the same JSON format as the HTTP POST endpoint:
Send: { "query": "mutation { goto(url: \"..\") { status } }", "variables": {} }
Receive: { "data": { "goto": { "status": 200 } } }'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: blockConsentModals
schema:
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: humanlike
schema:
type: boolean
- in: query
name: launch
schema:
description: 'Launch options for the browser, either as a JSON object or a JSON string.
Includes options like `headless`, `args`, `defaultViewport`, etc.
Must be either JSON object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: replay
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chromium/bql?(/*)
tags:
- Browser WebSocket APIs
/stealth:
get:
definitions: {}
description: Launch and connect to Stealthy Chromium with a library like puppeteer or others that work over chrome-devtools-protocol for scraping in a more stealth-like fashion.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: integrations
schema:
type: string
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: record
schema:
type: boolean
- in: query
name: replay
schema:
type: boolean
- in: query
name: solveCaptchas
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /stealth
tags:
- Browser WebSocket APIs
/chrome/live/*:
get:
definitions: {}
description: '> This API is only available on paid plans. [Sign-up here](https://www.browserless.io/pricing/).
Websocket back-end that powers the live session experience.'
parameters: []
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chrome/live/*
tags:
- Browser WebSocket APIs
/chrome/stealth:
get:
definitions: {}
description: Launch and connect to Stealthy Chrome with a library like puppeteer or others that work over chrome-devtools-protocol for scraping in a more stealth-like fashion.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: integrations
schema:
type: string
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: record
schema:
type: boolean
- in: query
name: replay
schema:
type: boolean
- in: query
name: solveCaptchas
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chrome/stealth
tags:
- Browser WebSocket APIs
/live/*:
get:
definitions: {}
description: '> This API is only available on paid plans. [Sign-up here](https://www.browserless.io/pricing/).
Websocket back-end that powers the live session experience.
**Note:** This endpoint is also available at: `/chromium/live/*` for backwards compatibility.'
parameters: []
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /live/*
tags:
- Browser WebSocket APIs
/chromium/stealth:
get:
definitions: {}
description: Launch and connect to Stealthy Chromium with a library like puppeteer or others that work over chrome-devtools-protocol for scraping in a more stealth-like fashion.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: integrations
schema:
type: string
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: record
schema:
type: boolean
- in: query
name: replay
schema:
type: boolean
- in: query
name: solveCaptchas
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chromium/stealth
tags:
- Browser WebSocket APIs
/reconnect/*:
get:
definitions: {}
description: Reconnect to an existing Chromium or Chrome session with a library like puppeteer or others that work over chrome-devtools-protocol.
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: integrations
schema:
type: string
- in: query
name: launch
schema:
description: 'Launch options, which can be either an object
of puppeteer.launch options or playwright.launchServer
options, depending on the API. Must be either JSON
object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- $ref: '#/definitions/BrowserServerOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: replay
schema:
type: boolean
- in: query
name: solveCaptchas
schema:
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /reconnect/*
tags:
- Browser WebSocket APIs
/session/connect/*:
get:
definitions: {}
description: 'Connect to an existing session with a library like puppeteer or playwright that work over chrome-devtools-protocol. See documentation for more details on how to start the session.
The browser type (Chrome/Chromium, stealth/regular) is determined from the session metadata when it was created initially.'
parameters:
- in: query
name: launch
schema:
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: replay
schema:
type: boolean
- in: query
name: timeout
schema:
type: number
- in: query
name: token
schema:
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /session/connect/*
tags:
- Browser WebSocket APIs
/chromium/agent:
get:
definitions: {}
description: 'WebSocket endpoint for agentic browser interaction. Connect to establish a
persistent browser session, then send JSON-RPC messages to control the browser.
Uses a simple JSON protocol instead of GraphQL:
Send: { "id": 1, "method": "goto", "params": { "url": "https://example.com" } }
Receive: { "id": 1, "result": { "status": 200, "url": "https://example.com" } }
All BQL mutations are available as methods (goto, click, type, screenshot, etc.).
Additionally supports a "snapshot" method that returns interactive page elements
with CSS selectors, plus tab-management methods (getTabs, switchTab, createTab,
closeTab) for multi-tab workflows.'
parameters:
- in: query
name: blockAds
schema:
description: 'Whether or nor to load ad-blocking extensions for the session.
This currently uses uBlock-Lite and may cause certain sites
to not load properly.'
type: boolean
- in: query
name: blockConsentModals
schema:
description: Whether to automatically block cookie consent modals and popups.
type: boolean
- in: query
name: externalProxyServer
schema:
description: 'External proxy server URL for user-provided proxies.
Format: http(s)://[username:password@]host:port
When set, routes requests through this proxy instead of built-in residential proxies.'
type: string
- in: query
name: humanlike
schema:
description: 'Whether to enable human-like behavior for interactions.
When true, actions like typing and clicking will have randomized delays.'
type: boolean
- in: query
name: launch
schema:
description: 'Launch options for the browser, either as a JSON object or a JSON string.
Includes options like `headless`, `args`, `defaultViewport`, etc.
Must be either JSON object, or a base64-encoded JSON object.'
anyOf:
- $ref: '#/definitions/CDPLaunchOptions'
- type: string
- in: query
name: profile
schema:
description: 'Name of an authenticated profile to hydrate into the browser at launch.
The profile''s cookies, localStorage and IndexedDB are injected via CDP
before your code runs. No-op in builds without a profile subsystem.'
type: string
- in: query
name: proxy
schema:
description: The type of proxy to use, currently just 'residential' is supported
type: string
const: residential
- in: query
name: proxyCity
schema:
description: 'The city to use for the proxy.
Available cities: https://production-sfo.browserless.io/proxy/cities?token=YOUR_TOKEN
Documentation: https://docs.browserless.io/baas/features/proxies#built-in-residential-proxy'
type: string
- in: query
name: proxyCountry
schema:
description: 'A two-letter country code for the proxy configuration.
Supported codes: US, GB, FR, DE, etc.
Full list: https://docs.browserless.io/bql-schema/types/enums/country-type'
type: string
- in: query
name: proxyLocaleMatch
schema:
description: 'Sets the browser''s language to match the proxy''s geographic location.
Recommended when using proxyCountry to ensure websites render content,
currency, and formatting in the local language. Default is English (en-US).'
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: proxyPreset
schema:
description: 'A preset code for website-specific proxy routing.
Maps to specific proxy vendors internally for optimal access to certain websites.
Format: "px_" (e.g., "px_gov01", "px_amazon01")'
type: string
- in: query
name: proxyState
schema:
description: The state or province to use for the proxy, whitespace must be replaced with underscores
type: string
- in: query
name: proxySticky
schema:
description: Whether or not to use the same IP for all requests, defaults to true
enum:
- '0'
- '1'
- 'false'
- 'true'
type: string
- in: query
name: replay
schema:
description: 'Whether to enable session recording for replay.
When true, the session will be recorded and can be replayed later.'
type: boolean
- in: query
name: timeout
schema:
description: 'Override the system-level timeout for this request.
Accepts a value in milliseconds.'
type: number
- in: query
name: token
schema:
description: The authorization token
type: string
- in: query
name: trackingId
schema:
description: Custom session identifier
type: string
requestBody:
content: {}
responses:
'101':
description: Indicates successful WebSocket upgrade.
'400':
code: 400
description: The request contains errors or didn't properly encode content.
message: HTTP/1.1 400 Bad Request
'401':
code: 401
description: The request is missing, or contains bad, authorization credentials.
message: HTTP/1.1 401 Unauthorized
'404':
code: 404
description: Resource couldn't be found.
message: HTTP/1.1 404 Not Found
'408':
code: 408
description: The request took has taken too long to process.
message: HTTP/1.1 408 Request Timeout
'429':
code: 429
description: Too many requests are currently being processed.
message: HTTP/1.1 429 Too Many Requests
'500':
code: 500
description: An internal error occurred when handling the request.
message: HTTP/1.1 500 Internal Server Error
'503':
code: 503
description: Service is unavailable.
message: HTTP/1.1 503 Service Unavailable
summary: /chromium/agent
tags:
- Browser WebSocket APIs
definitions:
CDPLaunchOptions:
type: object
properties:
args:
type: array
items:
type: string
defaultViewport:
type: object
properties:
deviceScaleFactor:
type: number
hasTouch:
type: boolean
height:
type: number
isLandscape:
type: boolean
isMobile:
type: boolean
width:
type: number
additionalProperties: false
required:
- height
- width
devtools:
type: boolean
dumpio:
type: boolean
headless:
enum:
- false
- shell
- true
ignoreDefaultArgs:
anyOf:
- type: array
items:
type: string
- type: boolean
ignoreHTTPSErrors:
type: boolean
acceptInsecureCerts:
type: boolean
slowMo:
type: number
stealth:
type: boolean
timeout:
type: number
userDataDir:
type: string
waitForInitialPage:
type: boolean
additionalProperties: false
BrowserServerOptions:
type: object
properties:
args:
type: array
items:
type: string
chromiumSandbox:
type: boolean
devtools:
type: boolean
downloadsPath:
type: string
headless:
type: boolean
ignoreDefaultArgs:
anyOf:
- type: array
items:
type: string
- type: boolean
proxy:
type: object
properties:
bypass:
type: string
password:
type: string
server:
type: string
username:
type: string
additionalProperties: false
required:
- server
timeout:
type: number
tracesDir:
type: string
additionalProperties: false