Une application Retool ne sait pas cocher une case « Je ne suis pas un robot » : elle parle en requêtes HTTP, pas en clics. Le montage tient en trois objets Retool — une ressource API REST pointée sur CaptchaAI, deux requêtes vers /in.php et /res.php, et une requête JavaScript qui interroge le résultat — au bout desquels votre outil interne récupère un token g-recaptcha-response prêt à être posté.
Aucun composant sur mesure : uniquement des requêtes natives et le Secrets Store, sur Retool Cloud comme en auto-hébergé.
Ce qu'il faut avoir sous la main
| Élément | Détail |
|---|---|
| Compte CaptchaAI | La clé API, dans le tableau de bord |
| Droits Retool | Édition des applications et Secrets Store |
| Cible reCAPTCHA v2 | Le sitekey de la page et son URL exacte |
| Périmètre | Vos propres démarches et environnements |
Le scénario type : un back-office qui dépose un dossier
Une équipe administrative dépose depuis Retool des dossiers sur un portail public protégé par reCAPTCHA v2, jusqu'ici résolu à la main. L'application prend le relais :
- Elle reçoit le sitekey et l'URL de la page en entrée
- Elle envoie la tâche à CaptchaAI
- Elle interroge régulièrement le résultat
- Elle affiche le token résolu, réutilisé dans la soumission du formulaire
Côté RGPD, la séparation est simple à documenter : seuls le sitekey et l'URL publique transitent vers CaptchaAI, jamais les données personnelles du dossier.
Quel plan pour un outil interne
La facturation se fait au thread simultané : chaque plan inclut des résolutions illimitées par thread, et c'est le pic de résolutions en parallèle qui dimensionne l'abonnement, pas le volume mensuel. Un back-office de deux ou trois opérateurs tient dans BASIC ($15/mois, 5 threads) ; une application partagée entre agences se traite en STANDARD ($30/mois, 15 threads). Facturation en dollars US.
Étape 1 : déclarer CaptchaAI comme ressource API REST
Dans Retool, ouvrez Resources → Create New → REST API, puis enregistrez : toutes les requêtes suivantes s'y rattacheront.
| Champ | Valeur |
|---|---|
| Nom | CaptchaAI |
| URL de base | https://ocr.captchaai.com |
| Authentification | Aucune (la clé API passe en paramètre de requête) |
Étape 2 : la requête submitCaptcha qui envoie la tâche
Sur la ressource CaptchaAI, créez une requête GET submitCaptcha pointée sur /in.php, puis renseignez ses paramètres :
| Clé | Valeur |
|---|---|
key |
{{secretsStore.CAPTCHAAI_API_KEY}} |
method |
userrecaptcha |
googlekey |
{{sitekeyInput.value}} |
pageurl |
{{pageurlInput.value}} |
json |
1 |
Placez la clé API dans le Secrets Store de Retool (Settings → Secrets) plutôt qu'en dur : les créateurs d'applications voient la référence, pas la valeur. Un transformateur facultatif normalise ensuite la réponse :
// Parse the response
const data = {{ submitCaptcha.data }};
if (data.status === 1) {
return { taskId: data.request, status: 'submitted' };
}
return { error: data.request, status: 'failed' };
Étape 3 : la requête pollResult qui interroge le résultat
Sur la même ressource, pollResult est aussi une requête GET, cette fois sur /res.php :
| Clé | Valeur |
|---|---|
key |
{{secretsStore.CAPTCHAAI_API_KEY}} |
action |
get |
id |
{{submitCaptcha.data.request}} |
json |
1 |
CAPCHA_NOT_READY n'est pas une erreur : le transformateur le distingue d'un vrai échec et laisse la boucle continuer.
const data = {{ pollResult.data }};
if (data.status === 1) {
return { token: data.request, status: 'solved' };
}
if (data.request === 'CAPCHA_NOT_READY') {
return { status: 'pending' };
}
return { error: data.request, status: 'error' };
Étape 4 : la boucle de polling en JavaScript
Une requête JavaScript nommée solveCaptcha orchestre l'ensemble. Le premier appel est différé de 15 secondes : un reCAPTCHA v2 se résout en moins de 60 secondes.
// solveCaptcha — JavaScript Query
async function solve() {
// Submit the CAPTCHA task
await submitCaptcha.trigger();
const submitResult = submitCaptcha.data;
if (submitResult.status !== 1) {
return { error: submitResult.request, status: 'submit_failed' };
}
const taskId = submitResult.request;
// Wait 15 seconds before first poll
await new Promise(r => setTimeout(r, 15000));
// Poll up to 20 times (100 seconds max)
for (let i = 0; i < 20; i++) {
await pollResult.trigger({
additionalScope: { taskId: taskId }
});
const result = pollResult.data;
if (result.status === 1) {
return { token: result.request, status: 'solved' };
}
if (result.request !== 'CAPCHA_NOT_READY') {
return { error: result.request, status: 'error' };
}
// Wait 5 seconds before next poll
await new Promise(r => setTimeout(r, 5000));
}
return { error: 'Polling timeout', status: 'timeout' };
}
return solve();
Le budget tient sous la limite de 120 secondes de Retool sur les requêtes JavaScript :
- 15 s d'attente avant la première interrogation
- 20 itérations espacées de 5 s
- 115 s au pire, avant l'abandon contrôlé
Étape 5 : l'interface, en trois zones
| Zone | Composants | Rôle |
|---|---|---|
| Saisie | Text Input sitekeyInput, Text Input pageurlInput, Button solveButton (onClick → solveCaptcha.trigger()) |
Recevoir les entrées et lancer la résolution |
| Statut | Text {{ solveCaptcha.isFetching ? "Solving..." : "" }} et Loading Indicator visible quand {{ solveCaptcha.isFetching }} |
Montrer la progression |
| Résultat | Text Area tokenOutput en lecture seule sur {{ solveCaptcha.data?.token || '' }}, bouton de copie, badge lié à {{ solveCaptcha.data?.status }} |
Exposer le token et son statut |
Étape 6 : injecter le token dans la requête aval
Une dernière requête submitForm poste le dossier vers votre API cible : un POST dont le corps reprend les champs du formulaire et ajoute g-recaptcha-response: {{solveCaptcha.data.token}}.
Reliez-la à un bouton « Soumettre le formulaire » activé uniquement lorsque {{ solveCaptcha.data?.status === 'solved' }}. La durée de vie du token est courte : enchaînez la soumission.
Dépannage
Configuration et authentification
| Problème | Cause | Correctif |
|---|---|---|
ERROR_WRONG_USER_KEY |
Clé absente du Secrets Store ou valeur erronée | Vérifiez la clé dans Settings → Secrets |
| La requête renvoie du texte brut au lieu de JSON | Paramètre json=1 oublié |
Ajoutez json: 1 aux paramètres de requête |
submitCaptcha.data non défini |
La requête d'envoi n'a pas encore été exécutée | Déclenchez submitCaptcha avant pollResult |
Timing et durée de vie du token
| Problème | Cause | Correctif |
|---|---|---|
| Timeout du polling | Le type de CAPTCHA demande plus de temps | Passez de 20 à 30 itérations |
| La requête JavaScript expire | Limite de 120 secondes de Retool sur les requêtes JS | Restez à 20 itérations espacées de 5 s |
| Le formulaire cible refuse le token | Token expiré avant l'envoi | Enchaînez solveCaptcha puis submitForm |
FAQ
Quel plan CaptchaAI faut-il pour un outil Retool utilisé par une dizaine de personnes ?
Comptez en résolutions simultanées : dix utilisateurs dispersés dans la journée dépassent rarement 5 threads. BASIC ($15/mois, 5 threads) suffit, STANDARD ($30/mois, 15 threads) absorbe les pics.
CaptchaAI prend-il en charge hCaptcha ou FunCaptcha depuis Retool ?
Non — ces deux types ne sont pas pris en charge. L'API couvre reCAPTCHA v2 et v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3, les CAPTCHA image et OCR et les grilles d'images ; GeeTest v4 est à venir. CaptchaFox (bêta), Friendly Captcha (bêta) et Lemin (bêta) restent en phase bêta.
Comment tenir la limite de 120 secondes des requêtes JavaScript Retool ?
15 s d'attente puis 20 itérations de 5 s laissent une marge confortable. Au-delà, découpez le cycle avec un timer plutôt que d'allonger la boucle.
Comment empêcher les créateurs d'applications de lire la clé API ?
Stockez-la dans le Secrets Store et référencez-la via {{secretsStore.CAPTCHAAI_API_KEY}} : la requête n'expose que le nom du secret. Prévoyez une rotation à chaque révocation d'accès Retool.
Le token résolu peut-il être réutilisé plus tard ?
Non. Un token reCAPTCHA v2 est à usage unique et de courte validité. Déclenchez la résolution au moment de la soumission plutôt qu'en amont.
Articles connexes
- Résoudre le callback reCAPTCHA v2 via l'API
- Gérer reCAPTCHA v2 et Turnstile sur un même site
- Comprendre le mécanisme de callback reCAPTCHA v2
- Zapier + CaptchaAI : résoudre un CAPTCHA sans écrire de code
- Make (Integromat) + CaptchaAI : automatiser la résolution
- Extraire les paramètres reCAPTCHA depuis le code source
Prochaines étapes
Ouvrez votre compte CaptchaAI, récupérez votre clé API et déclarez la ressource API REST : votre première application Retool rendra un token le jour même.