x402

Par browser-use · browser-use

Configurez les paiements Browser Use Cloud avec x402 — paiement à la requête depuis un portefeuille crypto (USDC sur Base mainnet), sans inscription ni clé API. Deux approches sont décrites dès le départ — « utilisation directe » (configurez un portefeuille pour que vous ou Claude Code puissiez exécuter des tâches de navigation cloud payées depuis le portefeuille — Claude écrit et exécute des scripts jetables, rien ne touche votre codebase) ou « intégration dans le projet » (installez le SDK et écrivez la clé + le code dans votre projet). Couvre la configuration du portefeuille, le financement, le `.env` et un test à ~1 $. À utiliser quand l'utilisateur demande x402, le paiement à l'usage, les paiements USDC, ou veut Browser Use Cloud sans clé API. Pour l'inscription au tier gratuit (reverse-CAPTCHA → clé API), utilisez `browser-use cloud signup` ou le skill `cloud` à la place.

npx skills add https://github.com/browser-use/browser-use --skill x402

Browser Use Cloud — payer avec x402 (portefeuille crypto)

Ceci est un flux scriptisé. Suivez les étapes dans l'ordre. x402 ne fonctionne que via le SDK (browser-use-sdk pour Python, le package npm browser-use pour TS) — il n'y a pas de commande browser-use CLI pour cela, donc chaque étape exécute un court script SDK.

Comment utiliser ce script

  • Les lignes sous Say: sont dites à l'utilisateur mot pour mot. Ne paraphrasez pas, n'ajoutez rien, ne laissez rien de côté.
  • <comme ceci> dans un bloc Say est un champ à remplir — remplacez-le par la vraie valeur, gardez le reste exact.
  • Les lignes sous Ask: utilisent l'outil AskUserQuestion. Utilisez le texte de la question et des options exactement comme écrit.
  • Pour montrer une explication avant une question, mettez-la dans le champ question d'AskUserQuestion (elle s'affiche au-dessus des options). Ne l'envoyez pas comme texte de chat séparé avant d'appeler l'outil — ce texte est supprimé quand l'interface de question s'ouvre. Donc : explication + la vraie question vont dans le champ question, en un seul appel d'outil.
  • Les lignes sous Do: sont vos actions. Ne les lisez pas à voix haute.
  • Suivez deux faits en chemin : SETUP (A ou B, de l'étape 1) et MODE (A ou B, de l'étape 2).
  • SETUP, MODE, et les noms des chemins A/B/C sont des labels internes pour vous seulement. Ne les dites jamais à l'utilisateur. Décrivez les choix en mots simples à la place (ex : « recharger votre compte » / « portefeuille sans compte »), jamais « Mode B » ou « Chemin A ».

Étape 1 — Ouvrir et choisir la configuration

Ask: (header: Use x402) — mettez l'explication et la question dans le champ question, exactement :

x402 est un protocole de Coinbase qui, au lieu de présenter une clé API, vous permet d'utiliser la crypto pour payer les requêtes API. x402 vous laisse payer Browser Use par requête depuis un portefeuille crypto avec USDC sur Base — pas d'inscription, de clé API ou de carte de crédit nécessaires, juste un portefeuille. La configuration prend quelques minutes : obtenir ou créer un portefeuille, ajouter des fonds, sauvegarder la clé dans .env, et la tester.

Comment voulez-vous utiliser x402 ?

  • L'utiliser simplement — Exécuter les tâches Browser Use, payées depuis votre portefeuille, ici en terminal en me le demandant. Je configure le portefeuille et la clé.
  • L'intégrer — Vous codez une app et voulez x402 dedans. Je vais vous aider à installer le SDK, sauvegarder la clé dans le .env de votre projet, et ajouter du code.

Do: "L'utiliser simplement" → SETUP = A. "L'intégrer" → SETUP = B.


Étape 2 — Trouver le compte (vérifier avant de demander)

Do: Cherchez une clé API Browser Use existante, dans cet ordre. Ne dites rien pour le moment.

  1. BROWSER_USE_API_KEY dans l'environnement
  2. une ligne BROWSER_USE_API_KEY= dans ./.env
  3. ~/.browser-use/config.json (sauvegardé par browser-use cloud login / signup)
  4. résultat de browser-use doctor, si la CLI est installée

Si aucune clé n'est trouvée nulle part :

Say:

Aucune clé Browser Use trouvée, donc je vais configurer cela sans compte : le portefeuille est votre identité, et le premier paiement crée un projet nommé d'après lui.

Do: MODE = A. Allez à l'étape 3.

