reCAPTCHA v2 Enterprise

Attention!
Built-in proxies are used by default — their cost is already included in the service. You only need to specify your own proxies in cases where the website does not accept the token or access to the built-in services is restricted.

If you are using a proxy, please use a proxy with username and password authentication.

The task object contains data for Google reCAPTCHA Enterprise solving. To ensure the universality of the solution, all the data used for automation is reproduced, including proxy access, browser User-Agent, and cookies.

This type of captcha has no visual differences from reCAPTCHA v2. You can see the difference by examining the captcha code, for example, in the developer tools under the Network tab in the requests:

https://www.google.com/recaptcha/enterprise/anchor?ar=1&k=6Lf26sUnAAAAAIKLuWNYgRsFUfmI-3Lex3xT5N-s&co=aHR0cHM6Ly8yY2FwdGNoYS5jb206NDQz&hl=en&v=1kRDYC3bfA-o6-tsWzIBvp7k&size=normal&cb=43r1q2d3mx66

This type of captcha might be solved a bit longer than usual image captcha, but this issue is compensated by the fact that g-recaptcha-response value we send to you is valid for the next 60 seconds after we solve your ReCaptcha2.

Task Types

Task TypeDescription
RecaptchaV2EnterpriseTaskSolve with your own proxy
RecaptchaV2EnterpriseTaskProxylessSolve without proxy (uses built-in proxies)

Request Parameters

ParameterTypeRequiredDescription
type String Required RecaptchaV2EnterpriseTask or RecaptchaV2EnterpriseTaskProxyless
websiteURL String Required Address of a webpage with Google reCAPTCHA Enterprise.
websiteKey String Required reCAPTCHA website key.
<div class="g-recaptcha" data-sitekey="THIS_ONE"></div>
or in iframe: ...;k=6LdIFr0ZAAAAAO3vz0O0OQrtAefzdJcWQM2TMYQH&..., where the k value is the websiteKey
enterprisePayload Object Optional Additional parameters passed to the grecaptcha.enterprise.render method along with the sitekey. For example:
{ "s": "2JvUXHNTnZl1Jb6WEvbDyB...ugQA" }
isInvisible Boolean Optional true if the captcha is invisible, i.e. has a hidden field for confirmation, no checkbox.
apiDomain String Optional Domain address from which to load reCAPTCHA Enterprise. For example: www.google.com or www.recaptcha.net. Don't use if you don't know why it's needed.
userAgent String Optional Browser's User-Agent which is used in emulation. It is required that you use a signature of a modern browser, otherwise Google will ask you to "update your browser".
cookies String Optional Additional cookies which we must use during interaction with target page or Google.
Format: cookiename1=cookievalue1; cookiename2=cookievalue2
proxyType String Optional http - regular http/https proxy;
https - try this option only if "http" doesn't work;
socks4 - socks4 proxy;
socks5 - socks5 proxy.
proxyAddress String Optional IPv4/IPv6 proxy IP address. Not allowed: using transparent proxies or proxies on local machines.
proxyPort Integer Optional Proxy port.
proxyLogin String Optional Proxy-server login.
proxyPassword String Optional Proxy-server password.
For enterprisePayload — before calling it, you need to replace the grecaptcha.enterprise.render function with your own and take the value from its parameters. The function exists after loading the script, and the captcha is usually rendered immediately or based on a page event. If the captcha is rendered with the current field s on the client, then the token will most likely not be accepted. The original function can be called without the s field.

Create Task - Without Proxy

Request

POST https://captcha69.com/createTask
Content-Type: application/json

{
  "clientKey": "max1_YOUR_API_KEY",
  "task": {
    "type": "RecaptchaV2EnterpriseTask",
    "websiteURL": "https://mydomain.com/page-with-recaptcha-enterprise",
    "websiteKey": "6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd",
    "enterprisePayload": {
      "s": "SOME_ADDITIONAL_TOKEN"
    }
  }
}

Response

{
  "errorId": 0,
  "taskId": 407533072
}

Create Task - With Proxy

Request

POST https://captcha69.com/createTask
Content-Type: application/json

{
  "clientKey": "max1_YOUR_API_KEY",
  "task": {
    "type": "RecaptchaV2EnterpriseTask",
    "websiteURL": "https://mydomain.com/page-with-recaptcha-enterprise",
    "websiteKey": "6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd",
    "enterprisePayload": {
      "s": "SOME_ADDITIONAL_TOKEN"
    },
    "proxyType": "http",
    "proxyAddress": "8.8.8.8",
    "proxyPort": 8080,
    "proxyLogin": "proxyLoginHere",
    "proxyPassword": "proxyPasswordHere",
    "userAgent": "userAgentPlaceholder"
  }
}

Response

{
  "errorId": 0,
  "taskId": 407533072
}

Get Task Result

Use the getTaskResult method to request the answer for reCAPTCHA v2 Enterprise. You will get a response within a 10-80 second period depending on service workload.

Request

POST https://captcha69.com/getTaskResult
Content-Type: application/json

{
  "clientKey": "max1_YOUR_API_KEY",
  "taskId": 407533072
}

Response

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "3AHJ_VuvYIBNBW5yyv0zRYJ75VkOKvhKj9_xGBJKnQimF72rfoq3Iy-DyGHMwLAo6a3"
  }
}

Solution Properties

PropertyTypeDescription
gRecaptchaResponse String Hash which should be inserted into reCAPTCHA submit form in <textarea id="g-recaptcha-response" ..></textarea>. It has a length of 500 to 2190 bytes.

Finding Parameters

websiteKey (sitekey)

