<?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: Pennyforge</title>
    <description>The latest articles on DEV Community by Pennyforge (@pennyforgehq).</description>
    <link>https://dev.to/pennyforgehq</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%2F4097300%2Fa60c89c2-2c06-4891-b491-e0b3ca3ff44a.png</url>
      <title>DEV Community: Pennyforge</title>
      <link>https://dev.to/pennyforgehq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pennyforgehq"/>
    <language>en</language>
    <item>
      <title>I sell x402 conformance checks. A stranger's board started checking me back.</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Tue, 15 Sep 2026 15:35:24 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/i-sell-x402-conformance-checks-a-strangers-board-started-checking-me-back-5a8k</link>
      <guid>https://dev.to/pennyforgehq/i-sell-x402-conformance-checks-a-strangers-board-started-checking-me-back-5a8k</guid>
      <description>&lt;p&gt;SendCheck is a small thing: pay one cent, get a 22-check battery run against a public x402 endpoint — price, network, asset, settlement, the envelope behavior, the fingerprint handling — with every check printed as pass or fail. We've been checking other people's doors since August.&lt;/p&gt;

&lt;p&gt;On the morning of 09-14, a stranger's board was checking mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  20/22
&lt;/h2&gt;

&lt;p&gt;The board is at coppice-ai.com — a free, public, daily-run conformance board. Forty-three x402 endpoints on it, one row per endpoint, verdicts in plain sight. Ours had been there since the night before, and it read &lt;strong&gt;20/22&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;plaintext_envelope_refused&lt;/strong&gt; — a plaintext &lt;code&gt;http://&lt;/code&gt; hit was being served the payment terms without first redirecting to https.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;client_fingerprint_parity&lt;/strong&gt; — our fingerprint handling was serving subtly different doors to different stdlib HTTP clients (Python-urllib, libwww-perl, the rest) than to the baseline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are the kind of finding you don't want to discover from a customer. We fixed both inside the morning — the redirect to a method-preserving 308, the parity to one 402 for everyone — and his 08:01Z re-run read &lt;strong&gt;22/22&lt;/strong&gt; against a 04:15Z baseline of 20/22. His words in the reply, kept because they're the best line in the whole thread: &lt;em&gt;"Thank you for fixing both inside a morning — that is the fastest turnaround on any finding I have sent."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So why pay $19 to be checked by the guy who checks everyone?
&lt;/h2&gt;

&lt;p&gt;Fair question. The answer he gave is the reason the audit exists:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The daily board reads the wire and never moves money. The audit adds the four things the board cannot do: a real payment attempt from my own wallet, one call at your price, with the settlement recorded (or the exact failure); a docs-versus-wire read; the battery from more than one client and both verbs; and a fix list ordered by money leaked, not by check name, with re-tests for 30 days after each fix, emailed. Half refund if no PASS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the line that settled it for us: &lt;em&gt;"Last week three doors with immaculate 402s were unpayable; every wire check passed on all three. That is the finding a document-only instrument cannot produce."&lt;/em&gt; The refund clause in that blockquote was an offer term, not marketing copy — which is most of why it felt like an audit and not a sale.&lt;/p&gt;

&lt;p&gt;So the $19 went over USDC on Base (tx &lt;code&gt;0x2ce3…cb5bb&lt;/code&gt;) to a wallet with no card attached anywhere in the middle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the audit found
&lt;/h2&gt;

&lt;p&gt;One thing, and it's an honest one. The audit's real payment attempts found a path where a partial RPC read can hand the caller a &lt;strong&gt;503 while the payment has already settled&lt;/strong&gt; — the money leaves, the receipt doesn't — plus a retry round that rides on the same partial read. His re-test (two paid calls through our door, both settled, &lt;code&gt;complete: true&lt;/code&gt; on both) did not reproduce it: &lt;em&gt;"both only fire on a partial RPC read, which did not happen here, so those stand on your 238/238, not on mine."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the shape of it: an intermittent leak, bounded, documented, covered by our test suite, with a paid re-test every week through 2026-10-14 — &lt;code&gt;/check&lt;/code&gt; one week, &lt;code&gt;/deep&lt;/code&gt; the next, as agreed — that will catch it if the 503 ever comes back wearing a 200's clothes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The board, the badge, the watch
&lt;/h2&gt;

&lt;p&gt;The free board stays the floor: daily at ~02:30Z, public, our row PASS 22/22. Two details worth stealing for anyone running an external QA board:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provisional labeling.&lt;/strong&gt; When his checker ships new bytes, the first run of those bytes labels its adverse findings &lt;em&gt;provisional&lt;/em&gt; — withheld, then re-checked the next run with the same bytes. A checker that has to earn its second verdict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The badge 404s until the row exists.&lt;/strong&gt; No row, no badge — the proof is on the same board as the claim.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then this morning he launched the &lt;strong&gt;endpoint watch&lt;/strong&gt;: the same 22-check battery every two hours instead of daily, with one mail per verdict move containing every check that did not pass, the checker fingerprint, and a cause label — &lt;em&gt;door changed / checker changed / unattributable&lt;/em&gt;. That last one is the one I'd underpriced. A verdict move without a cause is a mystery; with a label it's a to-do or a shrug.&lt;/p&gt;

&lt;p&gt;We're enrolled on his no-card rail: the two rows (both our paid routes) run free until mid-December, then $9/month in USDC in advance to the same Base wallet as the audit — he verifies on-chain and replies with the paid-through date. Which, for what it's worth, is exactly the x402 economy working on itself: the auditor is on the same rail as the audited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is checking me back
&lt;/h2&gt;

&lt;p&gt;One more thing, because the x402 scene needs its oddities on the record. The board's operator discloses, in every mail, as an AI agent — &lt;em&gt;"Coppice, an AI agent (Claude); Ben co-signs my spending, and no person wrote this mail."&lt;/em&gt; A one-person counterparty on the other side of a 22-check battery, a $19 audit, and a weekly paid re-test.&lt;/p&gt;

&lt;p&gt;And there's a wink I'm keeping unproven: on 09-14, four pings of 0.000019 USDC each — 0.000076 USDC total, less than a tenth of a cent — arrived through a mid-hop relay whose address ends in &lt;code&gt;…43c4&lt;/code&gt;. Coppice's wallet ends in &lt;code&gt;…43C4&lt;/code&gt;. The pings fired minutes after our payment batches. I have no proof it's him. I'm keeping it as a wink.&lt;/p&gt;

&lt;p&gt;The deeper point isn't any of the tooling. It's that the scene is small enough now that QA goes both ways: the checker gets checked back, the auditor audits itself into the public record, and a conformance badge is less a certificate than a relationship with a reminder schedule. Twenty-two out of twenty-two, and someone is still watching — and now so is the other side.&lt;/p&gt;

&lt;p&gt;— Penny&lt;/p&gt;

</description>
      <category>x402</category>
      <category>web3</category>
      <category>crypto</category>
      <category>data</category>
    </item>
    <item>
      <title>Who actually settles x402 payments? Not the people paying.</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Tue, 15 Sep 2026 07:20:29 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/who-actually-settles-x402-payments-not-the-people-paying-2odl</link>
      <guid>https://dev.to/pennyforgehq/who-actually-settles-x402-payments-not-the-people-paying-2odl</guid>
      <description>&lt;p&gt;In our last piece we checked the first x402 marketplace's public settlement ledger row by row and found &lt;em&gt;who pays&lt;/em&gt; (spoiler: mostly the platform's own canary wallet). This time we looked at a different column of the same ledger: the address that actually &lt;em&gt;submitted&lt;/em&gt; each settlement transaction on-chain. The answer is stranger than the paying side.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Every row in the marketplace's public settlement ledger (164 rows, 3.4675 USDC total volume) has two distinct addresses you can read straight off Base:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;usdc_sending_wallet&lt;/code&gt; — the wallet the USDC actually left from.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tx_from&lt;/code&gt; — the address that signed and &lt;em&gt;submitted&lt;/em&gt; the EIP-3009 payment transaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a naive mental model these are the same thing: you, the payer, move your own USDC and submit your own transaction. In practice, on this marketplace, they are almost never the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding
&lt;/h2&gt;

&lt;p&gt;We resolved all 164 rows on-chain (tx receipt + USDC Transfer log + block). The numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2 distinct USDC-sending wallets&lt;/strong&gt; across the entire ledger — the platform's own canary (its internal test/funding wallet; 159 rows) and one other wallet (5 rows, a single provider's family of "Evidence API" listings).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;27 distinct &lt;code&gt;tx_from&lt;/code&gt; addresses&lt;/strong&gt; that executed those settlements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All 164 rows: &lt;code&gt;tx_from&lt;/code&gt; != &lt;code&gt;usdc_sending_wallet&lt;/code&gt;.&lt;/strong&gt; Every settlement in the snapshot was submitted by an address that was not the wallet the money came from.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, the public ledger is 100% &lt;em&gt;facilitator-mediated&lt;/em&gt;. The payers' USDC is moved on their behalf, and a separate pool of executor addresses signs and submits the transactions. Two wallets' money, twenty-seven executors.&lt;/p&gt;

&lt;p&gt;The top of that executor pool is telling. The single most common &lt;code&gt;tx_from&lt;/code&gt; (&lt;code&gt;0x402feee0…&lt;/code&gt;) submitted 33 of the 164 settlements — and its first six hex digits spell &lt;strong&gt;402fee&lt;/strong&gt;, a one-in-16-million prefix that is almost certainly a vanity: an "x402 fee" address pattern, presumably the x402 stack's own settlement path (see the honesty notes — the vanity read is not a confirmed operator identity). The distribution: one address with 33 rows, one with 20, one with 13, one with 8, five with 7 each, and the remaining 17 addresses split the last 55 rows (four or fewer each). A handful of executors account for most of the volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it means
&lt;/h2&gt;

&lt;p&gt;x402 settlement is not, on this marketplace, a direct wallet-to-wallet hop. It's a &lt;em&gt;facilitator&lt;/em&gt; pattern: a small set of executor addresses (one of them apparently the x402 stack's own) batches and submits payments on behalf of a couple of funding wallets. That has real consequences for anyone reading this kind of public ledger as a demand signal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The payer identity is not in the ledger.&lt;/strong&gt; The &lt;code&gt;usdc_sending_wallet&lt;/code&gt; is a funding wallet, not a buyer. The actual buyer (if any) is one more hop away, behind the facilitator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concentration is in the executors, not the payers.&lt;/strong&gt; Twenty-seven executors, one of them dominant. If that one executor is the platform's own settlement path, then "the marketplace settled 164 payments" is closer to "the marketplace's settlement subsystem fired 164 times."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The ledger measures settlement activity, not buying activity.&lt;/strong&gt; Same honest caveat as the paying-side piece, now from the execution side: what you're counting is how often the rail moved, not how many humans chose to pay.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this makes x402 wrong — the facilitator pattern is a sensible design (gas, batching, custody). It just means the public ledger is a record of &lt;em&gt;who ran the rail&lt;/em&gt;, not &lt;em&gt;who rode it&lt;/em&gt;. Read it that way and it's a clear, honest instrument. &lt;strong&gt;Read it as a demand chart and it will tell you the market is busier than the humans suggest.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Method + honesty notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: the marketplace's public Supabase ledger + Base mainnet (CC BY 4.0). Dated snapshot (as_of 2026-09-14), not a live feed.&lt;/li&gt;
&lt;li&gt;Resolution: for every row we pulled the tx receipt, the USDC Transfer log (the actual sender of the value), and the block timestamp. 164/164 resolved, 0 amount mismatches.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tx_from&lt;/code&gt; is the EVM transaction submitter (&lt;code&gt;eth_getTransactionReceipt.from&lt;/code&gt;); &lt;code&gt;usdc_sending_wallet&lt;/code&gt; is the USDC Transfer-log &lt;code&gt;from&lt;/code&gt;. They differ on every row.&lt;/li&gt;
&lt;li&gt;The most recent settlement at time of writing (a $0.05 call to our own /deep route, 09-15) follows the same pattern — executor &lt;code&gt;0x4c93…0205&lt;/code&gt;, funder the platform canary — so the picture holds on the newest row, not just the snapshot.&lt;/li&gt;
&lt;li&gt;Coinclosures: our own listing is in the dataset (one canary payment row as of the snapshot); the dominant executor &lt;code&gt;0x402feee0…&lt;/code&gt; is &lt;em&gt;presumably&lt;/em&gt; the x402/CDP settlement path — we flag it as a vanity-address read, not a confirmed operator identity.&lt;/li&gt;
&lt;li&gt;The two funding wallets are the platform canary (0x7e6b…2b1c) and one provider wallet (0x171d…); the 5 rows on the second wallet are one provider's five "Evidence API" listings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data (all 164 rows with both addresses + on-chain timestamps) is public and free: &lt;code&gt;GET https://api.pennyforge.org/payapi-market&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>x402</category>
      <category>web3</category>
      <category>crypto</category>
      <category>data</category>
    </item>
    <item>
      <title>Who actually pays on the first x402 marketplace? We checked the chain.</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Tue, 15 Sep 2026 02:58:57 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/who-actually-pays-on-the-first-x402-marketplace-we-checked-the-chain-1ene</link>
      <guid>https://dev.to/pennyforgehq/who-actually-pays-on-the-first-x402-marketplace-we-checked-the-chain-1ene</guid>
      <description>&lt;p&gt;If you build with &lt;a href="https://www.x402.org/" rel="noopener noreferrer"&gt;x402&lt;/a&gt; — the HTTP 402 "payment required" protocol for pay-per-call APIs — you have probably heard of &lt;a href="https://payapi.market" rel="noopener noreferrer"&gt;payapi.market&lt;/a&gt;: the first x402-native marketplace we're aware of. 490 listings submitted — 158 live, 222 rejected after review — and a public settlement ledger the platform itself publishes: every verified payment, with a transaction hash.&lt;/p&gt;

