- Retired 40 free-tier tools and 29 skill packs that were named on no marketing surface and had zero
external use (paid or proof-of-work) in the preceding 30 days. Kits
encoding,math,stringandcolorare gone;date-time,validation,crypto-hash,utilandtext-analysiskeep only the tools a live pack or the test corpus depends on. The catalog stays above 500 entries. Removed routes answer 404.
- Finished report products on
/v1- one paid call returns a complete, cited report:POST /v1/research($0.35) //v1/research/pro($0.65) //v1/research/max($1.10) //v1/research/market-brief($0.35),/v1/dossier($0.55) //v1/dossier/max($0.95),/v1/fund($0.25) //v1/fund/max($0.50),/v1/domain-audit($0.20) //v1/domain-audit/pro($0.30),/v1/recall-report($0.20),/v1/insider-report($0.25),/v1/filing-report($0.25),/v1/token-brief($0.35),/v1/ticker-pack($0.75),/v1/token-risk($0.30) //v1/token-risk/pro($0.60), and the deterministic/v1/ipo-report($0.05). Grounded in primary data fetched by the server (EDGAR, openFDA, DNS/TLS, on-chain reads, live web search) before synthesis; wallet-only. - Card front door for people -
/reports(Stripe Checkout,POST /api/buy, delivery at/r/:sessionId; $1 a report, $2 for the deepest three, because the card price carries Stripe's 2.9% + $0.30 per charge while an agent paying per call pays the lower tool price for the same report; a report is generated once per paid session, a failed generation is refunded),/monitors($3/month subscriptions: domain security, SEC filings, Solana token safety, fund 13F, FDA recall, insider flow, IPO pipeline - cheap daily probes, a paid re-run and an email only on change, reports at/m/:id, Stripe Customer Portal at/monitors/manage), and/credits(prepaid $20 / $50 / $100 packs, onea402_key,Authorization: Bearer a402_...on any priced route, debited only on a successful response, never expires,GET /api/credits/balance; identity-bound routes refuse it). All of it mounts only withSTRIPE_SECRET_KEY.agent402-mcp0.13.0 readsAGENT402_CREDITS_KEY;agent402-client0.7.0 takes{ creditsKey }. - MPP everywhere - every 402 carries
WWW-Authenticate: Paymentalongside x402;evmcredentials translate to x402 settlement,temposettles natively on Tempo through Tempo's relay (USDC.e or PathUSD, chain-confirmed on a relay failure), andstripe/chargeoffers cards over MPP on routes priced $0.50 and up when configured. Rejected credentials answer RFC 9457application/problem+json. The hosted MCP connector pays wallet-only tools over MPP too.agent402-tollbooth0.9.x gains native MPP:createTollbooth({ x402 })mints evm challenges from your@x402/expressmiddleware,createTollbooth({ tempo })settles on Tempo with split payments and no x402 middleware at all. - LLM gateway -
POST /v1/rerank($0.002, Cohere wire), the Anthropic Messages wire and the OpenAI Responses wire on every tier,POST /v1/grounded/chat/completions($0.03, live web search withurl_citationannotations), five-model text-to-speech failover chain. - MCP tool names are dotted on both connectors -
catalog.search,catalog.find,catalog.call,payment.info,server.describe,sellers.list,demand.requestplus the flagshipsweb.search,web.answer,web.news,browser.render,market.quote,audio.transcribe,memory.read,memory.write; the prior snake_case names remain call aliases. - Site - dark theme by default with a light toggle; self-hosted fonts;
/reports,/monitors,/creditspages; the homepage loads no third-party script.
Catalog reshaped. Roughly 970 generated pairwise unit-converter endpoints
(/api/convert-miles-to-km and friends) were retired in favour of the one
parametric tool that already served every pair, POST /api/unit-convert, and the
catalog was then rebuilt out to 500+ entries: 400+ tools + 100+ skill packs.
Retired converter routes return a teaching 410 naming the replacement route
and handing back a ready-to-send { value, from, to } body, never a 301 - an
agent must not silently re-POST a paid call across routes. Retired tool pages
do 301, since a page visit has no re-POST hazard. CI now derives counts from the
booted server (/health for the total, /api/skill-packs.json for the packs)
and holds a 400-entry catalog floor, so the numbers can't be gamed by editing a
doc: scripts/sync-count.js --check. Full notes: docs/releases/v2.0.0.md.
Because of that prune, the tool counts quoted in the entries below predate
v2.0.0. They were accurate when written and are kept as history, not as current
figures. Read /health and /api/skill-packs.json for live numbers; documented
surfaces carry evergreen claims ("500+ tools") rather than an exact figure that
rots on the next commit.
-
Relicensed the server to AGPL-3.0 (the
client/,mcp/, andtollbooth/npm packages stay MIT). The rootLICENSEis now the GNU Affero GPL v3, and a newNOTICEdocuments the split: the self-hostable server is copyleft (run a modified version as a network service and you must offer its source to users), while the buyer SDK, MCP connector, and pay-per-crawl middleware remain permissively licensed so they can be embedded without obligation. The public promise thatagent402-tollboothstays MIT is unchanged. Served copy, the README badge, docs, and the machine-readable/.well-known/x402licensefield updated to match;agent402-tollboothmarketing continues to read MIT. Secret-scanning (gitleaks) now runs on every push and PR. -
Conversion funnel: diagnose the 402→settle drop-off (
paywall_402+ newpow_challenge). The funnel could show that agents bounce at the paywall but not why. Two privacy-preserving dimensions fix that (still counts-only - no IP/UA/wallet): (1)paywall_402gainsattempt, splitting every 402 intonone(first-contact quote - no payment header: no wallet, a crawl, or looked-and-left),usdc_failed(anX-PAYMENTauthorization was present but rejected - a buyer that tried and couldn't, the fixable leak), orpow_failed(bad/expired proof-of-work). (2) A newpow_challengeevent counts free-tier challenges issued (GET /api/pow/challenge); paired withpayment_settled{rail=pow}it yields the free-tier take rate (issued → solved), exposing whether the free path is undiscovered or just too much friction. Both roll up per(slug, …)on the existing 15-min flush so crawler sweeps can't blow the event budget; the long tail folds perattemptso the split survives for tail slugs. CI-locked (scripts/test-posthog-funnel.js). -
Buyer SDK spending caps (
agent402-client→ 0.5.0): the client now takes optionalmaxPerCallUsd,dailyLimitUsd, andmaxPerHostUsdceilings. A paid call that would break a cap is refused withSpendingLimitErrorbefore any payment is signed - a buyer-side circuit breaker against a malicious or misconfigured402that quotes an inflated price (the "wallet drain via uncapped spending" failure mode). Only settled paid calls count against the rolling-24h window; blocked/failed calls and free proof-of-work calls never consume budget. Newa.spendingSummary()for observability. Default (no caps set) behaviour is unchanged. -
Payment-metadata minimisation, stated explicitly (privacy + discovery manifest): an x402 token can carry optional annotation fields (resource URL, description,
reason) that a buyer might fill with personal data. Agent402 reads only the signed payer address and never parses, logs, or retains those fields - now spelled out on/privacyand exposed machine-readably at/.well-known/x402(payment.dataHandling) so a compliance-aware buyer can verify posture before transacting. No behaviour change - the code already did this; this documents and attests it. -
New tool
x402-audit(catalog: 1,350 → 1,351 tools): grade any x402 seller's externally-observable payment-security posture from a single read-only probe of its 402 challenge (never pays). Scores TLS transport, gated-response cache hygiene (Attack III / cache leakage), error/info-leak hygiene, and payment-terms well-formedness into a letter grade with per-check findings, each mapped to a failure mode from the "Five Attacks on x402" analysis - and honestly notes what a black-box probe cannot see (replay/idempotency and router Sybil resistance need insider or active testing). The grader is a pure, deterministic function (gradeX402Response), so it's CI-stable; the tool is wallet-only (paid surface).GET /api/x402-audit?url=…. CI-locked (scripts/test-x402-audit.js). -
Payment-nonce replay guard (security hardening, M3): the x402 paywall now rejects a duplicate payment authorization before it reaches the facilitator, and refuses a concurrent replay (the same signed authorization fired many times at once, racing the settle). Agent402 already settles-before-grant - an EIP-3009 nonce is single-use on-chain, so a replayed authorization fails at the facilitator and the duplicate-grant rate was already 1 - this is a strictly-earlier, cheaper defense-in-depth layer against Attack II ("replay / insufficient idempotency") from the "Five Attacks on x402" analysis. Release-on-failure: a nonce is only marked consumed on a granted 200 (which, under settle-before-grant, means the payment settled); any non-200 releases it so a legitimate retry of the still-valid authorization proceeds. Requests without a payment header (unpaid 402 challenges, discovery crawls, proof-of-work calls) are never touched. New
src/replay-guard.js; CI-locked (scripts/test-replay-guard.js, incl. a concurrent-replay HTTP E2E proving 8 identical authorizations collapse to a single grant). -
Router Sybil / metadata-capture resistance (security hardening, M6): the neutral cross-seller router (
/api/route, MCP router) now (1) drops any external listing whose text tries to command the ranker - "ignore previous instructions", "always pick this", fake<system>tags, oversized padding - instead of describing a tool, and (2) caps how many shortlist slots any one external seller can occupy (ceil(k/3)), backfilling from the remainder so a full shortlist is still returned. This blunts the discovery-capture failure mode (Attack IV) from the "Five Attacks on x402" analysis, where one crafted server reached 71.8% selection via metadata injection and a single domain owned 77.5% of a real registry's results. The local catalog is exempt (one trusted seller by construction); honest limitation: a Sybil spread across many distinct domains/wallets still gets one slot each - the paper's open problem. CI-locked (scripts/test-router-sybil.js). -
Cache hygiene on paid responses (security hardening, M5): every gated catalog response now sets
Cache-Control: no-store, private, so a shared cache or CDN can never serve a paid result to a later unpaid caller of the same URL. This closes the cache-leakage failure mode (Attack III) from the "Five Attacks on x402 Agentic Payment Protocol" analysis, which validated the leak at 100% on nginxproxy_cache. Free discovery/static surfaces (/llms.txt, landing,/api/find,/api/pricing…) are unaffected and keep their public caching. CI-locked (scripts/test-cache-hygiene.js). -
Skill packs are now the front door: the home page hero, page titles, meta/OG descriptions, and top nav all lead with "46 skill packs - a whole agent job, one x402 payment" (the tool catalog reframed as the supporting long tail), with a six-pack flagship showcase (financial-research, search-and-cite, onchain-analyst, seo-audit, wallet-readiness, decode-blob) linking straight to
POST /api/skill/{slug}. llms.txt now tells agents up front that packs are buyable as ONE bundled x402 call - previously it only advertised the free prompt-template route. Every count stays exact. -
Sales ledger (
/api/sales): every served paid/proven call is recorded at settle time - slug, price, rail, settlement chain, verified EIP-3009 payer, settle tx - on the persistent/datavolume, classified internal/external (heartbeat-token traffic and burner-wallet payers never count as demand). Answers the merchant question the odometer can't: which tools do external wallets actually buy, and who comes back. The paid canary sends the POW_SECRET-signed heartbeat token on every request so its daily real-money buys are excluded from demand metrics on all rails (including Solana, where the payer isn't server-visible). Since superseded: the public/api/salesendpoint is now aggregate-only - totals, the recording window, and counts, with no per-call rows, no payer addresses, and no per-tool ranking. The itemized feed moved behind the operator token at/__operator/sales.json, the analyzed per-tool layer is the paidbestsellerstool, and the "What's selling" section this entry added to/revenuehas been removed. -
Four new skill packs (catalog: 1,346 → 1,350 tools, 42 → 46 packs), aimed at real agent jobs on the newest kits:
wallet-readiness($0.05 - USDC balances on Base + Solana, gas, and a Coinbase Onramp funding link in one preflight),onchain-analyst($0.20 - your SQL over Coinbase's decoded Base data with the schema + a stats profile of the result in the same envelope),seo-audit($0.07 - reachability, TLS, robots policy incl. LLM crawlers, sitemap, meta/OG, and X-Robots-Tag headers for one URL), andcheapest-rail($0.05 - live cross-chain gas comparison priced in dollars). All four are wallet-only (every underlying tool hits the network). agent402-mcp 0.11.2 and agent402-client 0.4.2 republished for the corrected catalog metadata. -
PostHog conversion funnel (discovery → 402 → settlement): the env-gated PostHog stream gains three funnel events -
discovery(machine-readable surface fetches: llms.txt, openapi.json, the x402 manifest, pricing,/api/find, index, route, and the MCP connector's search/find/about tools),paywall_402(quotes issued; rolled up in memory per slug/window so registry-crawler sweeps can't blow the event budget -sum(count)is the exact total), andpayment_settled(rail-attributed: usdc with the settlement chain from the x402 receipt, pow, heartbeat, marketplace). Privacy posture unchanged: no caller IP/UA/wallet- aggregate stage counters only, conversion computed as a ratio of stage totals. A CI test boots a paid-mode server against a mock facilitator (real offline 402s) and asserts the exact events; an operator dashboard with stage trends, the 402→paid conversion ratio, and settled-$ tracking ships alongside.
-
Weekly x402 Economy report: every observatory refresh now persists its daily settlement rows into SQLite on the
/datavolume, so history compounds past the 30-day query window./x402-economygains a week-over-week trend line (trailing 7 complete days vs the prior 7) and/api/x402-economyexposesweekly; the daily digest workflow warms the snapshot so a history row lands every day even with zero page traffic. -
Claims audit (site + GitHub + packages): every public factual claim re-verified against the live system. Tool counts corrected 1,338 → 1,346 across 27 files (README, wiki, npm package descriptions, site pages, badges); free-tier count corrected to 1,156 (was variously ~1,040/~1,100/1,158); the hardcoded GitHub star count removed from the site nav; hand-written chain lists that omitted the USDG/Robinhood rail completed (landing metas, pricing meta, MCP connector tool descriptions); third-party claims hedged (Cloudflare gateway status, Stripe's x402 role stated as client tooling); absolutes softened ("every x402 seller" → indexed sellers, "guaranteed valid JSON" → schema-enforced, "only public gate" → one of the few). Packages republished for the corrected npm metadata: agent402-mcp 0.11.1, agent402-client 0.4.1, agent402-tollbooth 0.4.1.
-
x402 Economy Observatory (
/x402-economy+GET /api/x402-economy): live, chain-wide analytics on the x402 economy - daily gasless EIP-3009 USDC settlements on Base, unique payers, volume, and the top-earning seller wallets, measured directly from decoded on-chain events (Transfer + AuthorizationUsed pairs on the USDC contract) across EVERY seller, not just Agent402 - including sellers no directory has indexed. Data flows through the same paidonchain-sqltool agents can buy. 30-minute cache, per-query error resilience, graceful "warming up" state without CDP keys. -
Onchain SQL (
onchain-sql$0.02 +onchain-sql-schema$0.002): run read-only ClickHouse-dialect SQL against Coinbase's indexed, DECODED chain data -base.events(decoded logs with parameters),base.transactions,base.blocks,base.decoded_user_operations,base.transaction_attributions(builder codes), plus Solana token instructions - as a pay-per-call x402 tool. Ask Base anything in one call, no indexer to run; server-side grammar validation, 50k rows / 30s / 100GB-read caps, optional result caching. The groundwork for the x402 Economy Observatory. -
Solana onboarding parity:
testnet-fundnow also drips on Solana devnet (USDC or SOL via the CDP faucet, base58 validation, solscan devnet links) andwallet-balancesreads Solana + Solana devnet SPL balances (mint address in thecontractfield) - the create → rehearse → fund → verify loop now covers both major rails end to end. -
Wallet birth-to-first-purchase E2E + non-custodial wallet guide: a CI test generates a fresh keypair inside the runner (only the address is ever printed), funds it with testnet USDC via the CDP faucet, completes a REAL gasless x402 purchase against a paid-mode base-sepolia server, then scans every byte of its own output and the server's full log for key material in any prefix/case form - failing on any hit. The offline leg (keygen + leak audit) gates every test run. A new guide,
/guides/create-agent-wallet, documents the same flow for users: keys generated locally and never transmitted, gasless payments (USDC only, no ETH), testnet rehearsal viatestnet-fund, real funding viaonramp-link. -
CDP onboarding kit (
wallet-balances,testnet-fund,onramp-link): agent-wallet onboarding tools built on the Coinbase Developer Platform, reusing the same CDP keys that already drive x402 settlement (no new secrets; 503 when unset).wallet-balancesreturns indexed ERC-20 + native balances for any address in one call;testnet-funddrips Base Sepolia USDC/ETH via the CDP faucet so an agent can rehearse the full x402 payment loop safely - a tenth of a cent buys a full testnet dollar (local + CDP-side rate caps);onramp-linkmints a single-use Coinbase Onramp URL so a human can fund an agent's wallet with a card or Apple Pay. Auth is a zero-dependencynode:cryptoJWT signer (ES256 PEM + Ed25519 base64, mirroring the official SDK's claims), unit-tested offline with real signature verification plus a live CI check where the secrets exist. -
USDG buyer support in the packages:
agent402-mcp0.11.0 addsAGENT402_NETWORKS(restrict + order the chains the buyer pays on -robinhoodsettles USDG on chain 4663; raw CAIP-2 accepted);agent402-client0.4.0 exports a zero-depwithNetworkPreference(client, networks). Both throw before paying if the preference matches none of a seller's options. -
Tollbooth 0.4.0:
TOLLBOOTH_ASSET(with the existingTOLLBOOTH_NETWORK) lets operators charge crawlers in USDG on Robinhood Chain; defaults (USDC on Base) unchanged and regression-guarded. -
Network-aware Smart Order Router: crawled sellers record every chain their 402 advertises;
/api/route?network=<name|caip2>filters to sellers that settle there (positive-signal semantics);/indexrows carrynetworks. -
/robinhood: dedicated landing page for the USDG rail (chain params, buyer/seller recipes, on-chain proof), derived from the single rails source of truth.
-
Revenue visibility:
SCAN_NETWORK=robinhoodon the revenue scanner (USDG on chain 4663); the CI probe scans it when offered; a new daily revenue-digest workflow maintains a single per-rail takings issue. -
Live consolidated revenue view (
/revenue+GET /api/revenue): every rail's wallet balance and recent inbound transfers on one page - Base / Solana / Polygon / Arbitrum / Robinhood Chain read live from public RPCs (60s cache, best-effort per rail), every figure linking to its explorer proof. Replaces cycling three explorer tabs; the rails-copy CI lock asserts the view covers every configured rail. Transfers are classified with the scanners' shared rule - internal canary/test money renders dimmed and never counts as revenue. -
All-time revenue ledger (
src/revenue-ledger.js): a persistent SQLite table (on the/datavolume, same pattern as stats) of every inbound stablecoin transfer on every rail, backfilled from the wallet's first funding via polite chunked RPC sweeps with a resumable per-chain cursor, then tailed incrementally.SUM(external)= true all-time revenue - the headline figure on/revenueandallTimein/api/revenue, with per-chain splits and sync progress. Unit-tested (idempotent rescans, wallet scoping, CI self-gate: the loop only runs where/dataexists orREVENUE_LEDGER=true). -
Ops armor: daily USDG canary leg (real $0.001 settlement, accepts-pinned), heartbeat rails check (pages if Base - or an intended Robinhood rail - drops from the live 402), deploy job now polls Railway to SUCCESS before verifying (no more false-green deploys), and a gating rails-copy CI lock (
src/rails.js↔ payments code ↔ rendered pages, incl. the topbar ticker). -
Robinhood Chain support (chain reads + a full payment rail): added Robinhood Chain (Arbitrum Orbit / Nitro L2, EVM-equivalent, chain id 4663, AI-native RWA chain, mainnet live 2026-07-01) end to end.
tx-statusandgas-estimateacceptnetwork=robinhoodagainst the public RPC (its canonical stablecoin is USDG / Global Dollar, not Circle USDC, so the USDC-specific tools return a clear message on that network). x402 payments settle in USDG on Robinhood Chain: opt in withrobinhoodinPAYMENT_NETWORKS+ an operator-suppliedROBINHOOD_FACILITATOR_URL; a custom money parser resolves USDG (6 decimals, EIP-712 domain env-overridable) and settlement routes to that facilitator without disturbing the CDP (Base) / PayAI paths. Verified with a real on-chain USDG settlement. -
Payments hardening: a network listed in
PAYMENT_NETWORKSwith no facilitator behind it (e.g.robinhoodwithoutROBINHOOD_FACILITATOR_URL) is now dropped from the 402 offer instead of poisoning the challenge - previously this surfaced as HTTP 500 on every paid endpoint. UnknownPAYMENT_NETWORKSentries are skipped with a warning instead of crashing boot. A gating CI regression test reproduces the exact misconfig. -
Facilitator failure observability:
onVerifyFailure/onSettleFailurehooks log every facilitator rejection loudly (kind, network, payer, reason) - a silent settle regression now leaves a trace. OptionalPAYMENT_SETTLE_FALLBACKre-settles via PayAI only on pre-broadcast rejections (never on timeout/5xx, so it can't double-settle). -
x402 Index + Smart Order Router (
/index,GET /api/index,POST /api/route): free, cross-seller routing layer. Crawls the local catalog plus operator seeds plus an auto-discovered set from public x402 registries (Coinbase CDP Bazaar, refreshed hourly). Picks the cheapest healthy seller for a task. -
Health-aware routing: each seller carries a rolling 5-entry crawl history. Sellers whose recent crawls errored are excluded from
/api/route; healthier sellers tiebreak ahead of cheaper-but-flaky ones at equal match score. -
Three-rail attribution on
/api/statsand/__operator: USDC / proof-of-work / heartbeat counts are tracked separately so the maintainer can see real external demand vs. internal probe noise. The heartbeat rail is now gated on aPOW_SECRET-signedX-Heartbeat-Token(HMAC of UTC minute with ±5 min skew) - not a spoofable User-Agent - closing the audit finding fromscripts/audit-deep.mjs. -
Charged-but-failed counter: any non-200 response that left an
X-PAYMENT-RESPONSEheader is now tracked so the operator can catch handlers that errored after the buyer was charged. -
New kits:
ocr-image(pure-CPU OCR) and a deterministicgeo-*set (distance / bbox / bearing / geohash). Since changed: the OCR tool is nowimage-ocr, and of the geo set onlygeo-distanceremains a route (the bbox / bearing / geohash endpoints were retired).
The service is feature-complete as a v1 and battle-tested end to end:
- ~1,338 pay-per-call tools live at agent402.tools: browser rendering/screenshots, live web search, PDFs, real-ffmpeg audio, wallet-keyed memory with cross-wallet grants and a hash-chained audit log, US open-data feeds, and ~1,040 pure-CPU utilities including ~970 unit conversions.
- Three payment rails: x402 (USDC on Base, Solana, Polygon & Arbitrum; Coinbase CDP facilitator), a proof-of-work free tier (single-use, slug-scoped sha256 challenges), and a third-party marketplace bridge. Since removed: the marketplace bridge no longer exists; x402 (now twelve chains) and proof-of-work are the rails.
- MCP everywhere: hosted streamable-HTTP connector at
agent402.tools/mcp(authless free tier, rate-limited) + theagent402-mcpnpm server (v0.3.0) with pre-signature spend controls - both published in the official MCP Registry. - Interop proven with real money: Stripe's
purlx402 client parses our quotes and settles paid calls (CI-verified); marketplace roundtrip settled real USDC end to end. - Operations: CI re-tests every endpoint against its own documented example before each deploy; a heartbeat probes production every 15 minutes and decodes on-chain receipts every 6 hours to flag external customers; SQLite state on a persistent volume; graceful drain on redeploy.
- Hardening: DNS-pinned SSRF guards with per-request browser re-validation, wallet-only gating of costly tools, zero
npm auditfindings (vulnerable Excel toolchain removed along with its tools), MIT-licensed and fully open source.