<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alfred Nordman</title>
    <description>The latest articles on DEV Community by Alfred Nordman (@novalyth).</description>
    <link>https://dev.to/novalyth</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4128856%2F9d00dc8d-70b2-4066-bf3a-7b458b789ccb.png</url>
      <title>DEV Community: Alfred Nordman</title>
      <link>https://dev.to/novalyth</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/novalyth"/>
    <language>en</language>
    <item>
      <title>I Shipped 4 Real AI-Agent Payment APIs on Base Mainnet. They Made $0.</title>
      <dc:creator>Alfred Nordman</dc:creator>
      <pubDate>Thu, 17 Sep 2026 02:04:38 +0000</pubDate>
      <link>https://dev.to/novalyth/i-shipped-4-real-ai-agent-payment-apis-on-base-mainnet-they-made-0-5f24</link>
      <guid>https://dev.to/novalyth/i-shipped-4-real-ai-agent-payment-apis-on-base-mainnet-they-made-0-5f24</guid>
      <description>&lt;p&gt;A build log of real mainnet incidents — facilitator hangs, a silent scanner bug, and why $0 external revenue turned out to be a market signal, not a bug.&lt;/p&gt;

&lt;p&gt;I've spent the last few weeks shipping four small APIs that Cloudflare Workers serve, gated behind x402 micropayments in USDC, settled for real on Base mainnet. Domain parsing, DNS/RDAP/TLS intelligence, email verification, and markdown extraction — priced between $0.001 and $0.01 per call, all live, all $0 infrastructure cost on Cloudflare's free tier.&lt;/p&gt;

&lt;p&gt;This is the build log: two real incidents that could have quietly killed the whole thing, and the number that made me stop guessing and actually look at the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incident 1: the facilitator hang
&lt;/h2&gt;

&lt;p&gt;x402 payments get verified through a facilitator, a third-party service that checks a payment proof on-chain before your Worker returns a 200. My default client had a 30-second timeout on that call.&lt;/p&gt;

&lt;p&gt;On a cold start right after a deploy, the facilitator connection could stall, not fail, stall. Every paid route on the affected Worker would hang for 90+ seconds before giving up, self-resolving in under a minute once the connection warmed up. From the outside this looks like your API is down. From wrangler tail it looked fine, because the request was technically still in flight.&lt;/p&gt;

&lt;p&gt;Fix: cut the facilitator timeout to 5 seconds across all four products. If it can't confirm a payment in 5s, fail fast and let the client retry, instead of holding the connection open and looking dead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incident 2: the scanner that never wrote a row
&lt;/h2&gt;

&lt;p&gt;I built an on-chain scanner for my internal dashboard to track real settlements independently from the Worker's own logs, so I'd have a second source of truth. It ran silently for weeks. I assumed no rows meant no payments.&lt;/p&gt;

&lt;p&gt;It actually meant the scanner was broken from day one. Two compounding bugs: a KV cursor that never got seeded correctly, and a public RPC provider that rate-limits anonymous archive queries past roughly a 20k block window, which silently truncated every historical scan instead of erroring loudly.&lt;/p&gt;

&lt;p&gt;Lesson: a monitoring tool with no output and a monitoring tool with no problems look identical until you go verify the negative.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number
&lt;/h2&gt;

&lt;p&gt;Once both bugs were fixed, I could finally trust the dashboard. Cross-checked directly against BaseScan: every on-chain movement on these four contracts traces back to my own test wallet. Zero external payers. Zero dollars from anyone but me testing my own APIs.&lt;/p&gt;

&lt;p&gt;I want to be precise about what that does and doesn't mean. The code isn't broken, I settled real USDC payments end-to-end on mainnet, verified independently for every route before flipping each product from testnet. The paywall works. Nobody has used it, at all, except me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I think that's a market signal, not a marketing problem
&lt;/h2&gt;

&lt;p&gt;Before assuming I just needed better distribution, I checked whether there was an actual buyer-side gap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The x402 Bazaar, the closest thing this ecosystem has to a marketplace, grew past 140+ listed sellers in a matter of weeks. Supply is scaling faster than any visible demand.&lt;/li&gt;
&lt;li&gt;An independent on-chain analysis I read while researching this estimated a large majority of x402's total settled volume as wash trading between related wallets, not real commerce.&lt;/li&gt;
&lt;li&gt;Anthropic's own published examples of agent commerce infrastructure don't lean on x402-style wallets, and Stripe, Visa, Mastercard, and the major model labs are visibly investing in a competing payment protocol instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that proves x402 is dead. It does mean shipping an API, adding a paywall, and waiting was never going to work in this category right now. There isn't yet a population of autonomous agents with wallets out there buying things. The sellers showed up before the buyers did.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm doing about it
&lt;/h2&gt;

&lt;p&gt;The four APIs stay live, they cost $0 to keep running on Cloudflare's free tier, so there's no reason to tear them down. But I've stopped building more of them, and I've stopped assuming the next fix to my paywall code is what's blocking revenue.&lt;/p&gt;

&lt;p&gt;If you're building in this space and have actually found a real, non-test buyer paying over x402, I'd genuinely like to hear about it. Every lead I've chased so far turned out to be crawler traffic or my own wallet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>cloudflare</category>
      <category>x402</category>
    </item>
  </channel>
</rss>