Public site key. You can find the websiteKey in the Elements tab:

Or in Network requests:

enterprisePayload Extraction Script

Show extraction script
var __test_grc = undefined;
var __test_enterprise = undefined;
var __test_render = undefined;
var __test_render_widget = undefined;
var __test_render_args = undefined; // here will be the object with which render is called

var __test_handler = {
  get: function(target, name, receiver) {
    if (name == 'enterprise') {
      return __test_enterprise ? __test_enterprise : (__test_enterprise = new Proxy(target[name], __test_handler));
    } else if (name == 'render') {
      __test_render = target[name];
      return (function(a, b) {
        __test_render_args = b;
        __test_render_widget = a;
        return __test_render(a, {sitekey: b.sitekey}); });
    } else {
      return target[name];
    }
  }
};

Object.defineProperty(window, 'grecaptcha', {
  enumerable: true,
  configurable: false,
  get: function() {
    return __test_grc;
  },
  set: function(value) {
    __test_grc = new Proxy(value, __test_handler);
  }
});

Code Examples

JavaScript (Browser) - Extract Parameters
(() => {
  const payload = {};
  let sitekey = null;

  document.querySelectorAll('.g-recaptcha').forEach(div => {
    if (div.dataset.sitekey) sitekey = div.dataset.sitekey;

    for (const [key, value] of Object.entries(div.dataset)) {
      if (key !== 'sitekey') {
        payload[key] = value;
      }
    }
  });

  const scriptTags = Array.from(document.querySelectorAll("script:not([src])"));
  const regex = /grecaptcha\.enterprise\.render\([^,]+,\s*\{(.*?)\}/s;

  scriptTags.forEach(tag => {
    const match = regex.exec(tag.textContent);
    if (match) {
      const obj = match[1];
      const paramRegex = /(\w+)\s*:\s*['"]([^'"]+)['"]/g;
      let p;
      while ((p = paramRegex.exec(obj)) !== null) {
        const key = p[1];
        const val = p[2];
        if (key === "sitekey") sitekey = val;
        else payload[key] = val;
      }
    }
  });

  console.log("sitekey:", sitekey);
  console.log("enterprisePayload:", payload);
})();
JavaScript (Node.js) - Extract Parameters
import { chromium } from 'playwright';

(async () => {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();

  let sitekey = null;
  const enterprisePayload = {};

  const targetUrl = 'https://example.com';
  await page.goto(targetUrl, { timeout: 60000 });
  await page.waitForTimeout(3000);

  const recaptchaDivs = await page.$$('.g-recaptcha');
  for (const div of recaptchaDivs) {
    const attrs = ['data-sitekey', 'data-s', 'data-cdata', 'data-type', 'data-context'];
    for (const attr of attrs) {
      const val = await div.getAttribute(attr);
      if (val) {
        const key = attr.replace('data-', '');
        if (key === 'sitekey') {
          sitekey = val;
        } else {
          enterprisePayload[key] = val;
        }
      }
    }
  }

  const inlineScripts = await page.$$eval("script:not([src])", (scripts) =>
    scripts.map((s) => s.textContent)
  );

  const pattern = /grecaptcha\.enterprise\.render\([^,]+,\s*\{(.*?)\}/s;

  for (const script of inlineScripts) {
    const match = script.match(pattern);
    if (match) {
      const obj = match[1];
      const keyValuePattern = /(\w+)\s*:\s*['"]([^'"]+)['"]/g;
      let keyValueMatch;
      while ((keyValueMatch = keyValuePattern.exec(obj)) !== null) {
        const key = keyValueMatch[1];
        const val = keyValueMatch[2];
        if (key === 'sitekey') {
          sitekey = val;
        } else {
          enterprisePayload[key] = val;
        }
      }
      break;
    }
  }

  console.log(`sitekey: ${sitekey}`);
  console.log("enterprisePayload:");
  for (const [key, value] of Object.entries(enterprisePayload)) {
    console.log(`  ${key}: ${value}`);
  }

  await browser.close();
})();
Python - Extract Parameters
import asyncio
import re
from playwright.async_api import async_playwright

async def extract_recaptcha_v2_enterprise(url):
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        context = await browser.new_context()
        page = await context.new_page()

        sitekey = None
        enterprise_payload = {}

        await page.goto(url, timeout=60000)
        await page.wait_for_timeout(3000)

        recaptcha_divs = await page.query_selector_all(".g-recaptcha")
        for div in recaptcha_divs:
            attrs = ["data-sitekey", "data-s", "data-cdata", "data-type", "data-context"]
            for attr in attrs:
                val = await div.get_attribute(attr)
                if val:
                    key = attr.replace("data-", "")
                    if key == "sitekey":
                        sitekey = val
                    else:
                        enterprise_payload[key] = val

        inline_scripts = await page.locator("script:not([src])").all_text_contents()
        pattern = re.compile(r"grecaptcha\.enterprise\.render\([^,]+,\s*\{(.*?)\}", re.DOTALL)

        for script in inline_scripts:
            match = pattern.search(script)
            if match:
                obj = match.group(1)
                for pair in re.finditer(r"(\w+)\s*:\s*['\"]([^'\"]+)['\"]", obj):
                    key = pair.group(1)
                    val = pair.group(2)
                    if key == "sitekey":
                        sitekey = val
                    else:
                        enterprise_payload[key] = val
                break

        await browser.close()

        print(f"sitekey: {sitekey}")
        print("enterprisePayload:")
        for k, v in enterprise_payload.items():
            print(f"  {k}: {v}")

asyncio.run(extract_recaptcha_v2_enterprise("https://example.com"))