{“@context”: “https://schema.org”, “@type”: “Article”, “headline”: “7 Best Proxies for Puppeteer and Playwright in 2026 (Sessions, Prices, Setup)”, “description”: “The best proxies for Puppeteer and Playwright in 2026: 7 providers ranked on sticky sessions, price per GB and logins, with setup code that runs.”, “image”: “https://proxyadvice.net/wp-content/uploads/2026/10/best-proxies-for-puppeteer-and-playwright-cover.webp”, “datePublished”: “2026-11-06”, “dateModified”: “2026-11-06”, “inLanguage”: “en”, “wordCount”: 5841, “author”: {“@type”: “Organization”, “name”: “ProxyAdvice Editorial Team”, “url”: “https://proxyadvice.net/about-us/”}, “publisher”: {“@type”: “Organization”, “name”: “ProxyAdvice”, “url”: “https://proxyadvice.net”, “logo”: {“@type”: “ImageObject”, “url”: “https://proxyadvice.net/wp-content/uploads/2026/04/Proxyadvice.net-logo.png”}}, “mainEntityOfPage”: {“@type”: “WebPage”, “@id”: “https://proxyadvice.net/best-proxies-for-puppeteer-and-playwright/”}} {“@context”: “https://schema.org”, “@type”: “BreadcrumbList”, “itemListElement”: [{“@type”: “ListItem”, “position”: 1, “name”: “Home”, “item”: “https://proxyadvice.net”}, {“@type”: “ListItem”, “position”: 2, “name”: “Best Proxies by Use Case”, “item”: “https://proxyadvice.net/category/best-proxies-by-use-case/”}, {“@type”: “ListItem”, “position”: 3, “name”: “Best Proxies for Puppeteer and Playwright”}]} {“@context”: “https://schema.org”, “@type”: “ItemList”, “name”: “7 Best Proxies for Puppeteer and Playwright in 2026 (Sessions, Prices, Setup)”, “numberOfItems”: 7, “itemListElement”: [{“@type”: “ListItem”, “position”: 1, “name”: “Decodo”, “url”: “https://proxyadvice.net/best-proxies-for-puppeteer-and-playwright/#provider-1”}, {“@type”: “ListItem”, “position”: 2, “name”: “Oxylabs”, “url”: “https://proxyadvice.net/best-proxies-for-puppeteer-and-playwright/#provider-2”}, {“@type”: “ListItem”, “position”: 3, “name”: “Proxy-Seller”, “url”: “https://proxyadvice.net/best-proxies-for-puppeteer-and-playwright/#provider-3”}, {“@type”: “ListItem”, “position”: 4, “name”: “DataImpulse”, “url”: “https://proxyadvice.net/best-proxies-for-puppeteer-and-playwright/#provider-4”}, {“@type”: “ListItem”, “position”: 5, “name”: “IPRoyal”, “url”: “https://proxyadvice.net/best-proxies-for-puppeteer-and-playwright/#provider-5”}, {“@type”: “ListItem”, “position”: 6, “name”: “Bright Data”, “url”: “https://proxyadvice.net/best-proxies-for-puppeteer-and-playwright/#provider-6”}, {“@type”: “ListItem”, “position”: 7, “name”: “Evomi”, “url”: “https://proxyadvice.net/best-proxies-for-puppeteer-and-playwright/#provider-7”}]} {“@context”: “https://schema.org”, “@type”: “FAQPage”, “mainEntity”: [{“@type”: “Question”, “name”: “What are the best proxies for Puppeteer and Playwright?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “On the pages read on October 30, 2026, Decodo, Oxylabs and Proxy-Seller. Decodo starts at $3.75 per GB with a 3-day trial and sticky sessions from minutes to days. Oxylabs lists unlimited concurrent sessions and guides for both frameworks. Proxy-Seller advertises about 0.35 s response and says it works natively with Puppeteer and Playwright.”}}, {“@type”: “Question”, “name”: “How do I use a proxy with a username and password in Puppeteer?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “Pass the host and port in the launch args as –proxy-server=http://HOST:PORT, then call page.authenticate({ username, password }) before page.goto. Chrome ignores a login typed into the proxy flag itself. For several proxies in one browser, give each context its own proxyServer and call page.authenticate on each page.”}}, {“@type”: “Question”, “name”: “How do I set a proxy per context in Playwright?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “Pass a proxy object to new_context with server, username and password. Playwright’s docs say a proxy can be set for the whole browser or for each browser context, with a login for HTTP(S) proxies. One context per sticky session keeps each account on its own IP.”}}, {“@type”: “Question”, “name”: “Should I use rotating or sticky proxies with a headless browser?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “Sticky, in most cases. A page load is many requests, and per-request rotation spreads them across IPs. Hold one IP per browser context, then rotate by opening a new context with a new session. Oxylabs documents sessions up to 1,440 minutes; IPRoyal lists up to 7 days.”}}, {“@type”: “Question”, “name”: “Which proxy is cheapest for Puppeteer?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “Evomi lists $0.49 per GB on a 100 GB monthly plan, and DataImpulse $1 per GB with no subscription and gigabytes that never expire. DataImpulse also names Puppeteer and Playwright on its residential page; Evomi mentions them only under its separate Scraping Browser.”}}, {“@type”: “Question”, “name”: “How much traffic does Puppeteer use?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “It depends on the pages, because a browser downloads images, fonts and scripts as well as the HTML. That’s why price per GB matters more here than for plain HTTP scraping. Blocking images and media with Playwright’s network routing, or request interception in Puppeteer, cuts the gigabytes you pay for.”}}, {“@type”: “Question”, “name”: “Do I need residential proxies for Playwright?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “Only if the site blocks cloud IP ranges. Many sites accept datacenter IPs, which cost less. Start with the cheapest type that works on your target and move to residential when blocks start. Our best residential proxies ranking covers the residential side.”}}, {“@type”: “Question”, “name”: “Does Bright Data work with Puppeteer and Playwright?”, “acceptedAnswer”: {“@type”: “Answer”, “text”: “Yes, in two ways. Its residential proxies take the same host, port and login as any provider. Its pricing page also links a Browser API at $5 per GB, described as remote browsers with stealth included, which your Puppeteer or Playwright code connects to instead of launching Chrome.”}}]} .ap-article{–acc:#00b85e;–acc-2:#00e87a;–acc-ink:#00894a;–link:#1a6fd4;–navy:#0a1628;–navy-2:#0d1f33;–navy-3:#132a45;–pos:#00b85e;–pos-ink:#00894a;–mid:#3d8ef0;–top-a:#00e87a;–top-b:#00b85e;–bg:#f8fafc;–bg-2:#ffffff;–bg-3:#f1f5f9;–card:#ffffff;–border:#e2e8f0;–border-md:#cbd5e1;–text-head:#0f172a;–text-body:#334155;–text-muted:#64748b;–text-light:#94a3b8;–acc-dim:rgba(0,232,122,.10);–acc-dim-2:rgba(0,232,122,.05);–pos-dim:rgba(0,232,122,.12);–red:#e53e3e;–yellow:#d97706;–f-head:’Outfit’,sans-serif;–f-body:’Rubik’,sans-serif;–f-code:’JetBrains Mono’,monospace;–sidebar-w:290px;–radius:10px;–radius-lg:14px;–gap:30px;–sh-sm:0 1px 4px rgba(10,22,40,.07),0 1px 2px rgba(10,22,40,.04);–sh-md:0 4px 14px rgba(10,22,40,.10),0 2px 4px rgba(10,22,40,.05);–sh-lg:0 10px 32px rgba(10,22,40,.14);–grad:linear-gradient(135deg,#00e87a,#00b85e);–on-grad:#0a1628} .ap-article *,.ap-article *::before,.ap-article *::after{box-sizing:border-box;margin:0;padding:0} .ap-article{font-family:var(–f-body);background:var(–bg);color:var(–text-body);line-height:1.75;font-size:16px;overflow-x:clip;-webkit-font-smoothing:antialiased} .ap-article a{color:var(–link);text-decoration:none;transition:color .2s} .ap-article a:hover{color:var(–navy);text-decoration:underline} .ap-article img{max-width:100%;height:auto;display:block;border-radius:var(–radius)} .ap-article strong{color:var(–text-head);font-weight:700} .ap-article p{font-size:15.5px;line-height:1.8} .ap-article .outer{max-width:1260px;margin:0 auto;padding:0 20px} .ap-article .two-col{display:grid;grid-template-columns:1fr var(–sidebar-w);gap:var(–gap);align-items:start;padding:24px 0 64px} .ap-article .main-col{min-width:0;grid-column:1} .ap-article .sidebar-col{grid-column:2;grid-row:1;position:sticky;top:16px;display:flex;flex-direction:column;gap:14px;align-self:start} .ap-article .ap-progress-top{position:fixed;top:0;left:0;height:3px;width:0;z-index:9999;background:var(–grad);transition:width .12s linear} @keyframes apFadeUp{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}} @keyframes apSlideLeft{from{opacity:0;transform:translateX(22px)}to{opacity:1;transform:translateX(0)}} @keyframes apPulse{0%,100%{box-shadow:0 0 0 0 rgba(0,184,94,.40)}50%{box-shadow:0 0 0 7px rgba(0,184,94,0)}} .ap-article.ap-js .reveal{opacity:0;transform:translateY(16px);transition:opacity .5s ease,transform .5s ease} .ap-article.ap-js .reveal.vis{opacity:1;transform:translateY(0)} .ap-article .s1{transition-delay:.04s} .ap-article .s2{transition-delay:.09s} .ap-article .s3{transition-delay:.14s} .ap-article .s4{transition-delay:.19s} .ap-article .s5{transition-delay:.24s} .ap-article .s6{transition-delay:.29s} .ap-article .s7{transition-delay:.34s} .ap-article .sb-anim{opacity:0;animation:apSlideLeft .5s ease forwards} .ap-article .sb-anim:nth-child(1){animation-delay:.08s} .ap-article .sb-anim:nth-child(2){animation-delay:.16s} .ap-article .sb-anim:nth-child(3){animation-delay:.24s} .ap-article .sb-anim:nth-child(4){animation-delay:.32s} @media(prefers-reduced-motion:reduce){.ap-article .reveal,.ap-article .sb-anim{opacity:1!important;transform:none!important;animation:none!important}} .ap-article .breadcrumb{padding:14px 0 8px;font-size:12.5px;color:var(–text-muted);display:flex;gap:6px;align-items:center;flex-wrap:wrap} .ap-article .breadcrumb a{color:var(–text-muted)} .ap-article .breadcrumb a:hover{color:var(–link)} .ap-article .breadcrumb .sep{color:var(–text-light);font-size:10px} .ap-article .breadcrumb .cur{color:var(–text-body);font-weight:600} .ap-article .article-header{padding:6px 0 26px} .ap-article .art-flags{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:14px} .ap-article .aflag{font-size:11px;font-weight:700;padding:3px 10px;border-radius:20px;letter-spacing:.4px;text-transform:uppercase;font-family:var(–f-code)} .ap-article .af-b{background:var(–acc-dim);color:var(–acc-ink);border:1px solid rgba(0,184,94,.25)} .ap-article .af-g{background:var(–pos-dim);color:var(–pos-ink);border:1px solid rgba(0,232,122,.25)} .ap-article .af-dot{width:3px;height:3px;background:var(–text-light);border-radius:50%} .ap-article .art-h1{font-family:var(–f-head);font-size:clamp(24px,4vw,40px);font-weight:800;color:var(–text-head);line-height:1.18;margin-bottom:16px;letter-spacing:-.5px} .ap-article .art-h1 mark{background:none;color:var(–acc-ink);border-bottom:3px solid var(–acc);padding-bottom:1px} .ap-article .art-intro{font-size:16.5px;color:var(–text-body);line-height:1.8;border-left:4px solid var(–acc);padding:12px 0 12px 18px;margin-bottom:20px;background:var(–acc-dim);border-radius:0 var(–radius) var(–radius) 0} .ap-article .author-strip{display:flex;gap:12px;align-items:center;background:var(–bg-3);border:1px solid var(–border);border-radius:var(–radius);padding:12px 16px;box-shadow:var(–sh-sm)} .ap-article .author-ava{width:42px;height:42px;border-radius:50%;flex-shrink:0;background:var(–grad);display:flex;align-items:center;justify-content:center;font-family:var(–f-head);font-weight:800;font-size:15px;color:#fff} .ap-article .aname{font-weight:700;font-size:13.5px;color:var(–text-head)} .ap-article .arole{font-size:12px;color:var(–text-muted);margin-top:2px} .ap-article .achips{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap} .ap-article .achip{font-size:10px;font-family:var(–f-code);padding:3px 8px;border-radius:4px;font-weight:600} .ap-article .ac-b{background:var(–acc-dim);color:var(–acc-ink);border:1px solid rgba(0,184,94,.2)} .ap-article .ac-g{background:var(–pos-dim);color:var(–pos-ink);border:1px solid rgba(0,232,122,.2)} .ap-article .sec-h2{font-family:var(–f-head);font-size:clamp(18px,2.6vw,24px);font-weight:800;color:var(–text-head);margin:40px 0 14px;padding-top:14px;border-top:2px solid var(–border);display:flex;align-items:center;gap:10px;letter-spacing:-.3px} .ap-article .sec-h2::before{content:”;flex-shrink:0;width:4px;height:22px;background:var(–grad);border-radius:2px} .ap-article .sec-h3{font-family:var(–f-head);font-size:clamp(15px,2vw,18px);font-weight:700;color:var(–text-head);margin:22px 0 9px;display:flex;align-items:center;gap:8px} .ap-article .sec-h3::before{content:”;flex-shrink:0;width:3px;height:14px;background:var(–acc);border-radius:2px} .ap-article .body-p{color:var(–text-body);line-height:1.8;margin-bottom:14px;font-size:15.5px} .ap-article .punch{font-family:var(–f-head);font-weight:700;color:var(–text-head);font-size:16px;margin:16px 0;line-height:1.45} .ap-article ul.slist{list-style:none;display:flex;flex-direction:column;gap:9px;margin:12px 0} .ap-article ul.slist li{display:flex;gap:10px;align-items:flex-start;color:var(–text-body);font-size:15px;line-height:1.65} .ap-article ul.slist li::before{content:’▸’;color:var(–acc-ink);font-size:11px;margin-top:4px;flex-shrink:0} .ap-article .extended{max-height:0;overflow:hidden;transition:max-height .5s ease} .ap-article .read-more-btn{display:inline-flex;align-items:center;gap:6px;margin:6px 0 4px;background:var(–acc-dim);border:1px solid rgba(0,184,94,.22);color:var(–acc-ink);font-family:var(–f-head);font-weight:700;font-size:13px;padding:8px 15px;border-radius:8px;cursor:pointer;transition:background .2s} .ap-article .read-more-btn:hover{background:rgba(0,184,94,.16)} .ap-article .read-more-btn .rm-ic{transition:transform .3s;display:inline-block} .ap-article .read-more-btn[aria-expanded=”true”] .rm-ic{transform:rotate(180deg)} .ap-article .sec-lbl{font-family:var(–f-code);font-size:10.5px;letter-spacing:2px;text-transform:uppercase;color:var(–acc-ink);margin-bottom:10px} .ap-article .quicklist{display:flex;flex-direction:column;gap:8px;margin:14px 0} .ap-article .ql-card{background:var(–card);border:1px solid var(–border);border-radius:var(–radius-lg);padding:15px 18px;display:grid;grid-template-columns:58px 1fr 1fr auto;gap:14px;align-items:center;transition:border-color .2s,box-shadow .2s,transform .2s;position:relative;overflow:hidden;box-shadow:var(–sh-sm)} .ap-article .ql-card::before{content:”;position:absolute;left:0;top:0;bottom:0;width:3px;background:var(–border);transition:background .2s} .ap-article .ql-card:hover{border-color:var(–border-md);box-shadow:var(–sh-md);transform:translateX(3px)} .ap-article .ql-card:hover::before{background:var(–acc)} .ap-article .ql-card.top-pick{border-color:rgba(0,184,94,.4)} .ap-article .ql-card.top-pick::before{background:var(–acc)} .ap-article .ql-rank{width:54px;height:54px;flex-shrink:0;background:var(–bg-3);border:2px solid var(–border);border-radius:var(–radius);display:flex;flex-direction:column;align-items:center;justify-content:center} .ap-article .ql-num{font-family:var(–f-head);font-weight:900;font-size:19px;color:var(–acc-ink);line-height:1} .ap-article .ql-numlbl{font-family:var(–f-code);font-size:9px;color:var(–text-muted);letter-spacing:.5px} .ap-article .ql-card.top-pick .ql-rank{border-color:var(–acc);background:var(–acc-dim)} .ap-article .ql-card.top-pick .ql-num{animation:apPulse 3s infinite} .ap-article .ql-name{font-family:var(–f-head);font-weight:700;font-size:14.5px;color:var(–text-head);margin-bottom:4px;display:flex;align-items:center;gap:7px;flex-wrap:wrap} .ap-article .ql-tag{font-size:9.5px;font-weight:700;padding:2px 7px;border-radius:14px;text-transform:uppercase;letter-spacing:.4px;font-family:var(–f-code);background:var(–acc-dim);color:var(–acc-ink);border:1px solid rgba(0,184,94,.25)} .ap-article .ql-sub{font-size:12.5px;color:var(–text-muted);line-height:1.5} .ap-article .ql-metrics{display:flex;flex-direction:column;gap:7px} .ap-article .ql-mrow{display:flex;align-items:center;gap:8px;font-size:11.5px} .ap-article .ql-mlbl{color:var(–text-muted);width:50px;flex-shrink:0;font-weight:500} .ap-article .ql-mbar{flex:1;height:5px;background:var(–bg-3);border-radius:3px;overflow:hidden} .ap-article .ql-mfill{height:100%;border-radius:3px;background:var(–grad);width:var(–tw,0);transition:width 1.1s ease .2s} .ap-article.ap-js .ql-mfill{width:0} .ap-article .ql-mval{font-family:var(–f-code);font-size:10px;color:var(–text-head);font-weight:600;width:30px;text-align:right;flex-shrink:0} .ap-article .btn-visit{display:inline-flex;align-items:center;gap:5px;background:var(–grad);color:#fff;font-family:var(–f-head);font-weight:800;font-size:12.5px;padding:9px 15px;border-radius:8px;border:none;cursor:pointer;transition:filter .2s,transform .15s;white-space:nowrap;text-decoration:none} .ap-article .btn-visit:hover{filter:brightness(1.08);transform:scale(.97);text-decoration:none;color:#fff} .ap-article .tldr{background:var(–card);border:1px solid var(–border);border-left:4px solid var(–acc);border-radius:var(–radius-lg);padding:20px 22px;margin:24px 0;box-shadow:var(–sh-sm)} .ap-article .tldr-lbl{font-family:var(–f-code);font-size:10px;letter-spacing:2px;text-transform:uppercase;color:var(–acc-ink);margin-bottom:12px;display:flex;align-items:center;gap:7px} .ap-article .tldr ul{list-style:none;display:flex;flex-direction:column;gap:9px} .ap-article .tldr ul li{display:flex;gap:10px;align-items:flex-start;font-size:14.5px;color:var(–text-body);line-height:1.55} .ap-article .tldr ul li::before{content:’▸’;color:var(–acc-ink);font-size:11px;margin-top:3px;flex-shrink:0} .ap-article .direct-ans{background:linear-gradient(135deg,var(–acc-dim),var(–pos-dim));border:1px solid rgba(0,184,94,.2);border-radius:var(–radius-lg);padding:18px 20px;margin:0 0 24px} .ap-article .da-lbl{font-family:var(–f-code);font-size:10px;letter-spacing:1.8px;text-transform:uppercase;color:var(–acc-ink);display:flex;align-items:center;gap:7px;margin-bottom:8px} .ap-article .da-text{font-size:15px;line-height:1.7;color:var(–text-head);font-weight:400} .ap-article .provider-block{background:var(–card);border:1px solid var(–border);border-radius:var(–radius-lg);padding:26px;margin:24px 0;box-shadow:var(–sh-md);position:relative;overflow:hidden} .ap-article .provider-block::after{content:”;position:absolute;top:0;left:0;right:0;height:3px;background:var(–grad)} .ap-article .pb-title{font-family:var(–f-head);font-size:19px;font-weight:800;color:var(–text-head);margin-bottom:4px;line-height:1.25} .ap-article .pb-sub{font-size:13px;color:var(–text-muted);font-style:italic;margin-bottom:14px} .ap-article .pb-hd{display:flex;gap:18px;align-items:center;flex-wrap:wrap;margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(–border)} .ap-article .pb-logo{min-width:130px;height:50px;background:var(–bg-3);border:1px solid var(–border);border-radius:var(–radius);display:flex;align-items:center;justify-content:center;font-family:var(–f-code);font-size:13px;color:var(–acc-ink);flex-shrink:0;padding:6px} .ap-article .pb-scores{display:flex;gap:16px;flex-wrap:wrap;align-items:center} .ap-article .pb-sc-val{font-family:var(–f-head);font-size:22px;font-weight:900;color:var(–acc-ink);line-height:1} .ap-article .pb-sc-lbl{font-family:var(–f-code);font-size:9.5px;color:var(–text-muted);margin-top:3px;text-transform:uppercase;letter-spacing:.5px;text-align:center} .ap-article .pb-verdict{font-size:15px;line-height:1.7;color:var(–text-body);margin-bottom:6px} .ap-article .pb-ss{width:100%;height:180px;background:var(–bg-3);border:1px solid var(–border);border-radius:var(–radius);display:flex;align-items:center;justify-content:center;color:var(–text-muted);font-size:13px;margin:16px 0;overflow:hidden;position:relative} .ap-article .pb-ss img{width:100%;height:100%;object-fit:cover;border-radius:0} .ap-article .pb-ss-cap{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(10,22,40,.85));color:#dbe7f0;font-size:11px;padding:8px 12px} .ap-article .pb-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px} .ap-article .pb-box{background:var(–bg-3);border:1px solid var(–border);border-radius:var(–radius);padding:14px} .ap-article .pb-box-t{font-family:var(–f-code);font-size:9.5px;letter-spacing:1.5px;text-transform:uppercase;color:var(–acc-ink);margin-bottom:9px;font-weight:600} .ap-article .pb-box ul{list-style:none;display:flex;flex-direction:column;gap:6px} .ap-article .pb-box ul li{font-size:13px;color:var(–text-body);padding-left:14px;position:relative;line-height:1.5} .ap-article .pb-box ul li::before{content:’✓’;position:absolute;left:0;color:var(–pos-ink);font-size:11px;top:1px;font-weight:700} .ap-article .pb-pc{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:16px} .ap-article .pb-pcb{background:var(–bg-3);border:1px solid var(–border);border-radius:var(–radius);padding:14px} .ap-article .pb-pct{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:1px;margin-bottom:9px;display:flex;gap:5px;align-items:center} .ap-article .pb-pcb.pros .pb-pct{color:var(–pos-ink)} .ap-article .pb-pcb.cons .pb-pct{color:var(–red)} .ap-article .pb-pcb ul{list-style:none;display:flex;flex-direction:column;gap:6px} .ap-article .pb-pcb ul li{font-size:13px;color:var(–text-body);padding-left:15px;position:relative;line-height:1.5} .ap-article .pb-pcb.pros ul li::before{content:’+’;position:absolute;left:0;color:var(–pos-ink);font-weight:700} .ap-article .pb-pcb.cons ul li::before{content:’−’;position:absolute;left:0;color:var(–red);font-weight:700} .ap-article .pb-coupon{background:linear-gradient(90deg,var(–acc-dim),var(–pos-dim));border:1px solid rgba(0,184,94,.2);border-radius:var(–radius);padding:11px 15px;display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap} .ap-article .pb-coupon-t{font-size:13.5px;color:var(–text-body);flex:1} .ap-article .pb-coupon-code{font-family:var(–f-code);font-size:12px;font-weight:700;color:#fff;background:var(–acc-ink);padding:5px 12px;border-radius:6px;cursor:pointer;white-space:nowrap;transition:filter .2s} .ap-article .pb-coupon-code:hover{filter:brightness(1.1)} .ap-article .pb-tw{overflow-x:auto;margin-bottom:16px} .ap-article .pb-tbl{width:100%;border-collapse:collapse;font-size:13.5px;min-width:400px} .ap-article .pb-tbl th{background:var(–bg-3);color:var(–acc-ink);border-bottom:2px solid var(–border);font-family:var(–f-code);font-size:9.5px;letter-spacing:1px;text-transform:uppercase;padding:10px 13px;text-align:left} .ap-article .pb-tbl td{padding:9px 13px;border-bottom:1px solid var(–border);color:var(–text-body);font-size:13.5px} .ap-article .pb-tbl tr:hover td{background:var(–bg-3)} .ap-article .pb-tbl td strong{color:var(–text-head)} .ap-article .pb-tbl .best-row td{color:var(–acc-ink);font-weight:600} .ap-article .pb-foot{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding-top:16px;border-top:1px solid var(–border)} .ap-article .btn-expand{background:transparent;border:1px solid var(–border);color:var(–text-muted);padding:8px 14px;border-radius:var(–radius);font-size:13px;cursor:pointer;transition:all .2s;font-family:var(–f-body);display:flex;gap:6px;align-items:center} .ap-article .btn-expand:hover{border-color:var(–acc);color:var(–acc-ink)} .ap-article .btn-expand .exp-ic{transition:transform .3s;display:inline-block} .ap-article .btn-expand[aria-expanded=”true”] .exp-ic{transform:rotate(180deg)} .ap-article .pb-extended{max-height:0;overflow:hidden;transition:max-height .5s ease} .ap-article .pb-extended-in{padding-top:18px} .ap-article .pb-test-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:6px 0 18px} .ap-article .pb-test-box{background:var(–bg-3);border:1px solid var(–border);border-radius:var(–radius);padding:14px;text-align:center} .ap-article .pb-test-label{font-family:var(–f-code);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(–text-muted);margin-bottom:8px} .ap-article .pb-test-val{font-family:var(–f-head);font-size:20px;font-weight:800;color:var(–navy);margin-bottom:10px} .ap-article .pb-test-bar{height:6px;background:rgba(10,22,40,.08);border-radius:10px;overflow:hidden} .ap-article .pb-test-fill{height:100%;background:var(–grad);border-radius:10px} .ap-article .pb-audit{background:var(–bg-3);border:1px solid var(–border);border-radius:var(–radius);padding:16px;margin-bottom:14px} .ap-article .pb-audit-t{font-family:var(–f-code);font-size:9.5px;letter-spacing:1.5px;text-transform:uppercase;color:var(–acc-ink);margin-bottom:8px;font-weight:600} .ap-article .pb-audit p{font-size:14px;line-height:1.7;color:var(–text-body)} .ap-article .pb-bottomline{font-size:13.5px;color:var(–text-muted);font-style:italic;border-top:1px solid var(–border);padding-top:14px} .ap-article .ct-wrap{overflow-x:auto;margin:22px 0;border-radius:var(–radius-lg);border:1px solid var(–border);box-shadow:var(–sh-sm)} .ap-article .ct{width:100%;border-collapse:collapse;font-size:13px;min-width:700px} .ap-article .ct thead th{background:var(–bg-3);color:var(–text-muted);padding:12px 14px;text-align:left;font-family:var(–f-code);font-size:9.5px;letter-spacing:1px;text-transform:uppercase;border-bottom:2px solid var(–border);white-space:nowrap} .ap-article .ct-b{color:var(–acc-ink)!important} .ap-article .ct tbody td{padding:10px 14px;border-bottom:1px solid var(–border);vertical-align:middle} .ap-article .ct tbody tr:last-child td{border-bottom:none} .ap-article .ct tbody tr:hover td{background:var(–bg-3)} .ap-article .ct tbody td:first-child{font-size:13px;font-weight:600;color:var(–text-muted)} .ap-article .cy{color:var(–pos-ink);font-weight:700} .ap-article .cn{color:var(–red)} .ap-article .cbest{color:var(–acc-ink);font-weight:700} .ap-article .cok{color:var(–text-head)} .ap-article .cna{color:var(–text-muted);font-style:italic} .ap-article .wchip{display:inline-block;font-size:9px;font-weight:700;padding:2px 6px;background:var(–acc-dim);color:var(–acc-ink);border:1px solid rgba(0,184,94,.25);border-radius:12px;text-transform:uppercase;letter-spacing:.4px;margin-left:5px;vertical-align:middle} .ap-article .types-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(188px,1fr));gap:12px;margin:18px 0} .ap-article .type-card{background:var(–card);border:1px solid var(–border);border-radius:var(–radius-lg);padding:18px 15px;transition:border-color .2s,box-shadow .2s,transform .2s;box-shadow:var(–sh-sm)} .ap-article .type-card:hover{border-color:var(–border-md);box-shadow:var(–sh-md);transform:translateY(-2px)} .ap-article .type-icon{font-size:26px;margin-bottom:9px} .ap-article .type-name{font-family:var(–f-head);font-weight:700;font-size:14px;color:var(–text-head);margin-bottom:5px} .ap-article .type-desc{font-size:12.5px;color:var(–text-muted);line-height:1.6} .ap-article .faq-wrap{display:flex;flex-direction:column;gap:0;margin:18px 0;border-radius:var(–radius-lg);overflow:hidden;border:1px solid var(–border);box-shadow:var(–sh-sm)} .ap-article .faq-item{border-bottom:1px solid var(–border)} .ap-article .faq-item:last-child{border-bottom:none} .ap-article .faq-q{width:100%;background:#fff;border:none;padding:15px 46px 15px 18px;text-align:left;cursor:pointer;font-family:var(–f-head);font-weight:700;font-size:14.5px;color:var(–text-head);transition:background .15s;position:relative;line-height:1.4} .ap-article .faq-q:hover{background:var(–bg-3)} .ap-article .faq-q::after{content:’▾’;position:absolute;right:16px;top:50%;transform:translateY(-50%);font-size:15px;color:var(–text-muted);transition:transform .3s,color .2s} .ap-article .faq-item.open .faq-q{background:var(–bg-3);color:var(–acc-ink)} .ap-article .faq-item.open .faq-q::after{transform:translateY(-50%) rotate(180deg);color:var(–acc-ink)} .ap-article .faq-a{max-height:0;overflow:hidden;background:var(–bg-3);transition:max-height .35s ease} .ap-article .faq-a-in{padding:14px 18px;font-size:14.5px;color:var(–text-body);line-height:1.75;border-top:1px solid var(–border)} .ap-article .method{background:var(–card);border:1px solid rgba(0,184,94,.22);border-radius:var(–radius-lg);padding:22px;margin:26px 0;box-shadow:var(–sh-sm)} .ap-article .method-hd{display:flex;gap:12px;align-items:center;margin-bottom:14px} .ap-article .method-t{font-family:var(–f-head);font-weight:800;font-size:15px;color:var(–text-head)} .ap-article .method-sub{font-size:12px;color:var(–text-muted);margin-top:2px} .ap-article .method-cells{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px;margin-top:12px} .ap-article .method-cell{background:var(–bg-3);border-radius:8px;padding:11px 13px;border:1px solid var(–border)} .ap-article .method-cl{font-family:var(–f-code);font-size:9.5px;color:var(–acc-ink);text-transform:uppercase;letter-spacing:1px;margin-bottom:4px} .ap-article .method-cv{font-size:13px;color:var(–text-head);font-weight:700} .ap-article .related{background:var(–card);border:1px solid var(–border);border-radius:var(–radius-lg);padding:22px;margin:30px 0;box-shadow:var(–sh-sm)} .ap-article .related-t{font-family:var(–f-head);font-size:16px;font-weight:800;color:var(–text-head);margin-bottom:14px;display:flex;align-items:center;gap:8px} .ap-article .related-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px} .ap-article .related-link{display:flex;align-items:center;gap:8px;padding:10px 13px;background:var(–bg-3);border:1px solid var(–border);border-radius:var(–radius);font-size:13px;color:var(–link);transition:background .2s,border-color .2s} .ap-article .related-link:hover{background:var(–acc-dim);border-color:var(–acc);text-decoration:none} .ap-article .related-link::before{content:’→’;color:var(–acc-ink);font-size:12px;flex-shrink:0} .ap-article .footer-cta{background:var(–navy);border-radius:var(–radius-lg);padding:32px;text-align:center;margin:36px 0;box-shadow:var(–sh-lg);border:1px solid rgba(0,184,94,.2);position:relative;overflow:hidden} .ap-article .footer-cta::before{content:”;position:absolute;top:-60px;right:-60px;width:200px;height:200px;border-radius:50%;background:radial-gradient(circle,rgba(0,184,94,.18) 0%,transparent 70%);pointer-events:none} .ap-article .footer-cta h3{font-family:var(–f-head);font-size:22px;font-weight:900;margin-bottom:10px;color:#fff;letter-spacing:-.3px} .ap-article .footer-cta p{color:rgba(255,255,255,.66);font-size:14.5px;margin-bottom:20px} .ap-article .cta-btns{display:flex;gap:10px;justify-content:center;flex-wrap:wrap} .ap-article .btn-cta-primary{background:var(–grad);color:#fff;font-family:var(–f-head);font-weight:900;font-size:14px;padding:12px 26px;border-radius:var(–radius);border:none;cursor:pointer;transition:filter .2s,transform .15s;text-decoration:none} .ap-article .btn-cta-primary:hover{filter:brightness(1.1);transform:scale(.97);text-decoration:none;color:#fff} .ap-article .btn-cta-sec{background:transparent;color:#fff;font-family:var(–f-head);font-weight:700;font-size:14px;padding:12px 26px;border-radius:var(–radius);border:1px solid rgba(255,255,255,.28);cursor:pointer;text-decoration:none} .ap-article .btn-cta-sec:hover{border-color:var(–acc-2);color:var(–acc-2);text-decoration:none} .ap-article .sb-widget{background:var(–card);border:1px solid var(–border);border-radius:var(–radius-lg);overflow:hidden;box-shadow:var(–sh-sm)} .ap-article .sb-head{background:#fff;padding:11px 15px;font-family:var(–f-code);font-size:10px;letter-spacing:1.6px;text-transform:uppercase;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(–border);border-left:4px solid var(–acc);color:var(–acc-ink)} .ap-article .ep-wrap{padding:16px} .ap-article .ep-lbl{font-family:var(–f-code);font-size:9.5px;letter-spacing:1.5px;text-transform:uppercase;color:var(–acc-ink);margin-bottom:7px} .ap-article .ep-name{font-family:var(–f-head);font-weight:900;font-size:16px;color:var(–text-head);margin-bottom:5px} .ap-article .ep-desc{font-size:12px;color:var(–text-muted);line-height:1.5;margin-bottom:12px} .ap-article .ep-stats{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px} .ap-article .ep-stat{text-align:center;background:var(–bg-3);border-radius:8px;padding:7px 9px;flex:1;border:1px solid var(–border)} .ap-article .ep-stat-val{font-family:var(–f-head);font-size:15px;font-weight:900;color:var(–acc-ink)} .ap-article .ep-stat-lbl{font-size:9.5px;color:var(–text-muted);font-family:var(–f-code);letter-spacing:.5px} .ap-article .ep-btn{width:100%;background:var(–grad);color:#fff;font-family:var(–f-head);font-weight:900;font-size:13px;padding:10px;border-radius:8px;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:6px;text-decoration:none} .ap-article .ep-btn:hover{filter:brightness(1.08);text-decoration:none;color:#fff} .ap-article .stepper-wrap{padding:14px 16px 16px} .ap-article .step-progress-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px} .ap-article .step-pct{font-family:var(–f-head);font-weight:900;font-size:22px;color:var(–acc-ink);line-height:1} .ap-article .step-pct span{font-size:12px;font-weight:600;color:var(–text-muted)} .ap-article .step-pct-lbl{font-family:var(–f-code);font-size:9px;letter-spacing:1px;text-transform:uppercase;color:var(–text-muted);text-align:right;line-height:1.4} .ap-article .stepper{position:relative;padding-left:6px} .ap-article .stepper-rail{position:absolute;left:12px;top:8px;bottom:8px;width:3px;background:var(–bg-3);border-radius:2px;overflow:hidden} .ap-article .stepper-rail-fill{position:absolute;left:0;top:0;width:100%;height:0;background:var(–grad);border-radius:2px;transition:height .25s ease} .ap-article .step{position:relative;display:flex;align-items:flex-start;gap:11px;padding:7px 0;cursor:pointer} .ap-article .step-dot{width:15px;height:15px;border-radius:50%;background:#fff;border:2px solid var(–border-md);flex-shrink:0;margin-top:2px;z-index:1;transition:all .25s ease;display:flex;align-items:center;justify-content:center} .ap-article .step-dot::after{content:”;width:5px;height:5px;border-radius:50%;background:transparent;transition:background .25s} .ap-article .step-label{font-size:12.5px;color:var(–text-muted);line-height:1.4;transition:color .2s,font-weight .2s;font-weight:500} .ap-article .step.done .step-dot{border-color:var(–acc);background:var(–acc)} .ap-article .step.done .step-dot::after{background:#fff} .ap-article .step.active .step-dot{border-color:var(–acc-ink);box-shadow:0 0 0 4px var(–acc-dim);background:#fff} .ap-article .step.active .step-dot::after{background:var(–acc-ink)} .ap-article .step.active .step-label{color:var(–acc-ink);font-weight:700} .ap-article .step:hover .step-label{color:var(–text-head)} .ap-article .bf-list{padding:10px 14px} .ap-article .bf-row{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid var(–border);font-size:13px;gap:8px} .ap-article .bf-row:last-child{border-bottom:none;padding-bottom:0} .ap-article .bf-use{color:var(–text-muted);flex-shrink:0;font-weight:500} .ap-article .bf-pick{color:var(–acc-ink);font-family:var(–f-head);font-weight:700;font-size:11.5px;background:var(–acc-dim);padding:3px 8px;border-radius:6px;border:1px solid rgba(0,184,94,.2);text-align:right;line-height:1.3;max-width:120px} .ap-article .sb-cta{padding:16px;text-align:center} .ap-article .sb-cta-d{font-size:12px;color:var(–text-muted);margin-bottom:12px;line-height:1.5} .ap-article .sb-cta-btn{width:100%;background:var(–acc-ink);color:#fff;font-family:var(–f-head);font-weight:800;font-size:13px;padding:10px;border-radius:8px;border:none;cursor:pointer} .ap-article .sb-cta-btn:hover{filter:brightness(1.08)} @media(max-width:920px){.ap-article .two-col{grid-template-columns:1fr} .ap-article .sidebar-col{position:static} .ap-article .ql-card{grid-template-columns:52px 1fr} .ap-article .ql-metrics{display:none} .ap-article .pb-grid,.ap-article .pb-pc,.ap-article .pb-test-grid{grid-template-columns:1fr}} @media(max-width:540px){.ap-article .types-grid{grid-template-columns:1fr 1fr} .ap-article .method-cells{grid-template-columns:1fr 1fr}} .ap-article .bench-lead{font-size:14px;color:var(–text-muted);margin:0 0 18px} .ap-article .bench-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px} .ap-article .bench-card{background:#fff;border:1px solid var(–border);border-radius:var(–radius-lg);box-shadow:var(–sh-sm);padding:18px 20px} .ap-article .bench-card.full{grid-column:1 / -1} .ap-article .bench-ctitle{font-family:var(–f-code);font-size:11.5px;letter-spacing:.06em;color:var(–acc-ink);font-weight:600;text-transform:uppercase;margin:0 0 14px} .ap-article .bench-row{display:grid;grid-template-columns:120px 1fr auto;align-items:center;gap:10px;margin:9px 0} .ap-article .bench-name{font-size:13px;color:var(–text-body);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .ap-article .bench-track{height:9px;background:var(–bg-3);border-radius:5px;overflow:hidden} .ap-article .bench-fill{height:100%;width:var(–tw,0);border-radius:5px;transition:width 1.1s cubic-bezier(.22,.61,.36,1) .15s;background:var(–acc)} .ap-article.ap-js .bench-fill{width:0} .ap-article .bench-val{font-family:var(–f-code);font-size:12.5px;font-weight:600;color:var(–text-head);min-width:48px;text-align:right} .ap-article .bench-card .bench-row:nth-child(2) .bench-fill,.ap-article .bench-card .bench-row:nth-child(3) .bench-fill{background:linear-gradient(90deg,var(–top-a),var(–top-b))} .ap-article .bench-card .bench-row:nth-child(4) .bench-fill,.ap-article .bench-card .bench-row:nth-child(5) .bench-fill{background:var(–mid)} .ap-article .bench-card .bench-row:nth-child(6) .bench-fill,.ap-article .bench-card .bench-row:nth-child(7) .bench-fill{background:#8a98a6} .ap-article .bench-card .bench-row:nth-child(8) .bench-fill{background:var(–red)} .ap-article .bench-card.full .bench-row:nth-child(2) .bench-val::after{content:’ \2605′;color:#f5b50a} .ap-article .price-lead{font-size:14px;color:var(–text-muted);margin:0 0 16px} .ap-article .price-box{background:#fff;border:1px solid var(–border);border-radius:var(–radius-lg);box-shadow:var(–sh-sm);overflow:hidden} .ap-article .ptabs{display:flex;flex-wrap:wrap;gap:2px;background:var(–bg-2);border-bottom:1px solid var(–border);padding:6px 8px} .ap-article .ptab{appearance:none;border:none;background:transparent;font-family:var(–f-head);font-weight:700;font-size:13px;color:var(–text-muted);padding:9px 14px;border-radius:8px;cursor:pointer;transition:all .18s;white-space:nowrap} .ap-article .ptab:hover{color:var(–acc-ink);background:var(–acc-dim)} .ap-article .ptab[aria-selected=”true”]{color:var(–acc-ink);background:#fff;box-shadow:0 -2px 0 var(–acc) inset} .ap-article .ppanel{display:none;padding:20px} .ap-article .ppanel.active{display:block;animation:apFade .25s ease} @keyframes apFade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}} .ap-article .ppanel-h{font-family:var(–f-head);font-weight:800;font-size:18px;color:var(–text-head);margin:0 0 4px} .ap-article .ppanel-sum{font-size:13.5px;color:var(–text-muted);margin:0 0 16px;line-height:1.55} .ap-article .plan-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px} .ap-article .plan-card{position:relative;border:1px solid var(–border);border-radius:var(–radius);padding:16px 15px;background:var(–bg-2)} .ap-article .plan-card.feat{border-color:var(–pos);box-shadow:0 0 0 1px var(–pos)} .ap-article .plan-tag{position:absolute;top:12px;right:12px;font-family:var(–f-code);font-size:9.5px;letter-spacing:.05em;font-weight:600;text-transform:uppercase;color:var(–text-muted)} .ap-article .plan-name{font-family:var(–f-head);font-weight:800;font-size:15px;color:var(–pos-ink);margin:0 0 6px} .ap-article .plan-price{font-family:var(–f-head);font-weight:800;font-size:30px;color:var(–pos-ink);line-height:1} .ap-article .plan-price .per{font-size:13px;font-weight:600;color:var(–text-muted)} .ap-article .plan-sub{font-size:11.5px;color:var(–text-muted);margin:5px 0 12px} .ap-article .plan-feats{list-style:none;margin:0;padding:0} .ap-article .plan-feats li{font-size:12.5px;color:var(–text-body);padding:5px 0 5px 22px;position:relative;line-height:1.4} .ap-article .plan-feats li.pf-y::before{content:’\2713′;position:absolute;left:0;color:var(–pos-ink);font-weight:700} .ap-article .plan-feats li.pf-n{color:var(–text-muted)} .ap-article .plan-feats li.pf-n::before{content:’\2715′;position:absolute;left:0;color:var(–red);font-weight:700} .ap-article .price-strip{display:flex;flex-wrap:wrap;gap:14px;justify-content:center;align-items:center;padding:14px 16px;background:var(–bg-2);border-top:1px solid var(–border);font-family:var(–f-code);font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(–text-muted)} .ap-article .price-strip .pstop{color:var(–pos-ink);font-weight:600} .ap-article .price-strip .pspill{display:inline-block;margin-left:6px;background:var(–pos-dim);color:var(–pos-ink);border:1px solid rgba(0,232,122,.4);border-radius:20px;padding:1px 8px;font-size:9.5px} @media(max-width:760px){.ap-article .bench-grid{grid-template-columns:1fr} .ap-article .plan-grid{grid-template-columns:1fr} .ap-article .bench-row{grid-template-columns:96px 1fr auto}} .ap-article .steps{list-style:none;counter-reset:apst;display:flex;flex-direction:column;gap:10px;margin:14px 0;padding:0} .ap-article .steps li{counter-increment:apst;position:relative;padding:12px 14px 12px 52px;background:var(–card);border:1px solid var(–border);border-radius:var(–radius);font-size:15px;line-height:1.65;color:var(–text-body)} .ap-article .steps li::before{content:counter(apst);position:absolute;left:14px;top:12px;width:26px;height:26px;border-radius:50%;background:var(–grad);color:var(–on-grad);font-family:var(–f-head);font-weight:800;font-size:13px;display:flex;align-items:center;justify-content:center} .ap-article .steps li strong{display:block;margin-bottom:2px} .ap-article pre.code{background:var(–navy);color:#e6edf5;font-family:var(–f-code);font-size:12.5px;line-height:1.6;padding:14px 16px;border-radius:var(–radius);overflow-x:auto;margin:14px 0;white-space:pre} .ap-article code{font-family:var(–f-code);font-size:.9em;background:var(–bg-3);border:1px solid var(–border);border-radius:5px;padding:1px 5px} .ap-article pre.code code{background:none;border:none;padding:0;color:inherit;font-size:inherit} .ap-article .callout{border:1px solid var(–border);border-left:4px solid var(–acc);background:var(–acc-dim-2);border-radius:var(–radius);padding:14px 16px;margin:16px 0;font-size:14.5px;line-height:1.65;color:var(–text-body)} .ap-article .callout.warn{border-left-color:var(–yellow);background:rgba(217,119,6,.06)} .ap-article .callout-t{font-family:var(–f-code);font-size:10px;letter-spacing:1.5px;text-transform:uppercase;color:var(–acc-ink);margin-bottom:6px;font-weight:600} .ap-article .callout.warn .callout-t{color:var(–yellow)} .ap-article .dt-wrap{overflow-x:auto;margin:18px 0;border:1px solid var(–border);border-radius:var(–radius-lg);box-shadow:var(–sh-sm)} .ap-article table.dt{width:100%;border-collapse:collapse;font-size:13.5px;min-width:480px;background:var(–card)} .ap-article table.dt th{background:var(–bg-3);color:var(–text-muted);font-family:var(–f-code);font-size:9.5px;letter-spacing:1px;text-transform:uppercase;text-align:left;padding:11px 14px;border-bottom:2px solid var(–border)} .ap-article table.dt td{padding:10px 14px;border-bottom:1px solid var(–border);color:var(–text-body);vertical-align:top} .ap-article table.dt tr:last-child td{border-bottom:none} .ap-article table.dt td:first-child{font-weight:600;color:var(–text-head)} .ap-article .tbl-note{font-size:12px;color:var(–text-muted);margin:-8px 0 16px} .ap-article .quote{border-left:4px solid var(–border-md);padding:6px 0 6px 16px;margin:16px 0;color:var(–text-head);font-size:15.5px;line-height:1.7;font-style:italic} .ap-article .quote cite{display:block;font-style:normal;font-size:12.5px;color:var(–text-muted);margin-top:6px} .ap-article .src-list{list-style:none;counter-reset:apsrc;display:flex;flex-direction:column;gap:7px;margin:14px 0 0;padding:0} .ap-article .src-list li{counter-increment:apsrc;font-size:13px;padding-left:26px;position:relative;line-height:1.5;color:var(–text-body)} .ap-article .src-list li::before{content:counter(apsrc);position:absolute;left:0;top:1px;width:18px;height:18px;border-radius:50%;background:var(–bg-3);border:1px solid var(–border);font-family:var(–f-code);font-size:9.5px;display:flex;align-items:center;justify-content:center;color:var(–text-muted)} .ap-article .src-t{font-family:var(–f-code);font-size:9.5px;letter-spacing:1.5px;text-transform:uppercase;color:var(–acc-ink);margin-top:16px;font-weight:600} .ap-article .vs-head{display:grid;grid-template-columns:1fr auto 1fr;gap:14px;align-items:stretch;margin:18px 0} .ap-article .vs-side{background:var(–card);border:1px solid var(–border);border-radius:var(–radius-lg);padding:16px;text-align:center;box-shadow:var(–sh-sm)} .ap-article .vs-side.win{border-color:var(–acc);box-shadow:0 0 0 1px var(–acc)} .ap-article .vs-name{font-family:var(–f-head);font-weight:900;font-size:18px;color:var(–text-head)} .ap-article .vs-score{font-family:var(–f-head);font-weight:900;font-size:30px;color:var(–acc-ink);line-height:1.1;margin:6px 0 2px} .ap-article .vs-sub{font-size:12.5px;color:var(–text-muted);line-height:1.5} .ap-article .vs-mid{align-self:center;font-family:var(–f-head);font-weight:900;font-size:14px;color:var(–text-muted);background:var(–bg-3);border:1px solid var(–border);border-radius:50%;width:42px;height:42px;display:flex;align-items:center;justify-content:center} .ap-article .vs-logo{height:38px;display:flex;align-items:center;justify-content:center;margin-bottom:8px} .ap-article .vs-logo img{max-height:34px;max-width:130px;object-fit:contain;border-radius:0} .ap-article .ql-mlbl{width:86px} .ap-article .ql-mval{width:66px} @media(max-width:920px){.ap-article .sidebar-col{grid-column:1;grid-row:auto}.ap-article .sb-progress{display:none}} .ap-article .fig-note{font-size:12px;color:var(–text-muted);margin:10px 0 0} .ap-article .btn-visit,.ap-article .btn-visit:hover,.ap-article .btn-cta-primary,.ap-article .btn-cta-primary:hover,.ap-article .ep-btn,.ap-article .ep-btn:hover,.ap-article .author-ava{color:var(–on-grad)} .ap-article .sb-cta-btn,.ap-article .sb-cta-btn:hover{color:#fff} .ap-article .bench-card .bench-row:nth-child(n+9) .bench-fill{background:#8a98a6} @media(max-width:540px){.ap-article .vs-head{grid-template-columns:1fr}.ap-article .vs-mid{justify-self:center}} .ap-article .sec-h2::before{background:linear-gradient(180deg,#00e87a,#3d8ef0)}
Updated November 2026 25 min read 7 compared

7 Best Proxies for Puppeteer and Playwright in 2026 (Sessions, Prices, Setup)

Budget decides most of this list. Under $1 per GB you get Evomi and DataImpulse, cheap enough for image-heavy pages but light on session details. Around $3.50 to $4 you get Proxy-Seller, Decodo and Bright Data’s promo rate, with trials and sticky options. At $6 to $7 for small buys, Oxylabs and IPRoyal document sessions of 24 hours and 7 days. Here are the best proxies for Puppeteer and Playwright, ranked for browser work. ProxyAdvice earns a commission on some links here at no extra cost to you.

PA
ProxyAdvice Editorial Team, Proxy Research Desk
ProxyAdvice · Provider comparisons from published pricing and docs
✓ Sources checked November 6, 2026
Best proxies for Puppeteer and Playwright in 2026: 7 providers compared on sessions, price and setup
🤖 Direct answer

The best proxies for Puppeteer and Playwright in 2026 are Decodo, Oxylabs and Proxy-Seller. Decodo starts at $3.75 per GB with a 3-day trial and sticky sessions from minutes to days. Oxylabs lists unlimited concurrent sessions and sticky IPs for up to 1,440 minutes. Proxy-Seller advertises about 0.35 s response and says it works natively with both frameworks.

Quick ranking · all 7
8.3
Score
Decodo Best overall
$3.75 per GB · 3-day trial · sticky minutes to days
Volume rate
$2/GB
Entry price
$3.75/GB
8.2
Score
Oxylabs Best for scale
175M+ IPs · unlimited sessions · sticky up to 24 h
Volume rate
$2.50/GB
Entry price
$6/GB
8.1
Score
Proxy-Seller Fastest advertised
$3.50 per GB test · ~0.35 s · unlimited sessions
Volume rate
$1.45/GB
Entry price
$3.50/GB
7.7
Score
DataImpulse Best budget
$1 per GB · GB never expire · names both frameworks
Volume rate
$0.80/GB
Entry price
$1/GB
7.4
Score
IPRoyal Longest sessions
Sticky up to 7 days · GB never expire · $7 per GB
Volume rate
$1.75/GB
Entry price
$7/GB
6.5
Score
Bright Data Remote browsers
400M+ IPs · $4 per GB promo · Browser API
Volume rate
$3/GB
Entry price
$4/GB
6.4
Score
Evomi Lowest per GB
$0.49 per GB on 100 GB · unlimited sessions
Volume rate
$0.49/GB
Entry price
$0.49/GB
⚡ TL;DR · skip here if you are in a hurry
  • Browsers need sticky IPs. One page load fires dozens of requests, so per-request rotation splits a page across many IPs. Use one sticky session per browser context.
  • Logins go in the right field. Chrome ignores a username in its proxy flag. Use Playwright’s username and password fields, or Puppeteer’s page.authenticate.
  • Gigabytes add up. Browsers fetch images and fonts. At $1 per GB, DataImpulse costs a sixth of Oxylabs’ $6 small-volume rate for the same pages.

What makes a proxy good for Puppeteer and Playwright?

It’s a proxy that can hold one IP for a whole browser session, accepts a login your framework can pass, and doesn’t charge so much per GB that page assets eat the budget. Residential proxies (IPs from real home connections) fit most sites. The best-for map: Decodo overall, Oxylabs for scale, Proxy-Seller for speed, DataImpulse on a budget and IPRoyal for long sessions.

Puppeteer and Playwright both drive real Chromium, so a site sees everything a browser sends: the page request, then every script, image, font and API call it triggers. That’s why sessions matter more here than for a plain HTTP scraper. If those requests leave from different IPs, the site sees one visitor jumping between addresses mid-page.

Both frameworks take the same four proxy details: host, port, username and password. Playwright’s docs show a proxy set for the whole browser or for each browser context, with a username and password for HTTP(S) proxies. Puppeteer’s BrowserContextOptions takes a proxyServer per context and says the username and password are set with page.authenticate.

Not every browser job needs residential IPs. Sites that don’t block cloud ranges work with the best datacenter proxies at a lower cost, and if blocks are the real problem, hosted browsers may fit better: see our cloud browsers for AI scraping.

Short version: Decodo to start, Oxylabs to scale, DataImpulse to save.

Why these five picks for browser automation?

Each one wins on a single thing a browser job needs: a trial, documented sessions, low latency, cheap gigabytes or very long sessions. The scores weight sessions and price per GB highest, 25% each. Here’s the short case before the full reviews.

  • Best overall: Decodo: A 3 GB plan for $11.25, a 3-day trial with 100MB, sticky sessions from minutes to days and every targeting level included.
  • Best for scale: Oxylabs: Unlimited concurrent sessions, guides for Puppeteer and Playwright, and sticky IPs documented up to 1,440 minutes.
  • Fastest advertised: Proxy-Seller: About 0.35 s advertised response, unlimited sessions, and a page that says it works natively with both frameworks.
  • Best budget: DataImpulse: $1 per GB with gigabytes that never expire, login or IP authorization, and both frameworks named on its page.
  • Longest sessions: IPRoyal: A sticky IP for up to 7 days, unlimited sessions and traffic that never expires, at $7 for the first GB.

How do you set up a proxy in Puppeteer and Playwright?

Both take a host and port, then a login in a separate place. The code below sets one sticky proxy per browser context in Playwright and one per browser in Puppeteer. Both samples were run on October 30, 2026 against local test proxies with a login.

  1. Pick sticky, not rotatingIn your provider’s dashboard, generate a sticky session for each browser context. On Oxylabs, that’s sessid in the username; elsewhere it’s a session option in the proxy generator.
  2. Copy four valuesHost, port, username and password. If your provider offers it, also allowlist your server’s IP as a fallback.
  3. Set the proxy in codePlaywright: pass server, username and password in the proxy option of new_context. Puppeteer: pass –proxy-server=http://HOST:PORT at launch.
  4. Pass the loginPlaywright takes it with the server. Puppeteer needs page.authenticate with the username and password before the first goto.
  5. Check the exit IPOpen https://api.ipify.org through the proxy. You should see the provider’s IP, not your server’s.
  6. Block heavy filesDrop images, media and fonts you don’t need. Every skipped file is traffic you don’t pay for.
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    context = browser.new_context(proxy={
        "server": "http://HOST:PORT",
        "username": "USERNAME",
        "password": "PASSWORD",
    })
    page = context.new_page()
    page.goto("https://api.ipify.org")
    print(page.text_content("body"))
    browser.close()
import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({ args: ['--proxy-server=http://HOST:PORT'] });
const page = await browser.newPage();
await page.authenticate({ username: 'USERNAME', password: 'PASSWORD' });
await page.goto('https://api.ipify.org');
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Save the Puppeteer sample as check.mjs and run node check.mjs. For several proxies in one Puppeteer browser, browser.createBrowserContext({ proxyServer: ‘http://HOST:PORT’ }) gives each context its own proxy, with page.authenticate on each page.

The detail people get wrong: per-request rotation
A rotating gateway gives every request a new IP. In a browser, one page load is the HTML plus dozens of scripts, images and API calls, so the page arrives from many addresses at once, and logins and carts break. Use a sticky session per context, and rotate by opening a new context with a new session ID.

To see the rotation patterns for plain HTTP code, read our guide on how to rotate proxies in Python. Before wiring a new proxy into a browser fleet, you can also test your proxies with GoToProxy.

Sticky per context, login in the right field, and block what you don’t need.

Which are the best proxies for Puppeteer and Playwright in 2026?

1. Decodo: Best overall
Best for: browser jobs that need a trial, sticky sessions and every targeting level included
8.3
Overall
$3.75/GB
Entry price
$2/GB
Volume rate
Minutes to days
Sticky max

Decodo is the best all-round proxy for Puppeteer and Playwright on the pages read. Plans start at 3 GB for $11.25, the FAQ describes a 3-day trial with 100MB, and sticky sessions run from minutes to days. It advertises 99.92% success and under 0.5 s response. The catch: its page names no Puppeteer or Playwright guide.

Visit Decodo ↗
Decodo dashboard screenshot
decodo.com

To get started, take the 3-day trial, open the dashboard and copy the user, password and the gate.decodo.com endpoint on port 7000 that the page’s Python sample uses. Pass those three values to Playwright’s proxy option or to Puppeteer’s launch flag and page.authenticate. Choose a sticky session for any job that logs in.

Browser work burns gigabytes, so the tiers matter. The page lists $3.50 per GB at 10 GB, $2.75 at 100 GB and $2 at 1,000 GB, with pay as you go at $4. Continent, country, state, city, ZIP and ASN targeting are all included, which saves a second bill when a site checks location.

The page lists HTTP(S) and SOCKS5, and IP whitelisting in the dashboard. That matters for browsers: Chrome won’t take a login in its proxy flag, so an allowlisted server IP is the simplest route when your framework can’t pass credentials. A concurrency limit isn’t stated, so ask before you run hundreds of contexts.

Key facts
  • 3 GB for $11.25 ($3.75 per GB); $2 per GB at 1,000 GB
  • 3-day trial with 100MB; 14-day money-back on eligible plans
  • Rotating per request or on a timer; sticky for minutes to days
  • Username and password or IP whitelisting
  • 99.92% success, under 0.5 s response (advertised)
Best for
  • First browser scrapers that need a trial
  • Logged-in flows that hold one IP
  • Location checks down to ZIP or ASN
✓ Pros
  • Trial plus a 3 GB entry plan
  • All targeting levels included
  • Strong advertised success and response
  • HTTP(S) and SOCKS5
✗ Cons
  • No Puppeteer or Playwright guide named on the page
  • Concurrency limit not stated
  • Pay as you go costs $4 per GB
PlanPriceTrafficPer GB
3 GB$11.25 a month3 GB$3.75
25 GB$81.25 a month25 GB$3.25
100 GB$275 a month100 GB$2.75
1,000 GB$2,000 a month1,000 GB$2.00
Pay as you goNo commitmentAny$4.00
Volume rate
$2/GB
Entry price
$3.75/GB
Adv. success
99.92%
Editor’s notes · source decodo.com/proxies/residential-proxies, read on October 30, 2026

Prices exclude VAT. The trial isn’t covered by the 14-day money-back guarantee. The page claims the #1 response time in the market without naming a source.

Verdict: Best for most Puppeteer and Playwright jobs; not ideal if you need a written concurrency limit. Read the full Decodo review →

2. Oxylabs: Best for scale
Best for: teams running many browser contexts at once that want documented sessions
8.2
Overall
$6/GB
Entry price
$2.50/GB
Volume rate
1,440 min
Sticky max

Oxylabs is the pick for large browser fleets. Its residential page lists unlimited concurrent sessions, 175M+ IPs and integration guides for Selenium, Puppeteer and Playwright, and its session docs hold an IP for up to 1,440 minutes. It advertises 99.95% success. The weak spot is small-volume price: $6 per GB up to 5 GB.

Visit Oxylabs ↗
Oxylabs dashboard screenshot
oxylabs.io

To get started, use the $5 welcome credit, create a proxy user, and point the browser at pr.oxylabs.io:7777. Each request gets a new IP by default. For a browser context that must keep one address, add sessid and a random string to the username, as in customer-USERNAME-sessid-abcd1234.

Sessions are better documented here than anywhere else in this list. The session control page says a session lasts 10 minutes by default, or ends after 60 seconds without requests, and sesstime extends it up to 1,440 minutes. Give each Playwright context its own sessid and you get one stable IP per context.

Price falls with volume: $5 per GB up to 20 GB, $4 up to 125 GB and $2.50 from 1,000 GB. Plans start at $30 a month and Enterprise at $2,500. The page lists 3 proxy users and 10 whitelisted IPs, plus HTTP(S), HTTP3 and SOCKS5, and free targeting down to ZIP, coordinates and ASN.

Key facts
  • $6 per GB up to 5 GB; $2.50 per GB from 1,000 GB
  • Unlimited concurrent sessions
  • Per-request rotation by default; sticky up to 1,440 min
  • Puppeteer, Playwright and Selenium guides listed
  • 99.95% success; 0.41 s and 0.6 s response both listed
Best for
  • Hundreds of parallel browser contexts
  • One sticky IP per context
  • Teams that want written integration guides
✓ Pros
  • Unlimited concurrent sessions
  • Session lengths documented to the minute
  • Largest pool here after Bright Data
  • Free targeting to ZIP and ASN
✗ Cons
  • $6 per GB on small buys
  • Only a $5 credit instead of a trial
  • Two different response times on one page
PlanPriceTrafficPer GB
Up to 5 GBPay as you goUp to 5 GB$6.00
Up to 20 GBPay as you goUp to 20 GB$5.00
Up to 125 GBPay as you goUp to 125 GB$4.00
1K+ GBPay as you go1,000 GB and up$2.50
EnterpriseFrom $2,500 a monthCustomCustom
Volume rate
$2.50/GB
Entry price
$6/GB
Adv. success
99.95%
Editor’s notes · source oxylabs.io/products/residential-proxy-pool and developers.oxylabs.io session control, read on October 30, 2026

The residential page lists sticky sessions but no maximum; the 1,440-minute figure comes from Oxylabs’ session control docs. The page shows 0.41 s in one section and 0.6 s in another.

Verdict: Best for big parallel browser runs; not ideal for a 2 GB side project. Read the full Oxylabs review →

3. Proxy-Seller: Fastest advertised
Best for: short browser projects that want the lowest advertised response and native framework support
8.1
Overall
$3.50/GB
Entry price
$1.45/GB
Volume rate
Not stated
Sticky max

Proxy-Seller says its residential proxies work natively with Puppeteer, Playwright, Selenium and Scrapy, and it advertises the lowest response time here, about 0.35 s. Sessions are unlimited, with rotation by time or by request and session TTL controls. The catch: traffic lasts 30 days, and no maximum sticky time is stated.

Visit Proxy-Seller ↗
Proxy-Seller dashboard screenshot
proxy-seller.com

To get started, buy the Test plan at $3.50 per GB, add code GOTO15OFF at checkout, then pick username and password or IP allowlisting in the dashboard. Set rotation to by time for browser work, so a page and all its scripts load through one IP, and use the session TTL control to match your longest flow.

Volume plans start from $1.45 per GB and Enterprise from $0.3 per GB, both custom-sized. Every plan expires after 30 days, so buy for the month you’ll run, not the quarter. A replacement or refund is possible within 24 hours of purchase, according to the FAQ.

The page lists HTTP, HTTPS and SOCKS5, and says SOCKS5 can carry UDP and QUIC with a UDP-capable client. Targeting covers country, state, city and ISP. It advertises 99.5% success and a 1 Gbps channel, from a 47M+ pool in 220+ locations.

Key facts
  • Test plan $3.50 per GB, valid 30 days
  • Volume from $1.45 per GB; Enterprise from $0.3 per GB
  • Unlimited concurrent sessions; session TTL controls
  • Username and password or IP allowlisting
  • About 0.35 s response, 99.5% success (advertised)
Best for
  • Month-long scraping sprints
  • Jobs where page load time matters
  • Teams mixing Puppeteer, Playwright and Scrapy
✓ Pros
  • Lowest advertised response here
  • Says it works natively with both frameworks
  • Unlimited concurrent sessions
  • Coupon code GOTO15OFF
✗ Cons
  • Traffic expires after 30 days
  • Maximum sticky time not stated
  • Smallest pool in this list
🏷️Code GOTO15OFF at checkoutGOTO15OFF
PlanPriceTrafficPer GB
TestPay per GBValid 30 days$3.50
VolumeCustom sizeValid 30 daysFrom $1.45
EnterpriseCustom, premium SLACustomFrom $0.30
Volume rate
$1.45/GB
Entry price
$3.50/GB
Adv. success
99.5%
Editor’s notes · source proxy-seller.com/residential-proxies, read on October 30, 2026

An uptime of 99.7% appears only in the page’s meta description, not in its body, so it isn’t used here.

Verdict: Best for fast, month-long browser runs; not ideal if gigabytes must last longer than 30 days. Read the full Proxy-Seller review →

4. DataImpulse: Best budget
Best for: budget browser scrapers that need a login, an IP allowlist and gigabytes that don’t expire
7.7
Overall
$1/GB
Entry price
$0.80/GB
Volume rate
Not stated
Sticky max

DataImpulse is the cheapest proxy here that names Puppeteer, Playwright and Selenium on its residential page. It charges $1 per GB with no subscription, and unused gigabytes never expire. Both login and IP authorization are listed. You give up speed: about 1 second per response, as advertised, and no sticky session length.

Visit DataImpulse ↗
DataImpulse dashboard screenshot
dataimpulse.com

To get started, buy the Intro plan, 5 GB for $5, then copy the login and password for gw.dataimpulse.com on port 823 from the dashboard. In Playwright, put them in the proxy’s username and password fields; in Puppeteer, use the launch flag for the host and page.authenticate for the login.

At $1 per GB, a browser job that loads 50 GB a month costs $50 on the Basic plan, and the Advanced plan lowers the rate to $0.80 per GB at $800 for 1 TB. That’s the strongest case for DataImpulse with Puppeteer: browsers pull images, fonts and scripts, and cheap gigabytes absorb that waste.

The trade-offs are precision and pace. Country targeting is free, but city, ASN and ZIP cost extra, per the comparison table. Sticky and rotating sessions are both offered, with no duration given. The page lists HTTP(S) and SOCKS5, a 90M+ pool in 195+ countries and a 7-day refund policy.

Key facts
  • $1 per GB on Intro and Basic; $0.80 on Advanced (1 TB)
  • Intro: 5 GB for $5, new customers
  • Gigabytes never expire; 7-day refund
  • Login and password or IP authorization
  • 99.51% success, about 1 s response (advertised)
Best for
  • Image-heavy pages on a small budget
  • Country-level price checks
  • Jobs that run a few days a month
✓ Pros
  • $1 per GB with no subscription
  • Gigabytes never expire
  • Puppeteer, Playwright and Selenium named
  • HTTP(S) and SOCKS5
✗ Cons
  • About 1 s advertised response, the slowest here
  • No sticky session length stated
  • City, ASN and ZIP targeting cost extra
PlanPriceTrafficPer GB
Intro (new customers)$5, one time5 GB$1.00
Basic$5050 GB$1.00
Advanced$8001 TB$0.80
Custom+From $4,0005 TB and upCustom
Volume rate
$0.80/GB
Entry price
$1/GB
Adv. success
99.51%
Editor’s notes · source dataimpulse.com/residential-proxies, read on October 30, 2026

The page gives about 1 s as the headline response time but shows under 500 ms and under 0.5 s in two use-case sections. This list uses the headline figure.

Verdict: Best for cheap browser traffic; not ideal if you need long, documented sticky sessions. Read the full DataImpulse review →

5. IPRoyal: Longest sessions
Best for: account work in a browser that must keep one IP for days
7.4
Overall
$7/GB
Entry price
$1.75/GB
Volume rate
7 days
Sticky max

IPRoyal holds a sticky IP for up to 7 days, the longest stated in this list, and its traffic never expires. The page lists integration guides for Puppeteer and Playwright, unlimited concurrent sessions and a free trial. The drawback is entry price: 1 GB costs $7 on subscription, the dearest small buy here.

Visit IPRoyal ↗
IPRoyal dashboard screenshot
iproyal.com

To get started, start the free trial or buy 1 GB, then generate a proxy with a sticky session and the lifetime you need, up to 7 days. Use one sticky proxy per Playwright context or Puppeteer browser, so each logged-in account keeps its own address for the whole week.

The page says you can rotate on every request or keep one IP for up to 7 days, and switch IPs by hand in the dashboard or through the API. For browser automation, that manual switch is useful when one account gets flagged and you want a fresh IP without touching code.

Price drops fast after the first gigabyte: $5.95 at 2 GB and $5.25 at 10 GB on subscription, then $1.75 from 10 TB. Pay as you go adds about 5%. The page lists HTTP(S) and SOCKS5, 99.4% success, about 0.5 s response and 99.9% uptime, with country, state and city targeting.

Key facts
  • Sticky sessions up to 7 days
  • 1 GB $7 subscription, $7.35 pay as you go
  • Traffic never expires
  • Unlimited concurrent sessions; IP whitelisting and sub-users
  • 99.4% success, about 0.5 s response (advertised)
Best for
  • Logged-in browser accounts
  • Social media and marketplace sessions
  • Slow, steady monthly usage
✓ Pros
  • 7-day sticky sessions
  • Traffic never expires
  • Puppeteer and Playwright guides listed
  • Manual IP switch in dashboard or API
✗ Cons
  • $7 per GB on a 1 GB buy
  • No refund terms on the page
  • Username and password login not mentioned on the page
PlanPriceTrafficPer GB
1 GBSubscription1 GB$7.00
2 GBSubscription2 GB$5.95
10 GBSubscription10 GB$5.25
CustomFrom 10 TB10,000 GB and up$1.75
1 GBPay as you go1 GB$7.35
Volume rate
$1.75/GB
Entry price
$7/GB
Adv. success
99.4%
Editor’s notes · source iproyal.com/residential-proxies, read on October 30, 2026

The residential page lists IP whitelisting and sub-users but doesn’t mention username and password proxy authentication, so check the dashboard before building a Puppeteer flow around a login.

Verdict: Best for browser accounts that must hold one IP for days; not ideal for heavy, image-rich crawling on a budget. Read the full IPRoyal review →

6. Bright Data: Remote browsers
Best for: teams that would rather rent hosted browsers than run Chrome themselves
6.5
Overall
$4/GB
Entry price
$3/GB
Volume rate
Not stated
Sticky max

Bright Data has the largest pool in this list, 400M+ IPs, with country, state, city and ZIP targeting included. For Puppeteer and Playwright, its pricing page also links a Browser API at $5 per GB, described as remote browsers with stealth included. The catch: $4 per GB is a 3-month promo against an $8 list price.

Visit Bright Data ↗
Bright Data dashboard screenshot
brightdata.com

To get started on residential proxies, start the free trial, then apply code RESIGB50 for 50% off for 3 months. Copy the host, port and login from the dashboard into Playwright’s proxy option or Puppeteer’s launch flag and page.authenticate, as with any provider here. Budget for the $8 list price once the promo ends.

The other route is the Browser API. Instead of running Chrome on your own server with a proxy, you connect Puppeteer or Playwright to a browser Bright Data hosts. The pricing page lists it at $5 per GB with stealth included. It’s worth a look if blocks, not IPs, are your main problem.

Monthly plans start at $499 for 141 GB, $4 per GB under the promo and $7 at list, and drop to $3 per GB on the $999 and $1,999 plans. The page offers a first-deposit match of up to $500. It doesn’t state concurrency, a sticky session length or a success rate; it lists Extended Session Control and SOCKS5.

Key facts
  • Pay as you go $4 per GB under a 50% promo; $8 list
  • 400M+ IPs in 195 countries
  • Country, state, city and ZIP targeting included
  • Browser API linked at $5 per GB
  • First-deposit match up to $500
Best for
  • Teams that don’t want to host browsers
  • Precise ZIP-level geo checks
  • Large budgets that need the biggest pool
✓ Pros
  • Largest pool here
  • ZIP targeting included
  • Hosted browser option
  • Deposit match up to $500
✗ Cons
  • Promo price ends after 3 months
  • No success rate, response time or concurrency stated
  • Monthly plans start at $499
PlanPriceTrafficPer GB
Pay as you goNo commitmentAny$4 promo, $8 list
$499 a monthMonthly141 GB$4 promo, $7 list
$999 a monthMonthly332 GB$3 promo, $6 list
$1,999 a monthMonthly798 GB$3 promo, $5 list
Above 1 TBContact salesCustomCustom
Volume rate
$3/GB
Entry price
$4/GB
Adv. success
Not listed
Editor’s notes · source brightdata.com/pricing/proxy-network/residential-proxies, read on October 30, 2026

The 99.99% uptime SLA applies to the Enterprise tier only. The page says trial traffic isn’t billed but gives no trial length.

Verdict: Best for hosted browsers and the biggest pool; not ideal for a fixed small budget after the promo. Read the full Bright Data review →

7. Evomi: Lowest per GB
Best for: high-volume browser crawls where cost per GB beats everything else
6.4
Overall
$0.49/GB
Entry price
$0.49/GB
Volume rate
Not stated
Sticky max

Evomi lists the lowest residential rate in this list: $0.49 per GB on a 100 GB monthly plan, with unlimited concurrent sessions on its rotating pools. For browsers that pull heavy pages, that price stands out. It ranks last because the page gives no sticky length, no speed figures and no Puppeteer or Playwright notes for residential.

Visit Evomi ↗
Evomi dashboard screenshot
evomi.com

To get started, take the free trial on the Core Residential plan and cancel before it ends if you don’t want the $49 a month that follows. Use one endpoint for HTTP, HTTPS or SOCKS5. In Playwright, set the proxy per context, and use a sticky session for any flow that logs in.

Pay as you go costs $0.99 per GB from 15 GB, down to $0.79 from 1,000 GB, and that data doesn’t expire. Premium Residential costs $3.98 per GB pay as you go, or as low as $2.20 on the largest plans. Country, city, region and ISP targeting are included at no extra cost.

Puppeteer and Playwright appear on the pricing page only under Evomi’s Scraping Browser, a separate product. The refund window is 30 days but capped at 10% of your data or 1 GB, whichever is smaller. The page lists 54M+ IPs and doesn’t state how logins work.

Key facts
  • Core: 100 GB for $49 a month ($0.49 per GB)
  • Pay as you go $0.99 per GB from 15 GB, no expiry
  • Unlimited concurrent sessions on rotating pools
  • Free trial converts to the plan price unless cancelled
  • Refund within 30 days, capped at 10% or 1 GB
Best for
  • Image-heavy crawls at 100 GB a month and up
  • Rotating, logged-out scraping
  • Teams that already have retry logic
✓ Pros
  • $0.49 per GB, lowest here
  • Unlimited concurrent sessions
  • Free country, city and ISP targeting
  • One endpoint for three protocols
✗ Cons
  • No sticky length, success rate or response time stated
  • Trial rolls into $49 a month
  • Refund capped at 1 GB
PlanPriceTrafficPer GB
Core monthly$49 a month100 GB$0.49
Core pay as you goFrom 15 GBNo expiry$0.99
Core pay as you goFrom 1,000 GBNo expiry$0.79
Premium pay as you goNo commitmentAny$3.98
Volume rate
$0.49/GB
Entry price
$0.49/GB
Adv. success
Not listed
Editor’s notes · source evomi.com/pricing, read on October 30, 2026

Authentication isn’t described on the pricing page, and the residential docs page read for this article didn’t list the endpoint or session format.

Verdict: Best for cheap, high-volume rotating crawls; not ideal for logged-in browser sessions.

How do prices and session lengths compare for browser work?

These bars show each provider’s published numbers, read on October 30, 2026. Nobody here ran a benchmark. Bright Data appears twice in the first chart, at its promo rate and its list price. The sticky chart shows only providers that state a length.

Entry price per GB, US dollars (longer bar = cheaper)
Evomi
$0.49 on 100 GB
DataImpulse
$1.00
Proxy-Seller
$3.50
Decodo
$3.75
Bright Data, promo
$4.00
Oxylabs
$6.00
IPRoyal
$7.00
Bright Data, list
$8.00
Lowest listed volume rate per GB, US dollars (longer bar = cheaper)
Proxy-Seller
From $0.30, custom
Evomi
$0.49
DataImpulse
$0.80, 1 TB
IPRoyal
$1.75, 10 TB
Decodo
$2.00, 1,000 GB
Oxylabs
$2.50, 1,000 GB
Bright Data
$3.00, $999+ plans
Longest stated sticky session (longer bar = longer)
IPRoyal
7 days
Oxylabs
1,440 minutes (24 h)
Decodo
Minutes to days, no exact cap

Figures are the ones each provider publishes, checked on October 30, 2026. They are advertised numbers, not test results.

How do the 7 proxies for Puppeteer and Playwright compare?

One table, the same rows for every provider, in ranking order. Bold marks a clear plus. Every cell comes from the provider’s own page, read on October 30, 2026.

Decodo TopOxylabsProxy-SellerDataImpulseIPRoyalBright DataEvomi
Entry rate per GB$3.75 on 3 GB$6 up to 5 GB$3.50 Test plan$1$7 for 1 GB$4 promo, $8 list$0.49 on 100 GB
Longest sticky sessionMinutes to days1,440 minNot statedNot stated7 daysNot statedNot stated
Concurrent sessionsNot statedUnlimitedUnlimitedHigh limits, no numberUnlimitedNot statedUnlimited on rotating pools
Login optionsUser and password, IP whitelist3 users, 10 whitelisted IPsUser and password, IP allowlistLogin and password, IP authIP whitelist, sub-usersNot statedNot stated
Puppeteer or Playwright on the pageNot namedGuides for bothWorks natively with bothBoth namedGuides for bothBrowser API insteadScraping Browser only
Trial or refund3-day trial, 14-day money-back$5 credit24-hour refund or replacement5 GB for $5, 7-day refundFree trial, no refund termsFree trial, $500 deposit matchFree trial, refund capped at 1 GB
Advertised success99.92%99.95%99.5%99.51%99.4%Not listedNot listed
Advertised responseUnder 0.5 s0.41 to 0.6 sAbout 0.35 sAbout 1 sAbout 0.5 sNot listedNot listed

Which kind of browser proxy setup fits you?

Four setups cover most Puppeteer and Playwright work. Choose by whether you log in, how many browsers run at once, and how heavy the pages are.

🔐
Logged-in accounts
IPRoyal’s 7-day sticky sessions or Oxylabs’ 1,440 minutes. One context, one account, one IP for the whole job.
🚀
Many parallel contexts
Oxylabs, Proxy-Seller or IPRoyal, which list unlimited concurrent sessions. A sticky session ID per context keeps them apart.
🖼️
Heavy pages on a budget
DataImpulse at $1 or Evomi at $0.49 per GB. Block images and fonts too, and the bill stays small.
☁️
No browsers to host
Bright Data’s Browser API at $5 per GB runs the browser for you. Your Puppeteer or Playwright code connects to it instead of launching Chrome.

Proxies for Puppeteer and Playwright: your questions

On the pages read on October 30, 2026, Decodo, Oxylabs and Proxy-Seller. Decodo starts at $3.75 per GB with a 3-day trial and sticky sessions from minutes to days. Oxylabs lists unlimited concurrent sessions and guides for both frameworks. Proxy-Seller advertises about 0.35 s response and says it works natively with Puppeteer and Playwright.
Pass the host and port in the launch args as –proxy-server=http://HOST:PORT, then call page.authenticate({ username, password }) before page.goto. Chrome ignores a login typed into the proxy flag itself. For several proxies in one browser, give each context its own proxyServer and call page.authenticate on each page.
Pass a proxy object to new_context with server, username and password. Playwright’s docs say a proxy can be set for the whole browser or for each browser context, with a login for HTTP(S) proxies. One context per sticky session keeps each account on its own IP.
Sticky, in most cases. A page load is many requests, and per-request rotation spreads them across IPs. Hold one IP per browser context, then rotate by opening a new context with a new session. Oxylabs documents sessions up to 1,440 minutes; IPRoyal lists up to 7 days.
Evomi lists $0.49 per GB on a 100 GB monthly plan, and DataImpulse $1 per GB with no subscription and gigabytes that never expire. DataImpulse also names Puppeteer and Playwright on its residential page; Evomi mentions them only under its separate Scraping Browser.
It depends on the pages, because a browser downloads images, fonts and scripts as well as the HTML. That’s why price per GB matters more here than for plain HTTP scraping. Blocking images and media with Playwright’s network routing, or request interception in Puppeteer, cuts the gigabytes you pay for.
Only if the site blocks cloud IP ranges. Many sites accept datacenter IPs, which cost less. Start with the cheapest type that works on your target and move to residential when blocks start. Our best residential proxies ranking covers the residential side.
Yes, in two ways. Its residential proxies take the same host, port and login as any provider. Its pricing page also links a Browser API at $5 per GB, described as remote browsers with stealth included, which your Puppeteer or Playwright code connects to instead of launching Chrome.
🔎
How we compared
Last verified: October 30, 2026 · ProxyAdvice · affiliate links marked ↗ may earn a commission

We read each provider’s residential page on October 30, 2026, plus Oxylabs’ session control docs, and wrote down what they state. Scores weight session control and price per GB at 25% each, because browsers hold sessions and load heavy pages. The setup code was run on the same day against local test proxies with a login: Playwright for Python and Puppeteer 24. Nobody here benchmarked the providers. Compare picks with independent proxy ratings on ProxyRates, or browse all proxy rankings. Scores are our editorial rating built from published prices, features and terms. They are not lab measurements.

Sessions and rotation
25%
Price per GB
25%
Concurrency and logins
15%
Advertised speed and success
15%
Framework support on the page
10%
Trial and refund
10%
(function(){ if (window.__apArticleInit) return; window.__apArticleInit = true; var reduce = window.matchMedia ? window.matchMedia(‘(prefers-reduced-motion:reduce)’).matches : false; var wrap = document.querySelector(‘[data-ap-article]’); if (wrap) wrap.classList.add(‘ap-js’); try{ var io = new IntersectionObserver(function(entries){ entries.forEach(function(e){ if(!e.isIntersecting) return; e.target.classList.add(‘vis’); e.target.querySelectorAll(‘.bar-anim’).forEach(function(b){ b.style.width = b.style.getPropertyValue(‘–tw’) || ‘0%’; }); io.unobserve(e.target); }); },{threshold:0.07}); document.querySelectorAll(‘.reveal’).forEach(function(el){ io.observe(el); }); }catch(e){} function togglePanel(btn){ var panel = document.getElementById(btn.getAttribute(‘data-target’)); if(!panel) return; var open = btn.getAttribute(‘aria-expanded’) === ‘true’; if(open){ panel.style.maxHeight = ‘0px’; btn.setAttribute(‘aria-expanded’,’false’); }else{ panel.style.maxHeight = panel.scrollHeight + ‘px’; btn.setAttribute(‘aria-expanded’,’true’); setTimeout(function(){ if(btn.getAttribute(‘aria-expanded’)===’true’) panel.style.maxHeight = panel.scrollHeight + ‘px’; }, 520); } } document.querySelectorAll(‘.read-more-btn,.btn-expand’).forEach(function(btn){ btn.addEventListener(‘click’, function(){ togglePanel(btn); }); }); document.querySelectorAll(‘.faq-q’).forEach(function(q){ q.addEventListener(‘click’, function(){ var item = q.closest(‘.faq-item’); var was = item.classList.contains(‘open’); document.querySelectorAll(‘.faq-item.open’).forEach(function(i){ i.classList.remove(‘open’); var a=i.querySelector(‘.faq-a’); if(a) a.style.maxHeight=’0px’; var b=i.querySelector(‘.faq-q’); if(b) b.setAttribute(‘aria-expanded’,’false’); }); if(!was){ item.classList.add(‘open’); var a=item.querySelector(‘.faq-a’); if(a) a.style.maxHeight = a.scrollHeight + ‘px’; q.setAttribute(‘aria-expanded’,’true’); } }); }); window.apCopy = function(el, code){ try{ if(navigator.clipboard ? navigator.clipboard.writeText : false){ navigator.clipboard.writeText(code).then(function(){ var o=el.textContent; el.textContent=(wrap ? wrap.getAttribute(‘data-copied’) : ”)||’✓ Copied’; setTimeout(function(){ el.textContent=o; },1600); }); } }catch(e){} }; (function(){ var tabs = Array.prototype.slice.call(document.querySelectorAll(‘.ptab’)); if(!tabs.length) return; function activate(tab){ tabs.forEach(function(t){ t.setAttribute(‘aria-selected’, t===tab ? ‘true’:’false’); }); document.querySelectorAll(‘.ppanel’).forEach(function(p){ p.classList.remove(‘active’); }); var panel = document.getElementById(tab.getAttribute(‘data-panel’)); if(panel){ panel.classList.add(‘active’); panel.querySelectorAll(‘.bar-anim’).forEach(function(b){ b.style.width = b.style.getPropertyValue(‘–tw’) || ‘0%’; }); } } tabs.forEach(function(t){ t.addEventListener(‘click’, function(){ activate(t); }); t.addEventListener(‘keydown’, function(ev){ var i = tabs.indexOf(t), n = tabs.length; if(ev.key===’ArrowRight’){ ev.preventDefault(); tabs[(i+1)%n].focus(); activate(tabs[(i+1)%n]); } if(ev.key===’ArrowLeft’){ ev.preventDefault(); tabs[(i-1+n)%n].focus(); activate(tabs[(i-1+n)%n]); } }); }); })(); var stepper = document.getElementById(‘stepper’); var fill = document.getElementById(‘stepperFill’); var pctEl = document.getElementById(‘stepPct’); var topBar = document.getElementById(‘apProgressTop’); var sections = Array.prototype.slice.call(document.querySelectorAll(‘section[data-step]’)); var steps = []; if(stepper ? sections.length : 0){ sections.forEach(function(sec, i){ var div = document.createElement(‘div’); div.className = ‘step’; div.setAttribute(‘data-i’, i); div.innerHTML = ‘‘+ (sec.getAttribute(‘data-step’)||(((wrap ? wrap.getAttribute(‘data-step-word’) : ”)||’Step’)+’ ‘+(i+1))) +’‘; div.addEventListener(‘click’, function(){ var y = sec.getBoundingClientRect().top + window.pageYOffset – 70; window.scrollTo({top:y, behavior: reduce ? ‘auto’ : ‘smooth’}); }); stepper.appendChild(div); steps.push(div); }); } function clamp(v,a,b){ return Math.max(a, Math.min(b, v)); } function onScroll(){ var docH = document.documentElement.scrollHeight – window.innerHeight; var sc = window.pageYOffset; var pct = docH > 0 ? clamp(sc / docH, 0, 1) : 0; if(topBar) topBar.style.width = (pct*100).toFixed(1) + ‘%’; if(pctEl) pctEl.innerHTML = Math.round(pct*100) + ‘%‘; var line = window.innerHeight * 0.4; var activeIdx = 0; sections.forEach(function(sec, i){ if(sec.getBoundingClientRect().top – line <= 0) activeIdx = i; }); steps.forEach(function(st, i){ st.classList.remove('active','done'); if(i < activeIdx) st.classList.add('done'); else if(i === activeIdx) st.classList.add('active'); }); if(fill ? steps.length : 0){ var railTop = stepper.querySelector('.stepper-rail').getBoundingClientRect().top; var target = steps[activeIdx].querySelector('.step-dot').getBoundingClientRect(); var h = clamp((target.top + target.height/2) – railTop, 0, 100000); var byPct = (stepper.querySelector('.stepper-rail').offsetHeight) * pct; fill.style.height = Math.max(h, byPct) + 'px'; } } var ticking = false; function requestScroll(){ if(ticking) return; ticking = true; window.requestAnimationFrame(function(){ onScroll(); ticking = false; }); } window.addEventListener('scroll', requestScroll, {passive:true}); window.addEventListener('resize', requestScroll); onScroll(); })();
Proxy Advice
Logo