Bypass reCAPTCHA, hCaptcha & Turnstile in Puppeteer / Node.js — Last Updated: August 29, 2026
⚡ TL;DR: Skip the flaky puppeteer-extra-plugin-recaptcha. The production-grade pattern: pull the sitekey → POST it to CaptchaKings → inject the returned token with page.evaluate(). No browser extensions, no iframe clicking, ~3 seconds per solve. Free $0.50 credit on signup.
The popular plugin runs solving logic inside the automated browser. That leaves a detectable footprint, breaks whenever Google ships a reCAPTCHA update, and struggles with Enterprise score-based challenges. A server-side solving API decouples you from the cat-and-mouse game: your bot just asks for a token and injects it — the same technique used by large-scale scraping teams.
npm install puppeteer axios
# Recommended companion:
npm install puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const axios = require('axios');
puppeteer.use(StealthPlugin());
const API_KEY = 'ck_your_api_key_here';
const PAGE_URL = 'https://example.com/register';
async function solveRecaptchaV2(sitekey, pageUrl) {
const { data } = await axios.post('https://captchakings.com/api', {
api_key: API_KEY,
captcha_type: 'recaptcha_v2',
sitekey: sitekey,
page_url: pageUrl
});
if (!data.token) throw new Error('Solve failed: ' + JSON.stringify(data));
return data.token; // valid g-recaptcha-response, ~3s average
}
(async () => {
const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.goto(PAGE_URL, { waitUntil: 'networkidle2' });
// 1. Extract the sitekey
const sitekey = await page.$eval('[data-sitekey]', el => el.dataset.sitekey);
// 2. Solve server-side
const token = await solveRecaptchaV2(sitekey, PAGE_URL);
// 3. Inject + submit
await page.evaluate((t) => {
document.getElementById('g-recaptcha-response').innerHTML = t;
}, token);
await Promise.all([
page.waitForNavigation({ waitUntil: 'networkidle2' }),
page.click('button[type=submit]')
]);
console.log('Passed:', page.url());
await browser.close();
})();
const el = await page.$('#captcha-img');
await el.screenshot({ path: 'captcha.png' });
const FormData = require('form-data');
const fs = require('fs');
const form = new FormData();
form.append('captcha', fs.createReadStream('captcha.png'));
form.append('api_key', API_KEY);
const { data } = await axios.post('https://captchakings.com/api/process.php', form, {
headers: form.getHeaders()
});
console.log('Answer:', data.prediction, '| confidence:', data.confidence);
| Monthly Volume | Type | Approx. Cost |
|---|---|---|
| 10,000 solves | reCAPTCHA v2 | ~$6 – $20 |
| 100,000 solves | reCAPTCHA v2 | ~$60 – $200 |
| 100,000 solves | Image / text OCR | from $30 |
| Testing | Any | $0 — free $0.50 signup credit |
Yes — it's the recommended pairing. Stealth masks automation signals while CaptchaKings clears the challenge server-side.
Yes. The API is stateless and handles high concurrency, so puppeteer-cluster workers can request tokens in parallel without rate issues on paid plans.
Report it via the API for an automatic refund, then request a new token. Rejection is rare (<1% on reCAPTCHA v2) and never billed.
🎁 Free $0.50 credit — run this exact script today, on us. Create your API key →