<?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: factline</title>
    <description>The latest articles on DEV Community by factline (@factline).</description>
    <link>https://dev.to/factline</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%2F4180390%2F2d1a5891-e08e-435e-8789-9b6f41f9f6a7.png</url>
      <title>DEV Community: factline</title>
      <link>https://dev.to/factline</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/factline"/>
    <language>en</language>
    <item>
      <title>Check who your x402 agent is paying, before it signs</title>
      <dc:creator>factline</dc:creator>
      <pubDate>Tue, 20 Oct 2026 18:05:53 +0000</pubDate>
      <link>https://dev.to/factline/check-who-your-x402-agent-is-paying-before-it-signs-2m53</link>
      <guid>https://dev.to/factline/check-who-your-x402-agent-is-paying-before-it-signs-2m53</guid>
      <description>&lt;p&gt;An x402 client pays whatever &lt;code&gt;payTo&lt;/code&gt; the server puts in its 402 response. Budget caps answer "how much". Nothing in the default flow answers "to whom".&lt;/p&gt;

&lt;p&gt;So we gave our pay guard the Lazarus Group's wallet as the &lt;code&gt;payTo&lt;/code&gt; of a real, healthy seller and asked whether to pay:&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="s2"&gt;"https://factline.dev/v1/pay/guard?url=https://api.onesource.io/&amp;amp;pay_to=0x098B716B8Aaf21512996dC57EB0615e2383E2f96&amp;amp;amount_usd=0.05&amp;amp;max_usd=1"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasons"&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;"payTo 0x098B716B8Aaf21512996dC57EB0615e2383E2f96 is on the OFAC sanctions list (LAZARUS GROUP)"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"seller"&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;"origin"&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.onesource.io"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"known"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"payers_30d"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;321&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"uptime_30d"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"median_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;1197&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;"ttl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;600&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;The seller itself is fine (321 paying wallets in 30 days, answered every nightly check). The wallet is not. That is the case a budget cap never catches: a prompt-injected or swapped &lt;code&gt;payTo&lt;/code&gt; on an otherwise normal endpoint.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;payTo against the OFAC list.&lt;/strong&gt; OFAC is the list that publishes wallet addresses. (EU, UN and UK lists cover people and companies; those are a separate screen.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The seller's track record&lt;/strong&gt; from our nightly probes of x402 Bazaar sellers: does it answer a valid 402, how many wallets paid it in 30 days, how long has it been listed. Unknown sellers get a domain age check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your budget:&lt;/strong&gt; &lt;code&gt;amount_usd&lt;/code&gt; against &lt;code&gt;max_usd&lt;/code&gt;, plus the seller's usual price for comparison.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answer: &lt;code&gt;allow&lt;/code&gt;, &lt;code&gt;review&lt;/code&gt; or &lt;code&gt;deny&lt;/code&gt;, with reasons in plain English. Free, cached for 10 minutes per seller and payTo.&lt;/p&gt;

&lt;h2&gt;
  
  
  One line on an x402 client
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @factline/x402-pay-guard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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="s2"&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="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;withPayGuard&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;@factline/x402-pay-guard&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="nf"&gt;withPayGuard&lt;/span&gt;&lt;span class="p"&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="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="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="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="nx"&gt;signer&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;maxUsd&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="na"&gt;onReview&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;block&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The official x402 client already has a hook that runs right before it signs (&lt;code&gt;onBeforePaymentCreation&lt;/code&gt;, with &lt;code&gt;selectedRequirements.payTo&lt;/code&gt;). The guard plugs into that, so a deny aborts before any signature exists. If the guard is unreachable it pays by default (&lt;code&gt;failOpen: true&lt;/code&gt;); set it to &lt;code&gt;false&lt;/code&gt; if you would rather not pay unchecked. MCP agents can call the same check as the &lt;code&gt;x402_pay_guard&lt;/code&gt; tool on &lt;a href="https://factline.dev/mcp/kyc" rel="noopener noreferrer"&gt;https://factline.dev/mcp/kyc&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not do
&lt;/h2&gt;

&lt;p&gt;It is a denylist and a track record, not chain analytics. It will not see indirect exposure (a fresh wallet funded by a listed one). If you need that, pair it with a risk-scoring provider. For an agent paying small x402 bills, a free check of the obvious cases before signing is the part most clients are missing today.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/factline-dev/x402-pay-guard" rel="noopener noreferrer"&gt;github.com/factline-dev/x402-pay-guard&lt;/a&gt;. Live seller and facilitator health: &lt;a href="https://factline.dev/x402/health" rel="noopener noreferrer"&gt;factline.dev/x402/health&lt;/a&gt; and &lt;a href="https://factline.dev/x402/facilitators" rel="noopener noreferrer"&gt;factline.dev/x402/facilitators&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>x402</category>
      <category>ai</category>
      <category>agents</category>
      <category>payments</category>
    </item>
    <item>
      <title>We probe 517 paid x402 APIs every night. Here is what the first numbers say</title>
      <dc:creator>factline</dc:creator>
      <pubDate>Mon, 12 Oct 2026 21:44:19 +0000</pubDate>
      <link>https://dev.to/factline/we-probe-517-paid-x402-apis-every-night-here-is-what-the-first-numbers-say-16lm</link>
      <guid>https://dev.to/factline/we-probe-517-paid-x402-apis-every-night-here-is-what-the-first-numbers-say-16lm</guid>
      <description>&lt;p&gt;AI agents that pay for APIs with x402 usually pick a seller from a directory listing. A listing tells you a service exists and what it costs. It does not tell you whether it answers, how fast, or whether anyone else pays it.&lt;/p&gt;