Si une clé est trouvée :

Ask: (header: Account) — question: J'ai trouvé une clé API Browser Use dans <location>. Où doivent aller les crédits USDC ?

  • Recharger ce compte — Les crédits vont au projet de votre clé API existante. C'est bien si vos crédits gratuits ont épuisé, ou si vous préférez payer en crypto plutôt qu'avec une carte.
  • Portefeuille sans compte — Le portefeuille est une identité séparée. Le premier paiement crée un nouveau projet nommé d'après le portefeuille, à part de votre compte existant.

Do: "Recharger ce compte" → MODE = B. "Portefeuille sans compte" → MODE = A.


Étape 3 — Portefeuille

Ask: (header: Wallet) — question: Avez-vous un portefeuille prêt, ou devrais-je en configurer un ?

  • J'ai un portefeuille financé — Un portefeuille EVM (MetaMask, Rabby, Coinbase Wallet, Frame, Phantom, …) avec USDC sur Base mainnet.
  • Guidez-moi — Je vais vous guider dans la création d'un portefeuille, l'ajout de Base et l'achat d'USDC.
  • En créer un nouveau — Je vais générer un portefeuille jetable pour l'automatisation. Vous devrez toujours le financer.

Branchez sur la réponse.

Chemin A — « J'ai un portefeuille financé »

Do: Vérifiez que .env est dans .gitignore ; ajoutez-le s'il manque.

Ask: (header: Add key) — mettez la note et la question dans le champ question :

La clé privée de votre portefeuille doit aller dans .env. Vous pouvez la coller ici et je vais l'ajouter pour vous, ou l'ajouter vous-même. Attention : tout ce qui est collé dans le chat est sauvegardé dans la transcription, donc pour un portefeuille de valeur élevée, l'ajouter vous-même est un peu plus sûr. Comment voulez-vous faire ?

  • La coller ici — Collez votre clé privée dans le chat et je vais l'écrire dans .env pour vous.
  • Je vais l'ajouter moi-même — Vous l'ajoutez à .env, puis vous me envoyez seulement votre adresse publique.

Si « La coller ici » :

Do: Écrivez BROWSER_USE_X402_PRIVATE_KEY=<clé collée> dans .env (créez le fichier si nécessaire ; assurez-vous que .env est gitignored). Ne renvoyez jamais la clé ou ne l'imprimez nulle part.

Say:

Clé sauvegardée dans .env — je ne la réafficherai pas.

Do: Allez à l'étape 4.

Si « Je vais l'ajouter moi-même » :

Say:

Ajoutez cette ligne à votre .env, puis envoyez-moi l'adresse publique de votre portefeuille (le 0x… — c'est sans danger à partager) :

BROWSER_USE_X402_PRIVATE_KEY=<votre clé privée>

Do: Quand ils envoient l'adresse, vérifiez qu'elle correspond à ^0x[0-9a-fA-F]{40}$.

Say:

Compris : <address>. C'est une adresse valide.

Do: Allez à l'étape 4.

Chemin B — « Guidez-moi »

Say:

  1. Installez MetaMask (ou Rabby, Coinbase Wallet, Frame, Trust Wallet, Phantom, …) depuis le site officiel seulement : https://metamask.io. Créez un portefeuille, sauvegardez la phrase d'amorce hors ligne, définissez un mot de passe.
  2. Ajoutez Base comme réseau. Ouvrez https://chainlist.org/chain/8453 → « Connect Wallet » → « Add to MetaMask », puis approuvez dans votre portefeuille.
  3. Cliquez sur « Buy » dans votre portefeuille. Choisissez USDC, réseau Base, payez avec une carte / Apple Pay / banque. L'USDC atterrit directement dans votre portefeuille.
  4. Obtenez la clé privée : menu compte → Détails du compte → Afficher la clé privée → entrez le mot de passe → copiez.
  5. Ajoutez-la à votre .env (assurez-vous que .env est gitignored) :
    BROWSER_USE_X402_PRIVATE_KEY=<votre clé privée>
  6. Envoyez-moi l'adresse publique de votre portefeuille (le 0x…) pour que je puisse la vérifier.

Do: Puis suivez le chemin A à partir de la vérification d'adresse.

Chemin C — « En créer un nouveau »

Do: Générez un portefeuille. Sauvegardez la clé dans .env. Affichez seulement l'adresse.

Python :

pip install eth-account
from eth_account import Account
acc = Account.create()
print("Address:", acc.address)
print("Private key:", acc.key.hex())

TypeScript :