&lt;p&gt;That ledger is one of the clearest public windows into x402 settlement activity right now. So we pulled all 164 rows — $3.47 worth, as of Sept 14 — and asked the one question the dataset can't answer by itself: &lt;strong&gt;who actually paid?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The short version: &lt;strong&gt;98.6% of the settled value — 159 of the 164 payments — came from the platform's own wallet.&lt;/strong&gt; And we think that's mostly a good sign. Here's the full picture, and where we had to walk back our own first read.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data we had
&lt;/h2&gt;

&lt;p&gt;The public ledger rows carry: listing, route, amount, outcome, and a transaction hash. No timestamps. No payer address. Enough to see &lt;em&gt;that&lt;/em&gt; payments happened, not &lt;em&gt;who&lt;/em&gt; did them.&lt;/p&gt;

&lt;p&gt;Every row points at a real transaction on Base, though — so we went to the chain. For each of the 164 hashes we pulled:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;eth_getTransactionReceipt&lt;/code&gt; — who submitted the transaction, and whether it succeeded (all 164 succeeded);&lt;/li&gt;
&lt;li&gt;the USDC &lt;code&gt;Transfer&lt;/code&gt; log inside that receipt — who &lt;em&gt;actually sent the USDC&lt;/em&gt; (topics carry the sender and recipient);&lt;/li&gt;
&lt;li&gt;the block header — when it happened.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;164 out of the 164 resolved. Zero amount mismatches between a ledger row and its on-chain transfer. The reconstruction is complete, and it changes how you should read the dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the chain shows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One wallet did almost everything.&lt;/strong&gt; 159 of the 164 rows ($3.4175 of the $3.4675 total) were paid by a single address: &lt;code&gt;0x7e6b…2b1c&lt;/code&gt;. It appears to be the platform's &lt;em&gt;paid canary&lt;/em&gt; — the system sends a small real payment (the amounts we see range from $0.001 to $0.50) to listings, and the 159 canary payments reached 136 distinct listings. Each one lands in the same public ledger as everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rest is one provider's product family.&lt;/strong&gt; The other 5 rows ($0.05) all come from a second wallet (&lt;code&gt;0x171d…&lt;/code&gt;), and they're not scattered: one payment on each of five sibling "Evidence API" listings — US Business Registry, Building Permits, SEC EDGAR, IRS 990, and Merchant Risk WHOIS. We can't rule out that this is the provider's own wallet testing its listings, but it's the only non-canary activity in the ledger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every settlement is facilitator-mediated.&lt;/strong&gt; In all 164 rows, the transaction submitter is &lt;em&gt;not&lt;/em&gt; the wallet that sent the USDC — 27 distinct submitter addresses in total. The buyer authorizes the payment; a facilitator wallet executes it. That's the standard pattern for this kind of settlement (Coinbase Developer Platform runs it, among others), and it matters for the data: "who paid" only exists in the transfer log, never in the transaction itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The timeline.&lt;/strong&gt; First settlement: May 29. The market launched in late April, so it's roughly four and a half months old — but the ledger only shows activity on 44 of the ~110 days since first settlement, and recent weeks are running 2–9 settlements a day. Early, sparse, real.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read this
&lt;/h2&gt;

&lt;p&gt;The honest caveat, stated plainly: &lt;strong&gt;the public ledger is a record of verification traffic, not proven buyer demand.&lt;/strong&gt; If a buyer pays an x402 endpoint directly — client to provider, no marketplace in the middle — that payment never appears in the ledger at all. (We run our own x402 endpoint and have taken direct payments that no marketplace ledger will ever show.)&lt;/p&gt;

&lt;p&gt;What the ledger &lt;em&gt;is&lt;/em&gt; a good record of: which listings actually settle. "Payment-verified" is a real, on-chain property, and the check can catch real misconfigurations — a $0.01 payment that fails to settle is information no uptime monitor gives you. If you're paying a marketplace-listed API, a verified settlement path is worth something.&lt;/p&gt;

&lt;p&gt;So: early market, the platform doing the walking first, one product family showing the only non-canary use. The canary wallet is the marketplace's own QA, published for anyone to check — more than most marketplaces we've seen publish about their health.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;p&gt;We publish the reconstructed dataset as a free endpoint: every row of the ledger with its on-chain timestamps and the actual USDC-sending wallet, plus the marketplace census — &lt;code&gt;GET /payapi-market&lt;/code&gt; on &lt;a href="https://api.pennyforge.org/payapi-market" rel="noopener noreferrer"&gt;api.pennyforge.org&lt;/a&gt;, dated snapshot, CC BY 4.0. Method and honesty notes are in the file itself. (Every wallet address in it is public on-chain; the two above are truncated for readability and appear in full in the file.)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pennyforge is a one-person studio running a small paid x402 API. Disclosure, plainly: we are one of the listings on the market we're measuring, our listing received one canary payment, and that row is in the 164 we analyzed like any other. Our data, on-chain or otherwise, is yours to check.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>web3</category>
      <category>crypto</category>
      <category>data</category>
    </item>
    <item>
      <title>Tiny unknown USDC transfers: check before you send</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Mon, 14 Sep 2026 01:43:55 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/tiny-unknown-usdc-transfers-check-before-you-send-1opi</link>
      <guid>https://dev.to/pennyforgehq/tiny-unknown-usdc-transfers-check-before-you-send-1opi</guid>
      <description>&lt;p&gt;&lt;em&gt;A note before you read: this one is for people who hold stablecoins, not the developers who usually read this account. If it is useful, send it to someone who makes large transfers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On December 20, 2025, someone followed the standard advice.&lt;/p&gt;

&lt;p&gt;They were about to send a large stablecoin transfer, so they sent a small test first — $50 to the destination address. Twenty-six minutes later they sent the rest — 49,999,950 USDT, about $50 million in total — to a lookalike address the bot had planted minutes earlier. (Blockaid incident report, 2025-12-20.)&lt;/p&gt;

&lt;p&gt;That is address poisoning — an attack aimed precisely at people who follow the standard advice. The victim here was moving USDT; the mechanism does not care which token you are moving. It hits USDC the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the trick works
&lt;/h2&gt;

&lt;p&gt;The attack starts with a tiny unknown transfer. A tiny amount of USDC or USDT lands in your wallet from an address you do not recognize, and you probably glance at it and move on. The address is not random: its first and last characters match an address you deal with regularly — an exchange you withdraw from, a service you pay regularly, a trader you buy coins from directly. The middle, where the difference actually lives, is the part nobody reads: wallets and block explorers — the websites where you look up transactions — usually show only the first and last few characters of an address.&lt;/p&gt;

&lt;p&gt;Days later you make a real transfer. You open your transaction history, find that address, copy it, paste it, confirm. You copied the attacker's. The network confirms the transfer, and from the wallet's perspective everything was normal: no typo, no malware, no phishing site — just a line that looked familiar.&lt;/p&gt;

&lt;p&gt;A fund that lost $2M in USDC this way is a good case study (EIDEX write-up, 2026-08-25): a 0.0002 USDC decoy had been sitting in the fund's own transaction history for about twenty hours, and an operator copied that line — which belonged to somebody else — for the large transfer. The firm had traded with the real counterparty before. Familiarity was the vulnerability.&lt;/p&gt;

&lt;p&gt;The blunt rule from the case write-ups: &lt;strong&gt;your transaction history is for reading, not for copying.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The scale
&lt;/h2&gt;

&lt;p&gt;Blockaid has flagged over 65.4 million address-poisoning transactions on-chain since January 2025 — an average of roughly 160,000 per day across that period. About 316,000 of them were confirmed losses, meaning roughly one in every 200 attempts succeeds.&lt;/p&gt;

&lt;p&gt;It is accelerating. Ethereum's Fusaka upgrade on December 3, 2025 cut transaction fees by about six times, and poisoning attempts jumped from 628,000 in November 2025 to 3.4 million in January 2026 — a 5.5× increase in two months.&lt;/p&gt;

&lt;p&gt;Earlier research gives the baseline: roughly 17 million poisoning attempts against at least 1.3 million users and $79.3 million in losses between July 2022 and June 2024 (as cited by EIDEX). Coin Metrics found that stablecoin dust — tiny, near-worthless transfers sprayed at thousands of wallets — now makes up 10–15% of all Ethereum transactions, up from 3–5% before the upgrade. Cheap dust is a big net.&lt;/p&gt;

&lt;p&gt;In a case Blockaid documented on January 30, 2026, a holder lost 4,556 ETH (about $12.4M) to an address that had been dusting their wallet for more than two months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the test transfer is not enough anymore
&lt;/h2&gt;

&lt;p&gt;The standard advice for a large transfer is to send a small test first and wait for the recipient to confirm receipt. The problem — visible in the $50M case above — is that the attackers found out too. Sophisticated bots watch the network in real time and catch small test transfers as they happen. When they see one, they generate a lookalike address, plant it with a dust transfer, and wait for the follow-up. The defense you were taught got weaponized against the security-conscious.&lt;/p&gt;

&lt;p&gt;So the test transfer still helps — but only if the recipient actually confirms receipt, and the address you send the big transfer to is re-verified against a source that is not your own transaction history.&lt;/p&gt;

&lt;h2&gt;
  
  
  The habit worth building
&lt;/h2&gt;

&lt;p&gt;Case write-ups and Trezor's guidance converge on a short list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Never copy addresses from your own transaction history.&lt;/strong&gt; Treat it as read-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep real addresses in an address book&lt;/strong&gt; — saved once, clearly labeled — and initiate large transfers only from there. Or get the address from the counterparty through a channel you can verify independently — a known email thread, an app you already use, a call to a number you already have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send a small test transfer before the big one&lt;/strong&gt;, and wait for the recipient to confirm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the address through a checker before you send:&lt;/strong&gt; checksum, network, token.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Point 4 is the least familiar step. "Check the address carefully" is not a process — it is a hope. A checker makes it a step: you paste the exact string you are about to send to, and it tells you whether the checksum holds (every address carries a built-in pattern of capital and lower-case letters — change one character and it fails), whether it is on the network you think, and whether the token is what you expect. It cannot tell you the address &lt;em&gt;belongs to&lt;/em&gt; the person you mean to pay — only your address book or the counterparty can do that. A poisoned address is a perfectly valid address: it passes every string check, which is exactly why points 1 to 3 do the heavy lifting. What a checker catches is everything else — a mistyped character, a wrong network, a wrong token, a contract where you expected a wallet — the mistakes a glance never will.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we use
&lt;/h2&gt;

&lt;p&gt;We are Pennyforge, a one-person studio that builds small verification tools. Our free check page (sendcheck.surge.sh) does this and a little more: paste an address, and your browser checks the checksum, the network and token, whether the address is a contract (a program) rather than a wallet, and its balance data — then gives you a verdict with a line on what to do next. Three free checks a day, no login. There is also a share-link format that carries the address in the URL, so you can send a "check this" link and the recipient's browser runs a fresh check at no cost — the link is a pointer to re-verification, not a saved result.&lt;/p&gt;

&lt;p&gt;It is not a replacement for an address book. It is the step between "I think this is right" and "I sent it."&lt;/p&gt;

&lt;p&gt;The tiny unknown transfer sitting in your history is a signal, not noise. It is someone paying almost nothing to live in your wallet for a long time. Check before you send the big one — from your address book, not your history.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blockaid — &lt;em&gt;Address poisoning: the growing threat draining millions from crypto users&lt;/em&gt; (2025–26 tracking data): &lt;a href="https://blockaid.io/blog/address-poisoning-the-growing-threat-draining-millions-from-crypto-users" rel="noopener noreferrer"&gt;https://blockaid.io/blog/address-poisoning-the-growing-threat-draining-millions-from-crypto-users&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Blockaid incident — $50M USDT, December 20, 2025: &lt;a href="https://docs.blockaid.io/docs/security-incidents/address-poisoning-50m-usdt-dec-20-2025" rel="noopener noreferrer"&gt;https://docs.blockaid.io/docs/security-incidents/address-poisoning-50m-usdt-dec-20-2025&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Blockaid incident — 4,556 ETH (≈$12.4M), January 30, 2026: &lt;a href="https://docs.blockaid.io/docs/security-incidents/12m-address-poisoning-jan-30-2026" rel="noopener noreferrer"&gt;https://docs.blockaid.io/docs/security-incidents/12m-address-poisoning-jan-30-2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;EIDEX — &lt;em&gt;How address poisoning cost one firm $2 million&lt;/em&gt; (2026-08-25): &lt;a href="https://eidex.io/blog/address-poisoning" rel="noopener noreferrer"&gt;https://eidex.io/blog/address-poisoning&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Trezor — &lt;em&gt;What are address poisoning attacks and how to avoid them&lt;/em&gt;: &lt;a href="https://trezor.io/support/troubleshooting/coins-tokens/what-are-address-poisoning-attacks-and-how-to-avoid-them" rel="noopener noreferrer"&gt;https://trezor.io/support/troubleshooting/coins-tokens/what-are-address-poisoning-attacks-and-how-to-avoid-them&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>crypto</category>
      <category>security</category>
      <category>usdc</category>
      <category>web3</category>
    </item>
    <item>
      <title>I counted every payment on the first x402 marketplace — $3.42, 93% of it the platform's own tests</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Sun, 13 Sep 2026 15:17:10 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/i-counted-every-payment-on-the-first-x402-marketplace-342-93-of-it-the-platforms-own-tests-1nj5</link>
      <guid>https://dev.to/pennyforgehq/i-counted-every-payment-on-the-first-x402-marketplace-342-93-of-it-the-platforms-own-tests-1nj5</guid>
      <description>&lt;p&gt;&lt;em&gt;The four-rail series measured what actually settles on x402: Base carries essentially all of it. Then an x402-native marketplace launched — free listings, 100% of settlement to the provider, a "verified" badge enforced by a real payment from the platform's own wallet. So I pulled the whole marketplace out of its public database and counted.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The marketplace in one number
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;$3.42.&lt;/strong&gt; That is the entire settlement volume of the first x402-native marketplace — every payment, across all of its history as visible in its own public ledger, measured on 2026-09-13.&lt;/p&gt;

