← Clawy / Démarrage rapide
Sans clé API, sans inscription. Vous appelez un endpoint, le serveur répond 402 avec un prix, votre client signe une autorisation USDC unique sur Base et réessaie. Ci-dessous, le tout dans un seul fichier exécutable.
npm i viem/v1/chat/auto — le niveau optimisé en coût à $0,04 USDC/appel. Passez l'ENDPOINT à /v1/chat/opus ($0,15, Claude Opus 4.8) ou /v1/chat/chatgpt ($0,10, GPT-5.5) une fois que ça marche.
402 avec le prix dans l'en-tête PAYMENT-REQUIRED (JSON en base64).transferWithAuthorization EIP-3009 pour le montant USDC exact, payable à l'adresse indiquée dans les exigences.X-PAYMENT → 200 OK avec un chat.completion au format OpenAI.Enregistrez sous pay-and-call.mjs, puis exécutez X402_PRIVATE_KEY=0x... node pay-and-call.mjs :
// pay-and-call.mjs — pay Clawy in USDC over x402 and read the answer.
// Setup: npm i viem
import { privateKeyToAccount } from "viem/accounts";
import { randomBytes } from "crypto";
const GATEWAY = "https://clawy.uk";
const ENDPOINT = "/v1/chat/auto"; // cheapest tier: $0.04 USDC/call
const MESSAGE = "Reply with exactly: HELLO";
const USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base
const CHAIN_ID = 8453; // Base mainnet
const account = privateKeyToAccount(process.env.X402_PRIVATE_KEY);
const body = JSON.stringify({ messages: [{ role: "user", content: MESSAGE }] });
const headers = { "Content-Type": "application/json" };
// 1) Unpaid request -> 402 with the price in the PAYMENT-REQUIRED header
const r1 = await fetch(GATEWAY + ENDPOINT, { method: "POST", headers, body });
if (r1.status !== 402) throw new Error("expected 402, got " + r1.status);
const reqs = JSON.parse(Buffer.from(r1.headers.get("payment-required"), "base64").toString());
const a = reqs.accepts[0]; // { scheme:"exact", network, amount, payTo, ... }
console.log("price:", a.amount, "(6-dp USDC) ->", a.payTo);
// 2) Sign an EIP-3009 transferWithAuthorization for the exact amount
const nonce = "0x" + randomBytes(32).toString("hex");
const validBefore = BigInt(Math.floor(Date.now() / 1000) + 300); // valid 5 min
const signature = await account.signTypedData({
domain: { name: "USD Coin", version: "2", chainId: CHAIN_ID, verifyingContract: USDC },
types: { TransferWithAuthorization: [
{ name: "from", type: "address" }, { name: "to", type: "address" },
{ name: "value", type: "uint256" }, { name: "validAfter", type: "uint256" },
{ name: "validBefore", type: "uint256" }, { name: "nonce", type: "bytes32" },
] },
primaryType: "TransferWithAuthorization",
message: { from: account.address, to: a.payTo, value: BigInt(a.amount),
validAfter: 0n, validBefore, nonce },
});
// 3) Build the X-PAYMENT header and retry -> 200 + OpenAI-shape response
const xPayment = Buffer.from(JSON.stringify({
x402Version: 2, scheme: "exact", network: a.network,
payload: { signature, authorization: {
from: account.address, to: a.payTo, value: a.amount,
validAfter: "0", validBefore: validBefore.toString(), nonce } },
})).toString("base64");
const r2 = await fetch(GATEWAY + ENDPOINT, {
method: "POST", headers: { ...headers, "X-PAYMENT": xPayment }, body,
});
const out = await r2.json();
console.log(out.choices[0].message.content); // -> HELLO
console.log("served by:", out.x_clawy?.provider);
fetch gérant le paiement). Clawy est un serveur x402 v2 standard, donc tout client conforme fonctionne.
Les fichiers de découverte permettent à un client autonome de trouver, vérifier les prix et appeler Clawy par lui-même :
/llms.txt — résumé d'une page pour les clients LLM/openapi.json — spec OpenAPI 3.1 avec infos de paiement par endpoint/.well-known/x402.json — manifeste Bazaar x402 (schémas entrée/sortie)/.well-known/agent-services.json — catalogue agent-services/health — statut en direct + tarifs actuelsx_clawy.provider / x_clawy.delivery pour que vous sachiez toujours quel modèle a traité la requête. Les paiements sont réglés en USDC sur Base mainnet via le facilitateur Coinbase. La sortie du chat est générée par le modèle et n'est pas garantie correcte — vérifiez tout ce sur quoi vous vous appuyez.