LIVE
ANTHROPICOpus 4.7 benchmarks published2m ago
CLAUDEOK142ms
OPUS 4.7$15 / $75per Mtok
CHATGPTOK89ms
HACKERNEWSWhy has not AI improved design quality the way it improved dev speed?14m ago
MMLU-PROleader Opus 4.788.4
GEMINIDEGRADED312ms
MISTRALMistral Medium 3 released6m ago
GPT-4o$5 / $15per Mtok
ARXIVCompositional reasoning in LRMs22m ago
BEDROCKOK178ms
GEMINI 2.5$3.50 / $10.50per Mtok
THE VERGEFrontier Model Forum expansion announced38m ago
SWE-BENCHleader Claude Opus 4.772.1%
MISTRALOK104ms
ANTHROPICOpus 4.7 benchmarks published2m ago
CLAUDEOK142ms
OPUS 4.7$15 / $75per Mtok
CHATGPTOK89ms
HACKERNEWSWhy has not AI improved design quality the way it improved dev speed?14m ago
MMLU-PROleader Opus 4.788.4
GEMINIDEGRADED312ms
MISTRALMistral Medium 3 released6m ago
GPT-4o$5 / $15per Mtok
ARXIVCompositional reasoning in LRMs22m ago
BEDROCKOK178ms
GEMINI 2.5$3.50 / $10.50per Mtok
THE VERGEFrontier Model Forum expansion announced38m ago
SWE-BENCHleader Claude Opus 4.772.1%
MISTRALOK104ms
Back to Originals

Why We Picked USDC on Base Over Stripe for Agent Payments

Ripper··7 min read

Most paid APIs make their buying decision the same way. Open a Stripe account. Drop in the npm package. Wire up a webhook. Done in an afternoon. We considered it for about twenty minutes. Then we picked USDC on Base mainnet instead, and after a week of shipping on it I am more convinced we picked right than I was at the start.

The argument writes itself once you actually try to imagine the buyer. So let me try.

The buyer is not a person

The premium endpoint at TensorFeed returns a ranked list of AI models for a task. The intended caller is an autonomous agent making a decision in a loop. Maybe a coding agent deciding which model to ask its next question to. Maybe a research agent deciding which model to summarize a paper. Maybe a workflow tool routing requests across a fleet.

The thing those callers have in common is that there is no human in their loop at purchase time. They were spun up by a developer. They were given a task. They are now executing. The developer is asleep. The agent has to make a decision about whether to spend money to get a better answer, and then it has to actually spend it.

Stripe assumes there is a human at the keyboard. Every primitive in their stack is built around that assumption. The signup flow is a web form with a CAPTCHA. The credit card add is a Stripe Elements iframe. The 3DS challenge is an SMS the human reads on their phone. The webhook secret needs to be copied from a dashboard a human is logged into.

You can sand around all of these. Many people do. Run the agent under a developer account, hard-code the API key, accept that the developer is the legal payer for anything the agent decides to spend. This is the dominant pattern today and it is a fine 80% solution.

But it is not actually agent-native. The agent does not have a wallet. The agent does not have a billing relationship. The agent does not have an identity that scales beyond its developer's account. When the developer's card expires, the agent stops working. When the developer leaves the company, the agent dies. When the agent wants to spawn a sub-agent and pay it for a task, it cannot, because the sub-agent has no payment surface either.

The chain native version

Now imagine the same buyer with a self-custodied wallet on Base. The agent has its own private key. Maybe its developer funded it with a hundred dollars of USDC at startup, maybe it earned the USDC from a parent agent paying it for completed tasks. Either way, the spending decision lives entirely inside the agent's execution context.

When the agent wants to call a paid API, it signs a transaction. The transaction lands on chain in 3 seconds. The seller verifies the on-chain receipt and serves the data. No human approval. No card on file. No subscription. No webhook reconciliation lag. No processor that can decide tomorrow that AI agent transactions look fishy and freeze the merchant account.

That last one is the sleeper benefit. Stripe and every other processor reserves the right to terminate the merchant relationship. They do this regularly to anyone whose business model looks unusual to a fraud algorithm. AI agents paying autonomously for API access is going to look unusual to a fraud algorithm for at least the next three years. Building a real revenue stream on top of an infrastructure layer that can dump you with 30 days notice is a strategic mistake when there is a viable alternative that has no notion of an account at all.

