Puppeteer CAPTCHA Solver for Node.js and puppeteer-extra
Keep puppeteer-extra-plugin-recaptcha as it is, or await the capskip npm client, and headless Chrome gets an answer for reCAPTCHA, Turnstile, GeeTest v3 or a distorted text image, solved on your own PC with no meter per page.
- puppeteer-extra ready
- Promise-based npm client
- Unmetered headless runs
- open /signup
- fill the form
- solve the CAPTCHA
- submit
4 passed0 blockedWhen headless Chrome lands on a reCAPTCHA, a Turnstile box or a distorted image, CapSkip acts as the Puppeteer CAPTCHA solver beside your Node.js crawler. It runs on the same Windows PC or VPS and hands the script an answer to paste in, instead of a tab that times out. Puppeteer can click and type anywhere, but it cannot mint a valid token on its own. The CapSkip app does that part on a flat license with unlimited solves, which suits a browser that may open hundreds of tabs in a single crawl.
How deep the integration goes is your call. A project that already runs puppeteer-extra-plugin-recaptcha can stay untouched and still be answered by CapSkip, through the 2Captcha emulator. Fresh code can npm install capskip and await solver.recaptcha() or solver.turnstile() directly, typed for TypeScript out of the box.
Coverage goes beyond what the plugin scans for. reCAPTCHA v2, v3 and Enterprise are in, Turnstile both as a widget and as a full challenge page, plus GeeTest v3 slides, CaptchaFox, Capy Puzzle, AWS WAF CAPTCHA, the proof-of-work pair ALTCHA and Friendly Captcha, and thousands of image CAPTCHA styles read in about 0.1 seconds each. hCaptcha is in as well. GeeTest v4 and FunCaptcha stay out of scope. Stealth plugins still help by making challenges rarer; CapSkip clears the ones that slip through.
Your puppeteer-extra setup stays exactly as written. The recaptcha plugin keeps its 2captcha provider and its page.solveRecaptchas() calls. Once the CapSkip app has the 2Captcha emulator switched on and added to the hosts file, those calls are answered by the machine running Chrome instead of a prepaid balance. Walk through the setup guide
What the Puppeteer CAPTCHA solver adds to headless Chrome
Drop-in for puppeteer-extra-plugin-recaptcha
The plugin keeps its provider id and every page.solveRecaptchas() call. With the 2Captcha emulator in hosts-file mode, its requests stop at your own PC and no balance drains.
Await one method per CAPTCHA type
npm install capskip, create one client, then await recaptcha(), turnstile(), geetest() or normal(). Each resolves with result.code, and TypeScript definitions ship inside the package.
Turnstile pages with the right user agent
solver.turnstile() covers the embedded widget as well as the full-page Cloudflare check. For the page it also returns the userAgent the token belongs to, which you apply with page.setUserAgent.
Extension inside the Chrome you launch
Load the CapSkip extension into the Chrome instance Puppeteer starts, in a window or in the newer headless mode, and widgets clear inside the page without a single line of token code.
Many tabs, no solve queue
Start one solve per page and collect them with Promise.all. With no per-key rate limit and unlimited threads, throughput is set by your CPU and memory, not a vendor tier.
Retries never reach the invoice
Bronze, at $35 monthly for one machine, includes unlimited solves. A crawl that reloads a page ten times, or a test suite looping overnight, costs exactly the same.
Three ways to wire CapSkip into Puppeteer
const puppeteer = require('puppeteer');
const { CapSkip } = require('capskip');
const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com/login');
const sitekey = await page.$eval('.g-recaptcha', el => el.dataset.sitekey);
const { code } = await solver.recaptcha(sitekey, page.url());
await page.evaluate(t => {
document.getElementById('g-recaptcha-response').innerHTML = t;
}, code);
await page.click('button[type=submit]');
})();Puppeteer reads the sitekey, solver.recaptcha() from the capskip package returns a token, and page.evaluate places it before the submit click.
Extension in the launched browser
With the app running, put the CapSkip extension in the browser Puppeteer opens, and challenges clear themselves while your script waits for the next selector. Chrome and Firefox builds exist.
The capskip npm client
A Promise-based Node.js client with TypeScript types. Await a token or text per page and write it in with page.evaluate. Python, PHP and C# clients exist as well.
Emulated 2Captcha API for old code
puppeteer-extra-plugin-recaptcha and other 2Captcha-style clients keep sending the same requests, and the local API answers them on your machine, so existing Node code needs no edits.
Try it on a hosted reCAPTCHA page
Aim a test Puppeteer script, or Chrome with the extension, at our live reCAPTCHA v2 demo and watch a token come back before you point the same code at a real target.
Ready your Puppeteer project for CAPTCHAs
-
Install the app beside Chrome
Set up CapSkip on the Windows machine or VPS where your Puppeteer scripts run, and leave it open. One machine for both is simplest, and the hosts-file route needs it. Download the installer
-
Activate a plan or the trial
Pick a monthly plan or the free trial (500 solves across 3 days), then sign in to CapSkip with the credentials sent to your inbox. Compare the plans
-
Call it from your Puppeteer code
Run npm install capskip for direct calls, or switch on the 2Captcha emulator in hosts-file mode so puppeteer-extra keeps working, then run the script against a real page. See the Node.js SDK
Puppeteer CAPTCHA solving, local or billed per call
Both sides plug into the same Puppeteer code. The rows show what differs once a challenge leaves your script.
| Feature | CapSkip | 2Captcha & API services |
|---|---|---|
| How you pay | From $35 monthly, no setup fee, solves never counted | Prepaid credits priced per thousand solves, so cost tracks page count |
| Where the solve happens | Inside CapSkip, on the computer that runs your crawler | A remote API or a human solving farm |
| Wiring into Node.js | npm client, browser extension or the local API | API key plus a vendor client or puppeteer-extra |
| puppeteer-extra-plugin-recaptcha | Keeps working, answered locally through the 2Captcha emulator | Works, but every token is drawn from a paid balance |
| Image CAPTCHA turnaround | Roughly 0.1 seconds, answered on the same machine | Upload, queue and polling for every image |
| Parallel tabs | No thread limit; your hardware sets the pace | Concurrency caps or a pricier plan |
| Challenge data | Stays on the machine running Chrome | Sent to a third party with every solve |
Pricing
Stop paying per solve
Choose your license
Bronze License
$35/ month
Instant license activation
Billed monthly. Cancel from your account whenever you like.
Same features. More machines, more throughput.
Every machine solves as fast as its own CPU and memory allow. More machines run more threads at the same time, so Silver solves twice as many CAPTCHAs at once and Gold three times as many.
- Unlimited solving, no daily cap
- Unlimited threads, speed scales with your hardware
- 90% to 100% recognition accuracy
- Drop-in replacement for the major solving service APIs
- Works with almost any tool, no coding required
- REST API, SDKs and a browser extension
- Free training when a new CAPTCHA type appears
- Runs on your machine, nothing leaves it
Every CAPTCHA type CapSkip solves is on every license. See the coverage band
Just want to try it first?
Start with a free 3-day trial and solve 500 CAPTCHAs of any type on your own targets.
Related CAPTCHA solvers & guides
How to solve reCAPTCHA in Puppeteer: plugin route or SDK route
Puppeteer gives you two dependable ways to solve reCAPTCHA with CapSkip. The plugin route reuses puppeteer-extra-plugin-recaptcha untouched. The SDK route calls the capskip npm package yourself, and it also reaches Turnstile, GeeTest v3 and image CAPTCHAs, which the plugin never looks for.
Plugin route. Open the CapSkip app, turn the 2Captcha emulator on, then press Add to hosts file. This redirects 2captcha.com to CapSkip for that one computer only, so the Node process running Puppeteer must sit on the same machine as the app. Register the plugin as before, with the provider id 2captcha and, in the token field, a key from the CapSkip settings (with key validation off, any text is accepted). After each navigation, page.solveRecaptchas() finds the widgets, sends them to what it still takes for 2Captcha, and fills in the tokens CapSkip returns.
SDK route. After npm install capskip, create a single client for 127.0.0.1 on port 8080, where a fresh CapSkip install listens. Read the sitekey with page.$eval, then await solver.recaptcha(sitekey, page.url()). An invisible widget takes invisible: 1, and reCAPTCHA v3 takes version v3 plus the action the page uses.
Finish inside two minutes, because the token expires. Write result.code into the g-recaptcha-response textarea with page.evaluate, fire the widget callback when one is declared, and submit. Turnstile follows the identical pattern with solver.turnstile() and the cf-turnstile-response field. For an image CAPTCHA, screenshot the element in base64 and pass it to solver.normal() as a data:image/png;base64 string.
Related guides: Node.js CAPTCHA solver · reCAPTCHA v2 in Node.js · 2Captcha API alternative
What does a reCAPTCHA solve look like in a Puppeteer script?
Can puppeteer-extra-plugin-recaptcha send its work to CapSkip?
Does the plugin still need a funded 2Captcha account?
Why are some challenges left after page.solveRecaptchas() runs?
Can Puppeteer pass the full-page Cloudflare check?
Is puppeteer-extra-plugin-stealth enough to avoid CAPTCHAs?
What changes for reCAPTCHA v3 in Puppeteer?
Can the CapSkip extension run in headless Puppeteer?
Give every Puppeteer run a way past the CAPTCHA
Install CapSkip next to your Node.js project, keep the plugin you have or add the npm client, and the next challenge costs one awaited call instead of a stalled tab, at the same monthly price.
