x402-factory Field Notes
402x402-factory field notes
17 – 24 September 2026 · one week

Building a factory for agent tools, then checking who buys

We built an automated pipeline that turns an idea into a pay-per-call tool that AI agents can use, and shipped five of those tools to Base mainnet. The engineering worked. When we measured the market, we found almost nobody buys tools this way yet. This page is the overview. Each topic has its own page with the detail.

The week in five lines
  1. Built a staged pipeline where cheap AI models draft, a stronger model reviews, and scripts test everything against real infrastructure.
  2. Shipped five paywalled tools on Cloudflare Workers, an MCP server on npm, and listings in every catalog we could find.
  3. Hardened it. Almost every quality gate exists because a specific bug got through without it.
  4. Measured demand with on-chain data. About 90% of x402 money comes from captive users. The open market is about $10.7k per month across the whole network.
  5. Decided to stop building, keep the tools running, try one distribution experiment and review on 23 October.
5tools live on Base mainnet
82paid calls (1.41 USDC), nearly all our own tests
1outside payer, and it was a bot
23 Octnext review of the whole project

Numbers from the discoverability check on 24 Sep 2026.

New here? Read in this order

If x402 is new to you, start with x402 basics and keep the glossary open. Then read the timeline below. Each day links to the topics it touches, and the topic pages link back.

The week at a glance

Commits per day
Outer repository, 108 commits. Git tracking started on 18 Sep, so earlier work is a single snapshot.
21 Sep was the busiest day: fixes from the audit, the fifth tool, and the first round of registry listings.

Timeline

Before · Thu–Friup to 18 Sep
5 commits

Starting point: one live tool and a skeleton pipeline

Goal: make the first tool's setup reusable before building more.

  • The pipeline already existed as folders and scripts: Scout (ideas), Build, QA, ship-to-production and catalog registration. markdown-extractor was already live on Base mainnet.
  • We checked that both model providers answered through OpenClaw. We also found that Z.ai silently serves an older model name (glm-4.6) with a newer model (glm-5.3-flash). After that we always used the real model name.
  • We started git tracking and made the worker template support several chains. The QA script could now pay with a real mainnet wallet, and we confirmed a real settlement.
  • We hardened every URL-fetching tool against SSRF (requests aimed at internal addresses) and against huge responses.
Saturday19 Sep
10 commits

The pipeline runs end to end

Goal: prove that an idea can become a working, paid tool without anyone rewriting the code by hand.

  • spa-dom-to-md became the first tool to pass every stage with no manual code rewrite. It ran against a real headless browser and settled real testnet payments.
  • burn-once-secret-vault was built as a proof of concept, and svg-bar-chart-renderer ran as a fully unattended build.
  • The code-writing step took 11–16 minutes per build. Almost all of that was hidden "thinking" by the model. Turning thinking off brought it down to about 2 minutes.
  • The review model (Pass 2) caught a real bug: every error response returned HTTP 200.
Sunday20 Sep
12 commits

Quality gates grow out of failures

Goal: find a stronger flagship tool. Each failure along the way turned into a permanent check.

  • We built an MCP server so agents like Claude can call the tools and pay automatically. We confirmed its payments with a real settlement on-chain.
  • The first flagship candidate, token-rugcheck-scanner, was fully built and then rejected on review, because it was just a wrapper around a free API. That led to a new Viability Review stage that researches cost, competitors and volume before anything is built.
  • The second candidate, wasm-geotiff-transcoder, needed three Scout attempts. It then hit three bugs that only appeared when the code actually ran. That led to a mandatory runtime smoke test using a real testnet payment.
  • We found a bug in every live tool: they took payment before checking the request. A malformed request cost the caller real money. We fixed all tools and verified the fix with real mainnet payments.
  • Late that night, four parallel reviewers audited the whole repository.
Monday21 Sep
41 commits

Hardening, tool #5, and the first listings

