<?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: Frits Zwager </title>
    <description>The latest articles on DEV Community by Frits Zwager  (@fizzl13).</description>
    <link>https://dev.to/fizzl13</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%2F4191113%2Fde1df810-8e9f-44dc-b60d-5edc143ade4c.png</url>
      <title>DEV Community: Frits Zwager </title>
      <link>https://dev.to/fizzl13</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fizzl13"/>
    <language>en</language>
    <item>
      <title>The seven most common x402 seller mistakes, and how to fix them</title>
      <dc:creator>Frits Zwager </dc:creator>
      <pubDate>Sun, 18 Oct 2026 20:29:55 +0000</pubDate>
      <link>https://dev.to/fizzl13/the-seven-most-common-x402-seller-mistakes-and-how-to-fix-them-2c8g</link>
      <guid>https://dev.to/fizzl13/the-seven-most-common-x402-seller-mistakes-and-how-to-fix-them-2c8g</guid>
      <description>&lt;p&gt;An x402 API asks for payment with an HTTP &lt;code&gt;402 Payment Required&lt;/code&gt; answer, and an AI agent pays it per call in stablecoins. That only works when the 402 is exactly what the agent's client expects. &lt;a href="https://x402-doctor.fizzl.eu/" rel="noopener noreferrer"&gt;x402 Doctor&lt;/a&gt; calls every paid endpoint it can find once a day, about 50,000 of them, the way a paying agent would. On 17 October, 93% were payable as listed. These are the mistakes behind most of the rest, with the fix for each.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2,009&lt;/strong&gt; endpoints whose 402 names another URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1,042&lt;/strong&gt; listed URLs that don't answer 402 at all&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;206&lt;/strong&gt; offer only a testnet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7%&lt;/strong&gt; of Stellar endpoints can't be paid by the official client&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. The 402 names another URL (resource mismatch)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;2,009 endpoints.&lt;/strong&gt; The &lt;code&gt;resource.url&lt;/code&gt; in the 402 is not the URL the agent called: a relative path, another host, or &lt;code&gt;http://&lt;/code&gt; instead of &lt;code&gt;https://&lt;/code&gt;. Clients and indexes that check the resource refuse the challenge, and the CDP Bazaar may not list the route. The usual cause is a proxy that ends TLS (Render, Fly, Railway, Heroku), so the app builds an http URL.&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="c1"&gt;// Express behind Render, Fly, Railway or Heroku: the proxy ends TLS, so without this&lt;/span&gt;
