Un défi CAPTCHA au milieu d'un workflow n8n bloque tout ce qui suit : le formulaire n'est jamais envoyé et l'exécution se termine en erreur. La réponse tient en trois nœuds HTTP Request et une boucle d'attente, sans extension à installer ni code obligatoire.
Ce guide monte le workflow complet : envoi du défi à l'API CaptchaAI, interrogation du résultat, puis injection du token dans la requête finale.
Pourquoi n8n convient mieux que Zapier à ce workflow
Une résolution CAPTCHA n'est pas instantanée : vous envoyez, vous attendez, vous réinterrogez. Ce schéma réclame une boucle, ce qui manque à la plupart des outils no-code.
| Critère | n8n | Zapier |
|---|---|---|
| Boucles et nouvelles tentatives | Natif (boucle IF, Loop Over Items) | Limité (chemins conditionnels) |
| Auto-hébergement | Oui | Non (cloud uniquement) |
| Nœuds de code | JavaScript complet | Très limité |
| Coût | Gratuit en auto-hébergé, payant en cloud | Payant à la tâche |
| Prise en main | Modérée | Rapide |
L'auto-hébergement pèse aussi côté conformité : sur une instance OVHcloud ou Scaleway, URL cibles et logs d'exécution restent dans votre périmètre RGPD.
Ce qu'il faut préparer
- Une instance n8n cloud ou auto-hébergée (version 1.x pour le nœud Wait).
- Une clé API CaptchaAI. Facturation en dollars US, par thread simultané : BASIC ($15/mois, 5 threads) couvre quelques workflows en parallèle, STANDARD ($30/mois, 15 threads) une agence multi-clients.
- Le sitekey et l'URL exacte de la page ciblée, sur vos propres environnements.
- Types couverts : reCAPTCHA v2 et v3, Turnstile, GeeTest v3, CAPTCHA image/OCR.
Le schéma général du workflow
Manual Trigger / Cron
↓
HTTP Request: Submit CAPTCHA
↓
Wait: 10 seconds
↓
Loop: Poll until solved
├── HTTP Request: Get result
├── IF: status == 1? → Exit loop
└── Wait: 5 seconds → Loop again
↓
HTTP Request: Use token
Nœud 1 : envoyer le défi CAPTCHA
Ajoutez un nœud HTTP Request en POST sur https://ocr.captchaai.com/in.php, corps en Form URL Encoded.
Paramètres du corps :
| Nom | Valeur |
|---|---|
key |
{{ $credentials.captchaaiApiKey }} ou votre clé en dur |
method |
userrecaptcha |
googlekey |
6Le-SITEKEY |
pageurl |
https://example.com |
json |
1 |
La réponse porte l'identifiant de tâche :
{
"status": 1,
"request": "71823456"
}
Nœud 2 : temporiser avant la première interrogation
Ajoutez un nœud Wait, réglé sur 10 en Seconds.
Interroger l'API dès la seconde suivante ne sert à rien : la tâche n'est pas encore traitée et vous ne récoltez que CAPCHA_NOT_READY.
Nœud 3 : interroger le résultat jusqu'à la résolution
Deux voies : le nœud Loop Over Items, ou la sortie « false » d'un IF renvoyée vers un nœud précédent.
Option A : boucle IF, sans code
Ajoutez un nœud HTTP Request dédié à l'interrogation :
- Méthode
GETsurhttps://ocr.captchaai.com/res.php - Paramètres de requête :
key,action=get,id={{ $json.request }},json=1
Reliez-le à un nœud IF comparant {{ $json.status }} (Value 1) à 1 (Value 2) avec l'opération Equal :
- Sortie true → la suite du workflow, token en main.
- Sortie false → nœud Wait de 5 s, puis retour sur le nœud d'interrogation.
Option B : un seul nœud Code
Pour plafonner les tentatives et lever une erreur explicite :
const apiKey = 'YOUR_API_KEY';
const taskId = $input.first().json.request;
for (let i = 0; i < 24; i++) {
await new Promise(r => setTimeout(r, 5000));
const resp = await fetch(
`https://ocr.captchaai.com/res.php?key=${apiKey}&action=get&id=${taskId}&json=1`
);
const data = await resp.json();
if (data.status === 1) {
return [{ json: { token: data.request, taskId } }];
}
if (data.request !== 'CAPCHA_NOT_READY') {
throw new Error(`CaptchaAI error: ${data.request}`);
}
}
throw new Error(`Task ${taskId} timed out`);
Vingt-quatre itérations de 5 s placent le timeout à deux minutes.
Nœud 4 : injecter le token dans le formulaire
Un dernier nœud HTTP Request poste le formulaire sur https://target-site.com/submit, toujours en Form URL Encoded. Aux champs habituels, ajoutez g-recaptcha-response avec la valeur {{ $json.token }}.
Stocker la clé API sans la coder en dur
Passez par le système Credentials de n8n :
- Ouvrez Credentials → Add Credential → Header Auth.
- Nommez l'entrée
CaptchaAI API Key. - Enregistrez la clé, puis référencez le credential depuis les nœuds.
En auto-hébergé, la variable d'environnement suffit :
# In your n8n environment
export CAPTCHAAI_API_KEY="your_key_here"
Vous l'appelez avec {{ $env.CAPTCHAAI_API_KEY }}.
Variante : CAPTCHA image et OCR
Seul le nœud d'envoi change :
methoddevientbase64bodyreçoit l'image encodée en base64
Un nœud Code en amont convertit l'URL de l'image :
const imageUrl = $input.first().json.imageUrl;
const resp = await fetch(imageUrl);
const buffer = Buffer.from(await resp.arrayBuffer());
const base64 = buffer.toString('base64');
return [{ json: { imageBase64: base64 } }];
Surveiller le solde avec un workflow planifié
Un workflow séparé déclenché par un Cron évite l'arrêt silencieux de vos automatisations :
Cron (daily at 9 AM)
↓
HTTP Request: GET res.php?action=getbalance
↓
IF: balance < 5
↓
Slack / Email: "CaptchaAI balance low: $X.XX"
Cas d'usage : la recette nocturne d'une agence lyonnaise
Une agence héberge n8n chez OVHcloud et rejoue chaque nuit les formulaires d'inscription de ses clients. Un Cron démarre le workflow à 3 h, un nœud Split In Batches parcourt les environnements de préproduction, chacun suivant la séquence ci-dessus.
Deux réflexes d'exploitation :
- Les URL testées appartiennent aux clients, en préproduction : aucune donnée personnelle collectée, donc pas de zone grise RGPD.
- Le nombre d'environnements traités en parallèle reste aligné sur les threads du plan, jamais l'inverse.
Dépannage
| Problème | Cause | Correctif |
|---|---|---|
| La boucle d'interrogation tourne sans fin | Aucune limite d'itérations | Ajoutez un compteur, sortez après 24 passages |
CAPCHA_NOT_READY en continu |
Première interrogation trop précoce | Portez l'attente initiale à 15–20 s |
| Token absent du nœud suivant | Chemin d'expression erroné | Vérifiez que {{ $json.token }} correspond à la sortie |
| Credential introuvable | Variable d'environnement non chargée | Redémarrez n8n après l'avoir définie |
FAQ
Combien de threads pour plusieurs workflows en parallèle ?
Un thread correspond à une résolution en cours. BASIC ($15/mois, 5 threads) absorbe cinq exécutions simultanées ; au-delà, alignez le plan sur le nombre d'éléments traités par Split In Batches.
CaptchaAI prend-il en charge hCaptcha depuis n8n ?
Non, ni hCaptcha ni FunCaptcha. Restent disponibles reCAPTCHA v2 et v3, Cloudflare Turnstile, Cloudflare Challenge, GeeTest v3 et les CAPTCHA image/OCR ; CaptchaFox (bêta), Friendly Captcha (bêta) et Lemin (bêta) sont en évaluation, GeeTest v4 à venir.
Comment adapter le workflow à Cloudflare Turnstile ?
Remplacez method par turnstile et transmettez sitekey au lieu de googlekey. La boucle d'interrogation ne bouge pas.
n8n cloud ou auto-hébergé pour ce workflow ?
Les deux fonctionnent, avec les mêmes nœuds. L'auto-hébergement apporte les variables d'environnement et la maîtrise des logs.
Intégrez la résolution CAPTCHA dans vos workflows n8n
Obtenez votre clé API sur captchaai.com et branchez le premier nœud.