npm install viem
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
const key = generatePrivateKey();
console.log("Address:", privateKeyToAccount(key).address);
console.log("Private key:", key);

Say:

Nouveau portefeuille créé. Votre adresse publique est <address>, et j'ai sauvegardé la clé privée dans .env. Maintenant il a besoin de fonds.

Do: Allez à l'étape 4 (financement).


Étape 4 — Ajouter des fonds

Si chemin A ou B (déjà financé) :

Say:

Votre portefeuille est déjà financé, donc on va sauter directement au test.

Do: Allez à l'étape 5.

Si chemin C :

Say:

Deux façons d'obtenir de l'USDC dans votre portefeuille sur Base :

  • Bouton Buy dans le portefeuille (le plus facile) : cliquez sur « Buy », choisissez USDC, définissez le réseau à Base, payez avec une carte. Pas d'exchange nécessaire.
  • Depuis un exchange : envoyez l'USDC à <address> et choisissez « Base » comme réseau — pas Ethereum, qui coûte 5 à 20 $ de frais.

Ajoutez au moins 20 $ : cela couvre le test de 1 $ plus quelques vraies tâches. Je vais surveiller le solde et vous dire quand il arrive.

Do: Vérifiez le solde on-chain toutes les 5s avec le RPC public de Base :

PADDED=$(printf "%064s" "${WALLET_ADDR:2}" | tr ' ' '0')
curl -s https://mainnet.base.org \
  -H "Content-Type: application/json" \
  -d "{\"jsonrpc\":\"2.0\",\"method\":\"eth_call\",\"params\":[{\"to\":\"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\"data\":\"0x70a08231${PADDED}\"},\"latest\"],\"id\":1}"

Lisez result comme un nombre hexadécimal ; divisez par 1_000_000 (USDC a 6 décimales). Arrêtez une fois que c'est 20 $ ou plus.

Say:

Financé — je vois $<amount> sur Base. Ensuite, un test rapide.


Étape 5 — Test (~1 $)

