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
Built a staged pipeline where cheap AI models draft, a stronger model reviews, and scripts test everything against real infrastructure.
Shipped five paywalled tools on Cloudflare Workers, an MCP server on npm, and listings in every catalog we could find.
Hardened it. Almost every quality gate exists because a specific bug got through without it.
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.
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.
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.
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.
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.
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.
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).
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.
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 →
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.
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
The agent calls the toolA normal POST to the worker URL, without payment.
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.
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.
The agent retries with the signatureThe same request again, now with a PAYMENT-SIGNATURE header.
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.
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.
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:
Facilitator
Setup
Discovery catalog
Role for us
Primer Systems
No signup
None (extensions: [])
Our only facilitator until 22 Sep, now last fallback
PayAI
No key, free tier
Yes (Bazaar), lists within seconds
Second in the chain
Coinbase CDP
API key, signed JWT per request; 1,000 free settles a month
Yes (Bazaar), plus Builder Codes
First 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:
402 first, then validate, then settle. A request without payment always gets the 402, so discovery works. We briefly validated first, and x402scan rejected a tool for answering 400. A request with a payment attached is validated before the payment is settled, using cheap, bounded checks (schema, size cap, blocked URLs), so honest mistakes cost nothing. Expensive work, like launching a browser, runs only after settlement so nobody can trigger it for free. We got this wrong twice in every tool. See Verification →
Pay per attempt. Once a payment settles, a failure inside the tool (for example, the target site returns 404) is still charged. This is simpler and is documented in each tool. We chose to keep it for now.
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.
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.
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
Stage
Runs on
Added or changed because
Demand Scan
Z.ai glm-5.3 + web search
Scout 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.
Scout
Z.ai glm-5.3-flash, no network
Original stage. Since 20 Sep it must mark sections it cannot verify with SCOUT-UNVERIFIED.
Viability Review
Claude Sonnet 5 + web search
token-rugcheck-scanner passed every earlier check but was a thin wrapper around a free API (20 Sep).
Approval gate
Human
The build refuses any proposal that still contains an unverified marker, so the review cannot be skipped.
Pass 1 Scaffold
Z.ai glm-5.3-flash, thinking off
Cheap code generation. Since 20 Sep it must also produce a real QA fixture for the smoke test.
Pass 2 Audit
Claude Sonnet 5
A 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 test
Script, testnet only
geotiff had three bugs that type checks and unit tests could not catch (20 Sep).
QA simulator
Script
Original stage. On 21 Sep it gained lifecycle checks, which found the burn-once 410 bug on their first run.
Publish
Script
The 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 generation
Script, automatic
A manual step that was easy to forget. It now runs on every catalog change.
Ship + seed
Script + human go-ahead
Mainnet 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.
P0, fixed 21 Sep: publish without QA; a stateful check nobody ran; a deploy script that no longer matched the config format and flattened every price to 0.01.
P1, fixed 21 Sep: automatic MCP regeneration; removing triplicated helper code; no longer resending the full template in every prompt (cut 44–80% of that text).
External second opinion: 2 of its 5 points were real and fixed (the MCP spending ceiling and facilitator retries). The other 3 were wrong when checked against the code.
The full report lives in the repo at pipeline/reports/architectural-audit.md.
What is still weak
Scout still cannot see demand, and the Demand Scan is blocked. Tool results (buyers or none) never flow back to Scout.
There is no CI and no spending ceiling across the pipeline as a whole.
The deeper lesson: every gate protects build quality, and none protects against building something nobody needs. See Market & demand →
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.
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
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.
Local workerwrangler dev, the real Cloudflare runtime on your machine. This catches missing files, bad config and libraries that break in Workers.
Real testnet paymentSign, settle on Base Sepolia, and check the result. Automated in Pass 3 and costs nothing.
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.
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
Bug
How we found it
What it became
Testnet USDC signed with the mainnet token name
Facilitator rejected every payment
Rule: read contract values on-chain
Parser dropped a finished 16-minute generation over one line break
While timing Pass 1
Tolerant parser in the shared library
[[browser]] instead of [browser] in config
Only failed at real deploy
Build template fixed
Error responses returned HTTP 200
Pass 2 review
Pass 2 now sees real test output
geotiff: missing asset folder, wrong library return shape, WASM loader fetching its own file
Running wrangler dev
Pass 3 smoke test, mandatory
Payment settled before the request was validated, in every tool
A malformed request with payment was charged, then got 400
Validate before settling, size caps, verified with real mainnet payments
Unpaid malformed requests got 400 instead of 402, hiding the price from indexers
x402scan 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 above
QA now fails on a 402 there
Smoke test left a wrangler dev process running
Testing the smoke test itself
Kill the whole process group
Viability text replacement duplicated sections
Live run on a real proposal
Regex fixed ($ matched end of line)
burn-once: second read gave 404, not 410; multi-read vaults lost their secret after one read
New lifecycle check, first run
Lifecycle checks in QA fixtures
MCP client would sign any amount a server asked for
External critique
Hard ceiling at the catalog price
Tools could be published without passing QA
Architectural audit
Publish gate
Deploy script flattened every price to 0.01
Two tools' prices were being overwritten
Script fixed
geotiff WebP output: 500 after payment since launch
Paid calls during the facilitator rollout
End-of-session paid sweep checks response bodies
CDP rejects descriptions over 500 characters
Payments silently falling back to PayAI
Descriptions clamped
Non-Latin-1 text breaks btoa() in the 402 header
Tests on the discovery generator
Generator 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.
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.
Fetches 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-md
0.03
Renders 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-vault
0.01
Stores 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-renderer
0.015
Turns data into an SVG bar chart.
no simple geometry any agent can do
wasm-geotiff-transcoder
0.03
Converts 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
Idea
When
Why it was dropped
token-rugcheck-scanner
After building
One 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 tool
Before building
Would require holding a third-party API key for the caller. The pipeline has a hard rule against that liability.
botwall-render-extract
Before building
Priced 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-synthesis
Before building
Same 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:
Is there a real cost basis: a paid upstream, metered compute, or genuine multi-source work?
Could the agent get the same output with one more fetch of its own? If so, what extra work changes that?
Do live competitors already exist on x402scan, GitHub or the web, and what do they do better?
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 →
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.
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
Channel
What we did
Result
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.
livex402-mcp-server_by_milza 1.0.5
Claude Desktop integration
Tried 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
Smithery
Needs a hosted HTTP MCP server. Ours runs locally over stdio.
skipped would need a real architecture change
x402scan, agentbit
Registered 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 Market
Checked 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:
Base Builder Grants: retroactive, 1–5 ETH, for anything live on Base mainnet. We already qualified.
CDP Builder Grants: small, round-based, and it does require integrating Coinbase's developer stack. No round was open.
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.
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.
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.
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:
Markdown extraction: 33 sellers. Crypto data: 166. Company registries: saturated.
The burn-once and GeoTIFF niches were nearly empty. Emptiness can mean either an opportunity or a lack of demand.
Almost all active sellers settle through CDP, which led to the facilitator switch. See Distribution →
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:
Captive: pays exactly one operator.
Open market: pays two or more operators, with some repeat use.
Probe: pays five or more operators, mostly once each. These look like indexers and QA wallets.
Who x402 buyers on Base are
Share of each total, last 30 days, snapshot 23 Sep 2026
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 operator
Operators
Open-market USDC received
0 (where we were)
14,899
$1,220
1–2
1,389
$5,124
3–9
268
$1,252
10–29
83
$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.
Direction: flat to declining through 2026. Independent sources agree. Artemis estimates about half of x402 transactions are gamed (CoinDesk), Helios reports settlement volume down 93% year to date (Yahoo Finance), and American Banker reported a volume decline.
Infrastructure is ahead of demand: an x402 Foundation under the Linux Foundation; a no-code Cloudflare Monetization Gateway; Stripe's parallel protocol (MPP), which also supports x402.
"x402 integration as a service" is commoditized: it's one line of middleware, Cloudflare does it without code, and we found no hiring demand.
Trust tools (burn-once's niche): about two dozen sellers. The best has 48 buyers and $32 in 30 days.
What earns: reselling paid APIs that normally need an account.
The decision (23 Sep)
Stop building new tools. Keep the five running, since they cost almost nothing.
Run one cheap distribution experiment (AgentCash), then re-run the buyer analysis on 23 October and decide per tool.
Publish the analysis as a blog post.
Don't expect near-term income from x402 revenue. The asset is the skill set: agent pipelines, Workers, on-chain payments, market analysis.
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.
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
Run it for real. Every serious bug this week passed static checks. A real runtime plus a real (testnet) payment is part of the build, not an optional extra.
Turn incidents into gates. When a class of bug appears, add an automated check. Don't rely on memory.
Verify money facts at the source. Contract values come from the contract, payments from the transaction receipt, and responses are checked by their body.
Cheap models draft, a strong model judges. Put the expensive model only where a wrong "yes" is costly.
Confirm what actually answered. Model names can be rerouted, and a 200 can hide a failure.
Bound automated cost. Any automated stage must be impossible to abuse into spending real money. Automated tests only spend testnet funds.
Ways of working that held up
Dry-run before anything that spends money or deploys. Show the plan or file list, then wait for a go-ahead. Each escalation (testnet to mainnet) gets its own check-in.
Ask on judgment calls. If a decision with no clear default comes up mid-task, stop and ask instead of choosing silently.
"Propose" means describe. A request for a proposal gets a plan in words, not a pile of diffs.
Check research against the source. The grant document mixed up two programs, a marketplace's signup didn't match its docs, and an external critique was wrong on three of five points.
End each session with proof. Commit, run a small paid sweep of every live tool with bodies checked, refresh the numbers, and update the notes.
Keep commits atomic. One logical change per commit, even when the working tree has changes mixed together.
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
23 Oct review: re-run the buyer analysis and AgentCash search, then retire or keep each tool based on outside buyers.
Check now and then whether AgentCash search shows our GeoTIFF tool, which has no real competitor there.
Small backlog item: the shared btoa() fix for non-Latin-1 text in 402 headers.
Parked: a remote MCP transport (needed for Smithery), an ElizaOS plugin, community posts.
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.