&lt;span class="c1"&gt;// req.protocol is "http" and the 402 names http://… instead of your public URL.&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;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;trust proxy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// before paymentMiddleware&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or set the field yourself, with the full public URL of the route:&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="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://api.example.com/v1/price"&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;h2&gt;
  
  
  2. The listed URL doesn't answer 402
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1,042 endpoints.&lt;/strong&gt; The URL in the listing answers 404, 401, a login page, or 200 for free. Often the route answers 402 only on POST while the listing says GET, an API-key check runs before the paywall, or the payment middleware is registered after the handler. Agents and indexes only see a paid resource when the first answer to the listed method is a 402.&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="nf"&gt;paymentMiddleware&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET /v1/price&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;accepts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;exact&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$0.01&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="na"&gt;payTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&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;PAY_TO&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Latest price for a symbol&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;resourceServer&lt;/span&gt;&lt;span class="p"&gt;));&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="s2"&gt;/v1/price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// after the payment middleware&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Register the payment middleware before the handler and before any API-key check (the payment is the authorization), list the method the route really uses, and let a request without input reach the paywall instead of failing validation first.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Only a testnet is offered
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;206 endpoints.&lt;/strong&gt; The 402 offers only Base Sepolia or another testnet. Agents with real USDC on mainnet can't pay, so the endpoint is invisible to them. A testnet option next to a mainnet one is fine; 4% of payable endpoints do that.&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;accepts&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;scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;exact&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$0.01&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="na"&gt;payTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&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;PAY_TO&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;   &lt;span class="c1"&gt;// Base mainnet&lt;/span&gt;
  &lt;span class="c1"&gt;// { scheme: "exact", price: "$0.01", network: "eip155:84532", payTo: ... },             // Base Sepolia: test only&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. The MPP challenge names another host as its realm
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;102 endpoints.&lt;/strong&gt; On endpoints that also take MPP (the Machine Payments Protocol), the &lt;code&gt;WWW-Authenticate: Payment&lt;/code&gt; challenge has a &lt;code&gt;realm&lt;/code&gt; that is not the service's own host, often a leftover from a template or a gateway domain. Clients may refuse a challenge for another domain. Set it to your own host (or its base domain):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;WWW-Authenticate: Payment id="…", realm="api.example.com", method="tempo", intent="charge", request="…"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. The 402 asks more than the listing says
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;73 endpoints.&lt;/strong&gt; The price in the 402 is higher than the price in the listing the agent found. A careful agent stops there: x402 Doctor's preflight says caution for a higher price and no_go from ten times the listed price. Keep one source for the price:&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;PRICE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$0.01&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// one source for the route config and for every listing that shows the price&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Stellar: the asset is a name, not the token contract
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;47 of 631 Stellar endpoints (7%), from 3 sellers.&lt;/strong&gt; The &lt;code&gt;asset&lt;/code&gt; field says &lt;code&gt;"USDC"&lt;/code&gt; or &lt;code&gt;"USDC:G…"&lt;/code&gt;, but the official &lt;code&gt;@x402/stellar&lt;/code&gt; client expects the address of the USDC token contract. Its payments fail before they start. With a dollar price (&lt;code&gt;"$0.01"&lt;/code&gt;) the SDK fills in the right asset; otherwise:&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="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;"stellar:pubnet"&lt;/span&gt;&lt;span class="err"&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;"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;USDC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(Soroban&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;contract),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USDC"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every Stellar endpoint and its status: &lt;a href="https://x402-doctor.fizzl.eu/stellar" rel="noopener noreferrer"&gt;x402-doctor.fizzl.eu/stellar&lt;/a&gt;. More in &lt;a href="https://fizzl.eu/research/x402-stellar-october-2026/" rel="noopener noreferrer"&gt;x402 on Stellar&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The Bazaar example has no input that works
&lt;/h2&gt;

&lt;p&gt;The discovery extension in the 402 tells agents how to call the route. When its example has no parameters, or parameters the route rejects, an agent that found the route through the Bazaar sends a bare request, pays, and gets an error back. In x402 Doctor's spot-buy of 18 October, 3 of 27 purchases ended with an error after paying: 404, 404, and a 400 that said missing_required_parameters. None of them charged, but the agent got nothing. Declare a real example, and check input before you settle the payment:&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;declareDiscoveryExtension&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="s2"&gt;@x402/extensions/bazaar&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;discovery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;declareDiscoveryExtension&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="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BTC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;                                   &lt;span class="c1"&gt;// a real request that works&lt;/span&gt;
  &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&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;required&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="s2"&gt;symbol&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;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BTC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;67000&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="c1"&gt;// In the route config: extensions: discovery&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  And one security bug: HEAD gets the paid answer for free
&lt;/h2&gt;

