面向 AI Agent 的 ROZO Checkout
ROZO Checkout 让 AI agent 能够支付 OpenRouter 的账单——也就是一条 Coinbase 支付链接——并且可以用闪电网络上的 BTC,或者 Solana、BNB Chain、以太坊、Polygon、Base、Stellar 上的 USDT/USDC 来付,而不必使用该链接原本要求的 Base USDC。下面所有接口都是公开 HTTP:不需要 API key,不需要账号,不需要浏览器,也不需要钱包连接弹窗,因此整个支付流程可以完整放进一个脚本或一次工具调用里。
一条命令
如果你的 agent 能执行 shell 命令,这就是全部的接入工作。它会完成报价、创建订单、展示即将发送的内容,,同时告诉你这笔订单还能有效多久,并一直等到账单结清为止。
npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx
这个 URL 就是你的 OpenRouter 支付链接,从 OpenRouter 的 Buy Credits → Crypto 流程里复制。结尾的 xxx 只是用来表明这是示例——你自己的链接结尾是真实字符。
在终端里,它会先问你想用哪种币付款。你可以在提示处粘贴自己的钱包地址,它会标出哪些币你确实付得起——这只是展示层面的提示,绝不会改变最终签名的内容——并且会记住这个地址和你选的币,供下次使用。随后它会打印一个充值地址,你用任何钱包付款即可:不需要私钥,不需要环境变量,不需要任何配置。
已经知道要用哪种币,或者你在写脚本?直接指定,跳过这个提问。agent 和脚本必须始终传 --with——选择器只在终端下出现,而且刻意不设默认币种。
npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana
--with 接受 usdt-solana、usdc-solana、usdt-bnb、usdc-bnb、usdt-ethereum、usdc-ethereum、usdt-polygon、usdc-polygon、usdc-base、usdc-stellar 和 btc-lightning——参见支持的链。当 stdin 不是 TTY 时请加 --yes,需要 stdout 只输出一个 JSON 对象时加 --json。下面的内容都是同一笔支付,只是换成你已经在用的工具来表达。
选择你的工具
展开你正在用的那一项。对大多数工具来说负载完全相同——要么是上面那条 npx 命令,要么是让 agent 去读 /llms.txt。在所有这些方式里,你都是用自己的钱包付款,完全不涉及私钥;只有可选的 --send 参数才会在本地签名。
Claude Code安装 skill,或直接粘贴单行命令
这个仓库本身就是一个 Claude Code skill:它包含 SKILL.md 以及 scripts/dist/ 下的可执行文件。把它克隆到你的 skills 目录,Claude Code 就会自动识别。
git clone https://github.com/RozoAI/rozo-checkout-skill ~/.claude/skills/rozo-checkout
或者完全跳过配置,在任意会话里粘贴这段话:
Pay this OpenRouter link with USDT on Solana using: npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana
Codex CLI写进 AGENTS.md,或直接运行
Codex 会读取项目根目录下的 AGENTS.md。加一条常驻指令,它就不必每次都被告知该怎么付款:
## Paying OpenRouter invoices To pay a payments.coinbase.com link, run: npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana Full reference: https://checkout.rozo.ai/llms.txt
或者你自己在会话里直接运行这条命令——它不需要任何配置。
OpenCode写进 AGENTS.md,或直接运行
OpenCode 同样会读取项目根目录下的 AGENTS.md,所以上面 Codex 那段可以原样使用。最短的路径依然是命令本身:
npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana
Cline写进 .clinerules,或直接运行
Cline 从项目根目录的 .clinerules 读取常驻指令。把同样的规则放进去:
To pay an OpenRouter / Coinbase payment link, run: npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana Full reference: https://checkout.rozo.ai/llms.txt
Cline 在执行命令前会先询问你——对于付款场景,这正是你想要的行为。
Cursor写进 .cursor/rules,或直接运行
在 .cursor/rules/ 下加一条项目规则,让 agent 知道这条命令:
To pay an OpenRouter / Coinbase payment link, run: npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana Full reference: https://checkout.rozo.ai/llms.txt
或者直接在 Cursor 的终端里运行这条命令——不需要任何规则。
Hermes Agent在会话里运行单行命令
Hermes Agent(Nous Research 出品)拥有 shell 权限和自己的 skill 体系。用 hermes 启动,然后让它运行这条命令:
Fetch https://checkout.rozo.ai/llms.txt, then pay this OpenRouter link: npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana
OpenClawopenclaw agent exec
OpenClaw 的无头入口用于执行一次性任务,很适合从脚本或聊天频道触发的付款:
openclaw agent exec "Pay this OpenRouter link with USDT on Solana by running: npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana"
Pi在会话里运行单行命令
Pi 是一个 BYOK 终端 agent,其内置工具包含 bash,因此可以直接运行这条命令。用 pi 启动,然后让它:
Pay this OpenRouter link with USDT on Solana by running: npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana
终端——完全不用 agent逐步运行脚本
如果你想自己掌控每一步,就克隆仓库并直接运行脚本。它们都是自包含的打包产物——除了 Node 18+ 之外无需安装任何东西。
git clone https://github.com/RozoAI/rozo-checkout-skill cd rozo-checkout-skill LINK="https://payments.coinbase.com/payment-links/pl_01YOURLINKID" # 1. Quote — read-only, costs nothing node scripts/dist/quote.js --url "$LINK" # 2. Create the order. No money moves; the full deposit address is # WITHHELD and you get a masked summary to review first. node scripts/dist/create-order.js --url "$LINK" --chain 900 --token USDT # 3. Only once you have decided to pay, re-run with --confirm to # release the full deposit block. node scripts/dist/create-order.js --url "$LINK" --chain 900 --token USDT --confirm # 4. Pay the deposit block from any wallet — no key, no configuration. # Send exactly the amount, token, chain and every other field it gives # you, copied from the JSON and never retyped. # 5. Watch it settle node scripts/dist/status.js --rozo-payment-id <rozoPaymentId> --watch --timeout 600
每个脚本都只在 stdout 输出一个 JSON 对象;退出码 0 表示成功,1 表示被拒绝或失败(请读取 error.code),2 表示用法错误,3 表示已提交但未确认。
用自己的钱包付款是默认方式,完全不需要私钥。如果你更希望由这台机器代你签名——仅支持 EVM 链和 Solana——请使用 send-evm.js 或 send-sol.js。Solana 上它们用 solana-keygen 早已生成的 ~/.config/solana/id.json;EVM 上用加密的 V3 keystore,密码会在运行时提示输入,绝不作为命令行参数传入。无人值守的运行仍可使用环境变量里的裸私钥。这条路径只有一个限制:单笔付款不得超过 1,100 美元,且无法覆盖。金额更大的账单请走上面那条无需私钥的路径。
状态流转依次为 awaiting_deposit → payin_detected → payin_confirmed → bridging → paying_coinbase → settled。你的链上交易被确认并不代表流程结束——请持续轮询直到 settled。
任何其他 agent让它去读 /llms.txt
任何能抓取 URL 并执行命令的 agent 都可以做到。一行搞定,无需配置:
Fetch https://checkout.rozo.ai/llms.txt into your context, then use it to pay this OpenRouter link: https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx
如果 agent 没有 shell 但能发 HTTP 请求,就直接驱动下面那四个原始调用。
原始 HTTP,适用于任意框架
四次调用,全部公开且无需密钥。CLI 和 skill 都构建在这一层之上,因此任何框架——LangChain、一次 OpenAI 工具调用、一个定时任务——都可以直接驱动它。
MPP="https://apiserver.mpprouter.dev/v1/services/rozo-agent-api" INTENTS="https://intentapiv4.rozo.ai/functions/v1/payment-api" LINK="https://payments.coinbase.com/payment-links/pl_01YOURLINKID" # 1. Quote: merchant, amount, expiry, and a ~60-second quoteReceipt. # callerPays always equals the invoice amount; discount is always "0". curl -s -X POST "$MPP/quote-invoice" \ -H 'content-type: application/json' \ -d "{\"url\":\"$LINK\"}" # 2. Create a bridge order for, say, USDT on Solana. # Creates an order but moves no money; an unfunded order simply expires. curl -s -X POST "$MPP/create-invoice" \ -H 'content-type: application/json' \ -d "{\"url\":\"$LINK\",\"source\":{\"chainId\":\"900\",\"tokenSymbol\":\"USDT\"}}" # 3. Authoritative deposit instructions, using the rozoPaymentId above. # Pay EXACTLY source.amount of the requested token on the requested chain # to source.receiverAddress, including source.receiverMemo when present. # For Lightning, pay the BOLT11 in source.lnInvoice. curl -s "$INTENTS/payments/<rozoPaymentId>" # 4. Fulfilment status, using the Coinbase linkId. curl -s "$MPP/invoice-status?payment_id=pl_01YOURLINKID"
create-invoice 按 IP 限流(约每小时 30 次);读取类接口不限流。只有当 router 报告 paid / coinbase.settled 时,这条 Coinbase 链接才算真正结清——仅仅出现 intents 状态 payment_completed 只代表跨链桥的生命周期,并不等于最终结算完成。
值得写进代码的错误:409 链接已被使用 · 410 链接已过期 · UNSUPPORTED_SOURCE(响应中的 supported 对象会列出有效的链与代币组合;闪电网络受支持,但不会出现在该列表中)· RATE_LIMITED 按 IP 的创建频率上限,请稍后重试。
你需要准备什么
一个持有受支持代币的钱包,且代币位于下列某条链上。原生 gas 代币不被接受:SOL、ETH、BNB 和 MATIC 无法完成结算,链上 BTC 同样不行。
| 链 | Chain id | 代币 | 说明 |
|---|---|---|---|
| Ethereum | 1 | USDC, USDT | 6 位小数 |
| BNB Chain | 56 | USDC, USDT | 18 位小数——最常见的 1012 数量级错误来源 |
| Polygon | 137 | USDC, USDT | 6 位小数 |
| Base | 8453 | USDC | 6 位小数 |
| Solana | 900 | USDC, USDT | 6 位小数;SPL 代币。原生 SOL 不受支持 |
| Stellar | 1500 | USDC | 7 位小数;充值必须带 memo,且类型必须是 MEMO_TEXT——即使 memo 全是数字也一样。在钱包里选成 MEMO_ID 会产生一个不同的 memo,这笔付款就匹配不上 |
| Bitcoin Lightning | lightning | BTC | 金额为整数聪(satoshi),通过 BOLT11 invoice 支付 |
- Node 18 或更高版本,用于 CLI 与 skill 两种方式(
node -v)。原始 HTTP 方式只需要一个 HTTP 客户端。 - Coinbase 支付链接,例如
https://payments.coinbase.com/payment-links/pl_01YOURLINKID。 - 无需账号,也无需 API key。本页面上的所有接口都是公开的。
- 默认路径不需要任何私钥。用你自己的钱包向充值地址付款,不需要私钥、不需要环境变量,也不需要任何配置。只有可选的
--send参数会在本地签名,它的私钥来自 Solana 的~/.config/solana/id.json,或 EVM 上的加密 keystore(密码会在运行时提示输入);无人值守的自动化仍可用环境变量里的裸私钥,但私钥永远不会通过命令行参数传入。这条签名路径将单笔付款上限设为 1,100 美元;金额更大的走无需私钥的路径。
我需要什么钱包?
一个钱包、一条链就够了——不需要每条链各准备一个。从上面的表里挑一种你已经持有的币,然后从它现在所在的地方付款即可。
- 任何钱包都可以,从交易所提币同样可以。默认路径只是打印一段充值信息;你只需按上面给出的金额、代币、链,把钱发到那个地址。全程不需要连接本站,也不需要在浏览器里做任何授权。实践中大家在 EVM 链上用 MetaMask 或 Rabby,在 Solana 上用 Phantom 或 Solflare,付 BTC 时用 Phoenix、Wallet of Satoshi 之类的闪电钱包。
- Stellar 是需要特别小心的那一条。它的充值走的是共享地址加 memo 的方式,所以无论你从交易所还是钱包发出,都必须能填写 memo。漏掉 memo,这笔钱就丢了。memo 类型永远是
MEMO_TEXT,即使 memo 全是数字也一样:65371582是文本,不是 id。在钱包里选成MEMO_ID,它就变成另一个 memo,永远匹配不上。充值信息里会用receiverMemoType标明类型——请原样照发。 - 闪电网络付的是一张 invoice,不是地址。你扫描或粘贴充值信息里的 BOLT11 字符串即可,这条路径上没有可转账的地址。
- 只有
--send需要私钥,且仅支持 EVM 链和 Solana——Stellar 和闪电网络没有--send。它在本地签名:Solana 用solana-keygen早已生成的~/.config/solana/id.json,EVM 用加密的 keystore 文件,密码会在运行时提示输入。无人值守的自动化场景仍可继续用环境变量里的裸私钥。本页面上其余所有方式都不涉及私钥。
关于安全,说实话
付错金额、付错代币、付错网络,或者重复付款,通常都是不可挽回的。以下是最关键的几条安全约束;即使你要自己写客户端,也请把它们实现进去。
- 充值地址是一次性的,且与报价绑定。绝不要复用来自旧订单、缓存响应或某份文档里的地址。请在同一次运行中、在发送前重新获取充值信息。
- 严格遵守带余量的过期时间。取订单过期时间与 Coinbase 链接过期时间中较早的那个,再减去各链的安全余量:EVM 与 Stellar 为 10 分钟,Solana 为 5 分钟;如果当前时间已超过该点,就不要发送。闪电网络的 BOLT11 则要求至少还有 10 分钟有效期。充值信息、确认摘要以及
status都会把剩余时间显示成一个直观的时长——expires in 47m——而不是需要你自己换算的时间戳。没有付款的订单会自动过期,不产生任何费用,所以让它过期然后重新来一遍永远是安全的。 - 绝不要对已入金的订单重复付款。如果为某条链接创建订单时,该链接已存在一个未过期的订单,接口会直接返回那个已有订单——即使它已经入过金,也即使它使用的链或代币与你请求的不同。请核对返回的 source 是否与你的请求一致,并在发送前确认该订单确实处于未支付状态。一旦有资金离开你的钱包,就不要再重新创建订单重试:请保留
linkId、rozoPaymentId和每一个交易哈希,持续轮询,并交由人工来对账。 - 没有折扣。你支付的就是账单金额——
callerPays始终等于账单金额,discount始终为"0"。以最典型的场景为例:价值 1,000 美元的 OpenRouter 额度,在加上 OpenRouter 自己收取的 5% 加密支付手续费后,账单金额为 1,050.00 美元,你需要支付的就是这 1,050.00 美元。而你实际发送的充值金额还会再高一点,因为其中还含有跨链桥与来源链的手续费。请在继续之前核对页面显示的充值金额。 - 在广播交易前重新校验可支付性。这条 Coinbase 链接随时可能被另一个付款方抢先消耗掉。
完整清单——两阶段确认、资金已检测规则(money-detected rule)、失陷地址黑名单、跨进程的一次性发送锁、热钱包限额与地址掩码——记录在 GitHub 仓库的 Safety design 一节。
支付你的第一笔账单
一条命令,无需账号,无需 API key。SKILL.md 是写给 agent 看的,QUICKSTART.md 是写给做接入的开发者看的。
打开 rozo-checkout-skill 阅读 /llms.txt