&lt;p&gt;156 settlements. $3.4225 USDC. 136 distinct listings with at least one row.&lt;/p&gt;

&lt;p&gt;I'm not doing a press-release roundup. The platform — payapi.market — ships its own public Supabase tables, reachable with the anon key embedded in its JavaScript bundle. Two tables: &lt;code&gt;x402_ledger_public&lt;/code&gt;, a complete public settlement ledger (amount, listing, outcome, route, tx hash per row), and &lt;code&gt;api_listings&lt;/code&gt;, the full listing table. I pulled both in full, no filters, and aggregated locally. The whole census is in a dated, CC BY 4.0 data file — &lt;code&gt;GET https://api.pennyforge.org/payapi-market&lt;/code&gt; — so none of the numbers below are only in this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually on the marketplace
&lt;/h2&gt;

&lt;p&gt;The listing table says more than the marketing does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;477 total listings&lt;/strong&gt; submitted in the marketplace's life: &lt;strong&gt;153 live, 100 pending review, 222 rejected, 2 paused&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;139 listings carry the payment-verified flag&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;the oldest listing was created &lt;strong&gt;2026-04-25&lt;/strong&gt; — the marketplace is roughly four and a half months old, not the two weeks its launch energy suggests&lt;/li&gt;
&lt;li&gt;top categories by listing count: Data (166), Tools (124), Verification (69), Finance (62), Intelligence (56)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For reference: our SendCheck listing was submitted 2026-09-12, passed auto-triage, and sits in that 100-deep review queue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ledger, settlement by settlement
&lt;/h2&gt;

&lt;p&gt;156 rows. A few facts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total volume&lt;/td&gt;
&lt;td&gt;$3.4225&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median settlement&lt;/td&gt;
&lt;td&gt;$0.01 (62 of 156 rows are exactly $0.01)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90th percentile&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Largest single settlement&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outcome distribution&lt;/td&gt;
&lt;td&gt;PRODUCT 154 / ERROR 1 / STUB 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;93% of listings (127 of 136) have exactly one row.&lt;/strong&gt; That is not coincidence — it is the platform's own "paid canary" mechanics: when a listing passes human review, the platform sends a small real USDC payment from its own wallet to the provider's payTo address, records it in the same public ledger, and stamps the verified badge. Every verified listing therefore contributes at least one canary-class row. The majority of this ledger is the platform testing itself, not customers paying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nine listings show repeated payments.&lt;/strong&gt; These are the first signs of actual usage:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Listing&lt;/th&gt;
&lt;th&gt;Settlements&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent Utility Network (AveDaris)&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kurage FX Brain&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;$0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sirenic&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;$0.511&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pogo-tb.nl (Dutch open data)&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;$0.014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kristo Intelligence (DeFi)&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;$0.011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognilode (ticket resale)&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brazil CNPJ Business Verification&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;$0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zFinia (accessibility)&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;$0.002&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AGENTUM (Brazilian taxes)&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things stand out. First, the dollar volume is concentrated: &lt;strong&gt;Kurage and Sirenic alone are $1.21 — a third of the marketplace's entire history.&lt;/strong&gt; Second, AveDaris's six settlements are all $0.01 — either a genuine repeat micro-payer or someone exercising the endpoint; the public ledger doesn't say (rows carry no timestamps and no payer address).&lt;/p&gt;

&lt;p&gt;Velocity, for what it's worth: between my 09-12 pull and the 09-13 pull, the ledger grew by &lt;strong&gt;5 rows and $0.034&lt;/strong&gt;. That's the current speed of x402 marketplace commerce.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this tells you
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The rails are real, the demand is a trickle.&lt;/strong&gt; The marketplace has been live ~4.5 months with 153 verified-ish listings and $3.42 of all-time visible settlement. On the Base chain alone, the x402 services we measured in the four-rail series settle thousands of dollars a month with no marketplace in between. Marketplaces are not where x402 volume currently lives.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The canary badge is a trust mechanism, not a revenue signal.&lt;/strong&gt; One payment from the platform's wallet proves the payTo address works — that is genuinely useful (it's a paid handshake, not a checkbox), but if 93% of the ledger is canaries, the badge and the demand are different things.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Directory economics vs. marketplace economics.&lt;/strong&gt; Directories (x402-list, x402scan, the MCP registries) cost $0–$1 and take weeks. Marketplaces promise distribution and take a cut of nothing (100% to provider) — but at $3.42 of all-time volume, the "marketplace" part is still the product of the platform's own test wallet more than of buyers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;222 of 477 listings were rejected&lt;/strong&gt; — nearly half. Whatever their auto-triage crawls for, it is strict.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Honest caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The public ledger rows carry &lt;strong&gt;no timestamps&lt;/strong&gt; — the table could be windowed or pruned, so $3.42 is a floor on all-time volume, not a precise window total.&lt;/li&gt;
&lt;li&gt;"Canary class" = listings with exactly one row. It matches the documented mechanics, but it's a heuristic, not a column in their table.&lt;/li&gt;
&lt;li&gt;The "first x402-native marketplace" claim is theirs. What I verified: it is the only x402-native marketplace with a public settlement ledger we could measure.&lt;/li&gt;
&lt;li&gt;Ledger rows reference listings by name (a string), not by ID.&lt;/li&gt;
&lt;li&gt;Their MCP Registry description (same day) said "147 live APIs / 130 settlement-verified"; I measured 153 live rows / 139 payment-verified. The numbers move between pulls — that's normal for a live marketplace.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where we sit
&lt;/h2&gt;

&lt;p&gt;Our own listing (SendCheck, $0.01 per check / $0.05 deep scan, USDC on Base) is in their human-review queue. If it lands, their canary becomes the first payment from another company's wallet to ours — the first external revenue this studio has ever expected. The ledger is public, so you can watch for it: a new row with listing "SendCheck" would be the whole story in one line.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The data: &lt;code&gt;GET https://api.pennyforge.org/payapi-market&lt;/code&gt; (CC BY 4.0, dated snapshot, all raw tables re-pullable from their public Supabase). Method + honesty notes inside the file.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;We're Pennyforge, a one-person studio building SendCheck — pre-send address verification sold per-call over x402. Numbers measured 2026-09-13; the file is dated, not a live feed.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>I counted USDC payments to every published Polygon x402 wallet: $28.48 in 30 days</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Fri, 11 Sep 2026 19:23:41 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/i-counted-usdc-payments-to-every-published-polygon-x402-wallet-2848-in-30-days-dfp</link>
      <guid>https://dev.to/pennyforgehq/i-counted-usdc-payments-to-every-published-polygon-x402-wallet-2848-in-30-days-dfp</guid>
      <description>&lt;h1&gt;
  
  
  I counted USDC payments to every published Polygon x402 wallet: $28.48 in 30 days
&lt;/h1&gt;

&lt;p&gt;In the x402 directory census I published on 2026-09-09 (680 services, payment counts per rail), &lt;strong&gt;Polygon was the value odd-one-out&lt;/strong&gt; — 1,540 measured transactions at ~$0.72 each, roughly 9-14× the per-transaction value of Base or Solana. "Fewer services, but the ones there are doing real money."&lt;/p&gt;

&lt;p&gt;That was the directory's number, measured through its own settlement index. This week I did to Polygon what I'd just done to Solana and Arbitrum: I crawled the live discovery document of every one of the &lt;strong&gt;55 Polygon-declaring services&lt;/strong&gt;, extracted every payment address they actually publish, and read the chain for 30 days.&lt;/p&gt;

&lt;p&gt;The declared wallets moved almost nothing &lt;em&gt;on Polygon&lt;/em&gt; — and the money shows up where the wallets actually live: Base.&lt;/p&gt;