Do: Si SETUP = A, assurez-vous que le SDK est installé où vous allez exécuter les scripts (Python par défaut). Si SETUP = B, installez-le dans le projet dans le langage du projet — travaillez le langage à partir du cwd (package.json/tsconfig.json → TypeScript ; pyproject.toml/requirements.txt/*.py → Python ; demandez seulement si vous ne pouvez pas dire) :

# Python (nécessite 3.10+ pour l'extra x402)
pip install "browser-use-sdk[x402]"
# TypeScript
npm install browser-use-sdk @x402/fetch @x402/evm viem

Ask: (header: Test run) — question: Prêt à tester ? Cela dépense exactement 1 $ USDC de votre portefeuille pour vérifier le paiement + exécuter le travail de bout en bout.

  • Utiliser la tâche par défaut — « Allez sur example.com et dites-moi le texte du titre. » (~5 secondes, bon marché)
  • Je vais vous donner une tâche — Dites-moi une tâche courte à exécuter à la place.
  • Sauter le test — Sautez le test et allez directement à l'utilisation de x402.

Do:

  • « Je vais vous donner une tâche » → Say: Quelle est la tâche ? Gardez-la courte. Attendez-la.
  • « Sauter le test » → allez à l'étape 6.
  • Sinon utilisez la tâche par défaut.

Do: Exécutez le test. Utilisez le client x402 brut avec max_value de 1,50 $ pour qu'il paie 1 $, et non les 5 $ que le SDK utilise par défaut :

import asyncio, os
from decimal import Decimal
from x402 import x402Client
from x402.http.clients import x402HttpxClient
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact.register import register_exact_evm_client
from eth_account import Account

async def main():
    client = x402Client()
    register_exact_evm_client(
        client,
        EthAccountSigner(Account.from_key(os.environ["BROWSER_USE_X402_PRIVATE_KEY"])),
    )
    # max_value plafonne la dépense par requête — choisit l'option 1 $ plutôt que le défaut 5 $.
    async with x402HttpxClient(client, max_value=Decimal("1.5"), timeout=180.0) as http:
        resp = await http.post(
            "https://x402.api.browser-use.com/api/v3/sessions",
            json={"task": "<la tâche>"},
        )
        print(resp.status_code, resp.json())

asyncio.run(main())

Si MODE = B, ajoutez l'en-tête de clé API, sinon le 1 $ va à un nouveau projet de portefeuille au lieu de celui rechargeant :

async with x402HttpxClient(
    client, max_value=Decimal("1.5"), timeout=180.0,
    headers={"X-Browser-Use-API-Key": os.environ["BROWSER_USE_API_KEY"]},
) as http:
    ...

Si la lib x402 installée n'a pas de max_value, Say: Cette version x402 ne peut pas forcer un débit de 1 $, donc le test coûtera 5 $ à la place. Voulez-vous que je procède ? — attendez un oui avant d'exécuter.

Say:

Payé. Preuve on-chain : https://basescan.org/address/<address>#tokentxns — cherchez un transfert USDC sortant de exactement 1,000000 $.

Do: Lisez le solde. Si MODE = A (nécessite browser-use-sdk ≥ 3.8.0 ; si plus ancien, dites d'exécuter pip install -U "browser-use-sdk[x402]" ou sautez ceci) :

import asyncio, os
from browser_use_sdk.v3 import get_wallet_balance

async def main():
    bal = await get_wallet_balance(os.environ["BROWSER_USE_X402_PRIVATE_KEY"])
    print(bal['total_credits_usd'])

asyncio.run(main())

Si MODE = B, sautez get_wallet_balance (elle retourne 404 — les crédits sont dans le projet de la clé API, c'est normal, ne l'affichez pas comme une erreur) et lisez-le de façon normale :

from browser_use_sdk.v3 import AsyncBrowserUse
client = AsyncBrowserUse(api_key=os.environ["BROWSER_USE_API_KEY"])
acct = await client.billing.account()
print(acct.total_credits_balance_usd)

Say:

Terminé. Votre solde Browser Use est maintenant $<balance> (le test a coûté environ $<cost>). Les tâches tirent de ceci, et le SDK ajoute 5 $ de plus quand il n'y en a plus.


Étape 6 — Terminer

Si SETUP = A :

Say:

C'est bon. Demandez-moi d'exécuter n'importe quelle tâche de navigateur et je vais l'exécuter via le SDK, payée depuis votre portefeuille.

Do: Quand ils demandent une tâche, écrivez un script jetable (dans /tmp, ou un job en arrière-plan pour les longs), exécutez-le, rapportez le résultat, et supprimez-le — ne laissez pas de fichiers dans leur cwd. Le SDK lit BROWSER_USE_X402_PRIVATE_KEY et trouve le endpoint x402 tout seul :

import asyncio, os
from browser_use_sdk.v3 import AsyncBrowserUse

async def main():
    client = AsyncBrowserUse()  # Mode B: AsyncBrowserUse(api_key=os.environ["BROWSER_USE_API_KEY"])
    result = await client.run(task="<la tâche>")
    print(result.output)

asyncio.run(main())

Si SETUP = B :

Say:

C'est bon. Voici le client à utiliser dans votre code — il lit la clé et le endpoint de votre .env :

Do: Ajoutez le client dans le langage du projet et pointez-les vers la skill cloud / docs du SDK pour le reste :

from browser_use_sdk.v3 import AsyncBrowserUse

client = AsyncBrowserUse()                                  # Mode A (sans compte)
# client = AsyncBrowserUse(api_key="bu_...")                # Mode B (recharger compte existant)

(x402 a besoin du client async — le sync BrowserUse ne s'exécutera pas quand la var d'env x402 est définie.)


Équivalents TypeScript

Python TypeScript
from browser_use_sdk.v3 import AsyncBrowserUse import { BrowserUse } from "browser-use-sdk/v3"
AsyncBrowserUse() new BrowserUse()
await client.run(task=...).output await client.run({ task }).output
get_wallet_balance(key) getWalletBalance(key) (from "browser-use-sdk/v3")
pip install "browser-use-sdk[x402]" npm install browser-use-sdk @x402/fetch @x402/evm viem

Les deux SDKs lisent BROWSER_USE_X402_PRIVATE_KEY de l'env.

Règles

  • Suivez le script dans l'ordre. Dites les blocs Say mot pour mot.
  • Ne dépensez jamais l'USDC de l'utilisateur sans un clair oui (la question de l'étape 5 est ce oui).
  • Offrez toujours les deux façons d'ajouter la clé : la coller dans le chat (vous l'écrivez dans .env) ou l'utilisateur l'ajoute lui-même. S'ils la collent, écrivez-la directement dans .env et ne la renvoyez ou ne la stockez jamais ailleurs.
  • Ajoutez .env à .gitignore avant de sauvegarder les clés.
  • Les portefeuilles contiennent de l'argent réel. Gardez les clés hors du contrôle source, des logs et des captures d'écran ; ajoutez seulement ce que vous pouvez vous permettre de perdre si ça fuit.

Référence

Skills similaires