TL;DR
Un agent IA peut créer un compte Bright Data et recevoir un jeton API fonctionnel sans qu’un humain remplisse un formulaire d’inscription. Le protocole se trouve à https://brightdata.com/auth.md et est annoncé dans les métadonnées de découverte sous un bloc agent_auth.
Trois appels :
POST /users/auth/agent_registration/authavec l’email de l’utilisateur. Renvoie unclaim_token. Pas encore d’identifiant.- L’utilisateur lit un code à 6 caractères dans sa boîte mail et le donne à l’agent.
POST /users/auth/agent_registration/claim/completeavec leclaim_tokenet le code. Renvoie le jeton API.
Le compte démarre avec 5 000 crédits gratuits par mois, un crédit d’essai de 2 $ valable 7 jours, et trois zones pré-créées : agent_serp, agent_unlocker, agent_browser_api. Le premier appel à l’une d’elles fonctionne sans aucune configuration.

Le problème
Chaque formulaire d’inscription suppose un humain. Choisir un plan, cliquer sur un lien de vérification, ouvrir un tableau de bord, trouver les paramètres, copier une clé, la coller quelque part.
Cela casse quand l’élément ayant besoin de la clé est un agent. Un agent de codage chargé de récupérer les prix de 40 détaillants peut écrire le scraper, gérer les nouvelles tentatives et analyser la sortie. Il ne peut pas cliquer sur un bouton dans un navigateur qu’il n’a pas.
Il s’arrête donc à l’étape zéro. Et cet arrêt est plus difficile qu’il n’y paraît, car l’obstacle n’est pas une question de capacité.
L’agent n’y est pas autorisé, même s’il en est capable
L’objection évidente est que l’automatisation du navigateur résout ce problème. Donnez à l’agent une extension Chrome ou une session Playwright et il peut remplir un formulaire d’inscription comme n’importe qui.
Il le peut. Il n’y est pas autorisé.
Les agents de navigateur d’Anthropic ont l’interdiction de créer des comptes au nom d’un utilisateur. Ce n’est pas une préférence souple ni une invite de permission. La création de compte figure sur la liste des actions interdites, aux côtés de la gestion des données bancaires et des suppressions permanentes, ce qui signifie qu’elle est refusée même lorsque l’utilisateur le demande explicitement et donne son autorisation. La consigne est de diriger l’utilisateur vers la création du compte lui-même.
Deux autres règles rendent un formulaire d’inscription pratiquement inutilisable, même sans celle-ci. Claude respecte la détection de bots et les systèmes de vérification humaine et ne les complète pas au nom d’un utilisateur. Et accepter des conditions, des termes ou des accords nécessite l’approbation explicite de l’utilisateur à chaque fois, selon la documentation de sécurité publiée d’Anthropic. Un formulaire d’inscription standard demande à un agent de faire les trois à la fois : créer un compte, résoudre un CAPTCHA et accepter des CGU.
C’est une limite raisonnable à poser. Un agent capable d’enregistrer silencieusement des comptes contre des adresses email arbitraires est un moteur d’abus. Cette restriction existe pour de bonnes raisons et ne sera pas assouplie.
La conséquence pour un fournisseur de données est précise. Un formulaire d’inscription n’est pas une voie lente pour un agent. C’est une voie fermée. Donner un navigateur à l’agent n’aide pas, car le navigateur n’a jamais été le blocage.
auth.md place le consentement là où la politique l’exige. Le flux ne demande jamais à l’agent de se faire passer pour un humain. L’agent effectue des appels HTTP. L’humain récupère un code à usage unique dans sa propre boîte mail et le transmet. Le compte ne peut pas être créé sans la participation active de l’utilisateur, donc l’utilisateur ne peut pas ignorer que cela s’est produit. L’agent est un client, pas un substitut.
C’est pourquoi l’étape OTP fait partie du protocole plutôt que d’être conçue pour disparaître. Ce n’est pas une friction résiduelle d’un flux d’inscription humain. C’est le mécanisme de consentement, et c’est ce qui fait que c’est quelque chose qu’un agent est autorisé à accomplir plutôt que simplement capable d’accomplir.
Comment un agent le trouve
Un agent qui n’a jamais vu Bright Data peut accéder au flux à partir de métadonnées standard.
GET https://brightdata.com/.well-known/oauth-authorization-server
La réponse contient un bloc agent_auth :
{
"agent_auth": {
"skill": "https://brightdata.com/auth.md",
"register_uri": "https://brightdata.com/users/auth/agent_registration/auth",
"claim_uri": "https://brightdata.com/users/auth/agent_registration/claim",
"identity_types_supported": ["identity_assertion"],
"identity_assertion": {
"assertion_types_supported": ["verified_email"],
"credential_types_supported": ["api_key"]
}
}
}
Ce bloc est le contrat. github_token et anonymous y apparaîtront si et quand ils seront déployés. N’utilisez que les méthodes listées dans les métadonnées, pas celles mémorisées d’une ancienne copie du document.
Il existe également des métadonnées de ressource protégée pour l’API :
GET https://api.brightdata.com/.well-known/oauth-protected-resource
{
"resource": "https://api.brightdata.com/",
"resource_name": "Bright Data API",
"authorization_servers": ["https://brightdata.com"],
"scopes_supported": ["serp", "unlocker", "wsapi", "scraper_studio",
"discover", "browser", "usage:read"],
"bearer_methods_supported": ["header"]
}
Les points de terminaison s’auto-documentent à l’exécution. GET https://brightdata.com/users/auth/agent_registration renvoie une copie markdown lisible par machine des contrats de points de terminaison et du tableau d’erreurs. Si cette réponse et auth.md divergent un jour, la réponse du point de terminaison fait foi. Elle peut être désactivée indépendamment, auquel cas elle renvoie instructions_disabled avec un 404 et l’agent se rabat sur auth.md.
Quatre voies d’accès
L’inscription programmatique est la voie entièrement automatisée. Ce n’est pas la seule.
| Voie | Ce que fait l’humain | À utiliser quand |
|---|---|---|
| Inscription par email | Lit un code dans sa boîte mail | L’agent a besoin de son propre identifiant et aucune session navigateur n’existe |
| Jeton API | Colle un jeton une fois | L’utilisateur a déjà un compte. Jeton depuis https://brightdata.com/cp/setting/users |
| MCP hébergé avec OAuth | Termine l’OAuth dans un navigateur | Un navigateur est disponible. Se connecter à https://mcp.brightdata.com/mcp |
| Connexion CLI | Clique via le flux navigateur ou appareil | Contexte terminal. npx @brightdata/cli login, ou brightdata login --github si le CLI GitHub est authentifié |
Le reste de ce guide couvre la première.
Étape 1 : Découverte
Lisez les métadonnées du serveur d’autorisation et confirmez quels types d’assertion sont actifs. Aujourd’hui, c’est verified_email uniquement.
curl https://brightdata.com/.well-known/oauth-authorization-server
Étape 2 : Inscription
Utilisez la véritable adresse email de l’utilisateur. Les domaines jetables et les adresses avec alias plus comme [email protected] sont rejetés.
curl -X POST https://brightdata.com/users/auth/agent_registration/auth \
-H "Content-Type: application/json" \
-d '{
"type": "identity_assertion",
"assertion_type": "verified_email",
"assertion": "[email protected]",
"client": "claude-code"
}'
client est facultatif mais recommandé. Déclarer le nom de l’agent, jusqu’à 100 caractères, donne au support et aux diagnostics quelque chose à exploiter.
La réponse ne contient aucun identifiant :
{
"claim_token": "<uuid-v4>",
"state": "pending",
"otp_expires_at": "<ISO 8601 timestamp>",
"claim_token_expires_at": "<ISO 8601, 24 hours from registration by default>"
}
claim_token est un UUID v4 et constitue l’identifiant propre de l’inscription. Il n’y a pas de registration_id séparé. Conservez-le en mémoire et transmettez-le tel quel à l’étape 3.
Avant d’envoyer toute identité utilisateur, montrez à l’utilisateur le nom du service, Bright Data, et ce que le compte pourra faire. Appeler ces points de terminaison affirme l’acceptation des Conditions d’utilisation et de la Politique d’utilisation acceptable de Bright Data au nom de l’adresse email fournie.
Étape 3 : Vérification
Bright Data envoie par email à l’utilisateur un code alphanumérique à 6 caractères, en casse mixte, valable 10 minutes par défaut. Demandez à l’utilisateur de le relire.
curl -X POST https://brightdata.com/users/auth/agent_registration/claim/complete \
-H "Content-Type: application/json" \
-d '{
"claim_token": "<uuid-v4>",
"otp": "aB3xY9"
}'
L’identifiant est délivré ici :
{
"claim_token": "<uuid-v4>",
"credential": { "token": "<api_token>", "id": "<token_id>" },
"zones": {
"serp": { "zone_id": "agent_serp", "status": "success" },
"unlocker": { "zone_id": "agent_unlocker", "status": "success" },
"browser_api": { "zone_id": "agent_browser_api", "status": "success" }
}
}
Pour renvoyer le code, postez le claim_token à /users/auth/agent_registration/claim. Cela invalide le code précédent, ne réinitialise pas le nombre de tentatives restantes, et est limité à 3 renvois par inscription avec un intervalle minimum de 60 secondes.
Le compte est maintenant actif sur le niveau gratuit plus le crédit d’essai de 2 $. Les inscriptions en attente jamais vérifiées expirent après 24 heures.
Étape 4 : Utiliser l’identifiant
Recherche web via la zone SERP :
curl -X POST https://api.brightdata.com/request \
-H "Authorization: Bearer <api_token>" \
-H "Content-Type: application/json" \
-d '{
"zone": "agent_serp",
"url": "https://www.google.com/search?q=web+scraping+tools",
"format": "json"
}'
Scraper une page protégée via Web Unlocker :
curl -X POST https://api.brightdata.com/request \
-H "Authorization: Bearer <api_token>" \
-H "Content-Type: application/json" \
-d '{
"zone": "agent_unlocker",
"url": "https://example.com",
"format": "raw"
}'
Pour l’API Navigateur, connectez Playwright, Puppeteer ou Selenium via CDP à la zone agent_browser_api. Cela consomme le crédit d’essai de 2 $. La configuration se trouve sur https://docs.brightdata.com/scraping-automation/scraping-browser/quickstart.
Pour l’ensemble complet des outils MCP, utilisez https://mcp.brightdata.com/mcp?token=<api_token>.
Les Web Scraper APIs ne sont pas basées sur des zones et ne sont pas auto-provisionnées par l’inscription. Elles fonctionnent via un mécanisme séparé de déclenchement, sondage et téléchargement documenté sur https://docs.brightdata.com/datasets/introduction.
Ce que le compte obtient
| Élément | Détail |
|---|---|
| Crédits gratuits | 5 000 par mois, renouvelés mensuellement. Couvre Web Unlocker, SERP, Web Scraper APIs, Scraper Studio |
| Crédit d’essai | 2 $ unique, valable 7 jours, tout produit y compris l’API Navigateur. L’ajout d’un moyen de paiement accorde 5 $ supplémentaires et prolonge l’essai à 30 jours |
| Zones | agent_serp, agent_unlocker, agent_browser_api, pré-créées |
| Utilisation et facturation | Lecture seule. Vérification du solde, pas d’accès aux moyens de paiement ou aux factures |
| Durée de vie du jeton | De l’ordre d’un an par défaut. L’expiration exacte n’est pas renvoyée |
Non inclus : les réseaux de proxy, l’administration de compte, et la création ou modification de zones. Les proxys résidentiels nécessitent toujours un compte professionnel vérifié par KYC via le Panneau de contrôle. L’humain peut y ajouter des fonds et lever les restrictions à tout moment.
Le profil de permissions du jeton est délibérément minimal. Il est en lecture seule pour l’administration et la facturation, et ne peut pas créer ni modifier de zones, c’est pourquoi les trois dont il a besoin sont pré-provisionnées.
Sept comportements qui cassent les implémentations naïves
Ce sont les éléments qu’un agent se trompe s’il traite le flux comme un formulaire d’inscription générique.
Un 200 à l’étape 2 ne prouve pas que l’email est nouveau. Si l’adresse appartient déjà à un compte Bright Data, ou est filtrée par une liste d’autorisation de domaine ou d’email lors d’un déploiement contrôlé, la forme de la réponse est identique à un succès et aucun code n’est envoyé. Le propriétaire du compte existant reçoit à la place un email de notification séparé. C’est intentionnel et indiscernable d’un succès. Si un utilisateur signale ne jamais avoir reçu de code, demandez-lui de vérifier les spams et de confirmer qu’il n’a pas déjà de compte, plutôt que de relancer en boucle.
Répéter l’étape 2 ne redémarre rien. Appeler à nouveau /auth pour le même email alors qu’une inscription est en attente renvoie le même claim_token et des horodatages d’expiration inchangés. Utilisez le point de terminaison de renvoi pour obtenir un nouveau code.
Le provisionnement de zone est par produit et échoue indépendamment. Vérifiez chaque entrée sous zones. Un produit signalant "status": "failed" pendant que les autres réussissent signifie qu’il faut réessayer ce produit plus tard, pas que l’inscription entière a échoué.
/claim/complete est idempotent. Réessayer avec le même claim_token et le même code après un délai d’attente ou une erreur réseau renvoie un résultat identique. Cela ne crée pas de second compte, n’émet pas de second identifiant, et n’accorde pas de droits deux fois. Réessayez en toute sécurité.
L’identifiant est un secret. Ne jamais imprimer, journaliser ou répéter credential.token dans une sortie de chat, des transcriptions, des arguments de ligne de commande, ou tout fichier qu’une partie non prévue pourrait lire. Stockez-le dans un gestionnaire de secrets, un magasin d’identifiants du système d’exploitation, ou un fichier .env exclu du contrôle de version avec des permissions restrictives. Pas en texte brut dans le code source, l’historique du shell, ou les journaux.
Les limites de débit s’appliquent sur cinq dimensions. Valeurs par défaut : 3 démarrages d’inscription par heure par email, 60 par heure par IP source, 30 par heure par plage réseau, 50 par heure par domaine email, 1 000 par heure globalement. Dépasser l’une d’elles renvoie rate_limited. Les inscriptions passent également par un filtrage anti-fraude.
Un 401 sur un identifiant fonctionnel signifie redémarrer la découverte. Abandonnez l’identifiant et revenez à l’étape 1. Ne réessayez pas l’appel.
Codes d’erreur
Chaque réponse non-2xx de /auth, /claim, et /claim/complete utilise la même forme : {"error": "<code>", "error_description": "<étape suivante actionnable>"}. La description est une étape suivante, pas de la prose. Aucun seuil interne de fraude, score, ou nom de fournisseur n’est jamais inclus.
| Code | HTTP | Où | Que faire |
|---|---|---|---|
invalid_request |
400 | les trois | Corriger le corps JSON |
email_not_accepted |
400 | /auth |
Adresse jetable, aliasée, ou invalide. Demander la véritable boîte mail |
registration_denied |
403 | /auth, /claim/complete |
Refusé. Ne pas réessayer. Utiliser une voie de secours avec un humain présent |
browser_signup_required |
403 | /auth |
Cet email doit s’inscrire dans un navigateur. Ne pas réessayer. Indiquer à l’humain de s’inscrire au Panneau de contrôle avec la même adresse |
fraud_check_unavailable |
503 | /auth |
Réessayable. Attendre au moins les secondes de Retry-After, réessayer la requête identique, doubler l’attente à chaque échec, 3 tentatives au total, puis se rabattre sur une voie humaine |
rate_limited |
429 | tout | Patienter et réessayer plus tard |
invalid_claim_token |
400 | /claim, /claim/complete |
Invalide, inconnu, ou épuisé (5 tentatives OTP ou 3 renvois). Redémarrer l’inscription |
otp_invalid |
400 | /claim/complete |
Demander à l’utilisateur de relire le code. Après 5 tentatives erronées, la demande est définitivement invalidée |
otp_expired |
400 | /claim/complete |
Renvoyer via /claim. Les codes durent 10 minutes par défaut |
claim_expired |
400 | /claim/complete |
Inscription en attente dépassant 24 heures. Redémarrer |
registration_disabled |
503 | /auth |
Nouvelles inscriptions temporairement désactivées. Utiliser une voie de secours |
instructions_disabled |
404 | GET point de terminaison de découverte | Point de terminaison auto-documenté désactivé. Se fier à auth.md |
invalid_github_token |
401 | /auth |
Réservé. Non renvoyé aujourd’hui |
email_unverified |
401 | /auth |
Réservé. Non renvoyé aujourd’hui |
Réessayez les erreurs 5xx avec un recul exponentiel. Ne réessayez pas la même charge utile 4xx sauf indication contraire dans le tableau.
Révocation
Les agents n’initient pas la révocation. Il n’existe aucun point de terminaison permettant à un agent de restituer un identifiant.
Si un identifiant cesse de fonctionner et que l’API renvoie 401, abandonnez-le et redémarrez la découverte depuis l’étape 1. C’est tout le contrat. Un agent détenant un jeton mort ne doit pas le réessayer, ne doit pas tenter de le rafraîchir, et ne doit pas supposer que le compte a disparu. Il doit revenir aux métadonnées et recommencer.
Réclamer le compte plus tard
Un humain peut compléter l’inscription standard plus tard, avec un mot de passe, GitHub, ou Google, en utilisant la même adresse email, et obtenir un accès complet à ce même compte. Cela ne crée pas de doublon et n’invalide pas l’identifiant que l’agent utilise déjà. La réinitialisation du mot de passe sur cette adresse est le moyen d’accéder au Panneau de contrôle à froid.
Pas encore déployé
Énoncé explicitement afin que les agents ne tentent pas cela et ne gaspillent pas une requête.
L’assertion par jeton GitHub est prévue mais non planifiée. La conception lit le jeton depuis un CLI GitHub authentifié, le valide côté serveur auprès de GitHub, lit l’email principal vérifié, et identifie le compte par l’ID numérique GitHub. Le jeton est utilisé une seule fois et jamais stocké. Comme l’identité est déjà vérifiée, l’identifiant est renvoyé immédiatement sans étape de code. Les portées minimales seraient read:user et user:email, et un compte GitHub sans email principal vérifié serait rejeté.
Rien de tout cela n’est implémenté. Le serveur n’accepte que verified_email et rejette tout le reste comme invalid_request. Les codes invalid_github_token et email_unverified sont réservés et non renvoyés aujourd’hui.
L’inscription anonyme est prévue mais non planifiée.
La règle est la même pour les deux : lisez assertion_types_supported depuis les métadonnées et n’utilisez que ce qui est listé. Lorsqu’elles seront déployées, les métadonnées sont l’endroit où elles apparaîtront en premier.
Référence
Chaque URL du protocole :
| URL | But |
|---|---|
https://brightdata.com/auth.md |
Le document de protocole. Canonique |
https://brightdata.com/.well-known/oauth-authorization-server |
Métadonnées du serveur d’autorisation avec le bloc agent_auth |
https://api.brightdata.com/.well-known/oauth-protected-resource |
Métadonnées de ressource protégée, portées et méthodes bearer |
https://brightdata.com/users/auth/agent_registration |
Miroir en direct auto-documenté des contrats et erreurs |
.../agent_registration/auth |
Démarrer l’inscription |
.../agent_registration/claim |
Renvoyer le code |
.../agent_registration/claim/complete |
Soumettre le code, recevoir le jeton |
https://api.brightdata.com/request |
Appels SERP et Web Unlocker |
https://mcp.brightdata.com/mcp |
MCP hébergé, ensemble complet d’outils |
https://brightdata.com/cp/setting/users |
Où un humain trouve un jeton API existant |
https://docs.brightdata.com |
Référence API |
https://docs.brightdata.com/llms.txt |
Index de documentation |
https://docs.brightdata.com/scraping-automation/scraping-browser/quickstart |
Configuration de l’API Navigateur |
https://docs.brightdata.com/datasets/introduction |
Web Scraper APIs, déclenchement, sondage, téléchargement |
CLI : npm install -g @brightdata/cli
SDK : npm install @brightdata/sdk ou pip install brightdata-sdk
FAQ
Un agent IA peut-il créer un compte Bright Data sans humain ?
Presque entièrement. L’agent effectue chaque appel HTTP. La seule action de l’humain est de lire un code à 6 caractères dans son email et de le donner à l’agent. Pas de formulaire, pas de tableau de bord, pas de navigateur.
Pourquoi l’agent ne peut-il pas simplement remplir le formulaire d’inscription normal avec un outil de navigateur ?
Parce qu’il n’y est pas autorisé. Anthropic interdit à ses agents de navigateur de créer des comptes au nom d’un utilisateur, même avec une permission explicite de l’utilisateur, et leur ordonne séparément de ne pas compléter de CAPTCHA ou de vérification humaine. Un formulaire d’inscription demande les deux. Le flux auth.md évite cela en ne demandant jamais à l’agent d’agir comme un humain.
Où ce protocole est-il documenté ?
https://brightdata.com/auth.md, reflété sous forme lisible par machine à https://brightdata.com/users/auth/agent_registration.
Comment un agent découvre-t-il les points de terminaison ?
À partir du bloc agent_auth dans https://brightdata.com/.well-known/oauth-authorization-server.
Que reçoit l’agent ?
Un jeton API Bright Data standard, 5 000 crédits gratuits par mois, un crédit d’essai de 2 $ valable 7 jours, et trois zones pré-provisionnées pour SERP, Web Unlocker, et l’API Navigateur.
Le jeton expire-t-il ?
De l’ordre d’un an par défaut. L’expiration exacte n’est pas renvoyée dans la réponse d’inscription.
L’agent peut-il créer ses propres zones ?
Non. Le jeton est en lecture seule pour l’administration et la facturation. Les trois zones dont il a besoin sont pré-provisionnées.
L’agent peut-il révoquer son propre identifiant ?
Non. Les agents n’initient pas la révocation. Si un identifiant renvoie 401, abandonnez-le et redémarrez la découverte.
L’agent peut-il utiliser des proxys résidentiels ?
Non. Ceux-ci nécessitent toujours un compte professionnel vérifié par KYC via le Panneau de contrôle.
S’agit-il d’ID-JAG ?
Non. C’est un flux d’inscription d’agent propriétaire de Bright Data.
Essayez-le
Pointez un agent vers https://brightdata.com/auth.md et demandez-lui de s’inscrire. Trois appels plus tard, il dispose d’un jeton, de trois zones fonctionnelles, et de 5 000 crédits gratuits par mois.