&lt;p&gt;A bug in the x402 SDKs (&lt;a href="https://github.com/x402-foundation/x402/pull/3796" rel="noopener noreferrer"&gt;x402-foundation/x402#3796&lt;/a&gt;) let some paid GET routes answer a HEAD request with 200 and the full work behind it, without payment. Anyone can make such a server do paid work for free. Update &lt;code&gt;@x402/core&lt;/code&gt; and your framework adapter to a release with the fix, or refuse HEAD on paid routes until then. x402 Doctor's web check flags it as &lt;code&gt;head-unpaid&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="c1"&gt;// Until your @x402 packages include x402-foundation/x402#3796: refuse HEAD on paid routes.&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;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;HEAD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;405&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt; &lt;span class="c1"&gt;// before paymentMiddleware&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Check your endpoint
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free web check:&lt;/strong&gt; &lt;a href="https://x402-doctor.fizzl.eu/" rel="noopener noreferrer"&gt;x402-doctor.fizzl.eu&lt;/a&gt; reads your 402 the way a paying agent does, flags every problem above and gives the fix as code for your stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In CI:&lt;/strong&gt; &lt;code&gt;npx github:Fizzl13/x402-doctor &amp;lt;url&amp;gt;&lt;/code&gt; (exits 1 on failures), or the GitHub Action &lt;code&gt;Fizzl13/x402-doctor-action@v1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For the CDP Bazaar:&lt;/strong&gt; Coinbase's free validate API. How it compares to six other checkers: &lt;a href="https://fizzl.eu/guides/x402-endpoint-checkers/" rel="noopener noreferrer"&gt;x402 endpoint checkers compared&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How we measure
&lt;/h2&gt;

&lt;p&gt;Every endpoint listed in the CDP Bazaar, Circle's Agent Marketplace, the MPP directory and other public x402 indexes is called once a day without paying, and its 402 is checked the way a paying agent would. Counts are endpoints in the scan of 17 October 2026 with that problem; one endpoint can have more than one. The weekly spot-buy pays up to 30 random endpoints that look payable, at most $0.05 each. The whole index is an &lt;a href="https://huggingface.co/datasets/x402Fizzl/x402-trust-index" rel="noopener noreferrer"&gt;open dataset on Hugging Face&lt;/a&gt; (CC BY 4.0), and the overall picture is in &lt;a href="https://fizzl.eu/research/x402-health-october-2026/" rel="noopener noreferrer"&gt;We check 50,000 paid x402 endpoints every day&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is a resource mismatch in x402?
&lt;/h3&gt;

&lt;p&gt;The 402's resource.url names another URL than the one the agent called: a relative path, another host, or http instead of https. Clients and indexes that check it refuse the challenge. On 17 October 2026 it was the most common problem among paid x402 endpoints, on 2,009 of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why doesn't my x402 endpoint show up in the CDP Bazaar?
&lt;/h3&gt;

&lt;p&gt;The Bazaar indexes a route after its first payment settles through the CDP facilitator, and only when the 402 is valid: resource.url must be the exact public https URL, the listed method must answer 402, and the discovery extension should declare an example request that reaches the paywall. Coinbase's free validate API and x402 Doctor's free web check show which of these fails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does an agent get a 402 again after paying?
&lt;/h3&gt;

&lt;p&gt;Usually the seller's facilitator could not settle the payment (the 402 or its PAYMENT-RESPONSE header then carries an error such as settlement_failed), or the server did not see the payment: x402 v2 clients send it in the PAYMENT-SIGNATURE header, v1 clients in X-PAYMENT. Check the facilitator's logs and that the payment middleware runs on the paid route for that method.&lt;/p&gt;

&lt;h3&gt;
  
  
  How can I test my x402 endpoint for free?
&lt;/h3&gt;

&lt;p&gt;x402 Doctor's web check at &lt;a href="https://x402-doctor.fizzl.eu" rel="noopener noreferrer"&gt;https://x402-doctor.fizzl.eu&lt;/a&gt; reads your 402 the way a paying agent does and gives each problem with the fix as code for your stack; &lt;code&gt;npx github:Fizzl13/x402-doctor &amp;lt;url&amp;gt;&lt;/code&gt; and a GitHub Action run the same check in CI. Coinbase's validate API checks whether the CDP Bazaar can index the route.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fizzl.eu/research/x402-seller-mistakes-october-2026/" rel="noopener noreferrer"&gt;fizzl.eu&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>webdev</category>
      <category>api</category>
      <category>ai</category>
    </item>
    <item>
      <title>We check 50,000 paid x402 endpoints every day. Here's what works and what breaks.</title>
      <dc:creator>Frits Zwager </dc:creator>
      <pubDate>Sat, 17 Oct 2026 21:06:34 +0000</pubDate>
      <link>https://dev.to/fizzl13/we-check-50000-paid-x402-endpoints-every-day-heres-what-works-and-what-breaks-554j</link>
      <guid>https://dev.to/fizzl13/we-check-50000-paid-x402-endpoints-every-day-heres-what-works-and-what-breaks-554j</guid>
      <description>&lt;p&gt;x402 lets an API ask for payment with an HTTP &lt;code&gt;402 Payment Required&lt;/code&gt; answer, so an AI agent can pay per call in stablecoins without an account or API key. Before an agent pays an endpoint it has never seen, it wants to know two things: will the payment go through, and will it get what it paid for? &lt;a href="https://x402-doctor.fizzl.eu/" rel="noopener noreferrer"&gt;x402 Doctor&lt;/a&gt; checks that for every paid endpoint we can find, every day. This is what the October data shows (scan of 17 October 2026, &lt;a href="https://x402-doctor.fizzl.eu/trust" rel="noopener noreferrer"&gt;live numbers&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50,373&lt;/strong&gt; paid endpoints checked on 17 Oct (x402 and MPP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;93%&lt;/strong&gt; payable as advertised&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;41%&lt;/strong&gt; of all payable endpoints belong to one seller&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$0.01&lt;/strong&gt; median price per call&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Most endpoints work
&lt;/h2&gt;

&lt;p&gt;Of the 50,373 endpoints that answered on 17 October, 46,906 (93.1%) were payable as listed. 2,392 (4.7%) got a &lt;em&gt;caution&lt;/em&gt;, usually a detail that some clients refuse, and 1,074 (2.1%) a &lt;em&gt;no_go&lt;/em&gt;: an agent should not pay them. 49,955 were x402 endpoints and 418 MPP (Machine Payments Protocol) endpoints.&lt;/p&gt;

&lt;p&gt;The scan has grown fast: from 16,598 endpoints on 23 September to over 50,000 now, as new sellers list their APIs in the CDP Bazaar and in Circle's Agent Marketplace.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. One seller holds 41% of the market
&lt;/h2&gt;

&lt;p&gt;The index counts 61,860 payable endpoints. They come from 2,034 sellers, who sell 25,273 distinct services: many sellers publish the same service under thousands of URLs, one per ticker, city or query. The largest, datapackvibe.com, alone has 25,621 endpoints (41%) for 1,174 services. The ten largest sellers together hold 60% of all payable endpoints.&lt;/p&gt;

&lt;p&gt;For an agent that means a catalog of "60,000 APIs" is closer to 25,000 services, and that one seller's uptime moves the whole market's numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Base carries almost everything
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Share of payable endpoints&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;97%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solana&lt;/td&gt;
&lt;td&gt;21%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Polygon&lt;/td&gt;
&lt;td&gt;11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arbitrum&lt;/td&gt;
&lt;td&gt;8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tempo&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Algorand&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XRP Ledger&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arc (Circle)&lt;/td&gt;
&lt;td&gt;4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;30% of payable endpoints accept more than one network, so the shares add up to more than 100%. 4% also offer Base Sepolia, a testnet, next to mainnet.&lt;/p&gt;

&lt;p&gt;On Stellar we find 631 endpoints from 6 sellers. 47 of them (7%), from 3 sellers, can't be paid by the official &lt;code&gt;@x402/stellar&lt;/code&gt; client: they give the asset as &lt;code&gt;"USDC"&lt;/code&gt; or &lt;code&gt;"USDC:G…"&lt;/code&gt; instead of the USDC token contract (&lt;a href="https://x402-doctor.fizzl.eu/stellar" rel="noopener noreferrer"&gt;every Stellar endpoint&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Prices: a cent is the norm
&lt;/h2&gt;

&lt;p&gt;The median price is $0.01 per call. 80% of payable endpoints charge $0.01 or less, and under 1% charge $1 or more.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. What breaks, and how to fix it
&lt;/h2&gt;

&lt;p&gt;The problems we see most on 17 October, with the fix (the free &lt;a href="https://x402-doctor.fizzl.eu/" rel="noopener noreferrer"&gt;web check&lt;/a&gt; gives the exact code per endpoint):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Endpoints&lt;/th&gt;
&lt;th&gt;What it means, and the fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Resource mismatch&lt;/td&gt;
&lt;td&gt;2,009&lt;/td&gt;
&lt;td&gt;The 402 names another URL than the one called (a relative path, another host, http instead of https). Clients and indexes that check the resource refuse it. Put the full public https URL of the route in &lt;code&gt;resource&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No 402&lt;/td&gt;
&lt;td&gt;1,042&lt;/td&gt;
&lt;td&gt;The listed URL doesn't answer 402 at all (404, 401, a login page, or a 402 only on POST while the listing says GET). Answer 402 on the listed method, or fix the listing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testnet only&lt;/td&gt;
&lt;td&gt;206&lt;/td&gt;
&lt;td&gt;Only a testnet is offered, so mainnet agents can't pay. Add a mainnet option.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MPP realm mismatch&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;An MPP challenge names another host as its realm. Use the service's own host.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price above advertised&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;The 402 asks more than the listing says. Keep listing and 402 in sync.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invalid challenge&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;The 402 can't be parsed as x402 (missing fields, wrong types). Use the official SDK's middleware.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  6. We paid 27 random endpoints
&lt;/h2&gt;

&lt;p&gt;A valid 402 doesn't prove the seller delivers. Every week x402 Doctor buys 30 random endpoints that look payable, one per host, with its own wallet and their declared example input (at most $0.05 each), and records what comes back. In the run of 18 October, 3 endpoints were no longer payable when we got to them, so we didn't pay them; of the 27 we bought:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 delivered a proper answer;&lt;/li&gt;
&lt;li&gt;4 answered 402 again after our payment, and didn't charge;&lt;/li&gt;
&lt;li&gt;3 answered with an error and didn't charge;&lt;/li&gt;
&lt;li&gt;0 took the money without answering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is 74.1% paid and delivered, for $0.38 in all. The week before, on 12 October, 24 of 29 delivered (82.8%), and nobody took the money without answering then either. Results of every run: &lt;a href="https://x402-doctor.fizzl.eu/trust" rel="noopener noreferrer"&gt;the Trust Index&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Bait and sanctions
&lt;/h2&gt;

&lt;p&gt;An AI check reads every service's description for lures aimed at agents, such as promises no API can keep or impersonation of another brand. Of 7,890 services checked, 6 were flagged, for example "real-time guaranteed-profit racing arbitrage across all bookmakers".&lt;/p&gt;

&lt;p&gt;Every payout address is screened against the OFAC SDN list (1,050 crypto addresses, published 15 October). None of the sellers' payout addresses is on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we measure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sources:&lt;/strong&gt; the CDP Bazaar, Circle's Agent Marketplace, the MPP directory, GoPlausible and other public x402 indexes, read every day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The check:&lt;/strong&gt; each endpoint is called once without paying. Its 402 is parsed and checked the way a paying agent would: a valid challenge, the price against the listing, the network and token, whether the payout address can receive (USDC trustline on Stellar, opt-in on Algorand), the OFAC list, and testnet-only offers. Nothing is paid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The purchases:&lt;/strong&gt; only the weekly spot-buy pays, 30 endpoints at most $0.05 each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open data:&lt;/strong&gt; every endpoint's 30-day record is free at &lt;code&gt;GET https://x402-doctor.fizzl.eu/api/trust?url=&amp;lt;endpoint&amp;gt;&lt;/code&gt;, and the whole index is an &lt;a href="https://huggingface.co/datasets/x402Fizzl/x402-trust-index" rel="noopener noreferrer"&gt;open dataset on Hugging Face&lt;/a&gt; (CC BY 4.0, updated daily).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check an endpoint yourself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sellers:&lt;/strong&gt; the &lt;a href="https://x402-doctor.fizzl.eu/" rel="noopener noreferrer"&gt;free web check&lt;/a&gt; diagnoses your 402 and gives the fix as code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents:&lt;/strong&gt; before paying an unknown endpoint, &lt;code&gt;GET https://x402-doctor.fizzl.eu/api/v1/preflight?url=…&lt;/code&gt; answers go, caution or no_go for $0.001, also as an MCP tool. Instructions for agents: &lt;a href="https://x402-doctor.fizzl.eu/skill.md" rel="noopener noreferrer"&gt;skill.md&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://fizzl.eu/research/x402-health-october-2026/" rel="noopener noreferrer"&gt;fizzl.eu&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>ai</category>
      <category>api</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
