Skip to content
voidcaptcha

Task type

reCAPTCHA v3 solver API

reCAPTCHA v3 never shows a challenge - it scores the session in the background and hands the page a token. The score depends on the action name and the reputation of the requesting IP, so the proxy you pass matters as much as the site key. Pass the same action string the page uses or the token will be rejected at verification. ReCaptchaV3Fast trades a little score headroom for the leanest mint. ReCaptchaV3Max is the other end of that trade: it rotates a coherent signature per mint and returns a high-score token, typically between 0.7 and 0.9, for the checks that gate on a threshold rather than merely on a pass. ReCaptchaV3EnterpriseMax is the same thing against an Enterprise site key. Pricing has three tiers: ReCaptchaV3 and ReCaptchaV3Fast are $0.80 per 1,000; ReCaptchaV3Enterprise and ReCaptchaV3FastEnterprise, for Enterprise site keys, are $1.50; ReCaptchaV3Max and ReCaptchaV3EnterpriseMax are $2.00, because the per-mint signature rotation that earns the higher score is the expensive part of the solver.

Site loads recaptcha/enterprise.js? Use an Enterprise variant: reCAPTCHA Enterprise.

Tip

Send task.type as ReCaptchaV3 and the solution arrives in solution.token.

Before you integrate

  1. Prefer a page URL that is served by a plain GET over one behind a POST or an XHR endpoint. The score is built from what the session looks like while the token is minted, and a normal document load is the shape Google scores best - the same site key fetched through a POST route routinely scores lower for no other reason. If the widget appears on a form that is submitted by POST, pass the URL of the page the form lives on, not the URL the form posts to.

A site that will not solve is worth telling us about — coverage is per target as much as per type. The quickest route is Telegram (@VoidCaptchaSupport), where someone usually answers within minutes. You can also open a ticket from your dashboard or email [email protected]. Send the URL and the site key either way.

task.type
ReCaptchaV3
Median
285ms
over 7,431,799 solves, 30d
Success
99.9%
Price / 1k
$0.80
$0.0008 each · ReCaptchaV3Enterprise $1.50, ReCaptchaV3FastEnterprise $1.50, ReCaptchaV3Max $2.00, ReCaptchaV3EnterpriseMax $2.00
Proxy
Required

Solve request#

Solving reCAPTCHA v3 is a single synchronous call. You post one task object and the response carries the finished solution — no task id to store, nothing to poll for.

POSThttps://api.voidcaptcha.com/v1/getResult

The connection is held open for the whole solve, which for this type runs a median of 285ms. Set a client timeout that covers it — the default socket timeout in most HTTP libraries is shorter than the work. If holding a connection that long does not suit your worker fleet, the same task goes to /v1/createTask and you collect it from /v1/checkTask instead.

When to use it#

  • Load-testing a checkout that scores every request
  • Monitoring conversion funnels that silently gate on a score threshold
  • Verifying your own score thresholds behave as configured

Task object structure#

These fields go inside task. The envelope around it — clientKey and the optional softId — is the same for every type and is described in the API reference.

PropertyTypeRequiredDescription
typestringRequiredLiteral "ReCaptchaV3". Also accepts: ReCaptchaV3Enterprise, ReCaptchaV3Fast, ReCaptchaV3FastEnterprise, ReCaptchaV3Max, ReCaptchaV3EnterpriseMax. Matching is case-insensitive.
urlstringRequiredThe page the challenge is served on.e.g. https://example.com/login
site_keystringRequiredThe site key from the reCAPTCHA script tag.e.g. 6LdyC2cUAAAAACGuDKpXeDorzUDWXmdqeg-xy696
actionstringOptionalThe action name the page passes to grecaptcha.execute. Must match exactly or verification fails.e.g. login
proxystringRequiredUpstream proxy. Accepts host:port, host:port:user:pass, or a full http:// URL. Use a sticky session — a rotating exit IP mid-solve looks like a hijacked session and will fail.e.g. proxy.example.com:9090:user:pass
user_agentstringOptionalPin the User-Agent used for the solve. Omit it and a coherent one is chosen for you and returned in the response — match whatever you send downstream.e.g. Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 …

Example payload#

The whole body, assembled from the table above — copy it formatted to read, or on one line to paste straight into a terminal or a REST client. The values are placeholders: swap the key for your own and the URL and site key for the page you are solving.