Goal: close the audit's serious findings, then get the tools in front of agents.

  • All audit P0/P1 items were fixed. The biggest were:
    • Publishing now requires a passing QA report.
    • A new stateful check caught a real burn-once bug: the second read returned 404 instead of 410.
    • The MCP client now refuses to sign more than a tool's listed price.
    • Calls to the payment facilitator now retry.
  • We built an operator dashboard showing tools, backlog and reports.
  • wasm-geotiff-transcoder went live as tool #5.
  • We listed the MCP server on the official MCP Registry, Glama and mcp.so. We skipped Smithery because it needs a hosted server, and ours runs locally.
  • x402scan rejected geotiff for answering 400 instead of 402 to an unpaid probe. We fixed the order in all tools: payment check first, then validation, then settlement.
  • We added a repeatable script that counts who is paying us.
Tuesday22 Sep
16 commits

Looking for buyers

Goal: find out why nobody outside the project pays, and get visible.

  • We added a Demand Scan stage before Scout. The web search it relies on (DuckDuckGo) kept blocking it, so it produced nothing usable.
  • We applied for a Base Builder Grant with a nomination, a demo video, a security write-up and the first posts on X and Farcaster.
  • On-chain seller data from x402scan showed that nearly every successful seller settles through Coinbase's facilitator (CDP), and ours had no discovery catalog. We switched to a CDP → PayAI → Primer failover chain and got listed in two catalogs.
  • The rollout surfaced a bug hidden since launch. geotiff's default output format returned HTTP 500 after the caller had paid.
Wednesday23 Sep
24 commits

The reality check

Goal: stop guessing about demand and measure it.

  • We added Base Builder Codes (on-chain attribution) to all five tools and made them required for future tools. We published MCP server 1.0.5.
  • We wrote a demand-first plan, cleaned up rejected builds and redesigned the dashboard around it.
  • Buyer anatomy: we analysed every Base x402 buyer over 30 days. The market is mostly captive, meaning each seller brings its own users. The open market is about $10.7k per month for the whole network.
  • The market outlook showed volume declining since late 2025. Adding x402 to an API is now free with platform tools, and the trust-tool niche has sellers but no buyers.
  • Decision: stop building. Make all five tools discoverable by AgentCash, publish a blog post on the findings, and review in 30 days.
  • In the evening, the energy went into a separate project on the Apify Store (see the epilogue below).
Thursday24 Sep
0 commits

Monitor mode

Goal: watch and wait for the review date.

  • The first outside payment arrived: 0.055 USDC across three tools, hours after the AgentCash re-registration. The wallet belongs to an automated sweeper that pays hundreds of x402 endpoints, so this is a crawler, not a customer.
  • Next steps: check AgentCash search now and then, and re-run the buyer analysis on 23 October. Build a new tool only if that review shows real buyers.

Topics

Epilogue · 23 Sep evening

The side project

The x402 analysis raised the question of where tool demand can be measured before building. The Apify Store publishes usage per tool through a public API, so demand there is visible up front. The same data would have ruled out three of our five x402 tools.

In a separate repository we scanned the Store, picked a category with proven usage (tech-stack detection, where the leading tool has 1,222 users a month), and published tech-stack-detector the same evening at $0.01 per site. x402-factory stays running in monitor mode. What carried over →

Overview / Topic

x402 basics

x402 lets any HTTP endpoint charge per request in stablecoins, with no accounts or API keys. That makes it a natural way for AI agents to pay for tools.