What we gave up

The honest tradeoff. By picking USDC-only we cut ourselves off from any agent that cannot manage a Base wallet today. That is, by far, most agents.

Agents built on top of OpenAI's API don't have wallets. Agents built with Anthropic's SDKs don't have wallets. Most agentic frameworks (LangChain, LangGraph, CrewAI, Autogen) have no native wallet abstraction. The few projects working on agent wallets (Coinbase's AgentKit, a handful of Solana experiments) are very early. So when I say "the buyer has a wallet," I mean the buyer needs to opt into a stack that does not yet exist for most developers.

That is a real cost. We are going to make less revenue in the next 12 months than we would have if we had wired up Stripe and accepted credit cards from developers. The short-term TAM with USDC-only is a small fraction of what it would be with both rails.

We accepted that. The reasoning is that the agent payment infrastructure that does not yet exist is going to exist soon, and we would rather be the canonical reference implementation for agents that do have wallets than the tenth Stripe-billing API on the internet. We are betting on a future, not optimizing for today.

What we got in return

The architecture is dramatically simpler. The whole payment middleware is one file (worker/src/payments.ts) that does three things: verify the on-chain USDC Transfer event, mint a bearer token, debit credits from the token. There is no PCI scope. There is no SCA. There is no chargeback handling. There is no subscription state machine. We do not need a customer portal. We do not need a tax engine because we receive USDC directly and report it as ordinary income on the Pizza Robot Studios LLC books.

Latency is dramatically better. Stripe API calls run 200-500ms. A USDC tx confirmation on Base runs 3-5 seconds the first time, but for repeat purchases we mint a bearer token and decrement credits in 50ms per call. Agents that prefer to skip the per-call x402 flow can buy 50 credits at once for $1 and spend them with single-digit-ms overhead per paid request.

Pricing is dramatically lower. We charge $0.02 per call and clear ~$0.018 of it after gas. Stripe takes $0.30 per transaction plus 2.9%. At our price point Stripe is mathematically impossible. Without USDC we either could not do per-call pricing at all or we would have to bundle into expensive subscriptions that nobody wants.

The trust story is dramatically better too. Our wallet address is published in four locations (llms.txt, /api/payment/info, GitHub README, X bio). Anyone can verify the legal entity behind the wallet (Pizza Robot Studios LLC, California) on the state registry. Anyone can read every payment we have ever received fromBasescanand audit the books. Stripe gives us none of that transparency for the buyer.

The decision was not close

When I lay it out as "smaller short-term TAM in exchange for cleaner architecture, lower fees, faster latency, no platform risk, public auditability, and a positioning that compounds as agent wallets become standard" the decision is not close. We picked USDC.

The thing nobody mentions in these debates is that the choice is reversible. If in 18 months it turns out agent wallets failed to materialize and we are leaving real revenue on the table by not accepting cards, we add Stripe alongside. The credits primitive on our side is payment-rail-agnostic. We just have not seen a reason to do that yet, and everything since themainnet validationhas reinforced the original call.

If you are building something similar

The rough sequence we followed:

  • Pick a self-custodied wallet on a low-fee L2 (Base for us; Arbitrum or Solana would also work). Coinbase's Rabby integration on Base is lower friction than Ethereum mainnet by a wide margin.
  • Verify the USDC Transfer event in your worker, do not just trust a tx hash. Read the log topics and confirm the recipient address and amount before crediting anything.
  • Implement replay protection at the tx-hash level. Once a hash mints credits, store it permanently and reject any future submission of the same hash.
  • Offer credits as the primary flow and per-call x402 as a fallback. Per-call x402 is useful for discovery (an agent finds your endpoint, calls it once, decides whether to commit) but the latency makes it bad for repeat use.
  • Publish your wallet in at least three places (TLS-secured documentation, GitHub README, verified socials) so callers can cross-check before sending funds.
  • Document the legal entity. We added Pizza Robot Studios LLC to /terms, /privacy, /api/payment/info, and the .well-known/x402 manifest so any agent auditing the counterparty before paying knows exactly who it is dealing with.

That is roughly the whole stack. Theagent payments docshave the implementation details. The24-hour build retrospectivehas the receipts on what shipping it actually looked like.

Stripe is great for humans. USDC on Base is what works for AI agents. The decision is which buyer you are building for. We picked the agent and have not looked back.