POSThttps://api.voidcaptcha.com/v1/getResult
{
  "clientKey": "void_a1b2c3d4e5f60718293a4b5c6d7e8f90",
  "task": {
    "type": "ReCaptchaV3",
    "url": "https://example.com/login",
    "site_key": "6LdyC2cUAAAAACGuDKpXeDorzUDWXmdqeg-xy696",
    "action": "login",
    "proxy": "proxy.example.com:9090:user:pass"
  }
}

Example request#

The smallest thing that gets a token back, in your language. Python and Node.js use the official client (pip install voidcaptcha, npm install voidcaptcha); every other language makes the HTTP call its standard library already has. The complete version, with the key read from the environment and the error envelope checked, is in Sample code at the bottom of this page.

Language choice is remembered across the whole site, so switching here carries to every other sample in the docs.

# pip install voidcaptcha
from voidcaptcha import VoidCaptcha

client = VoidCaptcha("void_a1b2c3d4e5f60718293a4b5c6d7e8f90")

result = client.recaptcha_v3(
    url="https://example.com/login",
    site_key="6LdyC2cUAAAAACGuDKpXeDorzUDWXmdqeg-xy696",
    action="login",
    proxy="proxy.example.com:9090:user:pass",
)

print(result.value)

Example response#

A successful solve returns errorId: 0 and a solution object. The result is in solution.token; alongside it is the userAgent the solve ran under.

solution carries those and nothing else — the gateway copies the result field, anything extra this type returns, and userAgent across, and drops the rest of whatever the solver sent. Timing arrives at the top level as elapsedMs, present only when the duration is known, beside cost and your remaining balance. The figures below are illustrative: nothing here is a published median.

JSON
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "token": "03AGdBq25V6…",
    "userAgent": "Mozilla/5.0 …"
  },
  "cost": "$0.0008",
  "balance": "$411.24",
  "elapsedMs": 4820
}

Send that userAgent on your downstream request as well — for the cookie-based types the result is bound to it and will be rejected under a different one.

Errors for this type#

The codes reCAPTCHA v3 can return, on top of the shared authentication and billing set. Branch on errorCode, not on the HTTP status.

CodeHTTPMeaningRetry
ERROR_KEY_MISSING401No clientKey was supplied.Do not retry
ERROR_KEY_INVALID401The key does not exist or has been revoked.Do not retry
ERROR_KEY_SUSPENDED403The account attached to this key is suspended.Do not retry
ERROR_TYPE_NOT_ENABLED403This account is not enabled for the requested task type.Do not retry
ERROR_SITEKEY_INVALID400The site key was malformed, or does not belong to that URL.Do not retry
ERROR_IP_BLOCKED200The target rejected the proxy IP outright.Retry
ERROR_SCORE_NOT_REACHED200A token was produced but the target scored it too low to accept.Retry
ERROR_INSUFFICIENT_BALANCE402Your balance will not cover this solve.Do not retry
ERROR_THREAD_LIMIT429You have more solves in flight than your key permits.Retry with backoff
ERROR_RATE_LIMITED429Too many requests in a short window.Retry with backoff

Every code, with the fix for each, is on the error reference. A failed solve is never charged.

Sample code#

A complete file: key from the environment, task built, error envelope checked, result used. It calls the endpoint directly rather than through an SDK, so it works as a starting point in any language.

import os
import sys

import requests

API = "https://api.voidcaptcha.com/v1/getResult"

payload = {
    "clientKey": os.environ["VOIDCAPTCHA_KEY"],
    "task": {
        "type": "ReCaptchaV3",
        "url": "https://example.com/login",
        "site_key": "6LdyC2cUAAAAACGuDKpXeDorzUDWXmdqeg-xy696",
        "action": "login",
        "proxy": "proxy.example.com:9090:user:pass"
    },
}

# The endpoint is synchronous: it holds the connection open for the whole
# solve, so the read timeout has to cover it, not just the handshake.
res = requests.post(API, json=payload, timeout=180).json()

if res["errorId"] != 0:
    sys.exit(f"{res['errorCode']}: {res['errorDescription']}")

solution = res["solution"]

# Carry the User-Agent downstream — the result was earned under it.
print(solution["token"])
print(solution["userAgent"])

Last updated on 2 August 2026