&lt;h2&gt;
  
  
  The method
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Fresh pull of the directory on 2026-09-11: &lt;strong&gt;685 services, 55 of them declaring &lt;code&gt;eip155:137&lt;/code&gt; (Polygon)&lt;/strong&gt; — the same 55 count the census saw two days earlier.&lt;/li&gt;
&lt;li&gt;Live &lt;code&gt;GET /.well-known/x402&lt;/code&gt; for all 55: &lt;strong&gt;42 reachable&lt;/strong&gt; (13 offline).&lt;/li&gt;
&lt;li&gt;Of the 42 readable live docs, &lt;strong&gt;17 still declare Polygon in the doc itself&lt;/strong&gt;. The other 25 carry the claim in the directory listing only — the directory field outlived the doc, same pattern as Arbitrum.&lt;/li&gt;
&lt;li&gt;13 of those 17 publish a wallet, which resolve to &lt;strong&gt;8 distinct USDC payment addresses&lt;/strong&gt; (the six-service Japanese API family shares one wallet, and four services publish Polygon-routed &lt;code&gt;payTo&lt;/code&gt; entries per route). The other 4 of the 17 publish no wallet at all.&lt;/li&gt;
&lt;li&gt;30-day USDC inflow per address on Polygon, native USDC contract (&lt;code&gt;0x3c49…3359&lt;/code&gt;, "USD Coin", verified on-chain — more on why that matters below), block-timestamp-anchored window ending 2026-09-11.&lt;/li&gt;
&lt;li&gt;Same 8 addresses, same window, on &lt;strong&gt;Base&lt;/strong&gt; as a control. (An RPC footnote: every &lt;em&gt;public&lt;/em&gt; Base RPC — publicnode, drpc, mainnet.base.org — started gating &lt;code&gt;eth_getLogs&lt;/code&gt; on the morning I measured, having served the Arbitrum pass fine the day before. The control ran on a free tenderly public endpoint with a 1,000-block read window, 1,297 windows per address, 0 errors.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One catch: my first pass measured the &lt;strong&gt;bridged&lt;/strong&gt; USDC.e token (&lt;code&gt;0x2791…174&lt;/code&gt;), which reads &lt;code&gt;symbol() = "USDC"&lt;/code&gt; just like the native one. All 8 addresses showed zero. The services' own docs name the &lt;strong&gt;native&lt;/strong&gt; contract — so I re-ran the whole pass against &lt;code&gt;0x3c49…3359&lt;/code&gt;. The lesson: on Polygon there are two "USDC" tokens with the same &lt;code&gt;symbol()&lt;/code&gt;, so verify the token the &lt;em&gt;document&lt;/em&gt; names, not the address you recognize.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cascade
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;55 services declare Polygon in the directory
  → 42 live discovery docs reachable (13 offline)
    → 17 of the 42 still declare Polygon in the live doc
    → 8 distinct USDC payment addresses published
      → 2 of the 8 received any USDC on Polygon in 30 days:
        8 tx / $28.48 total (one wallet: 7 tx / $28.43;
        the other: 1 tx / $0.05)
      → 0 tx / $0 on the bridged USDC.e token, all 8 addresses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's actually in the wallets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;sean-claude-van-damme-s-general-store&lt;/code&gt;&lt;/strong&gt; — a general store selling over x402, 62 Polygon-routed payTo entries in its doc (it declares Ethereum mainnet, Gnosis, and Polygon among them). &lt;strong&gt;7 inflow transactions, $28.43 USDC, from 2 senders, over 30 days.&lt;/strong&gt; Real, small, genuine merchant volume — the whole story of declared Polygon settlement is basically this one store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;deskcrew&lt;/code&gt;&lt;/strong&gt; — declares Polygon, Gnosis, Arbitrum, and others behind one global wallet. &lt;strong&gt;1 transaction, $0.05.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The other six addresses: exactly zero.&lt;/strong&gt; That includes &lt;strong&gt;khotem-cryptographic-witness (25 Polygon-routed payTo entries in its doc)&lt;/strong&gt; and &lt;strong&gt;saylor-innovations-watchdog-token-intelligence (26)&lt;/strong&gt; — two of the heaviest Polygon footprints in the whole directory — plus x402-extract-api, arch-tools, kr-crypto-intelligence, and a six-service Japanese API family (japan-address, japan-diet, japan-furigana, japan-holiday, japan-transit, japan-weather) that shares one wallet between all of them. Route count in the doc and dollars on the rail are not the same metric.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the directory's $1,115 went
&lt;/h2&gt;

&lt;p&gt;The census's directory measurement said Polygon did &lt;strong&gt;$1,115 across 1,540 transactions in 30 days&lt;/strong&gt;. My declared-wallet measurement says &lt;strong&gt;$28.48 across 8 transactions&lt;/strong&gt;. The gap — about $1,087, or 97% of the rail's measured volume — did not land in any wallet these services publish. Three mechanisms, each observed in the docs themselves this run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wallets the docs never publish.&lt;/strong&gt; 4 of the 17 live declarers ship a doc with no payTo address at all: agentbit declares &lt;code&gt;"mode": "facilitator"&lt;/code&gt; outright, anchor-x402 runs an &lt;em&gt;in-process&lt;/em&gt; facilitator, and two more put their payment details in per-resource docs off the root path. No published address = an unmeasurable wallet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A different token on the same chain.&lt;/strong&gt; anchor-x402's Polygon rail is &lt;strong&gt;JPYC&lt;/strong&gt; — the doc calls it "First FSA-licensed Japanese yen stablecoin", 18 decimals — not USDC at all. The doc ships its own FX disclaimer: prices are fixed yen tiers with no oracle, and the doc notes a recent drift of ~+27% against spot. Any USDC-only measurement is blind to a rail like that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multichain declarations.&lt;/strong&gt; Most of the 17 list Polygon as one of four or five chains, and six of the eight published wallets were active on Base in the same window.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The control makes the mechanism concrete. Same 8 wallets, same 30-day window, &lt;strong&gt;Base&lt;/strong&gt;: &lt;strong&gt;1,549 transactions, $1,265.43 — six of the eight wallets are active.&lt;/strong&gt; The general store that moved $28.43 on Polygon moved &lt;strong&gt;$1,228.42 (195 tx, 17 senders)&lt;/strong&gt; on Base. deskcrew's wallet: $25.23 across 542 micro-transactions (38 senders). kr-crypto: 534 micro-transactions averaging $0.003. The six-service Japanese API family's shared wallet: $0.47 across 169 transactions. khotem — 25 Polygon-routed payTo entries in its doc — moved $7.96 on Base. Only two of the eight wallets are quiet on &lt;em&gt;both&lt;/em&gt; chains: x402-extract, and saylor, the other big Polygon-routed declarer.&lt;/p&gt;

&lt;p&gt;One number I didn't expect: the directory's Polygon figure ($1,115, window ending 2026-09-09) and what the same eight wallets collected &lt;strong&gt;on Base&lt;/strong&gt; ($1,265.43, of which $1,228.42 is the one general store) are within 15% of each other. It may be coincidence — the directory's window ends two days earlier, it measured 15 services rather than eight wallets, and its index is facilitator-level. From the outside I can't tell whether its "Polygon" column tracks declared rail or settled rail. The proximity is a fact either way; it's worth sitting with.&lt;/p&gt;

&lt;p&gt;So the gap is not "dead wallets" — it's &lt;strong&gt;chain selection&lt;/strong&gt;. The declared Polygon rail collects a trickle; the same services' declared wallets collect the real volume on Base, where their buyers actually pay.&lt;/p&gt;

&lt;p&gt;Polygon is the same story as Arbitrum and Solana, at a different scale: &lt;strong&gt;declaration is marketing, settlement is a number, and the number for declared wallets is $28.48.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  All four rails, one snapshot
&lt;/h2&gt;

&lt;p&gt;Same directory pull (2026-09-11 01:14 UTC), same declared-wallet method, 30-day windows ending within a day of each other (Solana 09-10, Arbitrum and Polygon 09-11):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rail&lt;/th&gt;
&lt;th&gt;Directory declares&lt;/th&gt;
&lt;th&gt;Live docs still declaring&lt;/th&gt;
&lt;th&gt;Declared wallets measured&lt;/th&gt;
&lt;th&gt;30d USDC to declared wallets&lt;/th&gt;
&lt;th&gt;Directory-measured 30d&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;657&lt;/td&gt;
&lt;td&gt;(not crawled in this series)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$2,190 / 27,213 tx (169 services)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solana&lt;/td&gt;
&lt;td&gt;236&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;46 (15 active)&lt;/td&gt;
&lt;td&gt;$12.84 / 204 tx&lt;/td&gt;
&lt;td&gt;$1,830 / 36,320 tx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polygon&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;8 (2 active)&lt;/td&gt;
&lt;td&gt;$28.48 / 8 tx&lt;/td&gt;
&lt;td&gt;$1,115 / 1,540 tx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arbitrum&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;6 (1 active)&lt;/td&gt;
&lt;td&gt;$11.28 / 187 tx&lt;/td&gt;
&lt;td&gt;$0 (census: unmeasured)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read it twice: the two totals don't reconcile on any rail. On Solana and Polygon, 97-99% of the directory's measured volume never touches a published wallet; on Arbitrum it's inverted — $11.28 into the wallets, $0 in the directory. Base is the control case: nobody's directory number and wallet number need to differ there, because Base &lt;em&gt;is&lt;/em&gt; where everyone settles (the eight Polygon wallets above included — their Base flow, same window, is the data file's &lt;code&gt;base_control&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you sell over x402
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A chain in your &lt;code&gt;networks&lt;/code&gt; array is a promise you have to fund.&lt;/strong&gt; 17 services still list Polygon live; 6 of the 8 wallets those services publish never received a cent of Polygon USDC in 30 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If your facilitator holds the wallet, publish it anyway&lt;/strong&gt; (or say so). An unpublished wallet is an unmeasurable wallet, and "unmeasurable" currently reads as "zero."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native vs bridged USDC is a live distinction on Polygon.&lt;/strong&gt; Two "USDC" tokens coexist on the chain, both report &lt;code&gt;symbol() = "USDC"&lt;/code&gt;, and our declared-wallet flow sat entirely on the native contract (&lt;code&gt;0x3c49…3359&lt;/code&gt;) with zero on USDC.e. If you declare one and settle in the other, your audit trail splits across two contracts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data
&lt;/h2&gt;

&lt;p&gt;Full per-address table (Polygon + Base control), the USDC.e secondary pass, method, and caveats as a dated CC BY 4.0 snapshot: &lt;strong&gt;GET &lt;a href="https://api.pennyforge.org/polygon-rail" rel="noopener noreferrer"&gt;https://api.pennyforge.org/polygon-rail&lt;/a&gt;&lt;/strong&gt; — the fourth rail file, alongside &lt;a href="https://dev.to/pennyforgehq/i-measured-every-x402-wallet-that-claims-arbitrum-1128-in-30-days-h82"&gt;the Arbitrum rail&lt;/a&gt; and &lt;a href="https://dev.to/pennyforgehq/i-counted-the-payments-behind-every-solana-x402-address-1284-in-30-days-3af4"&gt;the Solana rail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And now all four rails in one dated file: the cross-rail comparison table — per-rail numbers pulled verbatim from the three files above, Base-control ratios computed, nothing hand-typed: &lt;strong&gt;GET &lt;a href="https://api.pennyforge.org/rails" rel="noopener noreferrer"&gt;https://api.pennyforge.org/rails&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Caveats, stated plainly: addresses are the ones &lt;em&gt;currently&lt;/em&gt; published — a wallet rotated in the last 30 days is missed, and 13 of the 55 docs were unreachable, so this is a floor. Native USDC + USDC.e only — DAI, bridged variants, or non-USDC settlement are invisible to this pass. All totals are computed on unrounded amounts; the per-wallet figures shown are rounded to the cent. And $28.48 is a 30-day fact, not a verdict: the rail can start tomorrow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pennyforge is a one-person studio selling address verification over x402. This measurement cost $0 in public RPCs and one afternoon. Raw docs, crawl scripts, and both token addresses are kept with the data file.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>I measured every x402 wallet that claims Arbitrum: $11.28 in 30 days</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Fri, 11 Sep 2026 06:42:40 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/i-measured-every-x402-wallet-that-claims-arbitrum-1128-in-30-days-h82</link>
      <guid>https://dev.to/pennyforgehq/i-measured-every-x402-wallet-that-claims-arbitrum-1128-in-30-days-h82</guid>
      <description>&lt;p&gt;Two days ago I published the full x402 directory census: 680 services, and a payment count per rail. Three rails came back with numbers: Solana, Base, Polygon. The fourth — Arbitrum — came back as &lt;em&gt;40 declared, 0 measured&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The working assumption was a blind spot: the directory measures settlements through facilitator indices, so maybe Arbitrum was just invisible to it. This time I did the same thing I did for Solana: I crawled the live discovery document of every one of the 40 Arbitrum-declaring services I could reach, extracted every payment address they actually publish, and read the chain for 30 days.&lt;/p&gt;

&lt;p&gt;The wallets moved almost nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The method
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Fresh pull of the directory on 2026-09-11: &lt;strong&gt;685 services&lt;/strong&gt; (up from 680 two days ago). &lt;strong&gt;40 declare &lt;code&gt;eip155:42161&lt;/code&gt; (Arbitrum One)&lt;/strong&gt; in their directory listing.&lt;/li&gt;
&lt;li&gt;Live &lt;code&gt;GET /.well-known/x402&lt;/code&gt; for all 40: &lt;strong&gt;28 reachable&lt;/strong&gt; (the other 12 are offline or degraded in the directory too).&lt;/li&gt;
&lt;li&gt;Parsed every payment address in the 28 readable docs — across all the doc shapes I've seen (v1 routes, v2 resources with accepts, top-level payTo, per-chain &lt;code&gt;payToByNetwork&lt;/code&gt; tables, facilitator-mode envelopes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 distinct EVM payment addresses&lt;/strong&gt; are published across the 28 readable docs.&lt;/li&gt;
&lt;li&gt;30-day USDC inflow per address on &lt;strong&gt;Arbitrum One&lt;/strong&gt;: the native Circle USDC contract (&lt;code&gt;0xaf88…5831&lt;/code&gt;, "USD Coin", the one the docs themselves name), read as Transfer logs on public RPCs, block-timestamp-anchored window &lt;strong&gt;2026-08-12 → 2026-09-11&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Same six addresses, same window, on &lt;strong&gt;Base&lt;/strong&gt; as a control (USDC &lt;code&gt;0x8335…02913&lt;/code&gt;, via the Blockscout API).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One catch worth flagging: my first pass used a wrong USDC address (a lookalike &lt;code&gt;0xaf88…7526&lt;/code&gt; that has no deployed code), which would have read as zero for everyone. The address above is the one the services' own docs declare, verified on-chain before I trusted a single number.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cascade
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40 services declare Arbitrum in the directory
  → 28 live discovery docs reachable (12 offline)
    → 6 of the 28 still declare Arbitrum in the live doc
      (3 of those 6 publish no wallet at all)
    → 6 distinct EVM payment addresses published across the 28 readable docs
      → 1 of the 6 received any USDC on Arbitrum in 30 days:
        187 tx / $11.28 — all from agent402-tools, whose own live doc
        no longer declares Arbitrum
        (the 3 wallets the live docs DO map to Arbitrum: $0)
        (the same 6 received $1,325.14 on Base in the same 30 days)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;$11.28 is the entire 30-day Arbitrum inflow to every wallet these services publish. For scale, the same six wallets received &lt;strong&gt;5,992 USDC inflow transactions worth $1,325.14 on Base&lt;/strong&gt; over the same window — scvd.store's wallet took 185 tx / $1,212.41 from 16 distinct senders, the agent402-tools wallet took 5,786 tx / $112.56 from 128, and the rest (21 tx / $0.17) went to one more.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six live docs, spelled out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3 services (agentbit, edge-agents-ai, onchainpulse)&lt;/strong&gt; declare Arbitrum but publish &lt;strong&gt;no wallet at all&lt;/strong&gt; in the doc — agentbit's payment mode is literally &lt;code&gt;facilitator&lt;/code&gt;, so the receiving wallet lives with the payment processor, not in the file. The other two omit the wallet the same way; there's no on-chain address to measure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 services publish wallets that the live doc maps to Arbitrum&lt;/strong&gt;: &lt;strong&gt;saylor-innovations-watchdog-token-intelligence&lt;/strong&gt; maps one address to every chain in a &lt;code&gt;payToByNetwork&lt;/code&gt; table; &lt;strong&gt;scvd.store&lt;/strong&gt; and &lt;strong&gt;x402-extract-api&lt;/strong&gt; declare four or more EVM chains and publish &lt;strong&gt;one global wallet&lt;/strong&gt; that would receive on any of them. All three, measured on Arbitrum: &lt;strong&gt;exactly zero&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The remaining &lt;strong&gt;22 readable docs&lt;/strong&gt; carry Arbitrum in the &lt;strong&gt;directory listing only&lt;/strong&gt;. The live doc either names no network at all or names a different set. The directory claim is older than the doc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The $11.28 did not come from any of those six. It came from &lt;strong&gt;agent402-tools&lt;/strong&gt; — one of the docs whose live version no longer declares Arbitrum at all. 187 transactions from 4 distinct senders, all in the window. The directory still lists it as an Arbitrum claimant; its own doc quietly dropped the chain. That's the whole story of Arbitrum x402 settlement to declared wallets: one wallet that stopped declaring, and it moved eleven dollars.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why $11.28 is the finding
&lt;/h2&gt;

&lt;p&gt;The directory's "0 measured" for Arbitrum is mostly right, in the most literal sense. Unlike Solana — a real blind spot, where my declared-wallet measurement found $12.84 of activity the directory couldn't see — there's almost no hidden activity to find here. Three mechanisms, each verified:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stale declarations.&lt;/strong&gt; Only 6 of 28 readable live docs still claim Arbitrum. The directory's network field outlives the doc — and the one wallet that did move is attached to a doc that already gave up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilitator-held wallets.&lt;/strong&gt; When the processor holds the wallet, the "declared address" doesn't exist as a measurable on-chain address at all — the same no-payTo pattern I found on Solana, in facilitator clothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The money settles elsewhere.&lt;/strong&gt; &lt;a href="https://bitquery.io/investigations/x402-ai-agent-payments-audit" rel="noopener noreferrer"&gt;Bitquery's August 2026 x402 audit&lt;/a&gt; found that &lt;strong&gt;97.5% of Arbitrum's measured x402 volume runs through one bridge contract&lt;/strong&gt; (Circle's CCTP bridge extension, &lt;code&gt;CctpExtension&lt;/code&gt; — 34,577 distinct payers, median $749, one $10M payment) — settlement that never touches a service's declared wallet. Take that contract out and the chain moved $317M, not $2.59B.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Declaring a chain is marketing. Settling on a chain is a number. On Arbitrum, the number for declared wallets is $11.28 in 30 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you sell over x402
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The rail you claim is a product decision, not a checkbox.&lt;/strong&gt; Six of the forty claimants still have a live doc that matches the directory. If an agent's payment path routes to "eip155:42161" and your declared wallet has never received on that chain, you're advertising a route.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If your facilitator holds the wallet, say so in the doc.&lt;/strong&gt; A &lt;code&gt;payTo&lt;/code&gt; you can't publish is a wallet the directory and the auditor can't see — and right now "can't see" reads as "doesn't exist".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base is still the settlement default.&lt;/strong&gt; Every wallet with real x402 volume in this pass settled on Base ($1,325.14) — a hundred times the Arbitrum total. Per the audit, Arbitrum's measured x402 dollars are one bridge contract, not a merchant rail.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data
&lt;/h2&gt;

&lt;p&gt;Full per-address table (both chains), method, and caveats as a dated CC BY 4.0 snapshot: &lt;strong&gt;GET &lt;a href="https://api.pennyforge.org/arbitrum-rail" rel="noopener noreferrer"&gt;https://api.pennyforge.org/arbitrum-rail&lt;/a&gt;&lt;/strong&gt; (same pattern as the Solana rail file: &lt;a href="https://api.pennyforge.org/solana-rail" rel="noopener noreferrer"&gt;https://api.pennyforge.org/solana-rail&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Caveats, stated plainly: addresses are the ones &lt;em&gt;currently&lt;/em&gt; published — a service that rotated its wallet in the last 30 days is missed, and 12 of the 40 docs were unreachable, so this is a floor. Native USDC only — bridged USDC.e or a USDT/DAI settlement would be invisible to this pass. And $11.28 is a 30-day fact, not a verdict on the chain: the rail can start tomorrow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pennyforge is a one-person studio selling address verification over x402. This measurement cost $0 in public RPCs and one afternoon. Raw docs, crawl scripts, and the corrected token address are kept with the data file.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>I counted the payments behind every Solana x402 address: $12.84 in 30 days</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Thu, 10 Sep 2026 19:06:43 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/i-counted-the-payments-behind-every-solana-x402-address-1284-in-30-days-3af4</link>
      <guid>https://dev.to/pennyforgehq/i-counted-the-payments-behind-every-solana-x402-address-1284-in-30-days-3af4</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/pennyforgehq/i-pulled-all-680-x402-services-and-counted-the-payments-solana-does-74-of-the-measured-1d4h"&gt;the census&lt;/a&gt; I found that Solana does 74% of the measured x402 transactions — with one uncomfortable footnote: the directory's own measurement doesn't reach most of the services that declare Solana. 148 of the 236. This post attaches an on-chain number to that blind spot: every Solana &lt;code&gt;payTo&lt;/code&gt; address that is declared in a live discovery document, and what it actually received in the last 30 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did
&lt;/h2&gt;

&lt;p&gt;On 2026-09-10 (11:4x–12:2x UTC) I fetched the live &lt;code&gt;/.well-known/x402&lt;/code&gt; discovery document of each of the 236 services that declare Solana support in the directory. From each doc I parsed every declared Solana &lt;code&gt;payTo&lt;/code&gt; address — across the four different doc shapes that are actually in use (below) — and for each distinct address I counted 30 days of on-chain activity on Solana mainnet: total transactions, and USDC/USDT inflow, read directly from the chain with no facilitator index and no paid API in between — via the two public keyless RPCs left for the chain.&lt;/p&gt;

&lt;p&gt;Every number below comes from that one dated crawl. The full per-address table, method and caveats are a CC BY 4.0 data file: &lt;a href="https://api.pennyforge.org/solana-rail" rel="noopener noreferrer"&gt;&lt;code&gt;api.pennyforge.org/solana-rail&lt;/code&gt;&lt;/a&gt;. (Every fetch is logged — same instrument as the census digest, so I'll know if anyone actually reads it.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The cascade
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Services declaring Solana in the directory (09-09 pull)&lt;/td&gt;
&lt;td&gt;236&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whose live discovery doc was reachable on 09-10&lt;/td&gt;
&lt;td&gt;181&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;…of which still declare Solana in their live doc&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distinct Solana &lt;code&gt;payTo&lt;/code&gt; addresses declared by them&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;…of which structurally invalid (unqueryable)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;…with &lt;strong&gt;zero&lt;/strong&gt; 30-day transactions&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;…with 30-day on-chain activity&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total 30-day transactions to those 15 addresses&lt;/td&gt;
&lt;td&gt;204&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDC inflow to those addresses, 30 days&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$12.84&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only 70 of the 236 services — 30% — still declare Solana in a live, readable discovery document. 55 (23%) can't be reached at the well-known path at all. Another 111 (47%) respond, but their live docs make no mention of Solana at all. The 70 share 46 payout addresses — one address serves six MAMETA &lt;code&gt;japan-*&lt;/code&gt; services, all with zero 30-day traffic. And of the 46 addresses that are live and valid, 30 have seen no transaction in a month. The 15 that did move took in $12.84 of USDC across 29 inflow transactions in 30 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 15 addresses that actually saw money
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;30d tx&lt;/th&gt;
&lt;th&gt;USDC inflow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;402signal&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xfuel&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;$2.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;madeonsol&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;$2.68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;suverse (freight position data)&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;$1.27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stacktree&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;$1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;insider-radar telemetry&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;witness&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 other services&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;$0.0002&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Rows rounded to cents; the total is computed at full precision ($12.8405). Exact per-address values are in the data file. Two of the 29 inflow transactions belong to the bottom eight rows.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;All 204 transactions were parsed individually — no sampling. 29 of them carried USDC inflow to a declared address; the rest were outflows, internal moves, and token activity I didn't denominate (I tracked USDC and USDT only — USDT inflow to the 46 addresses was 0.00).&lt;/p&gt;

&lt;h2&gt;
  
  
  A 25-byte address, shipping as valid
&lt;/h2&gt;

&lt;p&gt;Solana addresses are raw base58: no checksum. On Base, a typo fails the EIP-55 check and a validating tool catches it. On Solana, a typo just &lt;em&gt;looks&lt;/em&gt; like an address. One of the 46 declared addresses — kr-crypto-intelligence, &lt;code&gt;raKj7ZGoPy1fWw1vfynuJhyHirpcmUMBhP&lt;/code&gt; — decodes to &lt;strong&gt;25 bytes&lt;/strong&gt;. A Solana public key is 32. The RPC rejects it outright (&lt;code&gt;WrongSize&lt;/code&gt;): a correct client fails before it signs, a sloppy one that zero-pads would strand funds in an account nobody can spend from. Either way, nothing reaches the service — and nobody's validation pipeline caught it, because base58 has nothing to validate against. Not a malicious rotation, just a silently-broken address in a discovery doc.&lt;/p&gt;

&lt;h2&gt;
  
  
  The invisible 60%
&lt;/h2&gt;

&lt;p&gt;Here is where the two measurements meet, and it's the sharpest finding of the exercise.&lt;/p&gt;

&lt;p&gt;The directory's Solana 30-day figure is $1,830 across 36,320 transactions. In the census I noted that one service — &lt;code&gt;sniperx-x402&lt;/code&gt; — accounts for 21,698 of those transactions, ~60% of the rail's measured transaction count, on a rotating address fleet. So when I crawled the live docs, I specifically looked for it.&lt;/p&gt;

&lt;p&gt;It wasn't there. Its discovery doc failed to fetch during the crawl. I re-probed it three times on 09-10 around 16:1x UTC, from my datacenter vantage: &lt;code&gt;/.well-known/x402&lt;/code&gt; returns a &lt;strong&gt;404&lt;/strong&gt; — a Next.js app page, no discovery document. And the directory's own live row for the service, read the same afternoon, says: status &lt;code&gt;online&lt;/code&gt;, 24h uptime 100%, &lt;code&gt;traction: unmeasured-network&lt;/code&gt; — volume, transaction count, buyer count, all &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Whether that 404 is a deliberate removal, a deploy accident, or a stale listing URL, I can't tell from outside. What I can say: at the address both systems use to find the service, the biggest measured contributor to "Solana does 74%" was invisible for the hours I watched — to the discovery crawl and to the directory's own index.&lt;/p&gt;

&lt;p&gt;And sniperx is not the whole story. I joined my 15 active addresses against the directory's live traction rows: &lt;strong&gt;10 of the 15 services with real on-chain activity at a declared Solana address are currently &lt;code&gt;unmeasured-network&lt;/code&gt;&lt;/strong&gt; in the directory — xfuel, stacktree, minifetch, relayshield, suverse, insider-radar, bykaranteli, agent402-tools, trustboost, vibes-coded — and two more (madeonsol, saylor-innovations) are &lt;code&gt;measured&lt;/code&gt; at exactly 0.00. The gap between the two numbers isn't one service. It's the default state of this rail.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read the two numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$12.84 / 204 tx&lt;/strong&gt; = the floor, defined precisely: USDC &lt;em&gt;verifiably received&lt;/em&gt; at addresses that declare Solana in live docs on 09-10, read straight off-chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$1,830 / 36,320 tx&lt;/strong&gt; = the ceiling of the directory's index: what its facilitators observed over the window — including addresses that have since rotated out of every live doc, and one service whose doc is now a 404.&lt;/li&gt;
&lt;li&gt;The gap is made of three nameable things: &lt;strong&gt;address rotation&lt;/strong&gt; (no checksum, so a rotated address can't be caught by format checks), &lt;strong&gt;55 unreachable services&lt;/strong&gt;, and &lt;strong&gt;666 &lt;code&gt;accepts&lt;/code&gt; entries&lt;/strong&gt; across the 181 readable docs that deliberately carry no &lt;code&gt;payTo&lt;/code&gt; — the x402 v2 stance that a stale address in a file is worse than no address at all, with authoritative terms deferred to the live 402 response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One caveat cuts against my own framing: on-chain inflow to a declared address isn't proof of an x402 settlement — a service's own smoke test, or an unrelated transfer to the same address, lands in the same bucket. So $12.84 is a floor for "USDC verifiably received at addresses that declare Solana today," not for "x402 revenue." The directory's $1,830 is the mirror image: it certifies the protocol side, but only for flows its facilitators touch. Neither number strictly bounds the other's blind spots — that's the point. What's hard is the ratio: the two most-cited measurements of the same nominal rail sit ~140× apart, and every term of that gap is accounted for — one rotating fleet (~60% of their transactions), 55 unreachable docs, 111 silent undeclares, 666 deferred accepts.&lt;/p&gt;

&lt;p&gt;The split also changes the shape of the story. The &lt;strong&gt;upper end&lt;/strong&gt; of the range is mostly one fleet — ~60% of the directory's measured Solana transactions — and as of this afternoon that fleet is visible to neither measurement. The &lt;strong&gt;floor&lt;/strong&gt; is different: 15 addresses, no single one above 39% of inflow, the largest $5.00. Whatever organic micro-demand exists on this rail is spread thin and real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parsing doubles what you can see
&lt;/h2&gt;

&lt;p&gt;The 148 "unmeasurable" services from the census are not an exotic edge case — a large part of the 236→70 collapse is machinery, not mystery. The live docs come in at least four shapes: v1 &lt;code&gt;routes[]&lt;/code&gt; with per-route &lt;code&gt;payTo&lt;/code&gt;; v2 &lt;code&gt;resources[].accepts[]&lt;/code&gt; where &lt;code&gt;payTo&lt;/code&gt; is optional; v1-style &lt;code&gt;resources&lt;/code&gt; as URL strings; and a custom MAMETA-style shape with &lt;code&gt;networks[]&lt;/code&gt; + &lt;code&gt;pay_to&lt;/code&gt; + &lt;code&gt;endpoints[].accepts[]&lt;/code&gt;, with the version as the string &lt;code&gt;"2.0.0"&lt;/code&gt;. A census that parses only the v1 shape finds 33 Solana-declaring services; reading all four shapes finds 70 — 2.1× the services, zero extra infrastructure. Fair caveat: v2's &lt;code&gt;payTo&lt;/code&gt;-optional design is a newer protocol generation doing what it's designed to do, not a misformat. The bigger losses are the 55 unreachable docs and the 111 that quietly stopped declaring — parsing recovers a third of what the crawl lost, not all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you build on it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The drift risk is now quantified, and it sits on the rail without the checksum.&lt;/strong&gt; A third of the declaring set is unreachable or undeclaring, 30 of the 46 distinct addresses have no 30-day traffic, and one confirmed-broken address is shipping as valid. If your agent pays any Solana x402 address, decode the base58 to 32 bytes before you sign — that check costs nothing and catches kr-crypto-intelligence today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quote the rail as a range, not a number.&lt;/strong&gt; "Solana does $X in x402" is unanswerable without stating which lens: declared-today-and-received (floor) or facilitator-window (ceiling). The two sit ~140× apart right now, and the join above shows which services each lens sees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My own gap, honestly stated:&lt;/strong&gt; my free pre-check (&lt;a href="https://api.pennyforge.org/validate" rel="noopener noreferrer"&gt;&lt;code&gt;/validate&lt;/code&gt;&lt;/a&gt;) is EVM-only — it doesn't decode base58 yet. The rail with the highest measured drift exposure is exactly the one my checker doesn't cover yet. If you're paying into a base58 address, the decode check is on you for now.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Method &amp;amp; caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Directory pull: &lt;code&gt;x402-list.com/api/v1/services&lt;/code&gt; (680 rows), 2026-09-09; 236 declare &lt;code&gt;solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp&lt;/code&gt; in &lt;code&gt;networks_caip2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Live doc crawl: 2026-09-10 11:4x–12:2x UTC, all 236, single datacenter egress (55 fetch/parse-fails include anti-bot challenge pages; one snapshot — treat reachability as "as of that window"); 181 reachable, including re-checks.&lt;/li&gt;
&lt;li&gt;Chain: Solana mainnet, &lt;code&gt;solana-rpc.publicnode.com&lt;/code&gt; + &lt;code&gt;api.mainnet-beta.solana.com&lt;/code&gt; (the two keyless public RPCs left; both Cloudflare-rate-limited — backoff + a second-chance pass, per-transaction results saved at crawl time). Window 2026-08-11 → 2026-09-10. USDC mint &lt;code&gt;EPjF…Dt1v&lt;/code&gt;, USDT mint &lt;code&gt;Es9v…wNYB9&lt;/code&gt;; inflow = per-transaction post-minus-pre token-balance delta for the address. 204/204 transactions parsed, 0 unparsed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower bound, by construction:&lt;/strong&gt; I can only see addresses that are declared &lt;em&gt;on 09-10&lt;/em&gt;. A service that rotated its payTo away during the window paid into addresses I never counted. The two windows are also offset by design: the directory's measurement covers its own 30-day index window, not mine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v2 caveat:&lt;/strong&gt; 666 Solana &lt;code&gt;accepts&lt;/code&gt; entries in the 181 readable docs omit &lt;code&gt;payTo&lt;/code&gt; by design — the true declared address set is larger than 46.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Certification caveat:&lt;/strong&gt; I can't certify x402-ness from outside a settlement — that's the facilitator's job. My number is what's &lt;em&gt;attributable&lt;/em&gt; to the declared addresses; the directory's is what's &lt;em&gt;certified&lt;/em&gt; as x402 settlement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join (the confusion matrix, small but real):&lt;/strong&gt; I matched my 15 active services against the directory's live traction rows (09-10 16:2x UTC). 3 are &lt;code&gt;measured&lt;/code&gt; with volume (402signal $2.06/314 tx, witness $2.04/403 tx, parallax $0.34/11 tx — all multi-network figures; 402signal's Solana-only address read is $5.00, a different cut of the same flows). 2 are &lt;code&gt;measured&lt;/code&gt; at 0 (madeonsol — whose Solana address took in $2.68 in my window — and saylor-innovations). 10 are &lt;code&gt;unmeasured-network&lt;/code&gt; despite real activity.&lt;/li&gt;
&lt;li&gt;One declared address is structurally invalid (25-byte base58, kr-crypto-intelligence) — counted in the 46, verified rejected by RPC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disclosure:&lt;/strong&gt; I run Pennyforge, the address-check API mentioned above. The measurement is independent of it — all 46 addresses were read straight off-chain, and every number is reproducible from the CC BY 4.0 data file without my product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Fourth in a series on measuring the x402 ecosystem: &lt;a href="https://dev.to/pennyforgehq/659-services-001-median-13-verified-a-field-guide-to-the-x402-directories-4lp8"&gt;a field guide to the x402 directories&lt;/a&gt; · &lt;a href="https://dev.to/pennyforgehq/one-x402-service-rotated-its-pay-address-964-times-in-10-days-i-measured-90-days-of-the-drift-feed-3cbp"&gt;90 days of the drift feed&lt;/a&gt; · &lt;a href="https://dev.to/pennyforgehq/i-pulled-all-680-x402-services-and-counted-the-payments-solana-does-74-of-the-measured-1d4h"&gt;the 680-service census&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>I pulled all 680 x402 services and counted the payments: Solana does 74% of the measured transactions</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Wed, 09 Sep 2026 22:53:24 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/i-pulled-all-680-x402-services-and-counted-the-payments-solana-does-74-of-the-measured-1d4h</link>
      <guid>https://dev.to/pennyforgehq/i-pulled-all-680-x402-services-and-counted-the-payments-solana-does-74-of-the-measured-1d4h</guid>
      <description>&lt;p&gt;Everyone keeps saying the x402 economy is booming. I wanted to know where the payments actually settle, so on 2026-09-09 I pulled the full listing of the largest public x402 directory — all 680 services, every field — plus 90 days of their change feed, and counted. Every number below comes from that one dated pull; methodology and caveats are at the bottom.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you're looking at
&lt;/h2&gt;

&lt;p&gt;The directory lists 680 services. 582 are online (86%), 60 offline, 38 degraded. Only 13 of 680 (2%) carry a verification badge.&lt;/p&gt;

&lt;p&gt;The mix: data APIs (283), AI (116), finance (82), verification (76), and a long tail of everything else.&lt;/p&gt;

&lt;p&gt;Pricing is quantized. 235 services charge exactly $0.01, 192 are free, 50 charge $0.02, 48 charge $0.05, 31 charge $0.10, and the median measured settlement is $0.01. x402 was designed for cent-scale machine payments, and the market took that literally.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rails nobody expected
&lt;/h2&gt;

&lt;p&gt;Services declare which chains they settle on in their &lt;code&gt;/.well-known/x402&lt;/code&gt; discovery document. The declarations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rail&lt;/th&gt;
&lt;th&gt;Services declaring it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;647 (95%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solana&lt;/td&gt;
&lt;td&gt;236 (35%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polygon&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arbitrum&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Multi-rail overlap is heavy — declaring two or three chains is normal. But a declaration is a promise. The directory also measures actual on-chain settlements (more on how, below), and the measured 30-day picture looks different:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rail&lt;/th&gt;
&lt;th&gt;Services with 30d volume&lt;/th&gt;
&lt;th&gt;30d volume&lt;/th&gt;
&lt;th&gt;30d transactions&lt;/th&gt;
&lt;th&gt;Per-transaction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;169&lt;/td&gt;
&lt;td&gt;$2,190&lt;/td&gt;
&lt;td&gt;27,213&lt;/td&gt;
&lt;td&gt;~$0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solana&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;$1,830&lt;/td&gt;
&lt;td&gt;36,320&lt;/td&gt;
&lt;td&gt;~$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polygon&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;$1,115&lt;/td&gt;
&lt;td&gt;1,540&lt;/td&gt;
&lt;td&gt;~$0.72&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things jump out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Solana does 74% of all measured x402 transactions&lt;/strong&gt; (36,320 of 48,937 — a measured floor from one directory, and since 307 services sit on unmeasured rails the true split could move in either direction; methodology below) with just 49 of the 172 services that have measured volume — under a third of Base's 169. That's consistent with high-frequency, low-value agent traffic — though with buyer concentration this high (see below), a few fleets could be most of it. One service, &lt;code&gt;sniperx-x402&lt;/code&gt;, alone accounts for 21,698 of Solana's 36,320 measured transactions (~60%); the rest is spread across 75 multi-rail services and a long tail of low-volume Solana-only services. Concentrated, but not a single outlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Polygon is the value odd-one-out.&lt;/strong&gt; 1,540 transactions at ~$0.72 each — roughly 9–14× the per-transaction value of Base or Solana. Fewer services, but the ones there are doing real money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The whole economy is small.&lt;/strong&gt; Counting each service once, measured 30-day volume is about $2,624 — roughly &lt;strong&gt;$87 per day&lt;/strong&gt;. (The per-rail figures above sum to ~$5,100 because 86 services settle on two or more rails and their volume shows up in each rail's view.) And "680 services" is not "680 paying customers": the number of services with at least one measured settlement in the last 30 days is 172. The other 189 of the 361 measurable ones have a confirmed payment address and zero measured volume — a payTo on the wire, no measured traffic yet.&lt;/p&gt;

&lt;p&gt;Arbitrum, the fourth declared rail, doesn't appear in the measured picture at all: 40 declarations, zero measured. Every service with measured volume settles on Base, Solana, or Polygon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most of Solana is invisible
&lt;/h2&gt;

&lt;p&gt;Here's the part that surprised me: the directory can't measure most of Solana.&lt;/p&gt;

&lt;p&gt;307 of the 680 listed services (45%) sit on a rail the directory's measurement doesn't cover — and that includes &lt;strong&gt;148 of the 236 services that declare Solana support (63%)&lt;/strong&gt;. It has no visibility into the bulk of the rail doing most of the measured transactions.&lt;/p&gt;

&lt;p&gt;Why does that matter? x402 drift — a service changing its payment address without telling anyone — is the ecosystem's top trust failure mode. I measured 90 days of it in &lt;a href="https://dev.to/pennyforgehq/one-x402-service-rotated-its-pay-address-964-times-in-10-days-i-measured-90-days-of-the-drift-feed-3cbp"&gt;my previous post&lt;/a&gt;. On Base, an address is 0x-prefixed and EIP-55 checksummed: one character wrong and a validating tool rejects it. Solana addresses are raw base58 — no checksum (Bitcoin's Base58Check adds one): one character wrong and it &lt;em&gt;looks&lt;/em&gt; valid, and the funds are gone. Right now, the rail with the highest drift risk is also the one with the least measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  126 services share a payout address
&lt;/h2&gt;

&lt;p&gt;126 services (19%) settle to an address they share with other listed services. The largest cluster I found: a single payout address shared with 45 other services — a whole family of crypto-risk and market-data feeds, all settling into one wallet.&lt;/p&gt;

&lt;p&gt;That's efficient operations, but it amplifies drift: one address rotation silently breaks dozens of listings at once. Fair coin flip — a shared address is also centralized and cheap to monitor, since watching one wallet covers 46 listings. The asymmetry is in blast radius: one bad rotation breaks all of them at once, and you catch it by watching the payment address, not the website.&lt;/p&gt;

&lt;h2&gt;
  
  
  The drift numbers, fresh
&lt;/h2&gt;

&lt;p&gt;From the 90-day change feed (pulled the same day):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1,086 payment-address (payTo) rotations&lt;/strong&gt; — about 12 per day, from 30 distinct services&lt;/li&gt;
&lt;li&gt;797 price changes&lt;/li&gt;
&lt;li&gt;7,234 schema changes&lt;/li&gt;
&lt;li&gt;9,117 total changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rotations are concentrated — one service alone rotated 964 times in 10 days — but a base rate of ~12 address changes per day across the directory means drift is a standing event, not a rare incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's actually paying
&lt;/h2&gt;

&lt;p&gt;Of the 172 services with measured 30-day volume, &lt;strong&gt;107 (62%) have a single buyer accounting for 80% or more of it.&lt;/strong&gt; The x402 long tail is currently kept alive by a handful of agent fleets and marketplaces poking at the rails. The "thousands of agents paying tiny amounts" future is real — but today it's a small number of wallets doing most of the transactions, and the services serving them can't afford to lose that one buyer to a bad address.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you build on it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Base is still the safe default rail.&lt;/strong&gt; 95% of declarations and the best-measured chain. If your buyer can only pay on one chain, that's it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana is where the transaction volume is.&lt;/strong&gt; If you're building x402 services on Solana, address verification is not a nice-to-have — that's exactly where the checksum-free pain lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check before you pay.&lt;/strong&gt; At $0.01 per transaction, one drift hit costs you more than the check costs. My free pre-check validates the address format and EIP-55 checksum in milliseconds, and the $0.01 paid check adds the live on-chain data (wallet-vs-contract, balances, activity, wrong-network detection):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.pennyforge.org/validate?address=0x&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt;
   &lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="c1"&gt;// v.valid, v.status ("valid" | "mismatch" | "format"), v.normalized&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The census is also a JSON file.&lt;/strong&gt; The same numbers above — the top-50 services by measured 30-day settlements (price percentile, shared-payout and verification fields, 30-day uptime, compliance grade) plus all 30 rotators with their 90-day rotation counts — is a dated, CC BY 4.0 data file (each fetch is logged, which is how I know when someone actually reads it): &lt;a href="https://api.pennyforge.org/diligence" rel="noopener noreferrer"&gt;&lt;code&gt;api.pennyforge.org/diligence&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Method &amp;amp; caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Full pull: &lt;code&gt;x402-list.com/api/v1/services&lt;/code&gt; (all 680 rows), 2026-09-09 ~05:30 UTC. Data: &lt;a href="https://x402-list.com" rel="noopener noreferrer"&gt;x402-list.com&lt;/a&gt; (CC BY 4.0) — the only public directory I found that publishes per-service measured traction (I checked the others; see the &lt;a href="https://dev.to/pennyforgehq/659-services-001-median-13-verified-a-field-guide-to-the-x402-directories-4lp8"&gt;field guide&lt;/a&gt;), which is why this is the source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disclosure:&lt;/strong&gt; I run Pennyforge, the $0.01 address-check API mentioned above. The census is x402-list.com's data (CC BY 4.0) and every number in this post is reproducible without my product.&lt;/li&gt;
&lt;li&gt;"Measured" is the directory's own on-chain settlement measurement. Their stated caveat, kept: a &lt;em&gt;conservative undercount&lt;/em&gt; — only USDC settlements via the facilitators they measure are counted. A measured floor, not an estimate; the true numbers are higher.&lt;/li&gt;
&lt;li&gt;Per-rail figures credit each service's full volume to every rail it settles on (matching how the directory presents per-chain views). The per-service total above de-duplicates the 86 multi-rail services.&lt;/li&gt;
&lt;li&gt;90-day change feed: &lt;code&gt;x402-list.com/api/v1/changes&lt;/code&gt;, pulled 2026-09-09 21:54 UTC.&lt;/li&gt;
&lt;li&gt;Raw pull and re-computation saved by me; the &lt;code&gt;/diligence&lt;/code&gt; file is the dated digest of this census.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Third in a series on measuring the x402 ecosystem: &lt;a href="https://dev.to/pennyforgehq/659-services-001-median-13-verified-a-field-guide-to-the-x402-directories-4lp8"&gt;a field guide to the x402 directories&lt;/a&gt; · &lt;a href="https://dev.to/pennyforgehq/one-x402-service-rotated-its-pay-address-964-times-in-10-days-i-measured-90-days-of-the-drift-feed-3cbp"&gt;90 days of the drift feed&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>One x402 service rotated its pay address 964 times in 10 days. I measured 90 days of the drift feed.</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Sun, 06 Sep 2026 07:35:26 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/one-x402-service-rotated-its-pay-address-964-times-in-10-days-i-measured-90-days-of-the-drift-feed-3cbp</link>
      <guid>https://dev.to/pennyforgehq/one-x402-service-rotated-its-pay-address-964-times-in-10-days-i-measured-90-days-of-the-drift-feed-3cbp</guid>
      <description>&lt;p&gt;The directory the x402-foundation README points to publishes a line I keep coming back to: &lt;em&gt;so an agent can check whether the address it is about to pay still belongs to the service it means to pay.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Good advice. So I pulled that directory's public 90-day change feed and measured what actually happens to settlement addresses on x402. The headline number and the real story are two very different things, and the difference matters if your agent pays any of these services.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the feed
&lt;/h2&gt;

&lt;p&gt;Ninety days, 630 listed services (their daily-updated llms.txt, as of 09-06), 8,000+ recorded changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;6,183 schema changes&lt;/strong&gt; — quiet background noise, endpoints reshuffling their payloads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;747 price changes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1,077 settlement-address (payTo) changes&lt;/strong&gt; — the trust-critical kind&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read "1,077" in isolation and x402 looks like a place where services swap their settlement wallet roughly 12 times a day, across the whole directory. That's the number you'd expect people to quote. It's also about 97% of the wrong shape: 1,046 of the 1,077 events come from two services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two metronomes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;964 of the 1,077 address changes come from a single service: Tavily Search.&lt;/strong&gt; Not gradually — in a burst: July 24, 14:45 UTC to August 4, 07:48 UTC, 257 hours, &lt;strong&gt;one brand-new payTo address every 16 minutes&lt;/strong&gt; — the median gap, to two decimals, is exactly 16.00. 964 distinct addresses. Each one used for exactly one rotation window, then swapped. None ever reused.&lt;/p&gt;

&lt;p&gt;A second service (altahub-vivarium) ran the same pattern on a smaller scale: 82 rotations over ~22 hours, median gap again 16.00 minutes. Two services, one rhythm. That regularity is a metronome, not a coincidence: either a pipeline that mints a fresh settlement wallet on every deploy (a CI cadence of ~16 minutes), or a deliberate stress test of the ecosystem's drift handling. The feed can't tell you intent — and honestly, rotation can be perfectly legitimate address hygiene. The failure mode is on the consumer side: an agent that caches the address.&lt;/p&gt;

&lt;p&gt;What the feed &lt;em&gt;can&lt;/em&gt; tell you: for an agent that cached the payTo from a listing, that service was settling to a &lt;strong&gt;different address every 16 minutes for ten straight days&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The steady state (the part that matters for most services)
&lt;/h2&gt;

&lt;p&gt;Strip out the two burst services and 90 days of x402 settles down to &lt;strong&gt;31 address changes across 22 services&lt;/strong&gt; — a few per week, almost all one-time events. Of those, 17 services rotated exactly once; one apparent repeat (synthora, same change recorded on consecutive days) is a duplicate scan, not a second rotation. The ecosystem is calmer than the headline — that's the point I'd want you to keep.&lt;/p&gt;

&lt;p&gt;1,068 of the 1,077 events were clean swaps: the old address removed and the new one added in the same observation. And it's not a single-chain story — the directory tags Tavily's network as &lt;code&gt;aws:base&lt;/code&gt;, altahub's as plain Base (eip155:8453), and other rotations touch Solana and Algorand endpoints. Base-family tags (&lt;code&gt;eip155:8453&lt;/code&gt; + &lt;code&gt;aws:base&lt;/code&gt;) account for 83% of the old-address snapshot rows I counted.&lt;/p&gt;

&lt;p&gt;So the honest version of the headline:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;3.8% of listed services (24 of 630) changed their settlement address at least once in 90 days. Most of them did it once. Two of them did it in a blur.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What this means if your agent pays x402 services
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don't hardcode payTo from a listing.&lt;/strong&gt; The discovery document exists to be re-fetched at payment time. The address in yesterday's scrape is a promise, not a fact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"I verified it yesterday" is a weak defense.&lt;/strong&gt; Inside a burst window, an address verified at 09:00 was dead by 09:16. Verification decays at the cadence of the service's deploys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong address = social recovery, not on-chain recovery.&lt;/strong&gt; USDC sent to a stranger's wallet is still USDC — it just isn't yours anymore. Recovering it is an email thread with someone who may not have your API on their keychain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata drift is constant; settlement drift is rare.&lt;/strong&gt; 8,000 changes across 630 services in 90 days — but almost all of it is schemas and prices. If your integration assumes the service card you cached is current, you're already behind on the metadata long before you'd notice anything about the money.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What a pre-payment check should actually cover
&lt;/h2&gt;

&lt;p&gt;The bar is low: &lt;strong&gt;is the token the token you expect (exact address, correct version), is the network the network you expect, is the payTo the address you expected, is the price sane?&lt;/strong&gt; That's four comparisons before you sign a transfer. Nothing exotic — just the difference between "the API told me what to pay" and "I verified what I'm about to sign."&lt;/p&gt;

&lt;p&gt;This is the class of bug that hurts — the $0.10 payment that lands in the wrong wallet is also the $1,000 payment that will. So we built SendCheck to do exactly these checks: a free checksum pre-check (&lt;code&gt;/validate&lt;/code&gt;), a $0.01 check of token + network + payTo (&lt;code&gt;/check&lt;/code&gt;), and a $0.05 deep check that adds schema and example validation (&lt;code&gt;/deep&lt;/code&gt;). No account, no API key — the x402 payment is the auth. It's a small tool, and the drift data is why it exists: &lt;a href="https://sendcheck.surge.sh" rel="noopener noreferrer"&gt;sendcheck.surge.sh&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method and caveats
&lt;/h2&gt;

&lt;p&gt;Source: &lt;code&gt;https://x402-list.com/api/v1/changes&lt;/code&gt; (90-day window). Their API serves the full feed — fetched 09-06, filtered to &lt;code&gt;type=payto_changed&lt;/code&gt;, all 44 pages (25 events/page, the last page returns 2 rows), and the oldest payTo event (2026-07-24) sits comfortably inside the window, so the series is complete, not truncated. Their own llms.txt independently states the same 1,077 payTo rotations. Three caveats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scanner-observed, not ground truth.&lt;/strong&gt; The feed records what the directory's scanner saw in discovery documents, not what the service intended.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate observations exist.&lt;/strong&gt; One service's single address change was recorded twice, on consecutive days — the scanner re-observed an endpoint that was still changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burst intent is unknown.&lt;/strong&gt; Tavily's and altahub's metronome could be deploys, a load test, or a wallet-rotation policy. If someone from either service wants to correct the story, the data's right there — re-run the query and compare.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Data: x402-list.com /api/v1/changes (CC BY 4.0, &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;creativecommons.org/licenses/by/4.0/&lt;/a&gt;), filtered and aggregated by me.&lt;/p&gt;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>659 services, $0.01 median, 13 verified: a field guide to the x402 directories</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Sat, 05 Sep 2026 17:08:45 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/659-services-001-median-13-verified-a-field-guide-to-the-x402-directories-4lp8</link>
      <guid>https://dev.to/pennyforgehq/659-services-001-median-13-verified-a-field-guide-to-the-x402-directories-4lp8</guid>
      <description>&lt;p&gt;Last month I shipped a small paid API over x402 — a $0.01 address-check for USDC transfers, settled on Base. Since then I've spent more time in the &lt;em&gt;directories&lt;/em&gt; than anywhere else, because that's where the question "how do people find a service?" actually lives.&lt;/p&gt;

&lt;p&gt;So I did the boring thing: pulled the data and counted. Everything below was measured on &lt;strong&gt;September 5, 2026&lt;/strong&gt; from the directory APIs themselves (x402-list's data is CC BY 4.0 — credited in the links). Here's the landscape of where x402 services live, what it costs to be on the shelf, and what the numbers say about where demand actually is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers first
&lt;/h2&gt;

&lt;p&gt;From x402-list's own monitoring (their state page, regenerated hourly):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;659 services&lt;/strong&gt; listed as accepting x402 — 568 answering, 91 offline, 29 offline for 30+ days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;592 are payment-ready&lt;/strong&gt; (answer a valid 402 challenge), but only &lt;strong&gt;13 are delivery-verified&lt;/strong&gt; — i.e., someone actually paid and got the product. That's ~2%.&lt;/li&gt;
&lt;li&gt;Growth is real: &lt;strong&gt;+84 services in 7 days, +225 in 30 days&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Average uptime: 86.7% on the latest daily rollup, 92.8% over 30 days.&lt;/li&gt;
&lt;li&gt;On-chain settlement volume they can measure across 37 tracked facilitators: &lt;strong&gt;$1.22M over 30 days&lt;/strong&gt; across ~14M settlements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My own pull of the full service list (630 rows, their API) adds a few slices their headline doesn't show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base is 95%&lt;/strong&gt; of listings (598 services), Solana the distant second (223). If you're choosing one rail in 2026, the directory data says USDC-on-Base.&lt;/li&gt;
&lt;li&gt;Pricing: &lt;strong&gt;median $0.01&lt;/strong&gt;. 41% of services are &lt;em&gt;below&lt;/em&gt; $0.01, 46% sit in $0.01–$0.10, and only 12% price above $0.10. Exactly one service is free.&lt;/li&gt;
&lt;li&gt;Sources: 472 services self-submitted, 155 imported from the Coinbase CDP Bazaar, 3 from x402scan. The directories are beginning to trade inventory with each other.&lt;/li&gt;
&lt;li&gt;Categories: Data (278), AI (110), Finance (82), Verification (66) — "check something for me" is the dominant job agents are paying for.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The concentration caveat (from the same directory's state data): the top handful of services take the large majority of measured volume, and one single service accounts for roughly 82% of it — driven by a small number of repeat buyers. The long tail, where most of the 659 live, has real calls but thin money.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shelf: who runs the directories
&lt;/h2&gt;

&lt;p&gt;The x402 README names the community-maintained options. I've now looked at each with a service to list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;x402scan.com&lt;/strong&gt; — indexes on-chain settlements (Bitquery + a CDP BigQuery sync). If your settlements go &lt;em&gt;through&lt;/em&gt; the Coinbase CDP facilitator, you appear automatically. Otherwise you self-register for free: expose an &lt;code&gt;openapi.json&lt;/code&gt; with x402 payment info, sign a Sign-In-With-X challenge with your receiving wallet, done. Their paid search API is a separate, small charge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;x402-list.com&lt;/strong&gt; — the one with the monitoring depth above. Submission goes through their &lt;strong&gt;paid x402 API&lt;/strong&gt; ($1 free-hosting fee for non-CDP domains, settled over x402 itself), then human review. The public read API is free and CC BY — which is how this post exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;agentic.market&lt;/strong&gt; (Coinbase's agentic marketplace) — a &lt;strong&gt;CDP-catalog-only index&lt;/strong&gt;. I verified this the hard way: domains with PayAI-settled services get zero hits there, while CDP-catalog domains all show up. One Coinbase API key gets you onto the shelf.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ampersend&lt;/strong&gt; (app.ampersend.ai/discover) — the new one in the README. I pulled its marketplace API today: 55 services, all Base/USDC, and &lt;em&gt;every&lt;/em&gt; listing sourced from the CDP catalog. So same key as above — it's the CDP shelf wearing a control-plane hat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pay.sh&lt;/strong&gt; — a directory with its own pay-gateway architecture; fits cleanly only if your settlement path matches theirs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub awesome-lists&lt;/strong&gt; — free PRs, slow merges, but the links outlive everything else.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pattern is unavoidable: &lt;strong&gt;CDP is the chokepoint of the curated shelves.&lt;/strong&gt; Get a facilitator key from Coinbase and three directories (agentic.market, Ampersend, plus the x402scan /all view, which only shows CDP-settled sellers) light up at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned building one
&lt;/h2&gt;

&lt;p&gt;SendCheck's x402 endpoint settles at $0.01/check and $0.05/deep, with a free &lt;code&gt;/validate&lt;/code&gt; pre-check (don't make agents pay for a malformed address). Practical notes from three weeks in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;openapi.json&lt;/code&gt; is the discovery file.&lt;/strong&gt; At least one major directory fetches &lt;em&gt;only&lt;/em&gt; that — not the older &lt;code&gt;/.well-known/x402&lt;/code&gt; card. Keep both, but treat OpenAPI as the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment &lt;em&gt;is&lt;/em&gt; the authentication.&lt;/strong&gt; No API keys, no accounts, no rate-limit tiers to sell. That's the whole product pitch — and the whole pricing pitch, since you can price a single request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilitator fees eat micro-prices.&lt;/strong&gt; CDP settles at $0.001/tx — fine, but that's 10% of a $0.01 ticket. Pick your facilitator on economics, not just on shelf access, and price accordingly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Directories are discovery, not distribution.&lt;/strong&gt; Being listed is table stakes. The calls that matter come from the protocol community (Slack, dev.to, X) reading that you exist and trusting that you answer the 402 honestly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification is the differentiator.&lt;/strong&gt; With only 13 of 659 services delivery-verified, "we paid for it and it worked" is the rarest claim on the shelf.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you're listing a service this month
&lt;/h2&gt;

&lt;p&gt;The zero-spend path, in order: (1) put a correct &lt;code&gt;openapi.json&lt;/code&gt; on your API, (2) self-register with x402scan via SIWX, (3) open the free PRs to the awesome-lists, (4) tell the x402 Slack / builders channels. The one-click path: get a CDP facilitator key from Coinbase — that single key unlocks the CDP catalog, agentic.market, Ampersend, and x402scan's sellers view. The paid path: x402-list's $1 submission, which buys the most rigorous monitoring of the lot.&lt;/p&gt;

&lt;p&gt;The median price on the shelf is a nickel's cousin. The standard is young, the rails are settling (Base/USDC, x402 under the Linux Foundation since July), and the directories are where the next few years of agent commerce will get discovered. Get listed, answer the 402 fast, and let the payment itself do the marketing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;SendCheck's paid x402 endpoint: $0.01/check, $0.05/deep, free pre-check — &lt;a href="https://sendcheck-x402.pennyforge.workers.dev" rel="noopener noreferrer"&gt;the API&lt;/a&gt; · &lt;a href="https://www.x402scan.com/server/5536db97-5cbc-42d0-8107-150f3263c7a4" rel="noopener noreferrer"&gt;listed on x402scan&lt;/a&gt; · &lt;a href="https://pennyforge.xyz" rel="noopener noreferrer"&gt;the human-facing checker&lt;/a&gt;. Data: &lt;a href="https://x402-list.com/state-of-x402" rel="noopener noreferrer"&gt;x402-list (CC BY 4.0)&lt;/a&gt;, ampersend marketplace API, own measurements 2026-09-05.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>stablecoins</category>
      <category>showdev</category>
      <category>crypto</category>
      <category>api</category>
    </item>
    <item>
      <title>Our $0.01 API hung for three days — the culprit was a GET request</title>
      <dc:creator>Pennyforge</dc:creator>
      <pubDate>Thu, 03 Sep 2026 04:38:34 +0000</pubDate>
      <link>https://dev.to/pennyforgehq/our-001-api-hung-for-three-days-the-culprit-was-a-get-request-4gal</link>
      <guid>https://dev.to/pennyforgehq/our-001-api-hung-for-three-days-the-culprit-was-a-get-request-4gal</guid>
      <description>&lt;p&gt;We run a small paid API endpoint: &lt;a href="https://sendcheck.surge.sh" rel="noopener noreferrer"&gt;SendCheck&lt;/a&gt;, a pre-send verification service for EVM addresses, exposed over the &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402&lt;/a&gt; protocol (HTTP 402 + USDC on Base) at &lt;strong&gt;$0.01 per check&lt;/strong&gt;. For three days, its paid routes would intermittently hang forever — no error, no timeout, no log line. Free routes on the &lt;em&gt;same isolate&lt;/em&gt; stayed fast the whole time.&lt;/p&gt;

&lt;p&gt;This post is two things: the war story (because the root cause is a genuine trap for anyone running x402 on Cloudflare Workers), and the API itself (because it's live, and a curl away).&lt;/p&gt;

&lt;h2&gt;
  
  
  The symptom pattern
&lt;/h2&gt;

&lt;p&gt;The shape of our Worker is the common one — free discovery/health endpoints plus paid routes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;paymentMiddlewareFromHTTPServer&lt;/span&gt;&lt;span class="p"&gt;(...));&lt;/span&gt;  &lt;span class="c1"&gt;// paid&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SendCheck x402 API&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;           &lt;span class="c1"&gt;// free&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/.well-known/x402&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...);&lt;/span&gt;                         &lt;span class="c1"&gt;// free discovery doc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What we saw in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Right after a deploy, paid routes answered &lt;code&gt;402 Payment Required&lt;/code&gt; in under a second. Our smoke tests passed.&lt;/li&gt;
&lt;li&gt;Minutes to hours later, paid POSTs would &lt;strong&gt;hang indefinitely&lt;/strong&gt; (verified past 45 seconds). The client just... waits.&lt;/li&gt;
&lt;li&gt;Simultaneously, free routes on the same isolate answered in ~100ms.&lt;/li&gt;
&lt;li&gt;A manual &lt;code&gt;fetch()&lt;/code&gt; from inside the Worker to the facilitator's &lt;code&gt;/supported&lt;/code&gt; endpoint returned in ~90-300ms — the network was fine.&lt;/li&gt;
&lt;li&gt;It never reproduced locally. &lt;code&gt;wrangler dev&lt;/code&gt; was always green.&lt;/li&gt;
&lt;li&gt;Re-deploying "fixed" it. For a while.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've debugged anything like this, you know the feeling: every probe says healthy, every real customer call says dead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The microscope
&lt;/h2&gt;

&lt;p&gt;The breakthrough came from wrapping the middleware's internals with breadcrumbs and watching &lt;code&gt;wrangler tail&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;x402HTTPResourceServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;httpServer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;init#1 start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="nf"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;init#1 done&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;init#1 fail&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;processHTTPRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proc#1 start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;processHTTPRequest&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nf"&gt;dbg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proc#1 done&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a wedged isolate, the tail looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET  /.well-known/x402 - Ok          ← free route, returns immediately
  (log) [x402dbg] init#1 start       ← handshake started under THIS request
  (log)                               ← ...no "done", ever
POST /check           - Canceled     ← later paid requests: no proc logs at all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The init handshake started, and never finished. Paid requests never even reached &lt;code&gt;processHTTPRequest&lt;/code&gt; — they were stuck earlier, waiting on a promise that would never settle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The root cause: workerd cancels work when the request context ends
&lt;/h2&gt;

&lt;p&gt;In &lt;code&gt;@x402/hono&lt;/code&gt; (v2.24.0 at time of writing), &lt;code&gt;paymentMiddlewareFromHTTPServer&lt;/code&gt; fires the facilitator handshake at &lt;strong&gt;middleware construction time&lt;/strong&gt; — with &lt;code&gt;syncFacilitatorOnStart = true&lt;/code&gt;, the default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;syncFacilitatorOnStart&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isInitialized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;initializeHttpServer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// not awaited; promise memoized in initPromise&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Middleware construction happens lazily inside the Worker's &lt;code&gt;fetch()&lt;/code&gt; handler. So that handshake &lt;code&gt;fetch()&lt;/code&gt; runs under &lt;strong&gt;whichever request first lands on a cold isolate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And in workerd, when a request finishes, everything still pending under its context — in-flight fetches, timers, all of it — gets cancelled.&lt;/p&gt;

&lt;p&gt;Now it clicks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A crawler (or a curious human) hits &lt;code&gt;/.well-known/x402&lt;/code&gt; or &lt;code&gt;robots.txt&lt;/code&gt; or any 404 — a short free GET that returns immediately.&lt;/li&gt;
&lt;li&gt;That request is the isolate's first. Middleware construction starts the facilitator handshake under it.&lt;/li&gt;
&lt;li&gt;The GET returns; workerd cancels the in-flight &lt;code&gt;/supported&lt;/code&gt; fetch.&lt;/li&gt;
&lt;li&gt;The memoized &lt;code&gt;initPromise&lt;/code&gt; &lt;strong&gt;stays pending forever&lt;/strong&gt;. No rejection, no error, nothing to catch.&lt;/li&gt;
&lt;li&gt;Every later paid request on that isolate does &lt;code&gt;await initPromise&lt;/code&gt; → infinite hang.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;No timeout saves you.&lt;/strong&gt; &lt;code&gt;AbortSignal.timeout&lt;/code&gt; and any &lt;code&gt;setTimeout&lt;/code&gt; race are cancelled with the same request context. That's why the hang showed no timeout ever firing. (A timeout guard around &lt;code&gt;await initPromise&lt;/code&gt; on the paid request only converts the infinite hang into a timeout error — the init was started under a context that is already dead. The repair has to keep the init's own context alive.)&lt;/p&gt;

&lt;p&gt;Free routes never await init, so they stay fast. A cold isolate whose first request is a paid POST works fine, because that request's context stays alive through init. Hence the maddening pattern: &lt;strong&gt;works after deploy (your smoke test is a POST), wedges minutes later (a crawler GET got there first).&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Keep the first request's context alive until the construction-time init settles, via &lt;code&gt;ctx.waitUntil&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;initPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// captured from the wrapped initialize()&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                        &lt;span class="c1"&gt;// init starts here&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initPromise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initPromise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With that in place, we ran a 12-minute adversarial loop — short free GETs interleaved with paid POSTs, the exact poison scenario — plus real paid round-trips at 0 and ~90 minutes after deploy. Clean, every time. Paid calls now answer &lt;code&gt;402&lt;/code&gt; in ~0.4s and complete the full pay→200 cycle in ~1.3-2.1s.&lt;/p&gt;

&lt;p&gt;One thing that is &lt;strong&gt;not&lt;/strong&gt; a fix: setting &lt;code&gt;syncFacilitatorOnStart = false&lt;/code&gt;. The middleware then never awaits initialization at all, and &lt;code&gt;processHTTPRequest&lt;/code&gt; fails with "no supported payment kinds" — a 500 on every paid route. (Yes, we shipped that for two minutes. Our test suite caught it. Run your tests before you deploy, not after.)&lt;/p&gt;

&lt;p&gt;If you run x402 on Workers with &lt;em&gt;any&lt;/em&gt; free GET route — and the quickstart's shape gives you several — you likely have this bug. We'd love to see it fixed upstream; until then, the &lt;code&gt;waitUntil&lt;/code&gt; pattern above is a complete workaround.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API itself
&lt;/h2&gt;

&lt;p&gt;SendCheck answers one question before you send funds: &lt;strong&gt;is this address what I think it is?&lt;/strong&gt; You give it an address and a chain; it returns a verdict with the on-chain facts behind it — EIP-55 checksum validation, wallet-vs-contract detection (is that "wallet" actually a smart contract?), outgoing activity, native + USDC balances, and a plain-language verdict.&lt;/p&gt;

&lt;p&gt;The base endpoint is &lt;code&gt;$0.01&lt;/code&gt; per check; the deep scan (&lt;code&gt;$0.05&lt;/code&gt;) runs the same verification across all five chains (Base, Ethereum, Arbitrum, Optimism, Polygon) including wrong-network detection.&lt;/p&gt;

&lt;p&gt;Here's the whole flow. A plain POST gets you the 402:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://sendcheck-x402.pennyforge.workers.dev/check &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"address":"0x9504A5939AB5be2B2B1F8beA7D7ebeCcd96c485D","chain":"base"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;HTTP/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;402&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;payment-required:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;eyJ&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;NDAyVmVyc&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;lvbiI&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="err"&gt;Miwi...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;payment-required&lt;/code&gt; header is base64; decoded, it's a machine-readable challenge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"x402Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Payment required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://sendcheck-x402.pennyforge.workers.dev/check"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SendCheck: pre-send verification of any EVM address on one chain (EIP-55 checksum, wallet-vs-contract, outgoing activity, balances, verdict). POST {address, chain}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mimeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serviceName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sendcheck"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"evm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"crypto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"security"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usdc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"address-verification"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accepts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eip155:8453"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"asset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x9504A5939AB5be2B2B1F8beA7D7ebeCcd96c485D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"maxTimeoutSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extra"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD Coin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the x402 client stack, payment is a wrapper around &lt;code&gt;fetch&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;wrapFetchWithPayment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x402Client&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@x402/fetch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ExactEvmScheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toClientEvmSigner&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@x402/evm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;x402Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eip155:8453&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExactEvmScheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toClientEvmSigner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchWithPay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wrapFetchWithPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchWithPay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://sendcheck-x402.pennyforge.workers.dev/check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0x9504…485D&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wrapper intercepts the 402, reads the challenge, signs an EIP-3009 transfer for exactly &lt;code&gt;$0.01&lt;/code&gt; of USDC on Base, replays the request with the payment header, and hands you the real response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"headline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Looks good — safe to send"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sendcheck"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;205&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key to provision, no account to create, no invoice to chase. The request &lt;em&gt;is&lt;/em&gt; the payment. That's the whole reason we built on x402: for a $0.01 call, every other billing stack (cards, invoicing, subscriptions) costs more to operate than the product earns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;p&gt;We'd rather over-disclose than oversell:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's a sanity check, not a guarantee.&lt;/strong&gt; The verdict summarizes on-chain facts at call time: checksum validity, contract-vs-wallet, activity, balances. It will not tell you the &lt;em&gt;purpose&lt;/em&gt; behind an address, and it doesn't do ML risk scoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/check&lt;/code&gt; is single-chain by design.&lt;/strong&gt; Give it the chain you actually care about; use &lt;code&gt;/deep&lt;/code&gt; for cross-chain and wrong-network detection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The facilitator settles on Base.&lt;/strong&gt; Payments are exact USDC amounts on Base mainnet; settlement takes a few seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Young service.&lt;/strong&gt; The verification engine has been live as a free web tool (&lt;a href="https://sendcheck.surge.sh" rel="noopener noreferrer"&gt;sendcheck.surge.sh&lt;/a&gt;) for a few weeks with a full test suite; the paid API went live this week. If anything looks off, the free web tool shows the same engine's output — you can cross-check us for $0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price is honest about scale.&lt;/strong&gt; $0.01 buys a verification, not insurance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you have a Base wallet with a little USDC, the whole flow above is copy-pasteable — first payment included. And if you're building on x402 on Cloudflare Workers, go check your free routes right now: hit them, then try a paid call. If it hangs, the &lt;code&gt;waitUntil&lt;/code&gt; fix above is yours.&lt;/p&gt;

&lt;p&gt;We're a small studio — feedback, bug reports, and "this verdict was wrong" mails all get read.&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>api</category>
      <category>showdev</category>
      <category>crypto</category>
    </item>
  </channel>
</rss>
