[{"data":1,"prerenderedAt":100},["ShallowReactive",2],{"$fAq_aAbzoFJhPQlOkAwtMnQ9uZwKrqzk_0NbGv_vSzA8":3},{"title":4,"date":5,"dateModified":6,"datePublished":7,"dateModifiedISO":7,"image":8,"content":9,"faq":10,"metaTitle":39,"metaDescription":40,"author":41,"authorBio":6,"authorLinkedin":6,"authorTitle":6,"authorPhoto":42,"lastReviewed":6,"noindex":43,"researchBasis":6,"category":44,"readingTime":45,"related":46,"prev":63,"next":64,"toc":65,"takeaways":94},"What Is Patchright? The Reference Guide (2026)","13 Oct 2026",null,"2026-10-13","/img/news/what-is-patchright-guide-2026.png","\u003Cp>\u003Cstrong>Patchright is Playwright with the headless tells patched out of the Chromium build.\u003C/strong> Same API, same selectors, same \u003Ccode>page.goto()\u003C/code>. The difference is that the browser it launches was compiled without three signals that vanilla Playwright announces about itself, and that anti-bot vendors check for.\u003C/p>\n\u003Cp>If you arrived here from a \u003Ccode>patchright\u003C/code> search wanting to know whether it is a new automation framework you need to learn: it is not. It is a drop-in package. The interesting questions are what it patches, what it leaves alone, and whether that is enough for your target.\u003C/p>\n\u003Ch2 id=\"patchright-in-one-table\">Patchright in One Table\u003C/h2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C/th>\n\u003Cth>Answer\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>What it is\u003C/td>\n\u003Ctd>A patched Chromium build plus a thin Playwright-compatible driver\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Language support\u003C/td>\n\u003Ctd>Python and Node.js. No Go, Java, .NET or Rust port\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Browser support\u003C/td>\n\u003Ctd>Chromium only\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>API\u003C/td>\n\u003Ctd>Identical to Playwright, drop-in\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Memory per instance\u003C/td>\n\u003Ctd>~200MB, no overhead over standard Chromium\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Maintained by\u003C/td>\n\u003Ctd>A small independent team (\u003Ca href=\"https://github.com/Kaliiiiiiiiii-Vinyzu/patchright\">Kaliiiiiiiiii-Vinyzu\u003C/a>)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Licence\u003C/td>\n\u003Ctd>Open source, free\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Fixes fingerprint signals\u003C/td>\n\u003Ctd>Yes\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Fixes behavioural signals\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Provides proxies\u003C/td>\n\u003Ctd>No\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Caside class=\"article__usecase-card\">\u003Cdiv class=\"article__usecase-label\">Related use case\u003C/div>\u003Ch3 class=\"article__usecase-title\">Any-site data scraper\u003C/h3>\u003Cp class=\"article__usecase-blurb\">No-code extraction from any website. Managed infrastructure, no anti-bot headaches.\u003C/p>\u003Ca class=\"article__usecase-link\" href=\"/use-cases/data-scraper\">See how it works →\u003C/a>\u003C/aside>\u003Ch2 id=\"installing-patchright\">Installing Patchright\u003C/h2>\n\u003Cp>Python:\u003C/p>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"code-block__copy\" data-copy-code aria-label=\"Copy code\">Copy\u003C/button>\u003Cpre>\u003Ccode class=\"language-bash\">pip install patchright\npatchright install chromium\n\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Node.js:\u003C/p>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"code-block__copy\" data-copy-code aria-label=\"Copy code\">Copy\u003C/button>\u003Cpre>\u003Ccode class=\"language-bash\">npm i patchright\nnpx patchright install chromium\n\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Then change the import. Python:\u003C/p>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"code-block__copy\" data-copy-code aria-label=\"Copy code\">Copy\u003C/button>\u003Cpre>\u003Ccode class=\"language-python\">from patchright.sync_api import sync_playwright\n\nwith sync_playwright() as p:\n    browser = p.chromium.launch(headless=True)\n    page = browser.new_page()\n    page.goto(&quot;https://example.com&quot;)\n    print(page.title())\n    browser.close()\n\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>Node.js:\u003C/p>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"code-block__copy\" data-copy-code aria-label=\"Copy code\">Copy\u003C/button>\u003Cpre>\u003Ccode class=\"language-javascript\">const { chromium } = require(&#39;patchright&#39;)\n\nconst browser = await chromium.launch({ headless: true })\nconst page = await browser.newPage()\nawait page.goto(&#39;https://example.com&#39;)\nconsole.log(await page.title())\nawait browser.close()\n\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>That is the whole migration. Your selectors, page objects, waits and context handling carry over unchanged, because they are Playwright&#39;s and Playwright has not changed. Extraction is ordinary Playwright too — nothing about the patched build changes how you read a page:\u003C/p>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"code-block__copy\" data-copy-code aria-label=\"Copy code\">Copy\u003C/button>\u003Cpre>\u003Ccode class=\"language-python\">from patchright.sync_api import sync_playwright\n\nwith sync_playwright() as p:\n    browser = p.chromium.launch(headless=True)\n    page = browser.new_page()\n    page.goto(&quot;https://example-retailer.de/category/laptops&quot;,\n              wait_until=&quot;domcontentloaded&quot;)\n    page.wait_for_selector(&quot;[data-product-card]&quot;)\n\n    for card in page.query_selector_all(&quot;[data-product-card]&quot;):\n        print({\n            &quot;name&quot;:  card.query_selector(&quot;h3&quot;).inner_text().strip(),\n            &quot;price&quot;: card.query_selector(&quot;[data-price]&quot;).inner_text().strip(),\n            &quot;url&quot;:   card.query_selector(&quot;a&quot;).get_attribute(&quot;href&quot;),\n        })\n    browser.close()\n\u003C/code>\u003C/pre>\u003C/div>\n\u003Cp>One habit worth keeping: \u003Ccode>wait_for_selector\u003C/code> on a real content element, not a fixed \u003Ccode>sleep\u003C/code>. A patched browser that still waits exactly 3,000ms on every page has handed back a behavioural signal it did not need to.\u003C/p>\n\u003Cp>Two install-time details that cost people an afternoon. The patched Chromium is downloaded and cached \u003Cstrong>separately\u003C/strong> from Playwright&#39;s own browser cache, so a CI image that already pins a Playwright browser now pulls a second build. And if both packages are installed in the same environment, an import left pointing at \u003Ccode>playwright\u003C/code> silently gives you the unpatched browser — the run succeeds, the block rate does not change, and nothing in the logs tells you why.\u003C/p>\n\u003Ch2 id=\"what-gets-patched-and-why-build-time-matters\">What Gets Patched, and Why Build Time Matters\u003C/h2>\n\u003Cp>Vanilla Playwright is not trying to hide. It is a testing tool, and it announces itself in ways that cost nothing in CI and everything in production scraping.\u003C/p>\n\u003Cp>\u003Cstrong>1. The \u003Ccode>Runtime.enable\u003C/code> CDP leak.\u003C/strong> Playwright calls \u003Ccode>Runtime.enable\u003C/code> over the Chrome DevTools Protocol to set up its execution-context bookkeeping. That call is observable from inside the page, and Cloudflare&#39;s current detection watches for it specifically. Patchright avoids the call and resolves execution contexts differently. This is the patch that matters most in 2026 and the reason Patchright clears targets that \u003Ccode>playwright-extra\u003C/code> does not.\u003C/p>\n\u003Cp>\u003Cstrong>2. The \u003Ccode>HeadlessChrome\u003C/code> user-agent string inside the binary.\u003C/strong> Not the runtime \u003Ccode>navigator.userAgent\u003C/code> you can override with a launch argument — the string compiled into the Chromium build, which surfaces in places a JavaScript override never reaches.\u003C/p>\n\u003Cp>\u003Cstrong>3. WebDriver capability exposure.\u003C/strong> \u003Ccode>navigator.webdriver\u003C/code> and its supporting plumbing, removed at the C++ level rather than deleted from the page context after load.\u003C/p>\n\u003Cp>The structural reason this works: \u003Cstrong>the patches land before the browser process starts, not in the page.\u003C/strong> A JavaScript-injection approach has to redefine properties after load, and redefinition is itself detectable — an \u003Ccode>Object.defineProperty\u003C/code> guard can spot a property whose descriptor was rewritten. There is nothing to spot when the property was never compiled in.\u003C/p>\n\u003Cp>Two consequences follow from the same fact: no JS injection cost at page load, and a TLS fingerprint closer to a real Chrome session.\u003C/p>\n\u003Caside class=\"article__inline-cta\">\u003Cp class=\"article__inline-cta-text\">Try ScrapeWise on your own URL. \u003Cstrong>Your first 5 requests are free.\u003C/strong>\u003C/p>\u003Ca class=\"article__inline-cta-btn\" href=\"https://portal.scrapewise.ai/register\" target=\"_blank\" rel=\"noopener\">Start Free →\u003C/a>\u003C/aside>\u003Ch2 id=\"the-four-limits-that-decide-whether-it-helps\">The Four Limits That Decide Whether It Helps\u003C/h2>\n\u003Cp>This is the section most \u003Ccode>patchright\u003C/code> write-ups skip, and it is the one that decides whether the package solves your problem.\u003C/p>\n\u003Cp>\u003Cstrong>It does not address behavioural scoring.\u003C/strong> Every modern WAF scores mouse-movement paths, scroll velocity, dwell time before the first click, keystroke cadence and the timing distribution of requests. A patched browser that loads a page, reads the DOM in 400ms and leaves has a signature no binary patch touches. Against Akamai Bot Manager v4 and PerimeterX/HUMAN this is usually what catches Patchright sessions.\u003C/p>\n\u003Cp>\u003Cstrong>It does not give you proxies.\u003C/strong> A clean fingerprint from a datacentre IP that has already been flagged is refused at the edge before anything in the browser is evaluated. In our April 2026 tests Patchright reached 74% against Akamai v4 \u003Cstrong>on residential proxies\u003C/strong>; the IP layer is doing a large share of that work.\u003C/p>\n\u003Cp>\u003Cstrong>It does not cover Firefox or WebKit.\u003C/strong> Patchright is a Chromium patch. Cross-browser suites keep vanilla Playwright for the other two engines, which means two browser caches and two code paths.\u003C/p>\n\u003Cp>\u003Cstrong>It does not exist outside Python and Node.\u003C/strong> The \u003Ccode>patchright go\u003C/code>, \u003Ccode>patchright java\u003C/code> and \u003Ccode>patchright .NET\u003C/code> searches have no answer: there is no port. Playwright itself ships in those languages, Patchright does not. On a Go stack the realistic options are driving a patched Chromium over raw CDP yourself, or moving the fetch layer out of the browser entirely — see \u003Ca href=\"/blogs/curl-cffi-tls-fingerprint-web-scraping-2026\">TLS fingerprint impersonation with curl_cffi\u003C/a>.\u003C/p>\n\u003Ch2 id=\"does-patchright-bypass-cloudflare\">Does Patchright Bypass Cloudflare?\u003C/h2>\n\u003Cp>On Cloudflare&#39;s free BotFight tier, consistently. On Cloudflare Enterprise and Turnstile, results vary by target — which is an honest &quot;sometimes&quot;, not a hedge.\u003C/p>\n\u003Cp>The reason it does better than \u003Ccode>playwright-extra\u003C/code> is the \u003Ccode>Runtime.enable\u003C/code> patch, because that is the signal Cloudflare&#39;s current detection looks for. The reason it still fails on Enterprise is that Enterprise also runs behavioural scoring, and no binary patch reaches it.\u003C/p>\n\u003Cp>Worth being concrete about the common failure sequence, because it is nearly always the same:\u003C/p>\n\u003Col>\n\u003Cli>Vanilla Playwright is blocked immediately.\u003C/li>\n\u003Cli>Patchright passes. The problem looks solved.\u003C/li>\n\u003Cli>Volume goes up. Rate-limiting starts.\u003C/li>\n\u003Cli>Residential proxies are added. Pass rates recover.\u003C/li>\n\u003Cli>Behavioural scoring catches the request timing.\u003C/li>\n\u003Cli>You are now writing a mouse-movement simulator.\u003C/li>\n\u003C/ol>\n\u003Cp>Step 6 is where most teams discover that stealth was never a library choice.\u003C/p>\n\u003Ch2 id=\"how-patchright-compares-to-camoufox-nodriver-and-playwright-\">How Patchright Compares to Camoufox, noDriver and playwright-extra\u003C/h2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Tool\u003C/th>\n\u003Cth>Best for\u003C/th>\n\u003Cth>Strengths\u003C/th>\n\u003Cth>Limitations\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Cstrong>Playwright\u003C/strong>\u003C/td>\n\u003Ctd>Tests, unprotected targets\u003C/td>\n\u003Ctd>Reference implementation, all three engines, Microsoft-maintained\u003C/td>\n\u003Ctd>Announces itself; blocked by any real WAF\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Patchright\u003C/strong>\u003C/td>\n\u003Ctd>A Python or Node scraper that Cloudflare is blocking\u003C/td>\n\u003Ctd>One-line migration, no runtime overhead, free\u003C/td>\n\u003Ctd>Chromium only, no behavioural handling, no proxies, small maintainer team\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Camoufox\u003C/strong>\u003C/td>\n\u003Ctd>High-value, low-frequency protected targets\u003C/td>\n\u003Ctd>Firefox fork patched at C++ level, 0% headless detection on standard tests\u003C/td>\n\u003Ctd>Averages 42.49s to clear a Cloudflare challenge; wrong for a daily catalogue crawl\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>noDriver\u003C/strong>\u003C/td>\n\u003Ctd>Lightweight crawls, no Chromium overhead\u003C/td>\n\u003Ctd>~80–120MB, drives Chrome over CDP with no Playwright\u003C/td>\n\u003Ctd>No behavioural handling, blocked quickly by anything scoring it\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>playwright-extra\u003C/strong>\u003C/td>\n\u003Ctd>Nothing new\u003C/td>\n\u003Ctd>Historical interest\u003C/td>\n\u003Ctd>Effectively unmaintained, blocked on Cloudflare Enterprise. Do not start new work on it\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>ScrapeWise\u003C/strong>\u003C/td>\n\u003Ctd>Teams that want the rows, not the stack\u003C/td>\n\u003Ctd>Managed browsers, proxies and challenge handling; pay per delivered page\u003C/td>\n\u003Ctd>Not a library you control — you cannot script arbitrary in-page behaviour, and it is a paid service\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Cp>The full measured matrix across all five open-source options is in the \u003Ca href=\"/blogs/playwright-stealth-2026\">Playwright stealth benchmark\u003C/a>. For the head-to-head on the specific signals, see \u003Ca href=\"/blogs/patchright-vs-playwright-2026\">Patchright vs Playwright\u003C/a>, and for the Firefox comparison, \u003Ca href=\"/blogs/camoufox-vs-patchright-2026\">Camoufox vs Patchright\u003C/a>.\u003C/p>\n\u003Ch2 id=\"patchright-by-anti-bot-system\">Patchright by Anti-Bot System\u003C/h2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>System\u003C/th>\n\u003Cth>Patchright result\u003C/th>\n\u003Cth>Better choice if it fails\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>No WAF\u003C/td>\n\u003Ctd>Passes — Patchright buys you nothing over Playwright\u003C/td>\n\u003Ctd>Playwright\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Cloudflare BotFight\u003C/td>\n\u003Ctd>Passes\u003C/td>\n\u003Ctd>—\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Cloudflare Enterprise / Turnstile\u003C/td>\n\u003Ctd>Variable\u003C/td>\n\u003Ctd>\u003Ca href=\"/blogs/camoufox-vs-patchright-2026\">Camoufox\u003C/a>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Akamai Bot Manager v4\u003C/td>\n\u003Ctd>74% on residential proxies\u003C/td>\n\u003Ctd>\u003Ca href=\"/blogs/curl-cffi-tls-fingerprint-web-scraping-2026\">curl_cffi, 87%\u003C/a> — skip the browser\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>DataDome\u003C/td>\n\u003Ctd>Variable\u003C/td>\n\u003Ctd>\u003Ca href=\"/blogs/bypass-datadome-web-scraping-2026\">Browser is mandatory here\u003C/a>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>PerimeterX / HUMAN\u003C/td>\n\u003Ctd>Variable\u003C/td>\n\u003Ctd>\u003Ca href=\"/blogs/bypass-perimeterx-human-web-scraping-2026\">Every approach hits a ceiling\u003C/a>\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Cp>The Akamai row is the counter-intuitive one and worth internalising: on Akamai, TLS fingerprinting is the \u003Cem>primary\u003C/em> signal, so a correct HTTP client beats a patched browser outright and costs about a quarter as much to run. The full argument, including when to keep the browser anyway, is in \u003Ca href=\"/blogs/playwright-akamai-bot-manager-2026\">Playwright vs Akamai Bot Manager\u003C/a>.\u003C/p>\n\u003Ch2 id=\"where-the-patching-cycle-stops-paying-off\">Where the Patching Cycle Stops Paying Off\u003C/h2>\n\u003Cp>Stealth tools decay. Each anti-bot vendor ships detection updates, each update needs a corresponding patch, and the gap between the two is downtime on whichever data source you depend on. Akamai alone pushes sensor-script changes roughly monthly, and each one can drop a pass rate by 15–30 points overnight.\u003C/p>\n\u003Cp>That maintenance cycle does not appear in any install command, and it is the real cost of a self-hosted stealth stack.\u003C/p>\n\u003Cp>If what you need is \u003Cstrong>competitor prices, stock levels and product data arriving in your systems\u003C/strong> rather than a stealth stack to keep alive, the Patchright question is the wrong one to be answering. \u003Ca href=\"/\">ScrapeWise\u003C/a> runs the browsers, the proxies and the challenge handling and delivers structured rows. No plan and no compute units: a balance you top up, and a published charge per delivered page — EUR 0.15 per 1,000 for plain requests, EUR 0.75 with rendering, EUR 1.50 through the residential tier and EUR 3.75 for render plus residential. New accounts get 5 free requests and the balance never expires.\u003C/p>\n\u003Cp>You can also call \u003Ca href=\"/scrapers\">ready-made scraping API endpoints\u003C/a> directly, or see how this feeds \u003Ca href=\"/use-cases/competitor-price-tracking\">competitor price tracking\u003C/a>.\u003C/p>\n\u003Ch2 id=\"so-should-you-use-patchright\">So Should You Use Patchright?\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Yes\u003C/strong> — you have a Python or Node scraper that Cloudflare is blocking. It is the cheapest upgrade available and costs you one import line.\u003C/li>\n\u003Cli>\u003Cstrong>No\u003C/strong> — you are writing tests, or your target has no WAF. Use Playwright.\u003C/li>\n\u003Cli>\u003Cstrong>No\u003C/strong> — you are on Go, Java or .NET. There is no port; fix the TLS layer instead.\u003C/li>\n\u003Cli>\u003Cstrong>Not enough\u003C/strong> — you are on Akamai. Drop the browser and get the handshake right.\u003C/li>\n\u003Cli>\u003Cstrong>Not the question\u003C/strong> — you want delivered rows on a schedule and would rather not run a stealth stack at all.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Ca href=\"/pricing\">See pricing\u003C/a>.\u003C/p>\n",{"title":11,"description":12,"badge":13,"benefits":14},"Frequently asked questions","What Patchright is, how to install it in Python and Node, what it patches, the languages and browsers it does not cover, and when a patched browser is the wrong tool","FAQ",[15,18,21,24,27,30,33,36],{"title":16,"description":17},"What is Patchright?","Patchright is Playwright with the headless tells patched out of the Chromium build. It is not a new automation framework and there is no new API to learn: you drive it with Playwright's own API, the same selectors and the same page.goto(). The difference is the browser it launches, which was compiled without three signals that vanilla Playwright announces about itself and that anti-bot vendors check for. It is open source and free, maintained by a small independent team.",{"title":19,"description":20},"How do you install Patchright?","In Python, pip install patchright followed by patchright install chromium. In Node.js, npm i patchright followed by npx patchright install chromium. Then change the import: from patchright.sync_api import sync_playwright in Python, or require('patchright') in Node. Two install-time details cost people an afternoon. The patched Chromium is cached separately from Playwright's own browser cache, so a CI image that already pins a Playwright browser now pulls a second build. And if both packages are installed in the same environment, an import left pointing at playwright silently gives you the unpatched browser — the run succeeds, the block rate does not change, and nothing in the logs tells you why.",{"title":22,"description":23},"What does Patchright actually patch?","Three things, all at build time. First, the Runtime.enable call Playwright makes over the Chrome DevTools Protocol to set up execution-context bookkeeping — that call is observable from inside the page and Cloudflare's current detection watches for it specifically. Second, the HeadlessChrome user-agent string compiled into the Chromium binary, which is not the runtime navigator.userAgent you can override with a launch argument. Third, WebDriver capability exposure, removed at the C++ level rather than deleted from the page context after load. Because the patches land before the browser process starts, there is no JavaScript redefinition for an Object.defineProperty guard to detect, and no injection cost at page load.",{"title":25,"description":26},"Is there a Patchright for Go, Java or .NET?","No. Patchright ships for Python and Node.js only, and there is no Go, Java, .NET or Rust port even though Playwright itself is available in those languages. On a Go or .NET stack the realistic options are driving a patched Chromium over raw CDP yourself, or moving the fetch layer out of the browser entirely with TLS fingerprint impersonation — which on some anti-bot vendors is both cheaper and more effective than a browser anyway.",{"title":28,"description":29},"Does Patchright work with Firefox or WebKit?","No. Patchright is a Chromium patch, so a cross-browser suite keeps vanilla Playwright for the Firefox and WebKit legs. That means two browser caches and two code paths. If you specifically want a patched Firefox, Camoufox is the Firefox fork patched at the C++ level, with a 0% headless detection rate on standard tests but a 42.49-second average to clear a Cloudflare challenge.",{"title":31,"description":32},"Does Patchright bypass Cloudflare?","On Cloudflare's free BotFight tier, consistently. On Cloudflare Enterprise and Turnstile, results vary by target — an honest sometimes rather than a hedge. It does better than playwright-extra because of the Runtime.enable patch, which is the signal Cloudflare's current detection looks for. It still fails on Enterprise because Enterprise also runs behavioural scoring on mouse paths, scroll velocity and request timing, and no binary patch reaches that.",{"title":34,"description":35},"Why is Patchright not enough on Akamai?","Because Akamai ranks TLS fingerprinting as its primary signal, and a patched browser cannot change its TLS handshake — the handshake belongs to the Chromium build, not to your script. In our April 2026 tests Patchright reached 74% against Akamai Bot Manager v4 on residential proxies, while a plain HTTP client with TLS impersonation reached 87% on the same targets for roughly a quarter of the compute. On Akamai the browser is usually the wrong layer unless you are behind a login or a cart.",{"title":37,"description":38},"When should you stop patching and buy the data instead?","When the maintenance cycle costs more than the data. Stealth tools decay: each anti-bot vendor ships detection updates, each update needs a corresponding patch, and the gap between the two is downtime on whichever source you depend on. Akamai alone pushes sensor-script changes roughly monthly, and each one can drop a pass rate by 15 to 30 points overnight. If what you need is competitor prices, stock levels and product data arriving in your systems rather than a stealth stack to keep alive, ScrapeWise runs the browsers, proxies and challenge handling and delivers structured rows from EUR 0.15 per 1,000 delivered pages, with 5 free requests on every new account.","What Is Patchright? Install, Patches, Limits (2026)","Patchright is Playwright with the headless tells patched out of the Chromium build. What it patches, how to install it in Python and Node, and the four things it cannot do.","Siim Brazier","/img/team/siim.jpg",false,"Scraping",8,[47,52,57],{"slug":48,"title":49,"image":50,"date":5,"category":44,"excerpt":51},"curl-cffi-tls-fingerprint-web-scraping-2026","curl_cffi and TLS Fingerprint Impersonation for Web Scraping (2026)","/img/news/curl-cffi-tls-fingerprint-web-scraping-2026.png","Your requests call is blocked before any JavaScript runs, because its TLS handshake is not a browser's. What JA3/JA4 is, how curl_cffi fixes it, measured pass rates, and the four cases where it cannot help.",{"slug":53,"title":54,"image":55,"date":5,"category":44,"excerpt":56},"playwright-akamai-bot-manager-2026","Playwright vs Akamai Bot Manager: Why the Browser Is the Wrong Layer (2026)","/img/news/playwright-akamai-bot-manager-2026.png","Vanilla Playwright does not clear Akamai Bot Manager v4. Patched Playwright reaches 74% on residential proxies. A plain HTTP client reaches 87% for a quarter of the compute. The measurements and the reason.",{"slug":58,"title":59,"image":60,"date":61,"category":44,"excerpt":62},"build-web-scraper-with-claude-mcp-2026","Build a Web Scraper with Claude and MCP: A Step-by-Step Walkthrough","/img/news/build-web-scraper-with-claude-mcp-2026.png","30 Sep 2026","Connect Claude to Scrapewise through MCP and let it build, test and run price scrapers for you. The setup, the prompts and the guardrails we use.",{"slug":58,"title":59},{"slug":53,"title":54},[66,70,73,76,79,82,85,88,91],{"level":67,"text":68,"id":69},2,"Patchright in One Table","patchright-in-one-table",{"level":67,"text":71,"id":72},"Installing Patchright","installing-patchright",{"level":67,"text":74,"id":75},"What Gets Patched, and Why Build Time Matters","what-gets-patched-and-why-build-time-matters",{"level":67,"text":77,"id":78},"The Four Limits That Decide Whether It Helps","the-four-limits-that-decide-whether-it-helps",{"level":67,"text":80,"id":81},"Does Patchright Bypass Cloudflare?","does-patchright-bypass-cloudflare",{"level":67,"text":83,"id":84},"How Patchright Compares to Camoufox, noDriver and playwright-extra","how-patchright-compares-to-camoufox-nodriver-and-playwright-",{"level":67,"text":86,"id":87},"Patchright by Anti-Bot System","patchright-by-anti-bot-system",{"level":67,"text":89,"id":90},"Where the Patching Cycle Stops Paying Off","where-the-patching-cycle-stops-paying-off",{"level":67,"text":92,"id":93},"So Should You Use Patchright?","so-should-you-use-patchright",[95,96,97,98,99],"Patchright is a patched Chromium build driven by Playwright's own API, not a separate library to learn.","It removes three detection signals at build time: the Runtime.enable CDP call, the HeadlessChrome UA string compiled into the binary, and WebDriver capability exposure.","Install is pip install patchright or npm i patchright, then a one-line import change. There is no Go, Java or .NET port.","Chromium only. A suite running Firefox or WebKit keeps vanilla Playwright for those legs.","It fixes fingerprint signals, not behavioural ones, and it does not give you proxies.",1791887687157]