I Put A Gpu Box Behind Http 402. Two Days Of Real Numbers.
I have a machine at home running open-weights models. This week I put it behind x402, the protocol that turns HTTP status 402 into an actual payment step: the client calls an endpoint, gets a price back, signs a USDC transfer, retries, and gets the answer. No account, no API key, no invoice.
I wanted to know one thing: do agents actually pay for things, or is that just a slide? So I shipped it on mainnet and counted.
What is for sale
Four endpoints, paid per call in USDC on Base:
| Endpoint | Price | What you get |
|---|---|---|
POST /v1/chat |
$0.005 | Qwen3 14B completion, up to 512 tokens |
POST /v1/chat-mini |
$0.002 | Up to 128 tokens, for classify / extract / yes-no |
POST /v1/embed |
$0.002 | BGE-M3 embeddings, 1024-dim, up to 16 texts per call |
POST /v1/vision |
$0.01 | Image description and OCR, base64 PNG/JPEG |
Base URL: https://x402.llnuvemlocal.com.br. There is an llms.txt and an openapi.json if you would rather let your agent read it.
The numbers, unflattering
After roughly two days on mainnet:
- About 2,800 requests that got a 402 quote and walked away.
- 15 paid calls. Eight of those were me, testing.
- 7 paid calls from strangers, from 6 different wallets.
- Six of the seven were embeddings. One was chat. Nobody bought vision.
- Revenue from strangers: $0.017.
So yes, agents pay. They pay once, two tenths of a cent, and so far only one came back.
What I learned
Crawlers ask for discovery files before they pay. In the first hours, bots were requesting /.well-known/x402, /openapi.json, /llms.txt and /agents.json and getting 404. They also probe paid routes with GET first. I now serve all of those for free, and GET on a paid route returns a description of how to call it instead of a 405.
Your endpoint is invisible until the first sale. The Coinbase facilitator's catalog indexes a route only after it settles a payment. Each route needs its own first purchase, so I bought from myself once per route.
Embeddings are what machines buy. I expected chat to lead. It did not. An embedding is a commodity with a fixed shape: an agent can evaluate it without reading prose, and $0.002 for sixteen texts is easy to justify.
Never charge for failures. With x402 the server settles after the handler succeeds. If the model is busy I return 503 and nobody pays. This matters more than it sounds: an agent that gets charged for an error has no support channel to complain to, it just never returns.
Price has a floor. The hosted facilitator charges per settlement after a free monthly allowance, so anything under about $0.002 can end up costing you money.
Use it from your own agent: MCP server
Calling x402 by hand means handling the 402, signing EIP-3009 and retrying. To skip that, I wrote a small MCP server. It is one Python file you run with uv, and it gives Claude, Cursor or any MCP client these tools: chat, chat_mini, semantic_rank, embed, read_image, plus free pricing and wallet.
claude mcp add x402-ai -e X402_PRIVATE_KEY_FILE=$HOME/.x402-buyer.key -- uv run $HOME/x402-ai-mcp/server.py
The one I expect to be most useful is semantic_rank: give it a query and up to 15 passages, in any mix of languages, and it returns them sorted by similarity for $0.002. It is a cheap way for a big model to delegate "which of these is relevant" instead of reading everything itself.
It has two guard rails, because handing a wallet to an agent deserves them: a per-session spend cap (default $0.50) and a per-call ceiling (default $0.02) that rejects a quote before anything is signed. Use a dedicated wallet with a few dollars in it.
Code: https://github.com/Leite007/x402-ai-mcp
Or with plain Python
from eth_account import Account
from x402 import x402Client
from x402.http.clients import x402HttpxClient
from x402.mechanisms.evm.exact.register import register_exact_evm_client
from x402.mechanisms.evm.signers import EthAccountSigner
client = x402Client()
register_exact_evm_client(client, EthAccountSigner(Account.from_key(KEY)), networks="eip155:8453")
async with x402HttpxClient(client, timeout=300) as http:
r = await http.post("https://x402.llnuvemlocal.com.br/v1/embed",
json={"input": ["hello world", "olá mundo"]})
print(r.json()["dimensions"]) # 1024
Is this a business?
Not at these numbers, and I would rather say that than pretend. I set myself a deadline: if there are not at least three wallets that either come back more than ten times or spend a dollar each by November 24, I turn it off. I will post the result either way.
If you build agents and have a use for cheap embeddings or a throwaway small model, try it and tell me what is missing.
Popular Products
-
Electronic String Tension Calibrator ...$41.56$20.78 -
Pickleball Paddle Case Hard Shell Rac...$27.56$13.78 -
Beach Tennis Racket Head Tape Protect...$59.56$29.78 -
Glow-in-the-Dark Outdoor Pickleball B...$49.56$24.78 -
Tennis Racket Lead Tape - 20Pcs$51.56$25.78