The task object contains data for Google reCAPTCHA v2 solving. To ensure the universality of the solution to this type of captcha, you need to use all the data used when automating the filling of the form on the target site, including proxies, browser UserAgent and cookies. This will help to avoid any problems when Google changes the code of its captcha.
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.
RecaptchaV2Task with proxy). Make sure to use the same proxies when solving the captcha and submitting the token to the site.| Task Type | Description |
|---|---|
RecaptchaV2Task | Solve with your own proxy |
NoCaptchaTaskProxyless | Solve without proxy (uses built-in proxies) |
| Parameter | Type | Required | Description |
|---|---|---|---|
type |
String | Required | RecaptchaV2Task or NoCaptchaTaskProxyless |
websiteURL |
String | Required | Address of a webpage with captcha. |
websiteKey |
String | Required | Recaptcha website key.<div class="g-recaptcha" data-sitekey="THIS_ONE"></div> |
recaptchaDataSValue |
String | Optional | Some custom implementations may contain additional "data-s" parameter in ReCaptcha2 div, which is in fact a one-time token and must be grabbed every time you want to solve a ReCaptcha2.<div class="g-recaptcha" data-sitekey="some sitekey" data-s="THIS_ONE"></div> |
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 |
isInvisible |
Boolean | Optional | true if the captcha is invisible, i.e. has a hidden field for confirmation, no checkbox. If a bot is suspected, an additional check is called. |
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. |
proxyPort |
Integer | Optional | Proxy port. |
proxyLogin |
String | Optional | Proxy-server login. |
proxyPassword |
String | Optional | Proxy-server password. |
POST https://captcha69.com/createTask
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"task": {
"type": "RecaptchaV2Task",
"websiteURL": "https://example.com/captcha-page",
"websiteKey": "6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd"
}
}
{
"errorId": 0,
"taskId": 407533072
}
POST https://captcha69.com/createTask
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"task": {
"type": "RecaptchaV2Task",
"websiteURL": "https://example.com/captcha-page",
"websiteKey": "6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd",
"proxyType": "http",
"proxyAddress": "8.8.8.8",
"proxyPort": 8080,
"proxyLogin": "proxyLoginHere",
"proxyPassword": "proxyPasswordHere",
"userAgent": "userAgentPlaceholder"
}
}
{
"errorId": 0,
"taskId": 407533072
}
POST https://captcha69.com/getTaskResult
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"status": "ready",
"solution": {
"gRecaptchaResponse": "3AHJ_VuvYIBNBW5yyv0zRYJ75VkOKvhKj9_xGBJKnQimF72rfoq3Iy-DyGHMwLAo6a3"
}
}
For some websites, the response may include userAgent and cookies:
{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...",
"gRecaptchaResponse": "0cAFcWeA5Y3...hF8UWA",
"cookies": {
"nocookies": "true"
}
}
}
| Property | Type | Description |
|---|---|---|
gRecaptchaResponse |
String | Hash which should be inserted into Recaptcha2 submit form in <textarea id="g-recaptcha-response" ..></textarea>. It has a length of 500 to 2190 bytes. |
Elements tab: Look for a <div class="g-recaptcha"> element on the page. Copy the value of the data-sitekey attribute.
Network tab: Open the Network tab and reload the page. Look for a request where the k value is the data-sitekey.
If the page contains a data-s attribute, find it in the HTML:
Network tab: If the captcha is invisible, the element will contain the attribute size="invisible".
(() => {
const iframeEl = document.querySelector('iframe[src^="https://www.google.com/recaptcha/api2/anchor?"]');
const captchaUrl = iframeEl?.getAttribute('src');
if (captchaUrl) {
const urlParams = new URLSearchParams(captchaUrl.split('?')[1]);
const sitekey = urlParams.get('k');
const size = urlParams.get('size');
const isInvisible = size === 'invisible';
const sitekeyEl = document.querySelector('[data-sitekey]');
const datasEl = document.querySelector('[data-s]');
const datas = datasEl?.getAttribute('data-s');
console.log({
sitekey: sitekey || sitekeyEl?.getAttribute('data-sitekey'),
datas,
isInvisible
});
}
})();
import { chromium } from "playwright";
(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
await page.goto("https://example.com");
await page.waitForSelector('iframe[src^="https://www.google.com/recaptcha/api2/anchor?"]');
const captchaData = await page.evaluate(() => {
const iframeEl = document.querySelector('iframe[src^="https://www.google.com/recaptcha/api2/anchor?"]');
const captchaUrl = iframeEl?.getAttribute("src");
if (captchaUrl) {
const urlParams = new URLSearchParams(captchaUrl.split("?")[1]);
const sitekey = urlParams.get("k");
const size = urlParams.get("size");
const isInvisible = size === "invisible";
const sitekeyEl = document.querySelector("[data-sitekey]");
const datasEl = document.querySelector("[data-s]");
const datas = datasEl?.getAttribute("data-s");
return {
sitekey: sitekey || sitekeyEl?.getAttribute("data-sitekey"),
datas,
isInvisible,
};
}
return null;
});
console.log(captchaData);
await browser.close();
})();
import asyncio
from urllib.parse import urlparse, parse_qs
from playwright.async_api import async_playwright
def parse_recaptcha_url(url):
parsed_url = urlparse(url)
params = parse_qs(parsed_url.query)
sitekey = params.get('k', [None])[0]
size = params.get('size', [None])[0]
return sitekey, size == 'invisible'
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto("https://example.com", timeout=60000)
captcha_url = await page.locator('iframe[src^="https://www.google.com/recaptcha/api2/anchor?"]').get_attribute('src')
if captcha_url:
sitekey, is_invisible = parse_recaptcha_url(captcha_url)
print({"sitekey": sitekey, "isInvisible": is_invisible})
await browser.close()
asyncio.run(main())