Node.js SDK

Node.js CAPTCHA Solver for Puppeteer, Playwright and Plain JavaScript

Add capskip from npm, await the answer and move on. The typed, dependency-free client gets reCAPTCHA, text images, Turnstile and GeeTest v3 solved by an app on hardware you own, never billed per solve.

Windows x64·Runs locally, so no CAPTCHA leaves your machine
  • npm install capskip
  • Ships TypeScript types
  • No per-solve meter
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

Run npm install capskip and your project gains a Node.js CAPTCHA solver: pass it a reCAPTCHA, a Cloudflare Turnstile widget, a GeeTest v3 slide or a distorted text image, and the Promise resolves with a token or the recognized characters. The work happens inside the CapSkip desktop app, which you run on Windows (a home PC or a VPS); the package itself is a lean HTTP client for Node 18 and newer with zero runtime dependencies.

Because every method returns a Promise, the client reads like the rest of your async code. Await it inside Puppeteer and Playwright code, fetch-based crawlers or queue workers, or start dozens of solves at once and gather them with Promise.all. TypeScript definitions ship in the package, so this JavaScript CAPTCHA solver fits CommonJS, ESM and typed projects alike.

Parallelism costs nothing extra. There is no per-solve meter and no per-key rate limit, so a batch of two hundred is billed the same as a single call; what sets the ceiling is how much CPU and memory the solving machine has. Plans start at $35 a month for one device, with unlimited solving on every tier.

Your 2Captcha client can stay. If a Node project on the CapSkip machine already uses a 2Captcha or Anti-Captcha library, enable that service's emulator in the app, then hit its Add button for the hosts file. Its requests then resolve locally, with no balance to refill and not one line of code changed.

Why this npm CAPTCHA solver fits async Node code

Await one solve or a thousand

Each method returns a Promise. Await a single answer inline, or fan out with Promise.all and switch to Promise.allSettled when one failed challenge must not reject the rest.

Typed for TypeScript projects

Definitions for SolveResult and every options object come inside the package, so your editor autocompletes without an @types install. ES modules load the CommonJS build through Node interop.

One entry in your lockfile

The client is built only on the core http and https modules of Node 18 and newer, so adding it pulls nothing else into node_modules.

A proxy on each token solve

Give token solves a proxy with its type and URI, and the challenge is cleared from the IP that later submits the form. SOCKS5 and SOCKS5h are accepted, as are HTTP and HTTPS.

Sits beside any headless browser

The client never drives a browser. Puppeteer or Playwright reads the widget, CapSkip sends back the answer, and one page.evaluate call writes it where the form expects it.

Wider batches, same invoice

No fee per solve and no rate limit per key: parallel solves stop only where the solving PC runs out of processor time and RAM, so concurrency becomes a hardware decision.

Pick how your Node project reaches CapSkip

JavaScript
// npm install capskip
const { CapSkip } = require('capskip');

const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });

(async () => {
  const result = await solver.recaptcha(
    'YOUR_SITEKEY',
    'https://example.com/page-with-recaptcha',
  );

  console.log(result.code); // token, inject and submit
})();

One client, one await: the token lands in result.code, ready to write into a page or post with fetch.

Let the extension clear widgets

No solving code at all: with the Chrome or Firefox extension installed and the app running, widgets clear in the page. Puppeteer and Playwright can also load it into the Chromium they launch.

The npm client and its siblings

One await per challenge from Node 18 or newer. Official clients for Python, PHP and .NET exist too, for the parts of your stack not written in JavaScript.

Local API for code you already run

Any Node HTTP client can call the app directly, and 2Captcha or Anti-Captcha libraries reach it unchanged through the built-in service emulation.

Try the client on a live reCAPTCHA page

Our demo hosts a real reCAPTCHA v2 widget. Point a few lines of Node at it, or open it in a browser where the extension is active, and see a token returned, all before your production code gets involved.

Three steps from npm install to a first token

  1. Install the solver app

    Install CapSkip on whichever Windows computer or VPS should carry the solving load. Your Node code can run there too, or on any other box with a network route to it. Get the Windows installer

  2. Activate a plan or the trial

    Choose a monthly plan, or try CapSkip free for 3 days with up to 500 solves and no card. The emailed credentials unlock the app on first sign-in. See plans and prices

  3. Add capskip and await a solve

    Install the package with npm, create one client for the app, and await a solve wherever a CAPTCHA stops your script, worker or browser session. Open the SDK guide

Metered solving APIs vs CapSkip inside a Node.js codebase

What changes for a Node codebase when solving moves from a metered remote API to an app on a machine you control.

