Pay many OpenRouter links from the terminal
Every OpenRouter crypto top up is its own Coinbase payment link. If you buy credits for many people, or for many accounts of your own, you can pay all of them from a script with the ROZO Checkout CLI. You pay from the wallet you already use, with the coin you already hold. No account and no API key.
1. Install
Node 20.18 or newer, plus jq for the batch script. Install once so each run skips the download. The same CLI is also a Claude Code plugin and a ClawHub skill.
npm i -g @rozoai/checkout rozo-checkout quote https://payments.coinbase.com/payment-links/pl_01YOURLINKID
2. Create the orders in a batch
Put one link per line in links.txt. The loop creates one order per link and writes one result row per link to runs/batch.tsv.
# links.txt: one Coinbase link per line
command -v jq >/dev/null || { echo "install jq first"; exit 1; }
mkdir -p runs
while IFS= read -r link || [ -n "$link" ]; do
link="${link%$'\r'}"; link="${link%%\?*}"
[ -n "$link" ] || continue
id="${link##*/}"
rozo-checkout pay "$link" --with usdt-solana --yes --json --no-watch \
</dev/null > "runs/$id.json"
code=$?
row=$(jq -r --arg id "$id" --arg code "$code" '[$id, $code,
(.order.rozoPaymentId // .error.details.body.rozoPaymentId // "-"),
(if .success then "pending: pay before " + (.order.expiry.effectiveDeadlineIso // "?")
else (.error.code // .send.error.code // "FAILED") end)] | @tsv' \
"runs/$id.json" 2>/dev/null) || row="$id $code - NO_OUTPUT"
printf '%s\n' "$row" >> runs/batch.tsv
done < links.txt
- Without
--send, creating an order moves no money. The row sayspendingand the JSON file holds the deposit details:deposit.receiverAddressanddeposit.amount(plusdeposit.receiverMemoon Stellar), or the BOLT11deposit.lnInvoicefor Lightning. - Pay each deposit right after it is created, from any wallet or exchange. Send exactly the amount shown, on the chain shown. Every deposit address is one time: never reuse one from an older order.
- Watch
order.expiry.effectiveDeadlineIsoand stop paying at leastorder.expiry.marginMinutesbefore it. - Use the same
--withcoin on every run for a link. Runningpayagain on an open link returns the same order, so a retry does not create a second one.
3. Check that each link settled
Track every order by its rozoPaymentId. receipt exits 0 only when Coinbase itself reports the invoice paid.
rozo-checkout status <rozoPaymentId> --json | jq -r '.state, .escalate'
# Is it paid? exit 0 = settled
rozo-checkout receipt <rozoPaymentId> --json
Coins and chains
| Coin | Chains |
|---|---|
| USDT | Solana, BNB Chain, Ethereum, Polygon, Arbitrum |
| USDC | Solana, BNB Chain, Ethereum, Polygon, Arbitrum, Base, Stellar |
| BTC | Lightning |
| Native coins | ETH (Ethereum, Base, Arbitrum), BNB, SOL, POL |
Pick one with --with, for example usdt-solana, usdc-base, btc-lightning or sol. A native coin is offered only when the quote lists it. On chain BTC and Tron are not supported. The full list is on the agent page.
Fees
- ROZO charges a 1% service fee on top of the OpenRouter invoice. The quote shows the invoice and what you pay in total before any order is created. The exact deposit for your coin comes with the order.
- The deposit you send also carries the bridge and network fees for your coin, so it reads a little higher than the invoice. Native coin amounts include an FX spread.
- OpenRouter adds its own crypto fee to the invoice. That fee is OpenRouter's, not ROZO's.
Limits
- Order creation is rate limited per IP per hour, and a history of paid orders raises the limit. When you hit it the CLI answers
RATE_LIMITED: wait, then resume with the links that are not yet settled. Current numbers are in the bulk purchases guide. - Stablecoins accept much larger invoices than native coins and BTC Lightning, which have a lower per invoice cap. See the limits in the bulk purchases guide before you plan a large invoice.
- The optional
--sendflag, which signs from a local key, caps a single payment at $1,100. Paying the deposit yourself from a wallet has no such cap.
If you send too little
- An order that receives less than the deposit amount is not settled automatically.
statusreportsescalate: trueand the order waits for a person on our side. - Do not pay again and do not open a new order for that link. Email hi@rozo.ai with the link, the rozoPaymentId and every transaction hash, and we sort it out by hand.
- If an order expires and you sent nothing, run the same
payagain on the same link. If you did send something to the old deposit, contact us first.
Questions about a batch?
Email hi@rozo.ai with how many links you pay a week and which coin you hold.
Open the CLI on GitHub Bulk purchases guide