Sur les types pris en charge, CaptchaAI résout la plupart des CAPTCHA en quelques secondes : moins de 4 s pour reCAPTCHA v3, moins de 10 s pour Cloudflare Turnstile, sous la seconde pour l'image/OCR. Mais ces chiffres ne comptent vraiment que mesurés dans votre environnement. Cet article donne les temps observés par type — médiane, P90 et P99 — et les scripts Python et JavaScript pour les mesurer sur votre compte CaptchaAI.
Temps de résolution observés par type
Les chiffres ci-dessous reposent sur des mesures observées et des retours d'utilisateurs. Les résultats varient selon l'environnement, le volume et le moment de la journée.
La colonne « Plafond SLA » reprend le plafond contractuel annoncé par CaptchaAI ; la médiane et les percentiles sont observés en production avec des proxys réalistes.
| Type de CAPTCHA | Plafond SLA | Médiane | P90 | P99 | Taux de réussite |
|---|---|---|---|---|---|
| reCAPTCHA v2 | < 60 s | 12–18 s | 25 s | 40 s | Élevé |
| reCAPTCHA v2 Invisible | < 30 s | 10–15 s | 20 s | 28 s | Élevé |
| reCAPTCHA v3 | < 4 s | 1–3 s | 3 s | 4 s | Élevé |
| reCAPTCHA Enterprise | < 60 s | 15–25 s | 35 s | 50 s | Élevé |
| Cloudflare Turnstile | < 10 s | 4–8 s | 9 s | 10 s | Élevé |
| GeeTest v3 | < 12 s | 6–10 s | 11 s | 12 s | Élevé |
| Image/OCR | < 0,5 s | 0,2–0,4 s | 0,5 s | 0,8 s | Élevé |
| BLS CAPTCHA | < 1 s | 0,3–0,7 s | 0,9 s | 1 s | Élevé |
Le plafond SLA est une limite contractuelle, pas une moyenne : si une résolution le dépasse durablement, ouvrez un ticket de support.
Ce qui change vos temps de résolution
Quatre facteurs pèsent sur chaque mesure ; isolez-les avant de comparer deux exécutions :
- Latence réseau — votre distance aux endpoints de l'API s'ajoute au total. Depuis un worker en Europe (OVHcloud à Roubaix, Scaleway à Paris, région AWS eu-west-3), comptez environ 1 s de plus pour un RTT de 200 ms. Mesurez depuis l'infrastructure qui exécutera les résolutions, pas votre poste local.
- Qualité du proxy — les proxys résidentiels donnent des résolutions plus rapides que les proxys datacenter, car ils déclenchent moins de défis secondaires ; un proxy lent ou distant ajoute plusieurs secondes.
- Complexité du CAPTCHA — un défi d'images reCAPTCHA v2 « feux de circulation » avec images qui s'estompent prend bien plus de temps qu'une case à cocher : la médiane lisse cette variabilité, le P90 la rend visible.
- Stratégie de polling — interroger toutes les 2 s détecte le résultat plus tôt mais multiplie les appels d'API ; toutes les 10 s allège la charge mais rallonge la latence perçue. Le bon rythme dépend du type (voir le tableau).
Lire la médiane, le P90 et le P99
Trois valeurs suffisent à dimensionner une intégration :
- Médiane — l'expérience typique. Utilisez-la pour le dimensionnement des capacités.
- P90 — le pire cas pour 9 résolutions sur 10. La bonne base pour vos timeouts standards.
- P99 — le vrai cas extrême. Placez votre timeout maximal au-dessus, sinon vous couperez des résolutions qui allaient aboutir.
Mesurez vos propres temps en Python
Ce script soumet une tâche, interroge le résultat, puis calcule médiane, P90, min et max. Renseignez votre clé via la variable d'environnement CAPTCHAAI_KEY.
# benchmark_captchaai.py
import os
import time
import statistics
import requests
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
def benchmark_solve(method, params, runs=10):
"""Benchmark a CAPTCHA type over multiple runs."""
times = []
successes = 0
for i in range(runs):
start = time.time()
# Submit
submit_params = {"key": API_KEY, "json": "1", **params}
resp = requests.get("https://ocr.captchaai.com/in.php",
params=submit_params)
result = resp.json()
if result.get("status") != 1:
print(f" Run {i+1}: Submit failed - {result.get('request')}")
continue
task_id = result["request"]
# Poll
time.sleep(10)
solved = False
for _ in range(30):
poll = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": task_id, "json": "1",
})
poll_result = poll.json()
if poll_result.get("status") == 1:
elapsed = time.time() - start
times.append(elapsed)
successes += 1
solved = True
print(f" Run {i+1}: {elapsed:.1f}s")
break
if poll_result.get("request") != "CAPCHA_NOT_READY":
print(f" Run {i+1}: Error - {poll_result.get('request')}")
break
time.sleep(5)
if not solved and poll_result.get("request") == "CAPCHA_NOT_READY":
print(f" Run {i+1}: Timeout")
if times:
return {
"runs": runs,
"successes": successes,
"success_rate": f"{successes/runs*100:.0f}%",
"median": f"{statistics.median(times):.1f}s",
"p90": f"{sorted(times)[int(len(times)*0.9)]:.1f}s" if len(times) >= 10 else "N/A",
"min": f"{min(times):.1f}s",
"max": f"{max(times):.1f}s",
}
return {"error": "No successful solves"}
# Benchmark reCAPTCHA v2
print("=== reCAPTCHA v2 ===")
recaptcha_v2 = benchmark_solve("userrecaptcha", {
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"pageurl": "https://www.google.com/recaptcha/api2/demo",
})
print(recaptcha_v2)
# Benchmark Image/OCR
print("\n=== Image CAPTCHA ===")
# Submit a base64-encoded test image
import base64
# Use a test image for benchmarking
image_result = benchmark_solve("post", {
"method": "base64",
"body": "BASE64_ENCODED_CAPTCHA_IMAGE",
})
print(image_result)
Le même benchmark en JavaScript (Node.js)
La logique est identique côté Node.js, avec axios pour les appels.
// benchmark_captchaai.js
const axios = require('axios');
const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
async function benchmarkSolve(params, runs = 10) {
const times = [];
let successes = 0;
for (let i = 0; i < runs; i++) {
const start = Date.now();
// Submit
const submit = await axios.get('https://ocr.captchaai.com/in.php', {
params: { key: API_KEY, json: '1', ...params },
});
if (submit.data.status !== 1) {
console.log(` Run ${i + 1}: Submit failed - ${submit.data.request}`);
continue;
}
// Poll
await new Promise(r => setTimeout(r, 10000));
let solved = false;
for (let j = 0; j < 30; j++) {
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
});
if (poll.data.status === 1) {
const elapsed = (Date.now() - start) / 1000;
times.push(elapsed);
successes++;
solved = true;
console.log(` Run ${i + 1}: ${elapsed.toFixed(1)}s`);
break;
}
if (poll.data.request !== 'CAPCHA_NOT_READY') {
console.log(` Run ${i + 1}: Error - ${poll.data.request}`);
break;
}
await new Promise(r => setTimeout(r, 5000));
}
if (!solved) console.log(` Run ${i + 1}: Timeout`);
}
if (times.length === 0) return { error: 'No successful solves' };
times.sort((a, b) => a - b);
return {
runs, successes,
successRate: `${((successes / runs) * 100).toFixed(0)}%`,
median: `${times[Math.floor(times.length / 2)].toFixed(1)}s`,
min: `${times[0].toFixed(1)}s`,
max: `${times[times.length - 1].toFixed(1)}s`,
};
}
(async () => {
console.log('=== reCAPTCHA v2 ===');
const v2 = await benchmarkSolve({
method: 'userrecaptcha',
googlekey: '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
pageurl: 'https://www.google.com/recaptcha/api2/demo',
});
console.log(v2);
console.log('\n=== Cloudflare Turnstile ===');
const turnstile = await benchmarkSolve({
method: 'turnstile',
sitekey: 'YOUR_TURNSTILE_SITEKEY',
pageurl: 'https://example.com',
});
console.log(turnstile);
})();
Réglez vos intervalles de polling par type
| Type de CAPTCHA | Attente initiale | Intervalle de polling | Tentatives max |
|---|---|---|---|
| Image/OCR | 5 s | 3 s | 15 |
| Cloudflare Turnstile | 5 s | 3 s | 15 |
| BLS CAPTCHA | 5 s | 3 s | 15 |
| reCAPTCHA v2 | 15 s | 5 s | 20 |
| reCAPTCHA v3 | 10 s | 5 s | 20 |
| GeeTest v3 | 12 s | 5 s | 20 |
| reCAPTCHA Enterprise | 15 s | 5 s | 25 |
Dépannage
| Problème | Cause | Correctif |
|---|---|---|
| Temps de résolution plus longs que le tableau | Latence réseau ou proxy lent | Testez depuis une région plus proche des serveurs CaptchaAI |
| Résultats incohérents d'une exécution à l'autre | Variation de difficulté du CAPTCHA | Augmentez l'échantillon à plus de 50 résolutions |
| Beaucoup de timeouts | sitekey ou URL de page invalide |
Vérifiez les paramètres avec un seul test manuel |
ERROR_ZERO_BALANCE pendant le benchmark |
Solde insuffisant pour toutes les exécutions | Rechargez avant de lancer de gros benchmarks |
FAQ
Combien de résolutions faut-il mesurer pour un benchmark représentatif ?
Au moins 50 par type. En dessous, la variation de difficulté fausse la médiane et rend le P90 instable. Répétez la mesure à différents moments : les heures ouvrables aux États-Unis allongent légèrement les temps.
Quelles valeurs utiliser pour régler mes timeouts en production ?
Prenez le P90 pour vos timeouts standards et le P99 pour le timeout maximal, puis ajoutez une marge d'environ 20 % pour la variabilité réseau. Ne dérivez pas un timeout unique de la médiane : vous couperiez trop de résolutions lentes mais valides.
Un benchmark entame-t-il mon solde CaptchaAI ?
La facturation est basée sur les threads, avec des résolutions illimitées par thread : un benchmark occupe vos threads le temps des résolutions, sans frais par résolution. Prévoyez un solde actif, sinon vous verrez ERROR_ZERO_BALANCE.
reCAPTCHA v3 est-il réellement plus rapide que reCAPTCHA v2 ?
Oui, nettement. reCAPTCHA v3 se résout en général en 1 à 3 s (plafond < 4 s), là où reCAPTCHA v2 demande 12 à 18 s en médiane à cause des défis d'images. Réglez donc vos timeouts par type, pas une valeur unique pour tout le trafic.
Articles connexes
- Résoudre plusieurs types de CAPTCHA dans un même workflow
- La matrice des types de CAPTCHA pris en charge
- Optimiser la vitesse et le coût de résolution
- Optimiser la latence de l'API
- La résolution parallèle des CAPTCHA
Pour commencer
Lancez les scripts ci-dessus sur votre propre compte et vos cibles CAPTCHA : récupérez votre clé API CaptchaAI.