In short
  • HTTP has had a status code 402 Payment Required since the 1990s, unused until now. x402 gives it a real protocol.
  • The buyer signs a USDC transfer authorization. A facilitator checks it and puts it on-chain. The buyer needs no ETH for gas.
  • Our tools run on Base mainnet (Coinbase's Ethereum L2) and charge 0.01–0.03 USDC per call.

One paid call, step by step

  1. The agent calls the toolA normal POST to the worker URL, without payment.
  2. The worker answers 402Any request without a payment gets 402, whatever its body says. That is how agents and indexers discover the price. The PAYMENT-REQUIRED header carries the terms: price, token (USDC), network, and the payTo address.
  3. The agent signsIts wallet signs an EIP-3009 "transfer with authorization" as EIP-712 typed data. This is a signed permission slip. No transaction is sent yet.
  4. The agent retries with the signatureThe same request again, now with a PAYMENT-SIGNATURE header.
  5. The worker checks the request before chargingCheap checks only: is the body valid, is it under the size limit, is the target URL allowed. A bad request gets a 400 here and the payment is never settled. See "Order of operations" below.
  6. The facilitator verifies and settlesThe worker sends the signature to a facilitator (/verify, then /settle). The facilitator submits the transfer on-chain and pays the gas.
  7. The worker does the work and responds200 with the result, plus a PAYMENT-RESPONSE header holding the settlement receipt.

The pieces

USDC, EIP-3009 and EIP-712

USDC implements EIP-3009, which allows a transfer to be authorized by signature and submitted by someone else. The signature follows EIP-712, a standard for signing structured data. It includes a "domain" naming the token contract. That domain caused our first real bug. The token's name is "USD Coin" on Base mainnet but "USDC" on the Base Sepolia testnet. We had copied the mainnet value from a GitHub issue, and the testnet facilitator rejected every payment. We fixed it by reading name() directly from the contract. From then on, facts involving money were checked on-chain rather than taken from docs or forum posts.

Facilitators

A facilitator is the service that verifies a payment and settles it on-chain. Which one you use matters more than it seems, because facilitators also run the discovery catalogs agents search. We used three:

FacilitatorSetupDiscovery catalogRole for us
Primer SystemsNo signupNone (extensions: [])Our only facilitator until 22 Sep, now last fallback
PayAINo key, free tierYes (Bazaar), lists within secondsSecond in the chain
Coinbase CDPAPI key, signed JWT per request; 1,000 free settles a monthYes (Bazaar), plus Builder CodesFirst in the chain since 22 Sep

We switched because x402scan data showed that 474 of the top 496 sellers settle through CDP and only one through Primer. Our tools were invisible in every catalog that agents search. The workers now try CDP, then PayAI, then Primer. More in Distribution →

Bazaar: how a tool gets listed

There is no submission form. A tool is listed when a real payment settles while carrying discovery metadata (description, input schema, example output) in paymentPayload.extensions.bazaar. So to get listed we made one small real payment to each tool per facilitator, a process we call "seeding". One surprise: CDP rejects the whole payment if the resource description is over 500 characters. We found the limit by testing lengths until one failed.

Order of operations

A paid endpoint must decide what happens before payment and what happens after. We settled on two rules:

Builder Codes

Base Builder Codes (ERC-8021) attach a short attribution tag to the end of a settlement transaction's data. The facilitator adds it, so no special wallet is needed. Our code rides on every CDP settlement, and base.dev counts those transactions. This is useful as evidence for grants and leaderboards, not as income.

Testnet and mainnet

Every tool is tested on Base Sepolia first. That testnet has worthless USDC and a free public facilitator at x402.org/facilitator. Only then does it move to Base mainnet with real USDC. The pipeline's automatic checks only ever spend testnet money.

Overview / Topic

The pipeline

A folder-based assembly line. A proposal moves from folder to folder, and at each step an AI model or a script works on it. Cheap models draft, a stronger model judges, and plain scripts test against real infrastructure.

In short
  • Each stage writes to its own folder (00_demand to 04_distribution). Moving a proposal into 02_approved is the human approval step.
  • Models run through OpenClaw's command line. Z.ai GLM models do the legwork; Claude Sonnet 5 makes the two judgment calls.
  • Most stages were added because something went wrong without them. The table below says what.

Stages at a glance

cheap model (Z.ai) judging model (Claude) deterministic script human
Pass 0.25Demand ScanWeb research for signs of demand
Stage 1ScoutDrafts a proposal, no web access
Pass 0.5Viability ReviewChecks cost, competitors, volume
GateApproveMove file to 02_approved
Pass 1ScaffoldWrites worker code, tests, config
Pass 2AuditReviews and patches using real test output
Pass 3Smoke testReal wrangler dev and a real testnet payment
QAQA simulatorPayment flow and lifecycle checks
PublishCatalog + MCPRefuses without a QA pass
ShipMainnet deployScript, after a human go-ahead

Why each stage exists

StageRuns onAdded or changed because
Demand ScanZ.ai glm-5.3 + web searchScout has no network access and can only imagine demand (22 Sep). DuckDuckGo blocked it repeatedly. It is to be replaced by on-chain market data.
ScoutZ.ai glm-5.3-flash, no networkOriginal stage. Since 20 Sep it must mark sections it cannot verify with SCOUT-UNVERIFIED.
Viability ReviewClaude Sonnet 5 + web searchtoken-rugcheck-scanner passed every earlier check but was a thin wrapper around a free API (20 Sep).
Approval gateHumanThe build refuses any proposal that still contains an unverified marker, so the review cannot be skipped.
Pass 1 ScaffoldZ.ai glm-5.3-flash, thinking offCheap code generation. Since 20 Sep it must also produce a real QA fixture for the smoke test.
Pass 2 AuditClaude Sonnet 5A second opinion on security and correctness. Since 20 Sep it sees real tsc and npm test output instead of reviewing code blind.
Pass 3 Smoke testScript, testnet onlygeotiff had three bugs that type checks and unit tests could not catch (20 Sep).
QA simulatorScriptOriginal stage. On 21 Sep it gained lifecycle checks, which found the burn-once 410 bug on their first run.
PublishScriptThe audit found tools could reach the auto-paying MCP catalog without passing QA (21 Sep). It now also checks the Builder Code (23 Sep).
MCP generationScript, automaticA manual step that was easy to forget. It now runs on every catalog change.
Ship + seedScript + human go-aheadMainnet deploy, then one small real payment per facilitator to get into the catalogs.

Which model does what

The rule: a stage that only gathers or drafts uses a cheap Z.ai model. A stage that gives the final go or no-go uses Claude. A cheap model confidently approving something wrong is worse than no check at all. This also keeps Claude's weekly usage for the steps that need it. QA, publishing and MCP generation use no model at all. They are plain code that either passes or fails.

One lesson along the way was to confirm which model actually answers. Z.ai quietly served glm-4.6 requests with glm-5.3-flash. A benchmark comparing the two was really comparing one model with itself.

Making Pass 1 fast

Pass 1 took 11–16 minutes per build. Timing each call showed the prompt was small (about 2,700 tokens) and the time to first byte was under 1% of the total. Nearly all the time went to generation, which pointed at hidden reasoning tokens. The command-line path has no cap on output tokens, so we turned thinking off and asked for shorter output. Pass 1 dropped to about 115 seconds, roughly 8 times faster. While investigating, we also fixed a parser bug that could throw away a full 16-minute generation because of a single line break.

The architectural audit

On 20 Sep, four parallel reviewers each audited one part of the repository: the MCP layer, the worker template and tools, the orchestration scripts, and the agent prompts. The verdict was that the security engineering was strong but the product and process layer was weaker.

The full report lives in the repo at pipeline/reports/architectural-audit.md.

What is still weak

Overview / Topic

Verification

Most of the important bugs this week passed type checks and unit tests. They only showed up when the code ran against real infrastructure with real payments. Each one became a check, so it cannot come back.

In short
  • Static review checks whether code agrees with itself. Only running it checks whether it agrees with reality.
  • We prefer an automated gate to "remember to check X".
  • Money facts are checked on-chain, and responses are checked by their body, not just their status code.

The verification ladder

  1. Type check and unit teststsc --noEmit and npm test. Necessary, but a model that writes both the code and its tests can repeat the same wrong assumption in both.
  2. Local workerwrangler dev, the real Cloudflare runtime on your machine. This catches missing files, bad config and libraries that break in Workers.
  3. Real testnet paymentSign, settle on Base Sepolia, and check the result. Automated in Pass 3 and costs nothing.
  4. Real mainnet paymentA few cents of real USDC, then the transaction receipt read from a public Base RPC instead of trusting the facilitator's reply.
  5. Check the bodyA 200 is not proof. geotiff's default format returned 500 after payment for days, and only a check of the actual response caught it.

Bugs that shaped the pipeline

BugHow we found itWhat it became
Testnet USDC signed with the mainnet token nameFacilitator rejected every paymentRule: read contract values on-chain
Parser dropped a finished 16-minute generation over one line breakWhile timing Pass 1Tolerant parser in the shared library
[[browser]] instead of [browser] in configOnly failed at real deployBuild template fixed
Error responses returned HTTP 200Pass 2 reviewPass 2 now sees real test output
geotiff: missing asset folder, wrong library return shape, WASM loader fetching its own fileRunning wrangler devPass 3 smoke test, mandatory
Payment settled before the request was validated, in every toolA malformed request with payment was charged, then got 400Validate before settling, size caps, verified with real mainnet payments
Unpaid malformed requests got 400 instead of 402, hiding the price from indexersx402scan rejected geotiff: "No valid x402 response found"Check for payment first, then validate (per the x402 v2 spec)
QA accepted any non-200 as "malformed request rejected"While fixing the bug aboveQA now fails on a 402 there
Smoke test left a wrangler dev process runningTesting the smoke test itselfKill the whole process group
Viability text replacement duplicated sectionsLive run on a real proposalRegex fixed ($ matched end of line)
burn-once: second read gave 404, not 410; multi-read vaults lost their secret after one readNew lifecycle check, first runLifecycle checks in QA fixtures
MCP client would sign any amount a server asked forExternal critiqueHard ceiling at the catalog price
Tools could be published without passing QAArchitectural auditPublish gate
Deploy script flattened every price to 0.01Two tools' prices were being overwrittenScript fixed
geotiff WebP output: 500 after payment since launchPaid calls during the facilitator rolloutEnd-of-session paid sweep checks response bodies
CDP rejects descriptions over 500 charactersPayments silently falling back to PayAIDescriptions clamped
Non-Latin-1 text breaks btoa() in the 402 headerTests on the discovery generatorGenerator refuses it. The shared fix is still open.

The payment-ordering fix, in detail

The shared worker template checked for a payment and settled it before it ever looked at the request body. So a caller who sent a valid payment with a malformed request paid in full and then got a 400. The bug was in all four live tools.

The fix had one condition from the operator: it must not open a way to run up costs. We moved only cheap validation ahead of payment: pure functions with no network calls and a hard byte limit on the body. Expensive work (browser rendering, encryption and storage) stayed behind payment. Three of the four tools had no body size limit at all, so the fix also closed an unbounded-input gap. We verified it with one real mainnet payment per tool and read each receipt from the chain.

The first version of the fix went one step too far. It validated the body before even checking for a payment, so an unpaid probe with an empty body got 400 instead of the 402 price terms. x402scan rejected a tool for exactly that. The x402 v2 spec is clear: no payment means 402, whatever the body. The final order is to check for a payment (none means 402), then validate (invalid means 400, nothing settled), then settle, then do the work.

The habit behind all of this: when a class of bug appears, add a gate that catches it automatically. A note saying "be careful next time" does not count.

Overview / Topic

The tools

Five tools are live on Base mainnet as Cloudflare Workers. Four more ideas were rejected, three before building and one after. The main question for each was whether an agent could get the same result for free.

Live

ToolUSDC / callWhat it doesHard to copy?
markdown-extractor0.01Fetches a public URL and returns clean Markdown. The first tool, built before the shared template existed.partly hosted fetch and cache; 33 other sellers do this
spa-dom-to-md0.03Renders JavaScript-heavy pages in a real headless Chromium (Cloudflare Browser Rendering), then converts to Markdown.partly the hosted browser is the value
burn-once-secret-vault0.01Stores an encrypted secret and hands out a link that works exactly once. A Durable Object makes that guarantee hold even under simultaneous reads. Every burn returns a signed receipt.yes needs hosted single-threaded state
svg-bar-chart-renderer0.015Turns data into an SVG bar chart.no simple geometry any agent can do
wasm-geotiff-transcoder0.03Converts GeoTIFF satellite and map rasters to PNG or WebP with WASM codecs. Source files are capped at 20 MB because Workers have 128 MB of memory.yes real binary compute, but a small niche

All five also offer free GET routes (docs, /openapi.json, /.well-known/x402) so agents can inspect them before paying.

Rejected

IdeaWhenWhy it was dropped
token-rugcheck-scannerAfter buildingOne call to a free, keyless API (GoPlus) plus some scoring. The agent could make that call itself, and two x402 competitors already did more.
Pay-per-query search toolBefore buildingWould require holding a third-party API key for the caller. The pipeline has a hard rule against that liability.
botwall-render-extractBefore buildingPriced at 3 USDC per call, far outside our 0.01–0.05 band, and a real browser would not fit Worker time limits.
token-trust-synthesisBefore buildingSame category as the rugcheck tool, with richer competitors already live.

The four questions every tool must answer

These came out of the rugcheck post-mortem and are now built into the Viability Review:

  1. Is there a real cost basis: a paid upstream, metered compute, or genuine multi-source work?
  2. Could the agent get the same output with one more fetch of its own? If so, what extra work changes that?
  3. Do live competitors already exist on x402scan, GitHub or the web, and what do they do better?
  4. At this price, is the number of calls needed for meaningful revenue remotely plausible?

Every successful x402 business we found (LLM proxies, RPC gateways, crawl compute, pay-per-crawl) had a real cost basis or an existing paying product before it added x402. None repackaged a free API.

In hindsight: these questions protect against thin tools, but they don't measure demand. Usage data from a comparable marketplace would have ruled out three of the five live tools before they were built: geospatial had 31 users a month, charts 77, and secrets 164. See Market & demand →

Overview / Topic

Distribution

Once the tools worked, the question was how agents would find them. We tried every channel we could verify: an MCP server, registries, facilitator catalogs, AgentCash, a grant and a blog. The tools were visible everywhere, and still nobody bought.

In short
  • By 23 Sep all five tools were in the PayAI and CDP catalogs, on x402scan, passing AgentCash's validator, and bundled in an MCP server on npm and the MCP Registry.
  • Outside buyers: zero, until a sweeper bot on 24 Sep.
  • Aggregators like agentbit seem to rank by buyer count, so a tool with no buyers stays invisible there.

Channels, in the order we tried them

ChannelWhat we didResult
MCP server (20 Sep)A generated npm package that exposes all tools to MCP clients such as Claude and pays automatically with the user's own key. The key never leaves the machine, and each call has a spending ceiling.live x402-mcp-server_by_milza 1.0.5
Claude Desktop integrationTried to launch the server from the desktop app.dropped this app build never loaded local servers; payment logic was already proven on-chain
MCP Registry, Glama, mcp.so (21 Sep)Registry via mcp-publisher. Descriptions are capped at 100 characters, which we learned from a real rejection. Glama syncs from GitHub.listed
SmitheryNeeds a hosted HTTP MCP server. Ours runs locally over stdio.skipped would need a real architecture change
x402scan, agentbitRegistered on x402scan; checked agentbit's index.listed, not surfaced agentbit seems to require buyers
Facilitator catalogs (22 Sep)Switched to CDP → PayAI → Primer and seeded each tool with a real payment.5/5 listed in both PayAI and CDP Bazaar
PayAPI MarketChecked its requirements. The real signup flow didn't match the research.skipped
AgentCash (23 Sep)Upgraded /openapi.json to OpenAPI 3.1 with the x-guidance and x-payment-info fields AgentCash reads. Real example outputs were added to the catalog data. Re-registered on x402scan.0 validator errors review 23 Oct

Why the facilitator switch mattered

Agents find tools through catalogs, and each facilitator runs its own catalog. Primer, our only facilitator at first, has none. On-chain data showed the market settles almost entirely through CDP. Adding CDP and PayAI (with Primer as the last fallback) put our tools in both catalogs within minutes. It also let every CDP settlement carry our Builder Code. The rollout used real deployments and real seed payments, and it surfaced two real bugs. How catalogs work →

Grants and visibility

Base Builder Grants

A research document the operator shared suggested integrating Coinbase's developer stack to win a grant. Checking the sources showed it mixed up two programs:

We took the free path: a short terminal demo video, a security section in the README, a self-nomination through the real form, and the project's first posts on X and Farcaster. The demo command briefly showed a wallet key on screen, so that wallet was emptied and retired and a new one was created. Selection is discretionary, with no timeline.

Builder Codes

We first ruled this out because it seemed to need a Coinbase smart wallet. Reading the extension's source showed the facilitator adds the tag itself, so it works with our plain EIP-3009 payments. We confirmed that our CDP settlements already carried the facilitator's own tag. Now every CDP settlement carries our code, base.dev counts those transactions, and publishing refuses a future tool without it.

The blog post

The buyer analysis was new enough to publish. It is live at jannis-e.github.io/x402-mcp-server/blog/x402-buyer-anatomy.

What distribution taught us: catalogs and registries only make a tool findable. They don't create buyers. The next topic explains why there were so few to find.

Overview / Topic

Market & demand

This is the central story of the week. We first tried to find demand through web search, then through seller statistics, and finally by analysing every buyer on Base for a month. The answer changed the direction of the project.

In short
  • About 90% of x402 money on Base comes from wallets that pay only one seller. That looks like each seller's own users or own app.
  • The open market, agents shopping across sellers, is about 1,700 buyers spending $10.7k per month across the whole network.
  • Volume peaked in November 2025 and has declined since. The sellers who earn mostly resell paid APIs.

Step 1: web search (didn't work)

The Demand Scan stage asked a model to search the web for evidence of unmet demand. DuckDuckGo blocked most queries, and later all of them. The model did the right thing: it reported "inconclusive" and suggested no topics rather than inventing some. One run did return results. Its two suggestions failed a manual source check: a free tool already existed for one, and the other rested on filler content.

Step 2: seller statistics (x402scan)

x402scan indexes every x402 payment and has a public API. Its 30-day seller list showed how crowded each category was:

Step 3: buyer anatomy

We had been asking which tools agents want. The better question: do buyers shop around at all, or does each seller bring its own users? If buyers don't shop, then building and listing a tool can't work, however good the tool is.

Method: pull every buyer on Base over 30 days (18,285 of 18,291) and every seller they paid. First remove a six-wallet wash ring that sent about $139k back and forth, and payments over $5 per call. Then sort buyers into three groups:

Who x402 buyers on Base are
Share of each total, last 30 days, snapshot 23 Sep 2026
Captive (1 operator)Open market (2+ operators)Probe (indexers, QA)
Show data table
TypeBuyersTransactionsUSDC
Captive15,7721,904,905$133,317
Open market1,681203,763$10,741
Probe22873,847$3,475
Total after filters17,6812,182,515$147,533
Source: pipeline/reports/buyer-anatomy.md, generated by buyer-anatomy.mjs from x402scan's public API.

The open-market money is also concentrated:

Repeat open-market buyers per operatorOperatorsOpen-market USDC received
0 (where we were)14,899$1,220
1–21,389$5,124
3–9268$1,252
10–2983$799
30+17$2,346

Where open-market buyers go: paid-API resellers (stableenrich, socialx402, twit.sh), large tool catalogs (agent402, ottoai, 2s.io), and a few data brands (Nansen, Exa). The stable* family belongs to Merit Systems, which also runs x402scan and AgentCash. That is why AgentCash became our one distribution experiment.

Step 4: market outlook

USDC settled via x402 on Base, per month
Oct 2025 – Sep 2026, gross, not wash-filtered · months sampled in the report
Average daily buyers
Oct 2025 – Sep 2026, same months
The November 2025 spike was a token mint (PING) paid through x402. September 2026 covers 23 days (lighter bar). Source: x402scan stats.bucketed, in pipeline/reports/market-outlook-2026-09.md.

The decision (23 Sep)

  1. Stop building new tools. Keep the five running, since they cost almost nothing.
  2. Run one cheap distribution experiment (AgentCash), then re-run the buyer analysis on 23 October and decide per tool.
  3. Publish the analysis as a blog post.
  4. Don't expect near-term income from x402 revenue. The asset is the skill set: agent pipelines, Workers, on-chain payments, market analysis.
  5. Build one paid-API-reseller tool only if the review shows life.

Rejected options: an integration service, more trust-primitive tools, more listings without a channel on the wallet side.

Postscript: the first outside payer (24 Sep)

Hours after the AgentCash re-registration, a new wallet paid three of our tools. The on-chain history showed an automated sweeper: about 2,000 USDC transfers to 632 different x402 sellers since early September, in bursts two seconds apart. It is an indexer or crawler, not demand. We are watching whether it repeats.

Overview / Topic

Lessons

What to repeat, what to do first next time, and what carried over to the next project.

The big one: measure demand before building

The factory made building the hardest-guarded step, with review, two-pass code generation, smoke tests, QA and a publish gate. The real bottleneck was demand, and the pipeline had no reliable way to see it. The only demand signal that ever worked was on-chain data, and we pulled it by hand after five tools were already live. Next time, the first step is a demand map from a source with real usage numbers. The idea comes second.

Engineering habits worth keeping

Ways of working that held up

What carried over to the Apify project

The Apify Store's public API shows users, runs and failures for every tool over 7, 30 and 90 days. That is the demand map x402 never had. The project started from that data, not from an idea. We picked a category with a proven leader (1,222 users a month) and built a cheaper and broader alternative with the same habits: SSRF guard, charge only on success, a budget reserved before each scan, live platform test runs, and listing text treated as part of the product.

Open threads

Overview / Topic

Glossary

Short definitions for the terms used on these pages.

Protocol and payments

x402
An open protocol for paying per HTTP request with stablecoins, built on the 402 Payment Required status code. Started by Coinbase, now under the x402 Foundation.
402 challenge
The server's reply to an unpaid request. Its PAYMENT-REQUIRED header lists price, token, network and payTo.
payTo
The wallet address that receives payments. All our tools share one.
USDC
A dollar stablecoin. Prices here are in USDC; 0.01 USDC is one cent.
Base / Base Sepolia
Coinbase's Ethereum layer-2 network (chain 8453) and its testnet (chain 84532), where test USDC is worthless.
EIP-3009
A token standard that lets a holder authorize a transfer by signature, which someone else submits and pays gas for.
EIP-712
A standard for signing structured data. Its "domain" names the contract, and a wrong token name there makes every signature invalid.
Facilitator
A service that verifies and settles x402 payments on-chain and pays the gas. Ours: Coinbase CDP, PayAI, Primer.
Verify / settle
The two facilitator calls. Verify checks a signed payment without moving money. Settle puts it on-chain.
Bazaar
The x402 discovery extension. Metadata sent with a payment gets the tool listed in that facilitator's catalog.
Seeding
Our term for one small real payment per tool per facilitator, made to get listed.
Builder Code (ERC-8021)
An attribution tag added to settlement transaction data. base.dev counts transactions carrying ours.
Pay per attempt
Once payment settles, the call is charged even if the tool then fails.

Infrastructure and tooling

Cloudflare Workers
Serverless functions at the edge, where all five tools run. 128 MB of memory on every plan.
wrangler
Cloudflare's command-line tool. wrangler dev runs a worker locally in the real runtime; wrangler deploy ships it.
Durable Object
A Cloudflare primitive with single-threaded state. It is what makes burn-once's "exactly once" guarantee hold.
SSRF
Server-side request forgery: tricking a server into fetching internal addresses. Every URL-fetching tool blocks it.
MCP
Model Context Protocol, how AI clients such as Claude call external tools. Our server runs locally over stdio, not as a hosted HTTP endpoint.
OpenClaw
The local agent runtime the pipeline uses to call models (openclaw capability model run).
Z.ai GLM
The cheaper model family used for Scout, Demand Scan and Pass 1.

Market analysis

x402scan
An explorer that indexes x402 payments, with a public API. Run by Merit Systems.
AgentCash
Merit Systems' agent wallet and tool-discovery plugin. It reads /openapi.json with x402-specific fields.
Captive buyer
A wallet that pays exactly one operator. It looks like that operator's own users or app.
Open-market buyer
A wallet that pays two or more operators with repeat use. It looks like an agent that shops around.
Probe wallet
A wallet that pays many operators once each, like an indexer, QA bot or sweeper.
Moat
What makes a tool hard to replace with the agent's own code or a free API.