Un job d'ingestion nocturne qui rencontre un défi CAPTCHA ne s'arrête pas toujours : il indexe une page d'erreur, et votre base vectorielle répond ensuite à partir de documents vides. La parade tient en deux décisions : traiter la résolution du CAPTCHA comme une étape explicite du pipeline, puis n'indexer que les documents dont la récupération est confirmée.
Périmètre sûr : ce guide s'applique à vos propres applications, à vos environnements de QA ou de préproduction, et aux sources couvertes par une autorisation écrite.
Pourquoi un CAPTCHA corrompt un index sans prévenir
Une base vectorielle ne juge pas ce qu'elle reçoit : elle vectorise. Un HTML de challenge produit un embedding parfaitement valide, qui remonte dans les résultats et dégrade les réponses construites au-dessus. Le symptôme apparaît des jours plus tard, loin des logs du crawler. D'où la règle : sans signal de réussite explicite, un document ne franchit pas l'étape d'embedding.
Le déroulé d'un pipeline qui tient la charge
- Détectez le défi avant de vectoriser : statut HTTP, présence d'un sitekey, taille anormale du document.
- Ne collectez que les paramètres attendus : sitekey, URL de la page, action, proxy éventuel.
- Envoyez la tâche et journalisez la réponse complète si le statut retourné signale une erreur.
- Interrogez le résultat à intervalle régulier, avec un timeout dur : sans plafond, une tâche bloquée immobilise un worker toute la nuit.
- Appliquez le token dans la même session que celle qui a déclenché le défi, cookies compris : le décalage de session est la première cause de token refusé.
- Vectorisez après confirmation, puis marquez le document comme indexé.
Cas concret : veille réglementaire chez un éditeur lyonnais
Une équipe RAG indexe chaque nuit des portails sectoriels dont l'accès lui est contractuellement ouvert ; deux d'entre eux placent un Cloudflare Turnstile devant les résultats. Les workers tournent sur OVHcloud, l'index en région eu-west-3 (Paris), et le lot doit être clos avant 6 h. Le point de vigilance est réglementaire : ces pages citent parfois des personnes. La minimisation RGPD s'applique donc avant l'embedding.
Créer la tâche côté client
Extrait de votre propre suite de tests :
import fetch from 'node-fetch';
const API_KEY = process.env.CAPTCHAAI_KEY;
export async function createTurnstileTask(siteKey, pageUrl) {
const res = await fetch('https://api.captchaai.com/createTask', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientKey: API_KEY,
task: {
type: 'TurnstileTaskProxyless',
websiteURL: pageUrl,
websiteKey: siteKey,
},
}),
});
const data = await res.json();
return data.taskId;
}
Ce qu'il faut journaliser
Instrumentez chaque appel : temps de résolution, code retour HTTP, identifiant de tâche et profondeur de la file d'attente, corrélés à votre traçage distribué.
Suivez ensuite deux taux distincts : la réussite de la résolution, et la part de documents réellement indexés. L'écart entre ces deux courbes se creuse avant toute panne visible.
Dépannage : les erreurs qui reviennent la nuit
| Symptôme | Cause probable | Correctif |
|---|---|---|
ERROR_WRONG_USER_KEY |
Clé recopiée avec une espace parasite, ou clé d'un autre compte. | Reprenez la clé depuis le tableau de bord et stockez-la comme secret CI. |
ERROR_ZERO_BALANCE |
Solde passé sous le minimum par tâche en pleine fenêtre nocturne. | Créditez le compte et posez une alerte de solde avant le créneau d'ingestion. |
ERROR_PAGEURL / ERROR_BAD_PARAMETERS |
URL de page ou sitekey obsolètes après un changement de gabarit sur la source. | Revalidez les paramètres envoyés contre le HTML réellement servi au worker. |
ERROR_CAPTCHA_UNSOLVABLE |
Le défi n'a pas pu être résolu de façon fiable. | Retentez une fois, puis mettez le document en quarantaine au lieu de l'indexer. |
| Token refusé après résolution | Token appliqué dans une session autre que celle qui a déclenché le défi. | Gardez le même client HTTP et le même cookie jar jusqu'à la soumission. |
| Documents vides dans l'index | Aucun signal de réussite exigé avant l'étape d'embedding. | Assertez la taille du document et la présence du sélecteur attendu avant de vectoriser. |
Les deux dernières lignes sont les plus coûteuses : elles ne déclenchent aucune alerte et se découvrent au moment où un utilisateur reçoit une réponse fausse.
Dimensionner les threads
La facturation CaptchaAI se fait au thread simultané, résolutions illimitées par thread : le coût dépend du parallélisme, pas du volume ingéré. Le plan BASIC ($15/mois, 5 threads) suffit à quelques centaines de documents par nuit ; STANDARD ($30/mois, 15 threads) ou ADVANCE ($90/mois, 50 threads) conviennent aux créneaux courts.
Liste de contrôle
- Périmètre limité à vos applications ou à des sources autorisées par écrit.
- Clé API dans un secret CI, jamais dans le dépôt.
- Aucune page de challenge n'atteint l'étape d'embedding.
- Retry borné (backoff exponentiel, plafond à 30 s) et verrou par document.
- Chaque vecteur relié à sa source et à sa date de collecte.
FAQ
Que faire d'un document déjà indexé depuis une page de challenge ?
Supprimez le vecteur, puis relancez l'ingestion de l'URL. Un upsert ne suffit pas si le découpage en chunks a changé : des fragments orphelins resteraient indexés.
CaptchaAI prend-il en charge hCaptcha ?
Non — hCaptcha n'est pas pris en charge, pas plus que FunCaptcha (Arkose Labs) ; GeeTest v4 est annoncé comme à venir. Sont couverts reCAPTCHA v2 et v3, Cloudflare Turnstile et Challenge, GeeTest v3, l'image/OCR et les grilles, plus CaptchaFox (bêta), Friendly Captcha (bêta) et Lemin (bêta).
Comment concilier ingestion et obligations RGPD ?
Filtrez les données personnelles avant l'embedding, documentez la base légale de votre accès et fixez une durée de conservation aux vecteurs comme aux journaux : un vecteur encodant des informations personnelles reste une donnée personnelle.
Quel plan choisir pour quelques milliers de documents par nuit ?
Cela dépend de la part réellement protégée, rarement plus de quelques pour cent du lot. Mesurez ce ratio sur une semaine, multipliez-le par votre temps de résolution médian et comparez à votre fenêtre nocturne.
Guides connexes
- Démarrage rapide
- Tests en environnement autorisé
- Tester l'endpoint API
- Résolution CAPTCHA en CI
- reCAPTCHA v2 via l'API
Gardez votre index à jour même quand la source oppose un défi. – Obtenez votre clé CaptchaAI.