Puppeteer

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.

Windows x64·Runs locally, so no CAPTCHA leaves your machine
  • puppeteer-extra ready
  • Promise-based npm client
  • Unmetered headless runs
CAPTCHAs a month40,000
40.0k250.0k
Metered elsewhere, about $1.40 per 1,000$56.00
CapSkip Bronze, flat$35.00
$21.00stays in your pocketevery month, at this volume

When 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

JavaScript
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

  1. 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

  2. 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

  3. 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.

FeatureCapSkip2Captcha & API services
How you payFrom $35 monthly, no setup fee, solves never countedPrepaid credits priced per thousand solves, so cost tracks page count
Where the solve happensInside CapSkip, on the computer that runs your crawlerA remote API or a human solving farm
Wiring into Node.jsnpm client, browser extension or the local APIAPI key plus a vendor client or puppeteer-extra
puppeteer-extra-plugin-recaptchaKeeps working, answered locally through the 2Captcha emulatorWorks, but every token is drawn from a paid balance
Image CAPTCHA turnaroundRoughly 0.1 seconds, answered on the same machineUpload, queue and polling for every image
Parallel tabsNo thread limit; your hardware sets the paceConcurrency caps or a pricier plan
Challenge dataStays on the machine running ChromeSent to a third party with every solve

Pricing

Stop paying per solve

Choose your license

Bronze License

$35/ month

Subscribe to Bronze

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.

Start the free trial

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?
Three awaited steps with the capskip npm client: page.$eval reads the data-sitekey value, solver.recaptcha(sitekey, page.url()) returns the token, and page.evaluate writes result.code into g-recaptcha-response before you click submit. On a puppeteer-extra project, a single page.solveRecaptchas() call does the same job.
Can puppeteer-extra-plugin-recaptcha send its work to CapSkip?
Yes, without editing it. Keep the 2captcha provider id, then in the CapSkip app enable 2Captcha emulation and use the Add button beside Hosts file. Requests the plugin makes to 2captcha.com then resolve to CapSkip on that computer, so run the script on the same PC or VPS as the app.
Does the plugin still need a funded 2Captcha account?
No account and no balance. The plugin still expects a value in its token field, so paste the API key shown in the CapSkip settings, or any string while key validation is off. Nothing is billed per call, because the requests never leave your machine.
Why are some challenges left after page.solveRecaptchas() runs?
That method only searches for reCAPTCHA and hCaptcha widgets, and CapSkip answers both through its 2Captcha emulation. Anything else on the page, such as Turnstile, a GeeTest v3 slide, ALTCHA or an image CAPTCHA, is invisible to the plugin, so handle it with the capskip SDK in the same script, right beside the plugin call.
Can Puppeteer pass the full-page Cloudflare check?
Yes. For a widget embedded in a form, give solver.turnstile() the sitekey plus the current URL, then fill cf-turnstile-response. The full-page check also needs the data and pagedata strings the challenge exposes. Its result carries the userAgent the token was issued under, so switch to it with page.setUserAgent before you submit.
Is puppeteer-extra-plugin-stealth enough to avoid CAPTCHAs?
It lowers how often they show up, not whether they can. Stealth patches hide the signals that mark headless Chrome as automated, yet a site can still serve a challenge, and that one needs a real answer. Run stealth for fewer prompts and CapSkip for the prompts that remain.
What changes for reCAPTCHA v3 in Puppeteer?
There is no widget to fill, only a score. Call solver.recaptcha() with version set to v3 and the action string the site hands to grecaptcha.execute, then send the token along with the request the page would make. Google rates v3 tokens by IP reputation and browser signals, and a clean proxy matters when a site wants a high score.
Can the CapSkip extension run in headless Puppeteer?
Yes, in Chrome's new headless mode, the default since Puppeteer 22, and with a visible window. The legacy headless shell has no extension support at all. Either way the extension needs the CapSkip app running. The SDK and the puppeteer-extra route have no such limit, since neither asks the browser to do the solving.

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.