Quem decide o formato é o site, não o seu código: se a verificação vive dentro do formulário, a resolução termina em token — uma string de uso único enviada junto com os campos. Se ela bloqueia a página antes do conteúdo, termina em cookie — uma sessão validada que serve às requisições seguintes.
O formato define se um navegador entra no caminho crítico, quantas resoluções o fluxo consome por minuto e quantas threads ficam ocupadas — e explica a maioria dos 403 que aparecem após uma resolução bem-sucedida.
Como saber em qual formato você está
Abra a página com o DevTools e observe quando a verificação aparece:
- Dentro do formulário, ao lado do botão de envio → token: reCAPTCHA v2, reCAPTCHA v3 e Cloudflare Turnstile.
- Antes de qualquer conteúdo, em uma página intermediária que recarrega sozinha → cookie: páginas de desafio da Cloudflare, desafio JS e alguns WAFs.
- 403 mesmo com um token recém-resolvido → provavelmente os dois formatos convivem na mesma jornada.
Regra prática: o token acompanha um envio; o cookie acompanha uma sessão.
Token e cookie lado a lado
| Aspecto | Baseado em token | Baseado em cookies |
|---|---|---|
| Saída | String longa (500+ caracteres) | Cookie de navegador (cookie_qa_validacao) |
| Onde aparece | reCAPTCHA v2/v3, Turnstile | Páginas de desafio da Cloudflare, desafio JS, WAFs |
| Validade | 60 a 120 segundos | 30 minutos a 24 horas |
| Reutilizável | Não, uso único | Sim, enquanto a sessão durar |
| Navegador | Só para extrair a sitekey | Necessário para resolver |
| Vínculo de rede | Vale a partir de qualquer IP | Preso ao IP e ao User-Agent |
Segundo as páginas públicas da CaptchaAI, o Turnstile é resolvido em menos de 10 s, o reCAPTCHA v2 em menos de 60 s e imagem/OCR em menos de 0,5 s.
Fluxo por token: uma string nova a cada envio
São cinco passos, e nenhum exige navegador na hora do envio: extraia a sitekey (chave pública do widget), envie sitekey e URL para a API, receba o token, preencha o campo oculto e faça o POST.
| Desafio | Onde o token entra |
|---|---|
| reCAPTCHA v2 | textarea g-recaptcha-response |
| reCAPTCHA v3 | mesmo campo, com action e o score mínimo do site |
| Cloudflare Turnstile | campo cf-turnstile-response |
O hCaptcha usa h-captcha-response, mas a CaptchaAI não resolve hCaptcha nem FunCaptcha (Arkose Labs).
Resolver e enviar em Python
import requests
import time
API_KEY = "YOUR_API_KEY"
# 1. Solve
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAAAPBMR...",
"pageurl": "https://staging.example.com/qa-login",
"json": "1",
}).json()
task_id = resp["request"]
# 2. Poll
token = None
for _ in range(24):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": "1"
}).json()
if result["status"] == 1:
token = result["request"]
break
# 3. Submit form with token (no browser needed)
form_response = requests.post("https://staging.example.com/qa-login", data={
"email": "[email protected]",
"password": "password",
"g-recaptcha-response": token,
})
O que isso muda na operação
- Vida curta: a janela é de 60 a 120 segundos — resolva e use em seguida
- Uso único: cada token vale um envio; outro formulário exige outra resolução
- Sem navegador no envio: o POST sai de uma requisição HTTP comum, o que deixa o worker leve
Fluxo por cookie: uma sessão validada que se reaproveita
Aqui a lógica se inverte: você paga o custo uma vez, na entrada, e depois navega com requisições HTTP comuns.
- A página de desafio aparece antes do conteúdo
- Um navegador completo conclui a verificação
- O servidor grava um cookie de sessão (
cookie_qa_validacao) - As requisições seguintes que carregam esse cookie passam direto
Extrair o cookie do navegador com Selenium
from selenium import webdriver
import requests
import time
# 1. Solve the challenge in a browser
driver = webdriver.Chrome()
driver.get("https://example.com/protected")
# Wait for challenge to complete (manually or with CaptchaAI)
time.sleep(10) # Or use CaptchaAI envio controlado ao endpoint QA
# 2. Extract cookies from browser
cookies = driver.get_cookies()
cookie_qa_validacao = next(
(c for c in cookies if c["name"] == "cookie_qa_validacao"), None
)
user_agent = driver.execute_script("return navigator.userAgent")
driver.quit()
# 3. Use cookies for subsequent requests (no browser needed)
session = requests.Session()
session.headers.update({"User-Agent": user_agent})
for cookie in cookies:
session.cookies.set(cookie["name"], cookie["value"])
# All requests now pass the challenge
for page in range(1, 50):
resp = session.get(f"https://example.com/api/data?page={page}")
print(f"Page {page}: {resp.status_code}")
Limites que costumam pegar as equipes de surpresa
| Limite | Como conviver com ele |
|---|---|
| Navegador na resolução | O desafio precisa de um ambiente completo |
| Cookie preso ao IP | Use o mesmo egress autorizado do começo ao fim |
| Cookie preso ao User-Agent | Reenvie o cabeçalho capturado no navegador |
| Vida de 30 min a 24 h | Renove antes de expirar, não a cada requisição |
Fluxo híbrido: cookie na porta, token no formulário
Cenário comum em times brasileiros: o worker roda em São Paulo (sa-east-1), consulta o catálogo da própria empresa em staging e encontra os dois formatos — desafio na entrada (cookie) e formulário com reCAPTCHA (token).
# Step 1: Get past Cloudflare (cookie)
session = get_cookie_qa_validacao_session("https://example.com")
# Step 2: Load the form (using the cookie session)
html = session.get("https://example.com/submit").text
sitekey = extract_sitekey(html)
# Step 3: Solve reCAPTCHA (token)
token = solve_recaptcha(sitekey, "https://example.com/submit")
# Step 4: Submit form (cookie + token)
resp = session.post("https://example.com/submit", data={
"data": "value",
"g-recaptcha-response": token,
})
Mantenha o worker no mesmo egress autorizado do começo ao fim: trocar de região no meio do lote invalida o cookie. Se o fluxo tocar dados pessoais, considere as obrigações da LGPD (RGPD, em Portugal) antes de gravar payloads inteiros em log.
Custo: o que cada formato consome do plano
A CaptchaAI cobra por thread simultânea, não por resolução: cada plano inclui resoluções ilimitadas dentro das threads contratadas, de BASIC (US$ 15/mês, 5 threads) a ADVANCE (US$ 90/mês, 50 threads).
Um fluxo por token ocupa uma thread a cada envio, então a conta acompanha os envios por minuto. Um fluxo por cookie ocupa a thread uma vez e depois só dispara requisições comuns — o gargalo passa a ser o tempo de vida do cookie.
Perguntas frequentes
O token expira antes do envio. Como evitar?
Resolva o mais tarde possível no fluxo. Se o formulário tem várias etapas, deixe a chamada à API para a última: a janela útil é de 60 a 120 segundos e validações locais demoradas consomem metade dela.
Dá para reaproveitar o mesmo token em outro formulário?
Não. O token é de uso único: assim que o site o manda para verificação, ele queima. Reaproveitar produz o mesmo erro de um token expirado — resolva de novo a cada envio.
O cookie parou de valer quando troquei de servidor. Por quê?
Porque ele está preso ao IP e ao User-Agent que resolveram o desafio. Mantenha o mesmo cabeçalho User-Agent capturado do navegador e o mesmo egress de rede autorizado durante todo o lote.
E se o formulário usar hCaptcha ou FunCaptcha?
Nenhum dos dois é suportado hoje, e o GeeTest v4 segue apenas anunciado como em breve. A cobertura atual inclui reCAPTCHA v2/v3 e Enterprise, Turnstile e Challenge da Cloudflare, GeeTest v3, imagem/OCR, grade de imagens e BLS, além de CaptchaFox (beta), Friendly Captcha (beta) e Lemin (beta).
Rode os dois formatos na sua própria stack
Pegue sua chave de API em captchaai.com, rode um envio por token e um por cookie no seu ambiente de QA e compare os tempos.