Réponse courte : peu importe. L'API CaptchaAI accepte aussi bien les requêtes codées par formulaire que les requêtes JSON, et les deux renvoient un résultat strictement identique. Le format n'a aucun effet sur la vitesse de résolution ni sur le taux de réussite — le serveur traite les deux corps de la même manière.
Ce qui vous fait pencher d'un côté ou de l'autre, c'est votre pile technique : le langage, la bibliothèque HTTP et les conventions de votre code d'intégration.
Ce guide pose d'abord les différences concrètes, une grille de décision et les pièges à éviter, puis donne le code Python et Node.js pour chaque format.
Différences clés entre JSON et formulaire
| Facteur | Codage par formulaire | JSON |
|---|---|---|
| Content-Type | application/x-www-form-urlencoded |
application/json |
| Structure des données | Paires clé-valeur plates | Objets imbriqués possibles |
| Données binaires | Multipart pour l'envoi de fichier | Encodage Base64 dans un champ du corps |
| Prise en charge des tableaux | Limitée | Native |
| Mot-clé Python | data={} |
json={} |
| Node.js | URLSearchParams |
JSON.stringify() |
| Lisibilité | Simple pour des paramètres plats | Meilleure pour des données complexes |
| Compatibilité | Fonctionne partout | Fonctionne partout |
Pour les paramètres de résolution habituels — clé, méthode, sitekey, URL de la page — la structure reste plate des deux côtés, et l'écart pratique est mince.
Il ne se creuse vraiment que sur les charges imbriquées ou binaires, traitées plus bas.
Quel format choisir selon votre cas
| Scénario | Format recommandé | Pourquoi |
|---|---|---|
| Scripts simples | Codage par formulaire | Plus simple, moins de dépendances |
| Intégration dans une API REST | JSON | Correspond aux conventions d'API habituelles |
| Envoi de fichiers | Formulaire multipart | Envoi binaire direct |
| Grandes images base64 | Codage par formulaire | Meilleure gestion des payloads volumineux |
| TypeScript / JS moderne | JSON | Prise en charge native des objets |
| Intégration d'un système existant | Codage par formulaire | Compatibilité universelle |
| Migration depuis 2Captcha | Codage par formulaire | Même format que 2Captcha |
Un exemple concret
Prenons une équipe qui exploite un service de scraping en Node.js déployé sur Scaleway ou OVHcloud, avec une API REST déjà en JSON de bout en bout. Rester en JSON évite une conversion inutile et garde le code homogène : les corps de requête ressemblent au reste de la couche HTTP. À l'inverse, une équipe qui migre un ancien pipeline depuis 2Captcha a tout intérêt à conserver le codage par formulaire — l'API compatible 2Captcha attend ce format, et vous ne touchez pas au code d'envoi existant. Dans les deux cas, la seule vraie contrainte reste RGPD côté données collectées, pas côté format de requête.
Erreurs fréquentes à éviter
| Erreur | Problème | Correctif |
|---|---|---|
Utiliser json={} sans json: 1 dans le corps |
La réponse revient en texte brut | Ajoutez "json": 1 aux données |
Mélanger data= et json= dans une même requête Python |
Requête mal formée | Utilisez l'un ou l'autre, jamais les deux |
| Oublier l'en-tête Content-Type | Le serveur ne sait pas analyser le corps | Laissez votre bibliothèque HTTP le définir |
| Envoyer un corps JSON à l'endpoint d'interrogation | L'interrogation passe par des paramètres GET | Utilisez toujours GET avec paramètres pour /res.php |
Les deux formats en un coup d'œil
Requête codée par formulaire (par défaut)
import requests
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
"json": 1,
})
Content-Type : application/x-www-form-urlencoded
Requête JSON
import requests
resp = requests.post("https://ocr.captchaai.com/in.php", json={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
"json": 1,
})
Content-Type : application/json
En Python, tout tient dans un seul mot-clé : data= envoie un corps codé par formulaire, json= envoie un corps JSON et pose l'en-tête Content-Type à votre place. Le reste des paramètres ne bouge pas.
Format de réponse : forcer du JSON avec json=1
Ajoutez json=1 pour recevoir une réponse JSON, quel que soit le format de la requête. Sans ce paramètre, l'API répond en texte brut au format historique OK|ID, qu'il faut découper à la main :
# Without json=1 — plain text response
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
})
# Response: "OK|12345678"
# With json=1 — JSON response
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
"json": 1,
})
# Response: {"status": 1, "request": "12345678"}
Gardez toujours json=1 : une réponse structurée s'analyse sans découpage de chaîne et se prête mieux à la gestion d'erreurs. Le format de la requête et celui de la réponse sont deux réglages distincts — vous pouvez envoyer un corps codé par formulaire et recevoir du JSON.
Exemples Python
Codage par formulaire
import requests
# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
"json": 1,
})
task_id = resp.json()["request"]
# Poll (always GET with query params)
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1,
})
Corps JSON
import requests
# Submit with JSON
resp = requests.post("https://ocr.captchaai.com/in.php", json={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
"json": 1,
})
task_id = resp.json()["request"]
# Poll (same as form-encoded — GET with params)
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1,
})
Un point à retenir : seule l'étape d'envoi change de format. L'interrogation du résultat sur /res.php reste un GET avec paramètres de requête dans les deux cas — c'est la seule façon d'interroger le résultat, quel que soit le format d'envoi choisi.
Exemples Node.js
Codage par formulaire
const axios = require('axios');
const qs = require('querystring');
// Submit
const resp = await axios.post(
'https://ocr.captchaai.com/in.php',
qs.stringify({
key: 'YOUR_API_KEY',
method: 'userrecaptcha',
googlekey: 'SITE_KEY',
pageurl: 'https://example.com',
json: 1,
})
);
const taskId = resp.data.request;
Corps JSON
const axios = require('axios');
// Submit with JSON
const resp = await axios.post(
'https://ocr.captchaai.com/in.php',
{
key: 'YOUR_API_KEY',
method: 'userrecaptcha',
googlekey: 'SITE_KEY',
pageurl: 'https://example.com',
json: 1,
}
);
const taskId = resp.data.request;
Avec Axios, un objet passé tel quel est sérialisé en JSON et l'en-tête est posé automatiquement. Pour le codage par formulaire, il faut passer par querystring (ou URLSearchParams) afin d'aplatir l'objet — d'où la dépendance supplémentaire.
CAPTCHA image : formulaire ou JSON
Pour les CAPTCHA image, le format pèse davantage, car il faut transporter des octets. Trois approches sont possibles.
Formulaire avec envoi de fichier (multipart)
# File upload — form-encoded with multipart
resp = requests.post("https://ocr.captchaai.com/in.php",
data={
"key": "YOUR_API_KEY",
"method": "post",
"json": 1,
},
files={
"file": open("captcha.png", "rb"),
},
)
JSON avec Base64
import base64
# Base64 in JSON body
with open("captcha.png", "rb") as f:
body = base64.b64encode(f.read()).decode()
resp = requests.post("https://ocr.captchaai.com/in.php", json={
"key": "YOUR_API_KEY",
"method": "base64",
"body": body,
"json": 1,
})
Formulaire avec Base64
# Base64 in form data
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "base64",
"body": body,
"json": 1,
})
Le multipart évite de gonfler la charge : il envoie le fichier tel quel.
Le Base64 alourdit le payload d'environ un tiers, mais reste pratique quand l'image est déjà en mémoire ou vient d'une autre étape du pipeline. Sur de grandes images, le codage par formulaire encaisse mieux ces payloads volumineux.
FAQ
Le format change-t-il la vitesse ou la précision de la résolution ?
Non. Les deux formats produisent des résultats identiques et le serveur les traite de la même façon. Choisissez selon votre langage et vos bibliothèques, pas selon la performance attendue.
Faut-il quand même envoyer json=1 quand j'utilise un corps JSON ?
Oui. Le format d'envoi et le format de réponse sont indépendants : json={} code la requête en JSON, mais c'est json: 1 dans le corps qui demande une réponse JSON. Sans ce paramètre, vous recevez le texte brut OK|ID.
Comment envoyer une image CAPTCHA en JSON ?
Encodez le fichier en Base64 et passez-le dans le champ body avec "method": "base64". Pour de très grandes images, le codage par formulaire ou l'envoi multipart reste plus économe en bande passante.
Puis-je interroger le résultat en JSON aussi ?
L'interrogation sur /res.php est toujours un GET avec paramètres de requête, quel que soit le format d'envoi. Ajoutez json=1 à ces paramètres pour recevoir la réponse au format JSON.
Quel format utiliser si je migre depuis 2Captcha ?
Restez sur le codage par formulaire. L'API 2Captcha d'origine l'utilise, et CaptchaAI ajoute le JSON par-dessus : conserver le formulaire vous évite de retoucher votre code d'envoi existant.
Guides connexes
Prêt à envoyer votre première requête ? Créez votre compte CaptchaAI et testez les deux formats en quelques minutes.