FeatureCapSkip2Captcha / CapSolver
How you pay$35 a month and up, every solve included, no setup feeCharged per thousand solves, pay as you go
Where challenges are solvedInside CapSkip, on the Windows PC or server you run it onOn remote servers or by a human solving farm
Cost of a bigger Promise.all batchNothing extra: the limit is your CPU and memoryEach extra parallel solve is another charge
Monthly cost as volume growsFixed, whatever your solve countRises in line with volume
Challenge dataNever leaves the machine you controlPassed to a third party to solve
Node packagecapskip on npm: typed, zero dependencies, plus API emulationA vendor-specific client tied to their API
Image CAPTCHA turnaroundAround 0.1 seconds, no remote queueRound trip and queue time on each 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

Solve CAPTCHA using JavaScript: from one await to a queue worker

Start with a single call. In a project on Node 18 or newer, add the package, point one CapSkip client at the app's host and port, and share it across modules. For reCAPTCHA or Turnstile, pass the sitekey and the page URL; for GeeTest v3, a gt value plus a newly issued challenge; for an image, a file path, URL or data URI. An hCaptcha takes the same pair as reCAPTCHA, its sitekey and the page URL.

Then fan out. Since every method returns a Promise, a crawler can start solves for many pages and await them together. Promise.allSettled is the safer collector, because one rejected solve comes back as a status instead of discarding the batch. CapSkip sets no thread cap, which makes the machine the limit. Image solves are light, but reCAPTCHA, Turnstile and GeeTest run real browser instances in the background, so budget 32 GB of RAM or more when many run side by side.

For long-running jobs, move solving into a queue worker so web requests never wait on a challenge; the BullMQ guide below shows one pattern. Set timeouts per type with headroom to spare. Image answers are near instant (about 0.1 seconds), while the browser-based types take longer: plan on 3 to 10 seconds for reCAPTCHA or Turnstile, and on about 7 to 12 for GeeTest.

Finally, spend tokens quickly. reCAPTCHA and Turnstile tokens expire within minutes, so submit as soon as the solve resolves, and send that request from the IP the proxy used. In a browser, set the hidden response field through page.evaluate; with fetch or undici, append the token to the form body.

Related guides: Puppeteer CAPTCHA solver · Cloudflare Turnstile in Node.js · BullMQ CAPTCHA worker

Which npm package do I install to solve CAPTCHAs?
Run npm install capskip. The package works on Node 18 or newer, adds no runtime dependencies, and relays each challenge to CapSkip on your Windows machine or server, then resolves with the token or text. It handles the CAPTCHA types the app supports, reCAPTCHA, Turnstile and hCaptcha included.
Can I await solves inside Puppeteer or Playwright scripts?
Yes. Read the sitekey with page.$eval in Puppeteer or page.getAttribute in Playwright, await solver.recaptcha(sitekey, page.url()), then store result.code in the g-recaptcha-response textarea via page.evaluate and submit. Because the client only talks to the app, it behaves the same in test suites and scraping scripts.
Does the client work with fetch and no browser at all?
Yes. Solve first, then put the token into the URLSearchParams body under the field name the form expects, for example g-recaptcha-response, and post it. If the solve went through a proxy, send the form from that same IP, since a mismatch is a common reason a site rejects the token.
What does the Turnstile call return on a full Cloudflare challenge page?
For an ordinary widget, await solver.turnstile(sitekey, url) and place the token in cf-turnstile-response. A full-screen Cloudflare challenge needs two extra inputs, data and pagedata, read from that page. The result then carries a userAgent as well as the token, and the request that follows must use that exact userAgent.
How many solves can one Node process keep in flight?
As many as the CapSkip machine can carry. No key is rate limited and no solve carries a fee, so wrap the calls in Promise.all, or Promise.allSettled if one failure should not reject the others. For many browser-based solves at once, give the box 32 GB of RAM or more.
Can I import capskip from an ES module or a TypeScript file?
Yes. The type definitions are bundled, so there is no @types package to add, and SolveResult plus the option objects are typed. The runtime is CommonJS, and an ES module imports the CapSkip class through Node's interop without extra configuration.
How do I read an image CAPTCHA with JavaScript?
Pass solver.normal() a path on disk, a remote image link or a data URI, and result.code holds the recognized characters, usually in about 0.1 seconds. Image solves take no proxy and open no browser, so they fit inside any request loop or worker.
Will my existing 2Captcha npm code work against CapSkip?
Yes, provided the code lives on the Windows box where CapSkip is installed. Switch the app's 2Captcha emulator on, press Add next to the hosts file entry, and that library gets its answers locally. The other route is the capskip package itself, which talks the same in.php and res.php protocol.

Put a CAPTCHA answer behind every await

Install the app, add capskip to your package.json and await your first token. A flat monthly plan covers every solve your scripts, crawlers and workers make, at any batch size.