关于 Fizzl Buy
Fizzl Buy(README 中称 x402 Doctor)用于诊断 x402 付费端点和 MCP 付费工具的支付问题,面向 API 发布者及 Agent 开发者。它会指出失败检查及原因,并提供修复建议。
主要功能
- 01检查 x402 402 挑战
- 02检测 MCP 付费工具配置
- 03检查支付选项与结算条件
- 04评估钱包及服务发现情况
- 05输出逐项诊断结果
适用场景
- 01排查付费 API 未返回有效支付挑战
- 02检查 MCP 付费工具能否正确要求付款
- 03定位支付参数或收款账户配置错误
MCP 相关
可检查使用 MCP 的端点,包括工具描述中的付费标识、未付款调用的响应及工具投毒风险。它本身不是 MCP 服务。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://buy.fizzl.eu/mcpclaude mcp add --transport http fizzl13-fizzl-buy https://buy.fizzl.eu/mcp{"mcpServers":{"fizzl13-fizzl-buy":{"type":"http","url":"https://buy.fizzl.eu/mcp"}}}在 Cursor 中打开{"servers":{"fizzl13-fizzl-buy":{"type":"http","url":"https://buy.fizzl.eu/mcp"}}}在 VS Code 中打开{"mcpServers":{"fizzl13-fizzl-buy":{"type":"http","url":"https://buy.fizzl.eu/mcp"}}}{"mcpServers":{"fizzl13-fizzl-buy":{"serverUrl":"https://buy.fizzl.eu/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
x402 Doctor
· 实时状态 ·
诊断 x402 可支付端点的支付流程为何无法正常工作,无需准备有资金的钱包。
粘贴 URL(Web 应用),或运行 x402-doctor <url>(CLI、CI),即可准确了解哪项检查失败、原因以及
修复方法。每项检查都对应我们发布
PlainText 和
Ichimoku Signal 时遇到的真实问题。
▶ 观看 70 秒讲解视频(含配音和字幕): 诊断故障端点、为 Agent 提供付款前检查,以及每日信任指数。
▶ 新内容:70 秒了解付费修复方案:只需 $0.05,Doctor 就会为你提供药方——针对你的技术栈修复每个问题的准确代码,可在浏览器中查看,也可作为 JSON 提供给 Agent。
检查内容
| 分组 | 检查项 | 检测内容 |
|---|---|---|
| 402 挑战 | returns-402 | GET 或 POST 未返回 402(会分别尝试两者,也可使用 --method)。如果位于 Cloudflare 或 Amazon CloudFront 后方,提示会指出常见的 Monetization Gateway 或 AWS WAF Monetize 规则遗漏。端点先要求 x401 证明属于信息提示,而非失败。对于空请求体返回 400 或 422 的 POST,说明端点会在付款前检查输入:Doctor 会发送卖家的 /openapi.json 中的 requestBody 示例(或根据其架构生成的示例),也会使用你自己的示例请求体;如果没有示例,请求体检查会给出警告(需要输入),而非失败 |
x401 | 端点要求提供 x401 证明请求(PROOF-REQUEST,x401.id),而非返回 402:端点会先询问 Agent 背后是谁,再要求付款。若 base64url 载荷中包含方案 x401、版本和凭据请求(包括其协议、令牌端点和付款提示),则通过;如果 Agent 无法读取,则警告;对于旧版标头名称 PROOF-REQUIRED,则给出信息提示 | |
protocol-version、challenge-header | v1 与 v2 不匹配、缺少 x402Version、挑战位于错误的标头中、标头无法解码 | |
envelope-body-mirror | 仅有标头的挑战(@x402/express 会发送 {})、标头与请求体不一致 | |
| MCP(每次工具调用付款) | mcp-server | URL 未返回 402,但提供 MCP 服务(Streamable HTTP、JSON 或 SSE,有无会话均可):无需付款即可执行 initialize 和 tools/list |
mcp-paid-tools | 没有工具描述表明该工具需要付费(x402、USDC、价格),因此 Agent 无法判断 | |
mcp-payment-required | 对每个看起来需要付费的工具执行一次未付款的 tools/call(最多 2 个;优先选明确标注为付费的工具——标题中包含“Paid …”或价格 /“via x402”;绝不选自称免费的工具、破坏性工具,或未明确标注为付费的写入工具)。免费返回仅在工具明确标注为付费时触发警告,否则仅给出信息提示:工具结果中的 x402 付款要求带有 isError: true(如 @x402/mcp),或返回 HTTP 402 而非 PAYMENT-REQUIRED(可通过 HTTP 付款,但 @x402/mcp 客户端无法使用),或返回 JSON-RPC 错误、工具免费作答,或在付款步骤前拒绝示例参数(可将有效调用发布为 _meta.examples 来避免此情况)。之后会对付款要求执行下文的付款选项、结算和钱包检查 | |
mcp-tool-poisoning | 工具描述中隐藏了对 Agent 的指令(工具投毒):隐藏的 Unicode 字符、<IMPORTANT> 块、读取 ~/.ssh 或 .env、“不要告诉用户”、发送最大金额的 USDC(代码规则),然后通过每个工具的 TypeSafe Jev 检查(需要 TYPESAFE_API_KEY)。确定发现的问题标记为 warn,不确定的标记为 info。在官方 MCP 注册表中 96 个服务的 755 个工具上校准:没有误报,且成功检测出 5 个虚构的投毒工具 | |
mcp-payment-text、mcp-payment-structured | 付款要求仅位于 structuredContent 中(x402 MCP 传输要求在 content[0] 中包含 JSON 文本),或仅作为文本提供(优先使用 structuredContent) | |
| 付款选项 | accepts[i]-scheme、-network | 缺少方案;使用 base / solana:mainnet 等旧名称,而非 CAIP-2 |
accepts[i]-payto、-asset | EVM、Solana、XRPL 或 Algorand 地址无效(XRPL 和 Algorand 地址还会检查校验和);payTo 是无人持有密钥的占位地址(USDC 不接受的零地址、0x…dEaD,或 Solana 的 System Program 或 incinerator),MPP 的 recipient 也同样检查;资产不是 USDC,或是其他网络的 USDC(例如 Base 上使用 Base Sepolia USDC);Algorand 上的资产不是 ASA ID(USDC 的 ASA 为 31566704);XRPL 上的 XRP 金额未使用 drops,或“RLUSD”来自 Ripple 以外的发行方 | |
accepts[i]-amount | 使用十进制美元金额("0.02"),而非最小单位;金额为零或不是整数 | |
| Stellar 选项 | Stellar 上的 x402 exact(stellar:pubnet、@x402/stellar):payTo 必须是 G…、C… 或 M… 地址,且 StrKey 校验和有效;asset 必须是 Soroban 代币合约(USDC 为 CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75;"USDC" 或测试网合约会失败);amount 必须为正整数(USDC 有 7 位小数:100000 即 $0.01);并且需要 extra.areFeesSponsored: true,否则客户端会拒绝 | |
aws-test-mode | 通过 Amazon CloudFront 提供的 402 仅支持测试网(信息提示):AWS WAF Monetize 仍处于 Test currency 模式 | |
accepts[i]-extra | Solana 缺少 extra.feePayer(客户端会报错“feePayer is required”);EVM 缺少 EIP-712 name/version | |
accepts[i]-batch、-batch-delay、-batch-deposit、batch-escrow | batch-settlement 方案(向 x402 托管合约存入一次款项,然后每次调用使用一张已签名凭证,并批量申领):缺少 extra.receiverAuthorizer(客户端会拒绝);缺少 withdrawDelay 或其值不在 900 秒到 30 天之间;EIP-3009 存款缺少 EIP-712 域;minDeposit 未使用最小单位;该网络上未部署托管合约;买家承诺的存款金额和提现延迟 | |
accepts[i]-auth-capture、-auth-escrow、-auth-deadlines、-auth-fees、-auth-domain、-auth-flow、auth-capture-escrow | EVM 上的 auth-capture 方案(买家签名一次;金额会保留在 commerce-payments 托管合约中,直到卖家进行扣款,且截止时间前可以退款):缺少操作员(extra.captureAuthorizer);托管合约既不是 commerce-payments v1.1,也不是 v1.0;扣款截止时间已过,或退款截止时间早于扣款截止时间;手续费范围超出 0 <= min <= max <= 10000 bps,或缺少手续费接收方;EIP-3009 授权缺少 EIP-712 域;charge(paymentFlow 为 authorization)缺少 receiverAuthorizer;该网络上未部署托管合约;款项何时扣取,以及可退款至何时 | |
accepts[i]-cloudflare、-payto、-amount、cloudflare-registration | Cloudflare 按抓取付费(网络 cloudflare:402 上的 batch-settlement):payTo 必须为 merchant(由 Cloudflare 作为登记商户进行结算),价格必须使用货币代码(USD),金额以美分计,且 402 必须包含 http-message-signatures 扩展,并提供 Agent 注册其签名密钥的网址。由已向 Cloudflare 注册的爬虫和 Agent(Web Bot Auth)付款,而非通过钱包付款:预检会提示谨慎(cloudflare_crawler_only),而非不可用 | |
accepts[i]-extra、circle-gateway、accepts-order | Circle Gateway 选项(为 Gateway Wallet 签名的“exact”,域为 GatewayWalletBatched):extra.version 不是“1”或缺少 verifyingContract(Circle 客户端会跳过或无法签名);合约不是 Circle 的 Gateway Wallet;谁可以付款(Gateway 余额和 Circle 客户端可以付款,标准 x402 客户端或浏览器钱包则不行;其 7 天超时设置正确);同一网络上的 Gateway 选项排在标准选项前面,导致 x402 客户端选中该选项后付款失败 | |
accepts[i]-scheme | 标准 x402 客户端无法支付的方案(除 exact、upto、batch-settlement 和 auth-capture 之外的任何方案;eip3009 会提示改用 exact):所需条件未知,因此缺失或异常的 payTo、asset 或 amount 会触发警告,而非失败(销毁地址仍会判定为失败)。预检绝不会推荐使用此类选项来替代标准选项;如果仅有此类选项,则会提示谨慎(custom_scheme_only) | |
accepts[i]-scheme、-network、-plan | Nevermined 套餐(eip155:<id> 上的 nvm:erc4337,以及 stripe、braintree 或 visa 上的 nvm:card-delegation):无需提供 payTo 或 amount,因为价格已包含在套餐中;network 必须是结算通道(不能是 sandbox 或 live),planId 必须是套餐 ID,且必须设置 extra.agentId。预检会提示谨慎(nevermined_plan):只能通过 Nevermined 帐户及其 SDK 付款,标准 x402 客户端无法使用 | |
| 资源 | resource-url | https:// 端点上的资源 URL 使用了 http://(Express 位于 TLS 代理后但未设置 trust proxy);使用路径而非完整 URL(会根据端点判断,并给出警告) |
resource-metadata | 缺少 description / mimeType | |
| 结算 | solana-payout-account | Solana 收款钱包没有该资产的代币帐户:每笔结算都会在链上失败 |
xrpl-payout-account、xrpl-payout-trustline | XRPL 收款帐户尚未激活、启用了 Deposit Authorization,或要求选项未提供的 destination tag;对于 RLUSD 等代币,没有(或已冻结)指向其发行方的 trust line:每笔付款都会失败 | |
accepts[i]-lightning、lightning-invoice、lightning-request-hash | Bitcoin Lightning(lnbtc 上的 x402 exact,2026 年 9 月):payTo 必须是节点密钥,amount 使用毫聪,paymentFlow: "upfront",并绑定请求(http:1/mcp:1);系统会解码 extra.invoice 中的 BOLT11 发票,并要求其与选项完全匹配(金额、bc/tb、过期时间 = maxTimeoutSeconds、由 payTo 签名且未过期),并绑定到 extra.requestHash;对于 http:1,Doctor 会根据自身请求重新计算该值 | |
algorand-payout-optin | Algorand 收款地址尚未选择加入该资产(帐户只有选择加入 ASA 后才能接收):每笔付款都会失败 | |
stellar-payout-trustline | Stellar 收款帐户(G…)尚未充值,或没有(或未授权)指向 Circle USDC 的 trustline:每笔付款都会失败。该检查从 Horizon 读取;合约(C…)无需 trustline | |
solana-wallets | 由 PayAI 结算的 Solana 付款会拒绝 Phantom(转账前会执行 Lighthouse 指令) | |
| 谁可以付款 | wallets | 分别检查各个钱包(MetaMask、Coinbase Wallet、Rabby、Phantom、Solflare、Backpack、Pera、Defly、Xaman、Crossmark、GemWallet、x402 Agent,也包括支持 Stellar 付款的 Agent):付款成功和失败的网络及原因。JSON 报告中也会以 wallets 字段提供 |
metamask-site-scan | 仅在设置 METAMASK_SCAN=on 时运行(默认关闭:端点没有公开的 API 或许可证)。MetaMask 的网站扫描器(Blockaid)会拦截该域名(例如“wallet drainer”):MetaMask 用户无法打开网站或在浏览器中付款。并说明如何报告误报。不会影响 Agent | |
evm-payto-eoa | EVM 收款钱包是普通钱包(EOA):MetaMask 的 Blockaid 检查可能会将付款签名标记为“deceptive request”。这属于信息提示,并说明如何申请解除标记 | |
coinbase-agents | 检查 Coinbase 的 Agent 钱包能否付款:Wallet MCP 使用 Base 上的 USDC 和 exact、upto 或 auth-capture 支付 x402,并通过 CDP Bazaar 查找服务(bazaar-listing 行会显示是否列出了该路由);Coinbase MCP 还要求使用 x402 v2,且每次调用金额不超过 $5,并且只会从其自有精选目录中查找。没有 Base 上的 USDC,或仅支持其他方案时,会给出信息提示 | |
| 发现 | bazaar、bazaar-output | 缺少 Bazaar 声明或声明无效;输出示例与其架构不匹配 |
market-price | 你的价格在 x402 Trust Index 中其他卖家可比的付费 API 价格范围内的位置(中位数和区间;使用 TypeSafe Jev 和 TYPESAFE_API_KEY 判断可比性)。始终为 info;如果 Agent 的预检会推荐更便宜的服务,或你的收费远低于其他服务,则会给出提示 | |
onchain-payments | 过去 7 天内向你的 Base 收款地址支付的真实款项(若没有 Base 选项,则检查 Solana 或 XRP Ledger):支付该地址的钱包数量、付款频率和金额,每小时从链上统计一次(Base 上通过 EIP-3009 签名的 USDC,即 x402 exact 方案的结算方式;Solana 上由 x402 facilitator 支付手续费的 USDC 转账;XRP Ledger 上带有 x402 客户端标记的 SourceTag 804681468 或 InvoiceID 的 RLUSD 和 USDC 付款;不统计 Permit2、Circle Gateway 和其他网络)。还会显示付款方中向 10 个或更多其他卖家付款的数量(检查器和扫描器也会这样做),并说明当端点尚未纳入 Trust Index 时如何被统计。始终为 info:新卖家从零开始 | |
bazaar-replay | 声明的示例请求未返回 402,因此 Bazaar 无法将其编入索引 | |
payto-stable | payout 地址(payTo)在前后两个 402 响应之间发生变化:买家再次请求时看到新的 payTo,可能会为一次调用重复付款 | |
bazaar-route | Bazaar 的 routeTemplate 不是路径(例如 :var1),或包含没有 pathParams 值的 :param,导致根据该模板构建的请求 URL 无效 | |
openapi-present、openapi-title、openapi-guidance | 缺少 /openapi.json、info.title、info.x-guidance | |
openapi-contact、openapi-ownership、openapi-input-schema、openapi-free-routes | 检查 x402scan 和 AgentCash 还会读取什么:info.contact.email(信息提示);x-agentcash-provenance.ownershipProofs 中的所有权证明,需通过还原签名者来验证其是否与 EVM payTo 匹配(匹配则通过;有尾部斜杠、签名者不同、签名损坏,或顶层 ownershipProofs 被 x402scan 忽略时则给出警告);缺少 parameters 或 requestBody 的付费操作(x402scan 不会注册这些操作);以及既没有 x-payment-info 也没有 "security": [] 的操作(免费操作会被报告为未受保护)。除非存在但证明错误,否则均为信息提示 | |
well-known | 缺少 /.well-known/x402(信息提示);无法读取(既支持将资源作为 URL,也支持将其作为带有 url 的对象读取);或列出的资源主机与检查的主机不同(根据请求的 Host 标头构建,可能仍将爬虫指向旧域名)。*.onrender.com 等平台地址指向其自身域名则没有问题 | |
well-known-names | /.well-known/x402 中的资源缺少 name 和 description(信息提示):XRPL AI Hub 等目录会通过它们列出各项资源。 | |
agent-instructions | 源站上存在 /skill.md,用户可以告知 Agent connect to <host>/skill.md(Coinbase 的做法);/llms.txt 视为旧版形式;在所有路径上都提供的 HTML 页面不算。缺少时会给出信息提示 | |
bazaar-listing | CDP Bazaar 在何处列出了此路由(路径相同、payTo 相同):列于当前源站、尚未列出,或仅列于其他主机。Bazaar 会保留付款方使用的 URL,因此域名迁移后,路由会一直列在旧主机下,直到有人通过新主机付款。此项仅用于网页检查和付费 API(不适用于 CLI) | |
bazaar-last-payment | CDP Bazaar 在此列出路由的时间:距离上次成功结算付款过了多久。超过 21 天会发出警告,因为 Bazaar 会在 30 天没有付款后移除路由(一次付费调用即可让路由继续列出)。 | |
cdp-validate | Coinbase 自己的判定:Doctor 会调用 CDP 的免费 validate API,询问 CDP facilitator 是否会将该路由编入 Bazaar(Coinbase Agent 搜索的索引),并显示其指出的失败项,但不包括首个失败项之后被跳过的内容。如果端点提供 Base 或 Solana,则给出警告,否则给出信息提示;通过时可能会附带 CDP 的建议。仅支持 HTTPS;CDP 未响应时不显示任何内容。适用于网页检查、付费 diagnose and fix 和 MCP(不适用于 CLI);每日健康检查也会对每条 Fizzl 付费路由执行此项。设置 CDP_VALIDATE=off 可关闭 | |
merchant | x402-merchant 扩展(名称、网站、标志、类别),GoPlausible 的目录会在卖家页面中显示该扩展:格式错误时给出警告;提供 Algorand 的端点缺少该扩展时给出信息提示 | |
builder-code | Base Builder Code(ERC-8021,即 x402 builder-code 扩展):买家的客户端会回传应用代码,facilitator 会将其写入结算记录,以便 Base 归属该笔付款。如果 facilitator 会丢弃该代码(代码不在 info 下、info.a 无效或缺失、服务代码无效或过多、x402 v1 挑战),则给出警告;如果在 Base 上结算的路由没有该代码,或没有任何选项通过 EVM 链结算,则给出信息提示 | |
| 浏览器 | paywall | 在主网端点上,浏览器付费墙处于测试网模式(@x402/paywall 默认使用测试网;此标志从 JS 或 JSON 配置中读取) |
状态:pass、warn(可用,但有异常)、fail(付款失败或不符合有效的 x402)、info。 |
Web 应用
npm install
npm start # http://localhost:3001
报告可分享:https://<host>/?url=<endpoint>&method=GET 会在加载时运行诊断(对于带示例请求体的 POST,请使用 &method=POST&body=<json>)。
API:POST /api/diagnose,请求体为 { "url": "...", "method": "GET" | "POST", "body": { ... } }(method 和 body 可选),
返回 { url, method, overall, checks[], challenge, share_url }。body 是 POST 的示例请求体(JSON,最多
16 KB),用于在 402 之前检查输入;它会默认使用 POST,报告会说明哪个请求体到达了 402
(body,如果来自卖家的 /openapi.json,还会包含 body_source)。share_url 是上方的页面链接,可粘贴到 issue 或聊天中。每个 IP 每分钟最多可进行 10 次诊断。
面向 Agent 的付费 API(x402)
GET /api/v1/diagnose?url=<endpoint>&method=GET|POST 会返回相同的报告,通过 x402 在 Base 或
Solana 上每次调用收费 $0.01 USDC,且没有速率限制。该 API 面向 Agent 和 CI 流水线;网页仍然免费。
- 未付款的请求会收到 x402 挑战(
PAYMENT-REQUIRED标头,正文中也有对应内容),其中包含 Bazaar 输入和 输出架构。 body=<URL-encoded JSON>(可选;同样适用于 preflight、deep 和 fix,以及 MCP 工具中的body):用于 在 402 之前检查 POST 路由输入的示例请求体。它会默认使用 POST;如果method=GET,或请求体不是 JSON,则会在付款前返回 400。批量请求不接受请求体。- 无效输入(URL 错误、非 http(s)、未知方法)会在付款前返回 400。不带
url的基础路由会返回 402,因此 x402scan 等索引器可以注册该路由。未提供url就付款会返回 400。 - x402 中间件只会在收到 2xx 响应后结算,因此诊断出错时不会收费。
- 服务发现:
/openapi.json(含x-payment-info)和/.well-known/x402。 - 在浏览器中打开该路由会显示钱包付款墙(优先使用 Base:MetaMask、Coinbase Wallet),而不是基础的 402。
- Bazaar:facilitator 会在首次成功结算该路由的付款后将其列出。设置好 CDP 密钥后,一次付费调用(例如来自浏览器付款墙)就会将该路由添加到 CDP Bazaar,供 Agent 搜索。
# pay-per-call from Node with @x402/fetch
const paidFetch = wrapFetchWithPayment(fetch, client); // client with an EVM or SVM signer
const report = await (await paidFetch("https://<host>/api/v1/diagnose?url=https://api.example.com/paid")).json();
购买方付款前检查:GET /api/v1/preflight
GET /api/v1/preflight?url=<endpoint>&max_usd=0.05&network=<caip2>&method=GET|POST,每次调用收费 $0.001 USDC:
在 Agent 向此前未使用过的 x402 端点付款前调用此接口。该接口不会为端点付款。如果 Agent 使用 Circle 的 Gateway 客户端从 Gateway 余额付款,请添加
client=gateway:这样 Circle Gateway 专用端点(gateway_only,否则会显示警告)即可通过检查,并会优先推荐 Gateway 选项。
{
"verdict": "go", // go | caution | no_go
"safe_to_pay": true,
"summary": "OK to pay: $0.02 on Solana.",
"recommended_option": 1, // index into the endpoint's accepts[]
"options": [{ "network": "eip155:8453", "asset_symbol": "USDC", "usd": 0.02, "payable": true, "problems": [] }, …],
"signals": { "https": true, "advertised_price_usd": 0.02, "listed_in_cdp_bazaar": true },
"reasons": [], // [{ level: no_go | caution | info, code, message }]
"cached": false
}
| 判定 | 条件 |
|---|---|
no_go | 没有 402 或没有有效挑战;所有选项都无法结算(payTo/金额错误、payTo 是零地址或其他销毁地址(payto_burn,若其他选项可付款则为警告)、缺少费用支付方或 EIP-712 domain、Solana 收款钱包没有代币账户);最便宜的选项高于 max_usd;指定的 network 上没有可付款选项 |
caution | 收费高于其 OpenAPI 声明的金额;不是 HTTPS;不是已知的 USDC(或 BNB Chain 美元代币)合约;金额带小数,或在 18 位小数代币上使用 6 位小数金额;资源 URL 与请求的 URL 不同;仅支持测试网;诱饵(见下文);价格达到可比服务的 20 倍或以上(见下文) |
go | 不符合上述任何条件。recommended_option 是最便宜的可付款 USDC 选项(若指定了 network,则限定在该网络上);价格相同时,优先推荐任何 x402 客户端都可付款的选项(EIP-3009,而非 Permit2),再考虑其他美元代币 |
BNB Chain(eip155:56)没有 Circle USDC。卖家以 18 位小数的美元代币标价:Binance-Peg USDC、USDT、USD1 和 United Stables(U),因此 $0.01 对应 "10000000000000000"。Doctor 会像处理 USDC 一样为这些选项定价。那里的 USDC 和 USDT 不支持 EIP-3009,因此不带 assetTransferMethod: "permit2" 的选项会失败;标准 x402 客户端不认识的值只会发出警告,因为 @x402/evm 随后会改为签署 EIP-3009。"permit2-exact" 和 "permit2-upto" 是 Binance 的 B402 facilitator 所用的方法,因此只有 Binance 自己的客户端可以支付这些选项。 |
诱饵检查(TypeSafe 的 Jev,在设置了 TYPESAFE_API_KEY 时启用):对于可能需要付费的端点,Jev 会判断协议检查无法判断的内容。它是否声称自己是某个品牌,或声称来自该品牌或得到该品牌背书,但其域名并不属于该品牌(brand_impersonation;以卖家自己的名义转售或代理某品牌的产品,例如 LLM 网关列出其提供的模型,不属于这种情况);是否以免费代币、空投或保证回报为诱饵(lure_description);或者承诺的内容是否与其声明的输出不符(output_mismatch)?明确肯定的回答会标记为 caution,不确定的回答会标记为 info;它绝不会将判定结果改为 no_go,也绝不会将其改为 go。概率值位于 signals.jev_lure 中。针对 300 条真实 CDP Bazaar 商品信息的检查中,品牌或诱饵措辞均未触发警告。当诱饵问题发生变化时(lib/jev-lure.js 中的 BAIT_VERSION),Trust Index 下次运行时会首先重新询问所有被旧措辞标记或无法确定的服务;答案明确的服务会沿用旧结果。
同名服务(使用同一密钥,由每日 Trust Index 扫描生成,lib/namesakes.js):x402 Bazaar 会索引每条商品信息的服务名称,因此搜索已知服务的 Agent 会找到所有使用该名称的商品信息。当另一位卖家使用自己的收款地址、且付款人数较少,却以成熟服务的品牌名称发布商品信息时,预检会添加 namesake(信息:名称、原服务的网站以及双方的付款人数)。共享收款地址、具有辨识度的主机名词汇或三个及以上名称的网站会被视为同一所有者;而 TypeSafe 的 Jev 必须以 0.85 的置信度确认该名称是品牌,而不是“网页搜索”之类的描述。截至 2026 年 10 月 23 日,有 83 个名称由多个所有者使用,其中一个是某个知名度更高的原服务的品牌名称。这不会改变判定结果:同名服务可能是正当的转售商,也可能是无关服务。
价格检查(使用同一密钥):价格是否远高于同类服务?Doctor 会从 x402 Trust Index 中选取最多 24 个其他卖家的付费 API,这些 API 的描述与当前服务有不常见的词语重合(每位卖家最多选两个);Jev 会逐一判断买家能否从这些候选服务中获得同样好的服务。满足至少 5 个此类服务时,会以其中位价格作为比较基准:价格达到中位数的 5 倍或以上(且至少高出 $0.05)时标记为 info;达到 20 倍或以上(且至少高出 $0.25)时标记为 caution。两种情况下都会添加 price_high,并列出最多三个更便宜的替代方案。比较结果位于 signals.price_check(comparable_median_usd、comparables、ratio、cheaper[])中。它绝不会将判定结果改为 no_go:定价由卖家决定,是否值得则由 Agent 判断。
未在 CDP Bazaar 列出只会报告为 info。结果会按 URL、预算和网络缓存 10 分钟(cached: true),因此每次付款前检查也能保持快速。
同时检查多个端点:GET /api/v1/preflight/batch
GET /api/v1/preflight/batch?url=<a>&url=<b>&max_usd=0.05,每次调用收费 $0.005 USDC,最多可检查 10 个端点(每个端点使用一个 url 参数;重复项只计一次)。适用于市场平台、目录和需要评估多项服务的 Agent。每个端点都会获得与单独预检相同的判定结果;发生错误或在 20 秒内未响应的端点会标记为 unknown,不会拖慢其他端点的检查。
{
"count": 2,
"counts": { "go": 1, "caution": 0, "no_go": 1, "unknown": 0 },
"results": [
{ "url": "https://a.example/paid", "verdict": "go", "safe_to_pay": true, "summary": "OK to pay: $0.02 on Base.", "recommended_option": 0, "options": […], "reasons": [] },
{ "url": "https://b.example/paid", "verdict": "no_go", "safe_to_pay": false, "summary": "Do not pay: …", … }
]
}
在进行高成本调用之前:GET /api/v1/preflight/deep
GET /api/v1/preflight/deep?url=<endpoint>&max_usd=0.5,每次调用 $0.01 USDC:包含预检提供的所有信息,此外还包括:
diagnosis:完整诊断信息(overall、每项检查,以及作为problems列出的失败项或警告项);history:最近 30 天的每日扫描记录,每天一条{ date, status };seller:同一来源下卖家的其他已扫描端点(端点数量、今天可付款的数量、平均可付款比例、不可靠端点数量)。如果卖家的端点在不到一半的扫描中可付款,go会变为caution(unreliable_seller);domain:域名迁移检查(well-known、bazaar-listing),例如仅在旧域名下列出的 Bazaar 条目。
已付款并已交付?GET /api/v1/delivery-check
GET /api/v1/delivery-check?url=<endpoint>&method=GET|POST,每次检查 $0.25 USDC:x402 Doctor 会按端点自身条目中声明的示例输入购买一次,并公开返回结果。适用于想要证明端点确实能交付内容的卖家,以及下大额订单前的买家。
- 付款前检查:端点必须使用 https,不能是 fizzl.eu 路由,通过付款前检查并获得
go,可在 Base 上使用 USDC 付款,且费用不超过 $0.10。其他情况会返回 400(如果当天的 20 次检查名额已用完,则返回 503),且不会收取任何费用。带有付款的请求会等待整个检查完成后才结算。不带付款的探测请求会收到 402,除非请求本身格式错误(不是一个 https URL、是 fizzl.eu 路由或方法无效);即使当前无法购买该端点,也会收到 402,因为运行时间监控会在url中填入https://example.com这样的占位符,而且必须在 5 秒内响应(CDP Bazaar 的验证器和健康探测会在 10 秒后放弃)。如需在付款前获取结果,请发送X-Delivery-Precheck: 1;主页会这样做。 - 立即返回结果,随后完成购买:付费调用会立即返回一个包含任务
id和status_url的响应。delivery-check.yml会从队列中获取任务(GET /api/v1/delivery-check/queue,免费),并使用专用的现货购买钱包(SPOT_BUY_KEY;服务器上没有钱包密钥)进行购买。只有付款已结算的任务才会加入队列。付款结算后,服务器会立即启动工作流(DELIVERY_DISPATCH_TOKEN:对此仓库仅具有 Actions 读取和写入权限的细粒度 GitHub 令牌;lib/delivery-dispatch.js);每 10 分钟运行一次的定时计划是备用方案,因为 GitHub 的定时工作流可能延迟运行或完全不运行。 - 与现货购买采用相同步骤(
lib/spot-buy.js):付款前立即重新进行预检并执行 OFAC 收款筛查,使用卖家声明的示例输入,将返回结果与声明的输出架构进行核对,并由 TypeSafe 的 Jev 判断(结果是否与购买内容相符、是否包含供 Agent 使用的指令:lib/jev-answer.js),最后在链上核算费用。 - 公开结果:
GET /api/v1/delivery-check/<id>(免费)会先显示queued,随后显示done及结果(delivered、off_schema、empty、charged_not_delivered、payment_rejected、error_not_charged,或付款前停止流程的步骤)和交易信息。所有结果都保存在delivery-data分支上。 - 缓存:对于已交付的 GET 结果,
cache会说明共享缓存(CDN)能否存储付费结果并提供给未付款的调用方(shared_cache为yes、no或unspecified,并附上发送的Cache-Control)。x402 付款信息通过独立的标头传递,而非Authorization,因此只有Cache-Control: private或no-store才能确保结果不进入共享缓存(针对 x402 的五种攻击,攻击 III)。
任务保存在 credits Redis(CREDITS_REDIS_URL)中;未配置时,该路由会在付款前返回 503。
预付额度:GET /api/v1/credits/1000
经常检查的 Agent 可以预付:一次 x402 付款 $0.80 购买 1000 个额度,或 $7.00 购买 10,000 个额度(分别优惠 20% 和 30%),有效期一年。一个额度价值 $0.001:预检消耗 1 个,批量检查消耗 5 个,深度预检或诊断消耗 10 个,修复消耗 50 个。额度包会返回一个 credit_key;使用任何付费调用时,将它作为 x-credit-key 标头发送,无需付款。GET /api/v1/credits(免费)会显示价格;附带该标头时,还会显示你的余额。调用失败时会退还额度;若没有密钥或额度不足,则按常规返回 402。需要设置 CREDITS_REDIS_URL(例如使用持久化 Redis,如 Upstash;presign-guard 实例也可,密钥彼此独立);未设置时不销售额度包。
将修复作为代码返回:GET /api/v1/fix
GET /api/v1/fix?url=<endpoint>&method=GET|POST&stack=<optional>,每次调用 $0.05 USDC:先诊断端点,
然后针对每项失败或警告检查,返回可解决问题的具体更改,以适用于你的技术栈的代码形式给出,并填入
你的实际值(payTo、amount、network、route)。
{
"stack": { "id": "express", "name": "Express (@x402/express)", "detected_from": "x-powered-by: Express" },
"summary": "3 fixes (1 blocking), for Express (@x402/express).",
"fixes": [
{
"recipe": "amount",
"severity": "warn",
"checks": ["accepts[0]-amount"],
"title": "Amount \"0.01\" → \"10000\" ($0.01)",
"why": "x402 amounts are integer strings in the token's smallest unit; USDC has 6 decimals.",
"steps": ["Easiest: let the SDK convert it by using price: \"$0.01\" instead of an amount."],
"code": [{ "language": "javascript", "stack": "node", "label": "Route config", "snippet": "accepts: [{ scheme: \"exact\", price: \"$0.01\", ... }]" }],
"verify": "Run x402 Doctor again on https://…; accepts[0]-amount should pass."
}
],
"unfixed": []
}
技术栈根据响应标头(x-powered-by、server、Vercel/Render/Cloudflare 标头)和质询推断:express、next、hono、node(在其他框架后使用 @x402 SDK)、python 或 generic(原始 HTTP,适用于任何语言)。若推断有误,可传入 stack=。Node 代码片段使用 @x402 v2 路由配置,@x402/express、/next 和 /hono 的配置相同;仅适用于 Express 的代码行会注明。
修复方案(lib/recipes.js,每项在 test/recipes.test.js 中都有一个测试):完全没有 402(付费墙前返回 200、先进行身份验证或验证、404/405、无法访问)、v1 或无效质询、错误的标头名称、没有响应体镜像、没有 accepts、scheme、旧版网络名称、无效的 payTo(检测引号、空格、错误的链)、USDC 资产、十进制金额、Solana 手续费支付方、EIP-712 域名、代理后的 http 资源 URL、资源 URL 和元数据、Bazaar 声明和示例、Solana 付款代币账户、PayAI 上的 Phantom、主网上的测试网付费墙,以及 openapi.json。没有对应修复方案的项目会连同诊断提示一起返回在 unfixed 下。
从结果中学习:POST /api/v1/outcome
完成付费预检后,购买方可以免费报告随后向该端点付款的结果:paid_ok、paid_failed(再次返回 402)或 paid_error。x402-safe-fetch 通过 shareOutcomes: true 提交报告。
{ "outcome": "paid_failed", "status": 402, "preflight": { …the signed preflight answer… }, "query": { "url": "…", "method": "GET", "max_usd": "0.05", "network": "eip155:8453" } }
- 报告只有在存在真实预检,且 Doctor 为完全匹配该查询的预检签名时才会计入;每次预检(
receipt.request_id)只能报告一次,因此虚假报告会导致一次付费预检。 - Doctor 会统计 30 天内每个端点的报告。当至少三个不同付款钱包报告的付款大多失败时,后续预检会添加
payments_fail_after_preflight(警示);signals.agent_outcomes会显示统计数据。 - 报告会写入使用日志(端点、结果、状态、判定、收据中的付款方);不会记录买家的其他信息。
已签名的判定结果
每个付费回答(diagnose、preflight、batch、deep 和 fix;HTTP 和 MCP)都带有由 Doctor 签名的 receipt,因此 Agent 之后可以证明它针对哪个端点收到哪项判定结果,例如它为何付费或未付费:
"receipt": {
"request_id": "…", "route": "GET /api/v1/preflight", "input_sha256": "…",
"payment": { "network": "eip155:8453", "amount": "1000", "payer": "0x…", "nonce": "0x…", "proof": "eip3009" },
"signed_at": "2026-09-27T08:00:00.000Z", "signer": "0x…",
"algorithm": "eip191-canonical-json-v1", "signature": "0x…"
}
- **签名内容:**不含
receipt.signature的整份回答,采用规范 JSON(配置文件js-json-stringify-sorted-utf16-ascii-v1:按 UTF-16 码元排序键,使用紧凑格式,将 U+007F 及以上的每个码元写成小写\uXXXX,数字按 JavaScript 的JSON.stringify写法处理——1.0→1,0.000001→0.000001),然后转为 UTF-8 字节;Python 的json.dumps仅在键为 ASCII 且值为整数时才匹配,因此请使用examples/canonical.py,其中也包含verify_receipt(answer)),并使用 EIP-191personal_sign。篡改判定结果或将其移至另一个请求都会导致验证失败。 - **
payment:**购买此回答的付款,来自你的 x402 付款载荷。在 Base 上,这是付款方和 EIP-3009 nonce,因此任何人都可以通过 USDC 合约的AuthorizationUsed(payer, nonce)事件在链上查到结算;在 Solana 上,这是付款方和你发送的已签名交易的 SHA-256。 input_sha256:{"route", "input"}规范 JSON 的 SHA-256,其中input是以字符串表示的查询参数(HTTP)或工具参数(MCP,路由为mcp <tool>)。- 签名者:
/.well-known/x402-doctor-signer.json,其中列出了已退役的签名者,以便旧回执仍可通过验证。 - **免费验证:**使用
{"response": …, "route": …, "input": …}调用POST /api/v1/verify,会返回valid、signer、known_signer和input_matches。通过 MCP 验证:使用免费工具verify_receipt并传入相同参数(route形如mcp x402_preflight,input为工具参数)。
**无需客户端更新即可轮换密钥:**付款钱包(0x6B0F4651eD42893ab58139938175E4a69f175F25)使用 personal_sign 对 fizzl receipt signer / service: x402-doctor / signer: <address> / valid_from: <YYYY-MM-DD> 签名,以授权每个签名密钥。将其设置为 RECEIPT_SIGNER_CERT(YYYY-MM-DD:0x<signature>,在钱包浏览器中通过 /sign-receipt-key 生成)。服务启动时会验证该证书,并将其放入每份回执的 receipt.cert 中,因此只固定付款钱包的客户端也能离线验证新密钥。
格式与 presign-guard 相同,因此一个验证器即可用于两者。密钥来自 RECEIPT_SIGNER_SECRET(不持有资金);未设置时,回答不会签名。
x402 信任指数
每天一次,trust-scan.yml 会对 CDP Bazaar 中的每项资源、MPP 目录、GoPlausible facilitator 的发现列表(Algorand 上的 x402,约 2,500 个 Bazaar 未收录的端点)、Circle's Agent Marketplace 目录(约 2,800 个端点,其中许多通过 Circle Gateway 付费)、XRPL AI Hub(通过 t54 的 XRPL facilitator 付款的商家;它没有列表 API,因此每天读取约 190 个商家页面)、nohumans.directory 的目录(CC BY 4.0,镜像该目录属于受支持的用途;约有 9,600 个活跃条目,其中约 1,550 个在 2026 年 10 月 25 日未被其他注册表收录),以及 PayAPI Market 的目录(其开放的 /agent/list;约有 940 个条目和 1,000 条路由,其中约 300 个在 2026 年 10 月 25 日未被其他注册表收录)执行付款前检查(只读:遇到 402 挑战时即停止;每个主机同时最多发出两个请求;每个源仅请求一次 /openapi.json;User-Agent 会链接到 /trust)。结果会汇总为每项资源的 30 天历史记录,每天一个字母(g 表示通过,c 表示谨慎,n 表示不通过,x 表示无法访问,- 表示未扫描),并以 index/ + summary.json 的形式发布到 trust-data 分支。索引会拆分写入,每个文件不超过 24 MB(先写入 index/meta.json,然后写入 index/<nn>.ndjson,每行一条 [key, resource];lib/index-files.js),因此随着索引增长,没有文件会接近 GitHub 的 100 MB 限制;只要 index.json 和 index.ndjson(整个索引作为单个文件)小于 90 MB,也会一并发布。扫描通过并行作业运行,每个作业处理完整的卖家(一个 plan 作业读取目录,四个扫描作业负责扫描,一个发布作业负责合并):某个分片失败,只会导致该分片的端点当天未被检查,绝不会被标记为不可用。对于端点超过 5,000 个的卖家,每天会抽取其中一部分进行检查,确保每个端点在一周内轮到一次(其余端点当天记为 -,并保留上次的判定结果;2026 年 10 月 27 日,有一家卖家列出了 62,924 个端点)。
服务器不会加载该索引(2026 年 10 月 25 日为 42 MB、约 88,000 项资源):扫描后,scripts/trust-views.js(lib/trust-views.js)会用相同代码将索引写成同一分支上的小型预计算文件(views/meta.json,含摘要;views/atlas.json、views/templates.json、views/sellers.json;价格检查的词语索引位于 views/similar/ 下;每个网络对应一个 views/networks/<key>.json(超过 16 MB 的网络会拆分为一个头文件和多个分片,并列在 views/meta.json 的 network_parts 中);资源则按 key 分到 keys/ 下的 256 个桶中)。
lib/trust-reader.js 只读取请求所需的数据(每次查找读取一个约 130 kB 的桶,最多保留 32 个),结果与完整索引一致;视图尚未发布时,则回退到完整索引。以 10 月 20 日的索引为基准进行测量:峰值内存为 116 MB,而非 285 MB;堆内存为 37 MB,而非约 100 MB。
每次扫描后,hf-sync.yml 都会将其作为开放数据集发布到 Hugging Face:x402Fizzl/x402-trust-index(CC BY 4.0):data/endpoints.jsonl(最新扫描中的每个端点及其判定结果、原因、价格、网络、类别和历史记录)、data/daily.csv(每天的 go / caution / no_go)、data/spot_buys.jsonl(每周现货购买的每笔交易,来自 spot-data 分支)、data/onchain_payments.csv(按收款地址和日期统计的 Base 上签名 USDC 付款,来自 payments-data 分支)以及数据集卡片(scripts/hf-export.js)。如果令牌有权限写入集合,它还会将数据集加入 Hugging Face 的 "x402 agent payments" 集合。它需要仓库密钥 HF_TOKEN(Hugging Face 写入令牌);变量 HF_DATASET 可覆盖数据集名称。
hf-bench.yml 会以相同方式发布 x402 Agent Safety Bench(scripts/hf-bench.js):名为 x402-agent-safety-bench 的数据集,包含每次运行及其记录文本(来自 x402-examples 的 bench-data 分支)、以 leaderboard.csv 发布的表格,以及同名的静态排行榜 Space。它会在脚本变更时、每周一以及手动触发时运行;变量 HF_BENCH_REPO 可覆盖名称。
hf-mcp-space.yml 会将 hf-mcp/ 发布为 Space x402Fizzl/x402-doctor:这是一个 Gradio 应用,同时也是 MCP 服务(https://x402fizzl-x402-doctor.hf.space/gradio_api/mcp/,或在 Hugging Face 的 MCP 设置中添加),通过公共 API 提供四个免费工具:check_x402_endpoint(/api/diagnose)、trust_record(/api/trust)、add_to_trust_index(POST /api/trust/submit)和 x402_market_health(/api/trust/summary)。它不会付款,也不会持有密钥;变量 HF_MCP_SPACE 可覆盖名称。
Hugging Face 仅为 PRO 账户托管 Gradio Spaces:没有 PRO 时,工作流会发出警告且不发布任何内容,Space 会留在 hf-mcp/ 中。Doctor 自己的 MCP 服务地址是 https://x402-doctor.fizzl.eu/mcp。
- 付款前检查会添加
signals.track_record;如果卖家在至少 3 个已扫描日中,少于一半的日期可付款,还会添加一条caution(unreliable_history)。 - 抽样购买: “go” 是否意味着已付款并交付? 扫描只读取 402 挑战。每周一次,
spot-buy.yml会从“go”端点中随机抽取少量样本进行购买(lib/spot-buy.js):仅在 Base 上使用 x402exact和 USDC;每个主机最多一个端点;绝不购买 fizzl.eu 或测试主机;请求使用卖家自行声明的示例(如果该示例能到达付费墙);付款前立即进行新的预检,并筛查 OFAC 收款地址;同时设有硬性上限(默认 30 个端点、每次调用 $0.05、每次运行 $2;最高分别为 50、$0.10 和 $5)。是否有资金离开钱包,通过链上数据测量(比较付款前后的 USDC 余额),并将卖家的PAYMENT-RESPONSE与链上数据核对。每个结果为delivered、off_schema(答案不符合声明的输出架构)、empty、charged_not_delivered、payment_rejected、error_not_charged或payment_failed;每次运行都会追加到spot-data分支(latest.json、results/<date>.json,同一天的第二次运行则为results/<date>-2.json)。只有使用机密SPOT_BUY_KEY才会付款;该密钥对应一个持有少量 USDC 的专用钱包。没有此密钥时,每次运行都是不会付款的试运行。最新一次运行可在/trust(“已付款并交付?”)以及GET /api/trust/spot(摘要和每笔购买记录,不含钱包详情)查看;如果某端点被购买,GET /api/trust?url=…会添加spot_buy(lib/spot-results.js)。付费的付款前检查会将相同信息添加为signals.spot_buy;如果端点收取了其列表中声明的示例请求费用,却返回错误或在 90 秒内没有答复,还会添加一条caution(charged_without_answer)。每笔购买还会记录答复时间(answer_s,从首次请求到付费答复的时间):摘要会统计答复超过 30 秒的情况(slow_answers和delivered_within_30s_pct,表示 Agent 等待 30 秒时能收到答复的比例);慢速答复还会在付款前检查中添加slow_after_payment(info)。 - 其他人使用真实 USDC 购买端点所提供的交付证据:nohumans.directory(其目录采用 CC BY 4.0 许可)和 PayAPI Market,后者会为每个列表购买一条路由一次。扫描的计划任务会将他们购买并收到答复的端点写入
trust-data上的delivery-nohumans.json和delivery-payapi.json(按购买日期、列表状态及列表链接记录;截至 2026 年 10 月 25 日,约有 3,650 条和 970 条,其中 PayAPI 的 600 条不在 nohumans 的记录中;相比之下,spot-buy 每周只能负担 26 条)。付费的付款前检查会为此类端点添加signals.delivered_elsewhere(最近一次购买,以及每个来源,位于sources中)和一条info(delivered_elsewhere);GET /api/trust?url=…会添加delivered_elsewhere,网页检查和/trust也会显示此信息(lib/delivery-elsewhere.js)。这只是只读检查旁的信息,不会影响判定。 同一钱包还会进行另一类付款,由人工发起:index-payment.yml会购买我们自己的 fizzl.eu 路由(scripts/index-payment.js),因为 CDP Bazaar 只有在路由的付款结算后才会将其列出,而在 30 天内没有付款时会将其移除。stale(默认值)会为 Bazaar 中上次结算付款距今已有 21 天或更久的每条自有路由付款(共 16 条;从其公开搜索结果读取),每条付款金额不超过该路由自身的价格(INDEX_PAYMENT.routes);url则会为单条路由付款一次。款项会进入我们自己的收款钱包。此操作不会发布任何内容,因此样本仍只包含其他卖家的端点。每次运行也会对这些路由进行自查:再次发送相同付款标头,必须收到 402(“Five Attacks on x402”中的攻击 II;如果路由再次提供服务,本次运行就会失败);结算交易的 ERC-8021 后缀则显示其中是否写入了我们的 Base Builder Code。绝不重放其他卖家的端点。 - 制裁筛查。 每个收款地址(x402
payTo、MPPrecipient)都会与 OFAC SDN 名单中的数字货币地址进行匹配。名单来自美国财政部名单的免费开源副本,由 presign-guard 提供(lib/sanctions.js,每 6 小时刷新一次)。如果地址在名单中,付款前检查会判定为no_go(payto_sanctioned,并附上 SDN 条目);付费检查和每日扫描也会执行此筛查。signals.sanctions会说明筛查内容及所依据的发布版本。summary.json会统计收款地址在名单中的已扫描资源(payto_sanctioned)。如果名单不可用,则不作任何判定(signals.sanctions.unavailable)。 - 销毁地址。 如果某个收款地址没有任何人持有其密钥(通常是配置中遗留的占位符),该选项就无法付款:零地址(USDC 会拒绝转账)、
0x000000000000000000000000000000000000dEaD,以及 Solana 上的 System Program 或 incinerator。付款前检查会标记为payto_burn:没有其他可付款选项时为no_go,否则为caution(如果客户端会签署第一个可用选项,就会付到这个有问题的地址)。summary.json会统计此类地址(payto_burn)。 - 链上真实付款。 每小时,
onchain-payments.yml都会读取新的 Base 区块(scripts/onchain-payments.js、lib/onchain-payments.js),并针对每日扫描发现的每个收款地址(trust-data上的paytos.json),统计付款方使用 EIP-3009 签署的 USDC 付款(transferWithAuthorization,这是 x402 的 exact 方案结算 USDC 的方式)以及不同付款钱包的数量。普通转账、Permit2 和 Circle Gateway 批次均不计入,x402 Doctor 自己的测试钱包也会排除。结果按地址保留 8 天,存放在payments-data分支。付费的付款前检查会添加signals.onchain_payments(days、payments、payers、usd、coverage:已读取区块占窗口区块的比例)和一条info(onchain_payments),例如:“过去 7 天里,有 47 个不同的钱包向该卖家的 Base 收款地址付款。”这不会改变判定:新卖家的计数从零开始。在窗口期内向 10 个或更多不同收款地址付款的钱包属于检查器或扫描器,而非普通买家:payers_wide会统计这类钱包,若部分或全部付款方属于此类钱包,信息行会注明(“尚未发现普通买家”)。GET /api/trust/summary会添加所有收款地址的总计(onchain_payments,并包含pay_tos_paid_only_wide:仅由此类钱包付款的地址;截至 10 月 19–20 日为 774 个地址中的 393 个),并在/trust显示。只读,无需密钥:如果已设置BASE_RPC_URL,则优先使用;否则使用公共节点base-rpc.publicnode.com。该节点只提供最近约 10,000 个区块,因此两次运行间隔超过约 5 小时会导致coverage降低。GitHub 的小时计划任务会延迟执行(10 月 19 日的间隔为 3.5 至 6.5 小时),因此 Doctor 会使用已有的DELIVERY_DISPATCH_TOKEN,自行每小时启动一次工作流。 - Solana 上的真实付款。 同一工作流会读取扫描发现的 Solana USDC 收款地址(
paytos-solana.json,以及为其支付费用的服务方:每个报价的extra.feePayer),并按地址统计转入的 USDC 付款,前提是网络费用由其中一个服务方支付;这是 x402 的 exact 方案在 Solana 上结算的方式(lib/onchain-payments-solana.js)。普通转账由发送方自行支付费用,因此不计入。Solana 不支持对多个账户进行日志筛选,所以系统会查询每个地址的 USDC 账户,获取自上次运行以来的新签名,并且每笔新交易只读取一次;未能在运行时间预算内读取的地址会留待下次运行,因此统计结果会延迟出现,但不会遗漏。结果与 Base 的格式相同,存放为payments-data上的payments-solana.json。没有 Base 选项的卖家,其 Solana 收款地址也会有相同的onchain_payments信息行和信号;/api/trust/summary会添加onchain_payments_solana,预检中的 Solana 选项则包含fee_payer。系统会优先使用SOLANA_RPC_URL,然后才使用每秒允许少量调用的公共节点。 - XRP Ledger 上的真实付款。 同一工作流会读取扫描发现的 XRPL 收款地址,以及 XRPL AI Hub 列出的所有商家(无论是否有 API 列表,见
paytos-xrpl.json),并按地址统计 x402 客户端标记的 RLUSD 和 USDC 付款(lib/onchain-payments-xrpl.js)。在 XRP Ledger 上,买家会签署完整的 Payment 并自行支付费用,因此无法根据费用付款方区分 x402 付款;x402 客户端会以其他方式标记付款:t54 的 SDK 会使用 SourceTag 804681468 签名,而 @x402/xrpl 会在 InvoiceID 中绑定发票。既没有这些标记的付款,或以 XRP 支付的付款(没有价格就无法确定美元金额),均不计入;RLUSD 和 USDC 则根据其发行方识别。x402 的批量结算方案通过 Check 在 XRPL 上结算(t54 的“xrpl-check-session”):买家向卖家签发一个 Check,卖家可一次性兑现多次调用的款项,因此每个已兑现的 Check 都计为该签发买家的单笔付款。系统会按地址使用account_tx查询上次账本读取以来的交易,顺序从最早开始;如果运行提前结束,会将最后一个账本保留完整,供下次运行继续读取。结果存放为payments-data上的payments-xrpl.json;没有 Base 或 Solana 选项的卖家,其 XRPL 收款地址也会有相同的onchain_payments信息行;/api/trust/summary会添加onchain_payments_xrpl。系统会优先使用XRPL_RPC_URL,然后才使用公共节点(xrplcluster.com、xrpl.ws)。 - Stellar 和 Algorand 上的真实付款。 同一工作流会统计转入 Stellar 收款账户的 USDC 付款(
paytos-stellar.json;由付款方授权、服务方发送的 Soroban 转账,见lib/onchain-payments-stellar.js),以及转入 Algorand 收款地址的 USDC 付款(paytos-algorand.json;原子组中由另一笔交易支付费用的 USDC 转账,即服务方的费用池模式,见lib/onchain-payments-algorand.js)。在这两个网络上,系统也会监控 x402 服务方曾为其支付费用的地址,无论这些地址是否列在注册表中:每次运行都会读取其费用账户中的新增内容(Stellar 上的 OpenZeppelin 和 agent402.tools,以及 Algorand 上 GoPlausible 的费用付款方),并在最近一次此类付款后继续保留通过这种方式发现的地址 14 天(文件中的found字段)。结果分别存放为payments-data上的payments-stellar.json和payments-algorand.json;/api/trust/summary会添加onchain_payments_stellar和onchain_payments_algorand。系统会优先使用STELLAR_HORIZON_URL和ALGORAND_INDEXER_URL,然后才使用 horizon.stellar.org 和 AlgoNode 的公共索引器。 - GitHub 跳过每日扫描时的处理。 扫描计划每天触发四次,由当天的第一次运行完成当日扫描;但 GitHub 繁忙时会丢弃计划运行(10 月 21 日的 03:17 运行就从未启动)。从 04:15 UTC 起,Doctor 每半小时检查一次对外提供的扫描结果;如果结果仍是前一天的数据,就会使用
only_if_missing启动trust-scan.yml。如果当天扫描已发布,工作流会立即停止;如果已有扫描仍在运行,则会等待其完成(lib/scan-watch.js,每两小时最多启动一次,并使用同一个DELIVERY_DISPATCH_TOKEN)。 GET /api/trust?url=<resource>(免费,每个 IP 每分钟 30 次):查询单个资源的往绩。POST /api/trust/batch,请求体为{"urls": [...]}(免费,最多 100 个 URL,每个 IP 每分钟 10 次调用):按提交顺序批量查询多个资源(对于索引中不存在的 URL,返回found: false);索引的days和updated只在顶部提供一次。适用于会重新测试自身列表的目录和索引器;完整索引位于trust-data分支。POST /api/trust/submit,请求体为{"url": "https://…"}(免费,每个 IP 每小时 10 次):卖家可以提交尚未被任何注册表列出的端点。Doctor 会检查该端点是否会返回带有付款挑战的 402(x402、MPP 或 L402),并将提交记录保存在使用日志仓库(events/trust-submit/);下一次扫描会读取GET /api/trust/submitted,并将提交的端点扫描至submitted.json,与索引分开存放,以便查找和徽章系统能够发现它(标记为submitted: true),同时总数、页面和数据集仍只统计注册表中的列表。每个主机最多 25 条;如果注册表之后列出某条提交记录,该记录就会移入索引;如果某条记录在最近 14 个已扫描日中都无法付款,则会被移除。GET /api/trust/summary:最新扫描的统计信息。/trust:带查询功能和扫描规则的公开页面。GET /api/trust/network?network=xrpl(或类似xrpl:0的 ID,免费):列出每个已扫描、提供此网络的 x402 端点,无论该端点今天能否付款以及原因(扫描会记录无法付款的网络及其首个问题),并按卖家网站分组。/xrpl:x402 在 XRP Ledger 上的公开状态页面,包含每个收款账户的账本检查和付款对象:GET /api/trust/payments?network=xrpl(免费)会列出过去 7 个完整日内收到付款的所有受监控 XRPL 收款地址,按金额从高到低排序,并提供其 XRPL AI Hub 商家名称或对应端点的主机、付款笔数、金额、钱包数,以及其中向 10 个或更多卖家付款的钱包数(名称来自每日扫描中的paytos-xrpl.json)。/algorand:x402 在 Algorand 上的相同页面,并显示每个收款账户的 USDC opt-in 状态。/stellar:x402 在 Stellar 上的相同页面,并显示每个收款账户的 USDC trustline 状态。两者也会列出收款对象(?network=algorand、?network=stellar),并为注册表未列出的地址注明服务方名称。- 不同服务及其类别。 卖家经常会多次列出同一个 API(分别按币种、城市或股票代码列出),因此端点数量会高估市场规模。同一卖家的可付款端点,如果描述中的大部分词语相同(Jaccard ≥ 0.5,
lib/services.js),就会计为一个服务;2026 年 10 月 9 日,40,451 个可付款端点对应 18,475 项服务,其中一个卖家单独列出了三分之一。每项服务都会获得一个类别(crypto、security、on-chain、AI、search、finance、media、places、social、developer tools、other),由 TypeSafe Jev 在每日扫描后选定(scripts/categorize.js;按描述缓存于 trust-data 分支上的categories.json,每天最多新增 1,500 项);在此之前则根据关键词推测类别。在/api/trust/summary(services)、/api/trust/network(services、categories、每个卖家的services、每个端点的category和same_service_endpoints)以及/trust、/algorand和/xrpl中显示。 - 可能的诱饵。 扫描结束后,会对每项服务运行与付费预检相同的诱饵检查(TypeSafe Jev:知名品牌的服务看似官方,但所在域名并非该品牌所有;或以免费代币、空投或保证收益为诱饵),每天最多检查 1,000 项新服务,并按描述缓存于
categories.json。Jev 确认度高(≥ 0.85)的服务会列在/trust和/api/trust/summary中(services.bait:已检查数量、标记数量和确认度最高的 100 项),并在/api/trust/network、/algorand和/xrpl的对应端点上标记。 - 自行运行:
node scripts/trust-scan.js --out trust-data --limit 200,然后运行node scripts/trust-views.js --dir trust-data。
每周 x402 健康报告
每周一,weekly-report.yml 会将 Trust Index 最近 7 天的数据整理成一份报告:有多少 Bazaar 资源状态正常、可付费但需谨慎或不可付费;最常见的原因及各自的修复方法;可付费资源支持哪些网络;以及本周发生的变化(失效、修复、不稳定、新增)。报告不会点名任何卖家或主机。报告、数据和用于 X、Discord 和 Reddit 的帖子草稿(供人工审核和发布)会写入 weekly-reports 分支上的 reports/<date>.md、.json 和 -posts.md。在本地运行:
node scripts/weekly-report.js --out reports [--index trust-data/index.json]。
同一次运行还会为每个网络生成一份摘要,包括 Algorand 和 XRP Ledger(network-digest.js):有多少端点可在该网络上付费,涉及多少卖家;与上周相比有哪些变化(新增端点、停止接受付费的端点、新卖家);有多少端点仅接受该网络;价格中位数;以及规模最大的卖家。摘要只会点名可付费的卖家;问题则以数量统计。文件包括 reports/<date>-<network>.md 和 -posts.md(X 和社区帖子草稿),以及 reports/networks/<network>-latest.json,供下周进行对比的快照。在本地运行:
node scripts/network-digest.js --out reports [--index trust-data/index.json] [--previous reports/networks]。
Fizzl Buy(buy.fizzl.eu)
Fizzl 的第四个 Agent 来自此代码库(buy-server.js、lib/buy/),作为独立的 Render 服务运行。Agent 说明所需内容,inkoper 就会为其购买合适的付费 API:POST /v1/buy {"need": "weather forecast for Amsterdam tomorrow"},通过 x402 支付 $0.02(使用 Base 或 Solana 上的 USDC),适用于费用不超过 $0.01 的服务。
- 挑选(
lib/buy/search.js):钱包服务对整个 Bazaar 进行排名搜索,只保留可在 Base 上使用 USDC 付款、费用在限额内,且 x402 Doctor 至少检查过 3 天、其中至少 80% 的天数都可付款的卖家。 - 填写(
lib/buy/fill.js):Claude 根据需求填写卖家的输入内容(使用其 Bazaar 示例中的键,并将路径参数填入路径)。 - 检查并购买(
lib/buy/purchase.js):必须通过新的预检(OFAC 收款方筛查、交易记录、同名对象、诱饵);然后由 inkoper 自己的钱包(BUY_WALLET_KEY,其中仅保留少量资金)付款,金额不得超过每日限额BUY_DAILY_USD(默认值为 5)及其余额。 - 检查答案:使用 TypeSafe Jev 的答案检查(
lib/jev-answer.js)。如果答案不是所购内容、出现错误或答案为空,就会继续尝试下一个候选项,最多尝试三个。如果没有任何卖家能提供答案,则返回错误,且不会结算 Agent 自己的付款。
GET /v1/pick?need=… 和 MCP 工具 x402_pick(免费,每小时 10 次)会说明将购买什么及原因;MCP 工具 x402_buy 会在调用过程中购买(通过 x402 支付 $0.02,使用 _meta["x402/payment"],网络与 HTTP 路由相同,并采用相同的防止重复使用同一笔付款的锁)。MCP 服务(https://buy.fizzl.eu/mcp)已列入官方 MCP 注册表,标识符为 io.github.Fizzl13/fizzl-buy(server.buy.json,通过 Publish to MCP registry 工作流发布,服务为 fizzl-buy)。它在 Base 上的 ERC-8004 Identity Registry 中是 #988891 号 Agent。
node scripts/buy-dry-run.js "<need>" … 会显示候选项、填写后的请求和预检结果,但不会付款(需要 ANTHROPIC_API_KEY)。2026 年 10 月 23 日,该工具为全部七项测试需求(天气、BTC 价格、网页搜索、加密货币新闻、EUR 兑 USD、代币检查、翻译)找到了预检通过的卖家;同时跳过了一个有警告的卖家,以及一个未响应 402 的卖家。
一次付款只购买一个答案:x402 会先验证付款,再在购买完成后结算;因此,如果同一笔付款同时发送多次,否则就会用 inkoper 的资金执行多笔购买。已经在使用的付款会被拒绝,并返回 409(lib/buy/once.js)。每日限额(BUY_DAILY_USD)在部署后仍然有效:每次购买都会将支付给卖家的金额写入使用日志,新实例会统计其他实例当天的支出(lib/buy/spent-log.js)。
自 2026 年 10 月 23 日起在 https://buy.fizzl.eu 上线(首次索引付款在 15 秒内完成)。与其他 fizzl.eu 服务一样,它的 402 会注明卖家(x402-merchant);在 Render 服务中设置 BUILDER_CODE 后,还会附带 Base Builder Code。
Agent 技能
skills/ 中的两个 Agent Skills 教会编码 Agent(Claude Code、Codex、Cursor 及其他会读取 SKILL.md 的工具)何时以及如何使用 Doctor:
x402-preflight:在 Agent 支付任何 x402 或 MPP 端点之前(awal x402 pay、x402-fetch、Privy's x402 客户端、mppx 等),先查询免费交易记录,再购买 $0.001 的预检,并根据 go / caution / no_go 执行操作,之后报告结果。x402-seller-check:构建或更改付费端点后,运行免费检查,直到检查通过;如果问题不明显,则购买 $0.05 的修复服务。
npx skills add Fizzl13/x402-doctor
Claude Code 插件
在 Claude Code 中,同一组技能会与下方的 MCP 服务一起打包为一个插件,而 presign-guard 的技能和 MCP 服务则作为第二个插件。Fizzl Buy、Fizzl Agent Wallet 和 Ichimoku Signal 各有一个插件,均来自 Fizzl13/fizzl-skills,其中概述了每项 Fizzl 技能:
/plugin marketplace add Fizzl13/x402-doctor
/plugin install x402-doctor@fizzl
/plugin install presign-guard@fizzl
/plugin install fizzl-agent-wallet@fizzl
/plugin install ichimoku-signal@fizzl
/plugin install fizzl-buy@fizzl
市场清单位于 .claude-plugin/marketplace.json。两个 MCP 服务中的付费工具都需要通过 x402 付款的 MCP 客户端;没有此类客户端时,技能会按其说明,通过你自己的 x402 客户端使用 HTTP 付款。
MCP 服务
https://x402-doctor.fizzl.eu/mcp 是供 Claude、Cursor 和 Agent 框架使用的 MCP 服务(Streamable HTTP、无状态),已列入官方 MCP 注册表,名称为 io.github.Fizzl13/x402-doctor。目录无需连接服务,即可从 /.well-known/mcp/server-card.json 的服务卡片读取其工具(列表与 tools/list 相同)。
https://x402-doctor.fizzl.eu/mcp/free 是同一服务,但仅提供免费工具(x402_quick_check、check_payment_proof、x402_trust_record、x402_trust_add),适用于客户端不付款的目录,例如 Claude 的连接器目录。Claude 从 Anthropic 的出站地址范围(160.79.104.0/21)调用连接器,因此来自该地址范围的调用在两个端点上共用每小时 300 次免费调用的额度,而不是每个地址 10 次。
| 工具 | 价格 | 返回内容 |
|---|---|---|
x402_quick_check | 免费,每小时 10 次调用 | pass/warn/fail、问题数量及最重要的三项 |
x402_diagnose | 通过 x402 支付 $0.01 USDC | 每项检查及修复提示,对应 GET /api/v1/diagnose |
x402_preflight | 通过 x402 支付 $0.001 USDC | 在支付端点费用前给出 go/caution/no_go,对应 GET /api/v1/preflight |
x402_preflight_batch | 通过 x402 支付 $0.005 USDC | 对最多 10 个端点(urls)进行预检,对应 GET /api/v1/preflight/batch |
x402_preflight_deep | 通过 x402 支付 $0.01 USDC | 预检结果,以及诊断、历史记录、卖家和域名检查,对应 GET /api/v1/preflight/deep |
x402_fix | 通过 x402 支付 $0.05 USDC | 适用于你的技术栈的代码更改,对应 GET /api/v1/fix |
x402_delivery_check | 通过 x402 支付 $0.25 USDC | 对端点进行一次实际购买:立即返回任务 ID,稍后返回结果,对应 GET /api/v1/delivery-check |
x402_delivery_status | 免费 | 交付检查的状态,以及完成后的结果,对应 GET /api/v1/delivery-check/{id} |
verify_receipt | 免费 | 已付费回答的签名回执是否有效,以及对应的请求,对应 POST /api/v1/verify(参见 Signed verdicts) |
feedback | 免费 | 报告错误或缺失的功能,对应 POST /feedback(见下文) |
付费工具通过 x402 MCP 传输(_meta["x402/payment"])在 MCP 调用中付款,支持 Base 或 Solana,价格和收款钱包与 HTTP 路由相同。无效输入会在付款前被拒绝,调用失败不会收费。通过 MCP 下单的交付检查只有在付款结算后才会加入队列,这与 HTTP 路由相同。
反馈
发现错误或有功能缺失?可以通过 POST /feedback(免费,无需付款)或 MCP 工具 feedback 提交:
curl -X POST https://x402-doctor.fizzl.eu/feedback \
-H 'content-type: application/json' \
-d '{"type": "feature", "message": "Also check the facilitator /supported list", "endpoint": "/api/v1/diagnose"}'
type 可以是 bug、feature 或 other;必须提供 message(最多 2000 个字符);endpoint 和 contact 为可选项。响应为 202,并附带一个 ID。每位调用者每小时最多可提交 10 条报告。报告会写入使用日志(显示在 /admin/usage),每条报告都会由人工阅读;报告中的内容不会被自动执行或更改。GET /feedback 会显示请求结构。诊断不会调用其他服务的 feedback 工具:自称免费的工具会被跳过。
CLI
npx github:Fizzl13/x402-doctor https://api.example.com/paid
npx github:Fizzl13/x402-doctor https://api.example.com/paid --method POST --json
npx github:Fizzl13/x402-doctor https://api.example.com/v1/score --body '{"text":"hello"}'
检查通过或发出警告时,退出代码为 0;检查失败时(或使用 --strict 且有警告时),退出代码为 1;用法错误时,退出代码为 2。
CLI 可以诊断 localhost,因此你可以对开发服务器运行它。
GitHub Action
在每次推送时检查你的 x402 端点。如果 402 响应异常,该步骤就会失败;每个问题都会作为注释显示在运行记录和 PR 中,作业摘要还会列出问题及对应的修复方法。在 GitHub Marketplace 上以 x402 Doctor check 的名称发布;通过检查的公共端点还会获得徽章代码片段。
- uses: Fizzl13/x402-doctor-action@v1
with:
urls: |
https://your-api.example.com/paid
https://your-api.example.com/other
| 输入 | 默认值 | |
|---|---|---|
urls | (必填) | 每行一个,或用逗号分隔。对于在作业中较早启动的开发服务器,localhost 也可用。 |
method | 先尝试 GET,再尝试 POST | GET 或 POST |
fail-on | fail | fail:检查失败时,该步骤失败。warn:警告也会导致失败。never:仅报告。 |
输出:overall(pass、warn 或 fail,表示所有 URL 中最严重的结果)和
report(完整报告的 JSON)。此 Action 使用运行器自带的 Node
(20.18 或更高版本,与 GitHub 托管运行器相同),不会更改作业的
Node 版本。只读:无需钱包,也不涉及付款。
或者在普通的 run: 步骤中使用 CLI:
- run: npx -y github:Fizzl13/x402-doctor https://your-api.example.com/paid
配置
| 变量 | 用途 |
|---|---|
PORT | Web 服务器端口(默认 3001) |
SOLANA_RPC_URL | 用于检查 Solana 收款账户的 RPC(默认:公共主网 RPC,该 RPC 会进行速率限制) |
AGENT_PAYOUT_WALLET | 接收付费 API 款项的 Base 地址(或 DOCTOR_PAYOUT_WALLET) |
AGENT_PAYOUT_WALLET_SOLANA | 接收付费 API 款项的 Solana 地址(或 DOCTOR_PAYOUT_WALLET_SOLANA);需要一个 USDC 代币账户 |
ALGORAND_PAY_TO | 通过 GoPlausible 的促进器结算、接收 USDC 付费 API 款项的 Algorand 地址(ASA 31566704)(可通过 ALGORAND_FACILITATOR_URL 覆盖)。账户必须已选择接收 USDC。未设置或设为 off:不提供 Algorand 选项 |
STELLAR_FACILITATOR_KEY | OpenZeppelin「Built on Stellar」促进器的 API 密钥(在 channels.openzeppelin.com/gen 生成);启用 Stellar 选项:在 Stellar 主网上以 USDC 支付 API 款项,费用由促进器支付。STELLAR_FACILITATOR_URL 指向其他促进器(可带或不带密钥) |
STELLAR_PAY_TO | 接收这些款项的 Stellar 账户;默认是 Frits 的账户(该账户信任 USDC)。账户必须有 USDC 信任线。设为 off:不提供 Stellar 选项 |
BUILDER_CODE | Base Builder Code(ERC-8021,在 base.dev 铸造),作为 builder-code 扩展写入每个付费路由的 402 中:买方的 x402 客户端会回传此代码,促进器会将其写入结算,因此 Base 能归属这笔付款。未设置或代码无效:不使用 |
DOCTOR_PRICE | 每次付费诊断的价格(默认 $0.01) |
DOCTOR_PREFLIGHT_PRICE | 每次付款前检查的价格(默认 $0.001) |
DOCTOR_BATCH_PRICE | 每次批量付款前检查的价格,最多检查 10 个端点(默认 $0.005) |
DOCTOR_DEEP_PRICE | 每次深度付款前检查的价格(默认 $0.01) |
DOCTOR_FIX_PRICE | 每次修复的价格(默认 $0.05) |
FACILITATOR_URL | x402 促进器(默认 PayAI,https://facilitator.payai.network) |
CDP_API_KEY_ID、CDP_API_KEY_SECRET | 使用 Coinbase 的 CDP 促进器处理 Base(PayAI 保留为后备选项)。通过 CDP 结算的付款会将该路由列入 CDP Bazaar |
CDP_VALIDATE | 设为 off 可停用 cdp-validate 检查;该检查会将所检查的 URL 发送到 Coinbase 的公共验证 API(api.cdp.coinbase.com/platform/v2/x402/validate,无需密钥) |
DOCTOR_SOLANA_FACILITATOR | 设置 CDP 密钥后,Solana 由 PayAI 结算(如果 PayAI 不可用,则由 CDP 接管)。设为 cdp 也可通过 CDP 结算 Solana |
MPP_SECRET | 在付费路由上,除 x402 外还启用 MPP 支付(方法 evm,在 Base 上使用 USDC,通过同一促进器),供支持 MPP(mppx)的 Agent 使用。可使用任意较长的随机字符串;该字符串用于签署 challenge id。未设置时仅提供 x402 |
OUTREACH_URL / OUTREACH_KEY | 可选,但必须同时设置:当免费 Web 检查发现损坏的端点(检查失败),且其 /openapi.json 中发布了 info.contact.email 时,Doctor 会将邮件草稿交给 Fizzl 钱包服务器(地址为 OUTREACH_URL,即 https://wallet.fizzl.eu),并通过 OUTREACH_KEY 进行身份验证(与该服务器使用的相同长随机字符串)。钱包服务器只会创建草稿;所有者决定是否通过 Telegram 或控制面板发送。Fizzl 自己的主机不会处理,并且每个主机每天最多处理一次。同一个密钥还允许钱包服务器在发送草稿邮件前调用 POST /api/outreach/recheck({url, ids}),检查其发现的问题(Web 检查 id 或 preflight 原因)是否仍然存在 |
TYPESAFE_API_KEY | 可选:在创建联络草稿前,TypeSafe 的 Jev 会判断损坏的端点(lib/jev-triage.js):对于测试、预览或隧道服务,以及不会影响付费 Agent 的发现结果,不会创建草稿。停用或检查失败时:仍按原有方式创建草稿。明显的测试地址(staging.、sandbox.、testnet、隧道、Vercel 预览)和明确的实际问题(https 上的 http resource.url、内部或原始云函数 resource.url、价格 ≥ 标示价格的 1.5 倍、没有可付款选项)由代码直接判定,无需询问。若同时设置了 ANTHROPIC_API_KEY,Claude 会判定 Jev 无法确定的情况。使用与仓库机密相同的密钥,可让 .github/workflows/triage.yml 手动排列所有 Trust Index 候选项 |
MPP_TEMPO_RECIPIENT | 与 MPP_SECRET 配合使用:还接受 MPP 方法 tempo(推送模式:Agent 在 Tempo 上发送 USDC.e 并附带 MPP 备注,然后返回交易哈希,Doctor 会通过 Tempo RPC 检查)。这是在 Tempo 上接收款项的地址;请确保你在支持 Tempo 的钱包中持有该地址的密钥。未设置时仅提供 evm |
MPP_TEMPO_CHAIN | 4217(Tempo,默认)或 42431(Moderato 测试网,以 pathUSD 支付) |
MPP_TEMPO_RPC | 覆盖 Tempo RPC(默认 https://rpc.tempo.xyz,或 Moderato 的 RPC) |
USAGE_LOG_TOKEN | 仅对 usage-log 仓库具有 Contents 读写权限的细粒度 GitHub 令牌。每次调用都会记录在该仓库中(见下文) |
USAGE_LOG_REPO | 私有 usage-log 仓库(默认值为 Fizzl13/usage-log) |
ADMIN_PASSWORD | /admin/usage 的密码(用户名不限)。未设置时,管理页面不会存在 |
如果两个收款钱包都未设置,付费路由会返回 503,应用的其余部分照常运行。
使用情况仪表板
/admin/usage 显示对 Fizzl 服务(x402 Doctor、PlainText、Ichimoku Signal、presign-guard)的所有调用:
总数、收入、付款钱包、每个服务每天的调用量、最常询问的输入,以及最近调用时填写的内容、
结果和付款情况(附有 Basescan/Solscan 链接)。每个服务都会在私有 usage-log 仓库中为每次调用追加一行 JSON:从 2026 年 10 月 25 日起,每小时一个文件,路径为 events/<service>/<YYYY-MM-DD>/<HH>.jsonl;此前每天一个文件,路径为
events/<service>/<YYYY-MM-DD>.jsonl。相关代码位于 lib/usage-log.js,并复制到了每个服务中;仪表板会读取这些记录(lib/usage-reader.js)。机器人的未付款 402 响应会按小时、路由和 Agent 记录为一行,其中包含 count 和 visitors(不同调用者的数量)。402 挑战、健康检查和静态文件不计为调用;输入会截断至 300 个字符。日志记录不会延迟请求,也不会导致请求失败。
付款安全(Five Attacks on x402)
Five Attacks on x402(Li、Wang 和 Wang,2026)描述了从 HTTP 请求到链上交易过程中 x402 付款可能出错的五种方式,并为每种方式提出了缓解措施。本服务的处理方式如下:
| 攻击 | 问题所在 | 本服务的处理方式 |
|---|---|---|
| I-A 撤销授权 | 付款最终确认前就发出答复,之后付款失败 | 等待结算确认后再发出答复:@x402/express 会缓冲答复,XRPL 和 Solana 路径则会等待交易验证成功。结算失败时返回 402,绝不发送内容。 |
| I-B 结算抢先提交 | 某人看到付款标头后先提交授权,导致服务器自身的结算失败 | 这是协议层面的问题;论文的解决方案是让结算与中介方绑定。此处付款标头只通过 HTTPS 传输,绝不会记录在日志中。 |
| II 重放 | 一笔付款购买多个答复 | 每笔付款只能认领一次:Base 使用 EIP-3009 随机数,XRPL 和 Solana 使用以交易为键的结算缓存(通过 t54 进行的 XRPL 付款在其交易上账后也会被拒绝,因此重启不会使其再次生效),MPP Tempo 转账则必须携带某个挑战的备注(有效期为数分钟),并通过其哈希进行认领。XRPL 付款的 InvoiceID 用于标识本服务,额度会以原子方式扣减。 |
| III 缓存和标头混淆 | 共享缓存(CDN、代理)存储付费答复,并将其提供给未付款的人 | 402 挑战使用 Cache-Control: no-store;付费答复则带有 private(由 @x402/express 添加)或 no-store。 |
| IV 服务选择 | 虚假或被操纵的列表将 Agent 引向错误的卖家 | openapi.json 包含由收款钱包签名的所有权证明(x402scan),付款前检查会标记冒充、诱饵、模板农场以及位于 OFAC 名单上的收款地址。 |
Doctor 也会针对其他卖家检查其中两种问题:付费交付检查会记录 CDN 是否可能免费提供付费答复(III);付款前检查则会覆盖买家即将付款的每个端点的 IV 类问题。
安全
Web 应用会在服务器端获取用户提交的 URL:
- 每次连接都会在连接时检查是否属于私有和保留地址范围(RFC 1918、环回、链路本地和云元数据、CGNAT、IPv6 ULA/链路本地地址,以及任何表示形式的 IPv4 映射 IPv6 地址),因此 DNS 重绑定无法绕过单独的查询。重定向会手动跟随,并对每一跳重新检查。
- 响应大小上限为 2 MB,每个请求都会在 8 s 后超时。
/api/diagnose(免费)按 IP 限流;/api/v1/diagnose按调用付费,并使用相同的防护措施。- 从受诊断端点获取的所有内容都会作为文本呈现,绝不会作为 HTML 呈现。
它绝不会向受诊断的端点付款:没有钱包、没有签名,财务风险为零。付费探测(签名并结算一笔最低金额的付款,以追踪验证/结算故障)特意不在此处的范围内。
项目结构
server.js Express app: /api/diagnose (free), paid API, /openapi.json, /.well-known/x402, static frontend
lib/paid-api.js GET /api/v1/diagnose, /preflight (+ /batch, /deep) and /fix behind x402 (Base + Solana USDC)
lib/recipes.js The fix per failed check, as code for the detected stack
lib/stack.js Which stack runs an endpoint, from its response headers
lib/preflight.js Pre-payment check: verdict, recommended option, reasons (cached)
lib/preflight-plus.js Batch (up to 10 endpoints) and deep pre-payment checks
lib/bazaar-index.js Cached CDP Bazaar index (listing signal for preflight)
lib/trust-scan.js Trust Index scan: catalog, polite fetch, 30-day history
lib/trust-index.js Reads the published index for preflight and /api/trust
lib/index-files.js The index in parts (index/meta.json, index/<nn>.ndjson): written, read, loaded over HTTP
scripts/trust-scan.js Daily scan entry point (trust-scan.yml): plan, one share of the sellers, merge
public/trust.html /trust page
lib/media.js Serves the explainer and paid-fix videos from their branches (/media/explainer.mp4, /media/fix.mp4)
media/explainer/ Explainer video pipeline (script, voice, recording, encoding)
lib/diagnose.js The checks
lib/request-body.js Example POST body: the caller's, or the requestBody example from the seller's /openapi.json
lib/site-scan.js MetaMask's site scanner verdict for the domain
lib/mcp-check.js x402 over MCP: tools/list, unpaid tools/call, the payment requirement in the tool result
lib/networks.js Known networks, USDC (or BNB Chain's dollar tokens) per network, address validation
lib/safe-fetch.js SSRF-safe fetch (connect-time IP check, redirects, size cap, timeout)
bin/x402-doctor.js CLI
public/index.html Frontend
skills/ Agent Skills: x402-preflight (buyers) and x402-seller-check (sellers)
.claude-plugin/ Claude Code plugin marketplace: the skills plus the MCP servers of Doctor and presign-guard
test/ node:test suites (fixture x402 servers, SSRF, CLI, API)
测试
npm test
这些测试套件会使用本地夹具服务对 doctor 运行测试:一个正常的 v2 服务(Base + Solana、Bazaar、OpenAPI、主网付费墙)和一个复现上述真实错误的故障服务,此外还有 SSRF、大小上限、API 和 CLI 测试。
许可证
版权所有 (C) 2026 Frits Zwager。仅根据 GNU Affero General Public License v3.0(AGPL-3.0-only)授权;详见 LICENSE。如果你以网络服务形式运行修改后的版本,必须向该服务的用户提供其源代码。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。