&lt;p&gt;So I started probing them. Every night a small script on a Raspberry Pi takes the x402 origins in the Coinbase Bazaar with at least two paying wallets in the last 30 days (517 so far, about 500 per night), sends one unpaid request to a real paid endpoint, and records whether a valid &lt;code&gt;402 Payment Required&lt;/code&gt; challenge comes back and how long it took. It never pays. The results are a free table and JSON feed: &lt;a href="https://factline.dev/x402/health" rel="noopener noreferrer"&gt;factline.dev/x402/health&lt;/a&gt; and &lt;code&gt;GET https://factline.dev/v1/x402/sellers&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is after two nights, so read it as a first snapshot, not a trend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in the sample
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;517 origins&lt;/strong&gt; (hosts) with &lt;strong&gt;2,555 paid resources&lt;/strong&gt; between them, 4.9 per origin on average, 72 at most.&lt;/li&gt;
&lt;li&gt;Selection: origins with 2 or more distinct paying wallets in the Bazaar over 30 days. Payer counts include sellers paying themselves, so treat them as an upper bound.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Almost everything answers
&lt;/h2&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;Night 1&lt;/th&gt;
&lt;th&gt;Night 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Probes&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;501&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Valid 402 challenge&lt;/td&gt;
&lt;td&gt;496 (99.2%)&lt;/td&gt;
&lt;td&gt;500 (99.8%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Over both nights, 513 of the 517 origins answered every time. 3 never answered, 1 answered once out of two.&lt;/p&gt;

&lt;p&gt;That is better than I expected. The catch is the next section: answering is not the same as answering fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The sellers people pay are three times faster
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Origin group&lt;/th&gt;
&lt;th&gt;Origins&lt;/th&gt;
&lt;th&gt;Average uptime&lt;/th&gt;
&lt;th&gt;Median response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 or more paying wallets&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;501 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 to 9 paying wallets&lt;/td&gt;
&lt;td&gt;411&lt;/td&gt;
&lt;td&gt;99.1%&lt;/td&gt;
&lt;td&gt;1,609 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The slowest valid 402 took 26 seconds. The fastest took 139 ms. An agent that waits 26 seconds for a price quote before it has even paid is going to time out or give up, and the payer counts suggest buyers notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Calls are concentrated in very few hosts
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paying wallets (30 days)&lt;/th&gt;
&lt;th&gt;Origins&lt;/th&gt;
&lt;th&gt;Calls (30 days)&lt;/th&gt;
&lt;th&gt;Share of calls&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100 or more&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;466,991&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 to 99&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;161,472&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 to 9&lt;/td&gt;
&lt;td&gt;410&lt;/td&gt;
&lt;td&gt;40,817&lt;/td&gt;
&lt;td&gt;6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five hosts carry 70% of the paid calls in this sample. Four out of five sellers share 6%. If you are building on x402 as a seller, the honest takeaway is that a listing alone does very little.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Base is the default, Solana is the common second
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Networks offered&lt;/th&gt;
&lt;th&gt;Origins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base only&lt;/td&gt;
&lt;td&gt;309 (60%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base and Solana&lt;/td&gt;
&lt;td&gt;106 (21%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base, Solana, Polygon and Arbitrum&lt;/td&gt;
&lt;td&gt;38 (7%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solana only&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base Sepolia (testnet) only&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;508 of 517 origins (98%) accept USDC on Base mainnet, and 181 (35%) also accept Solana. Five are listed with paying wallets but advertise only Base Sepolia, the testnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Most prices are under a cent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lowest price per call&lt;/th&gt;
&lt;th&gt;Origins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;under USD 0.001&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USD 0.001 to 0.01&lt;/td&gt;
&lt;td&gt;294 (57%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USD 0.01 to 0.10&lt;/td&gt;
&lt;td&gt;206 (40%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USD 0.10 to 1&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USD 1 or more&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I would do with this as an agent builder
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check that a seller answers its 402 quickly before you route traffic to it. A slow challenge is a cheap early signal.&lt;/li&gt;
&lt;li&gt;Prefer sellers that offer more than one network, so a wallet on either Base or Solana can pay.&lt;/li&gt;
&lt;li&gt;Do not read a high call count as trust. Look at distinct payers and response times together.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Table, filterable by uptime and payers: &lt;a href="https://factline.dev/x402/health" rel="noopener noreferrer"&gt;https://factline.dev/x402/health&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JSON for your agent, free: &lt;code&gt;GET https://factline.dev/v1/x402/sellers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Method: one unpaid request per origin per night against a listed paid resource; "ok" means a parseable x402 challenge (HTTP 402 with payment requirements). Nothing is paid, nothing is stored beyond status, time and date.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I run this as part of &lt;a href="https://factline.dev" rel="noopener noreferrer"&gt;Factline&lt;/a&gt;, which sells official-records checks to agents over x402 (company checks, sanctions, supplier invoices). The health data is also behind a payee check that tells an agent whether to pay an x402 seller it has never used. But the table above is free, and I will post an update once there are 30 nights of data.&lt;/p&gt;

&lt;p&gt;If you run an x402 service and want your origin added or removed, email &lt;a href="mailto:hello@factline.dev"&gt;hello@factline.dev&lt;/a&gt;.&lt;/p&gt;

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