← Clawy / Inicio rápido
Sin clave API, sin registro. Golpeas un endpoint, el servidor responde 402 con un precio, tu cliente firma una autorización USDC única en Base y reintenta. Abajo está todo en un único archivo ejecutable.
npm i viem/v1/chat/auto — el nivel optimizado en coste a $0,04 USDC/llamada. Cambia el ENDPOINT a /v1/chat/opus ($0,15, Claude Opus 4.8) o /v1/chat/chatgpt ($0,10, GPT-5.5) cuando funcione.
402 con el precio en la cabecera PAYMENT-REQUIRED (JSON en base64).transferWithAuthorization EIP-3009 por el importe exacto de USDC, pagadero a la dirección de los requisitos.X-PAYMENT → 200 OK con un chat.completion con formato OpenAI.Guárdalo como pay-and-call.mjs y luego ejecuta 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 con pagos). Clawy es un servidor x402 v2 estándar, así que cualquier cliente conforme funciona.
Los archivos de descubrimiento permiten a un cliente autónomo encontrar, consultar precios y llamar a Clawy por sí mismo:
/llms.txt — resumen de una página para clientes LLM/openapi.json — spec OpenAPI 3.1 con info de pago por endpoint/.well-known/x402.json — manifiesto Bazaar x402 (esquemas de entrada/salida)/.well-known/agent-services.json — catálogo de agent-services/health — estado en vivo + precios actualesx_clawy.provider / x_clawy.delivery para que siempre sepas qué modelo atendió la petición. Los pagos se liquidan en USDC en Base mainnet mediante el facilitador de Coinbase. La salida del chat es generada por el modelo y no se garantiza su corrección — verifica todo aquello en lo que confíes.