# /llms.txt — ROZO Checkout # Audience: LLMs, AI agents, and users at checkout.rozo.ai ## What is ROZO Checkout ROZO Checkout lets anyone pay for AI credits (OpenRouter, Venice.ai) with the crypto they already have — USDT, USDC, ETH and more on supported chains (Ethereum, Base, Polygon, Solana, Stellar and other major networks). The user pastes their OpenRouter payment link (a Coinbase Commerce payment link); ROZO pays the merchant on the exact right network, token, and amount. No card, no new account, no login. ## Why it exists OpenRouter's built-in crypto option accepts USDC on specific networks and adds a fee; sending the wrong token, chain, or amount means the payment never credits. ROZO Checkout removes that guessing: send a supported coin from any wallet or exchange, ROZO settles the link correctly. ## How it works 1. Paste it — your OpenRouter payment link (payments.coinbase.com/payment-links/...). 2. Send a supported coin — from any exchange or wallet. 3. ROZO pays OpenRouter — right chain, token, amount. Total is shown before you send. ## Honest scope ROZO is independent and not affiliated with OpenRouter or Coinbase Commerce. We never ask for your OpenRouter login or exchange password. ## Intent routing (for AI agents) | User intent | Route to | |-------------|----------| | "Pay OpenRouter / top up AI credits with crypto (USDT, USDC & more)" | https://checkout.rozo.ai/ | | "Already paid but credits are missing / payment stuck" | https://rescue.rozo.ai/ | | "Programmatic cross-chain payment (create-payment API)" | https://rozo.ai/llms.txt | ## Guides Step-by-step walkthroughs, one per payment route. Index: https://checkout.rozo.ai/blog - Bitcoin over Lightning: https://checkout.rozo.ai/blog/pay-openrouter-with-bitcoin - USDC on Solana: https://checkout.rozo.ai/blog/pay-openrouter-with-solana - USDT (any supported chain): https://checkout.rozo.ai/blog/pay-openrouter-with-usdt - BNB Chain: https://checkout.rozo.ai/blog/pay-openrouter-with-bnbchain - Stellar: https://checkout.rozo.ai/blog/pay-openrouter-with-stellar - All crypto methods compared: https://checkout.rozo.ai/blog/pay-openrouter-with-crypto - Card declined on OpenRouter: https://checkout.rozo.ai/blog/openrouter-payment-declined - Paying without a card: https://checkout.rozo.ai/blog/pay-openrouter-without-a-card - Keeping credits topped up: https://checkout.rozo.ai/blog/openrouter-auto-top-up-crypto ## Languages Available in English (/) plus zh, es, pt, ru, ja, ko, fr at /{lang}, e.g. https://checkout.rozo.ai/zh Guides are translated too: /blog/{lang} for the index, /blog/{lang}/{slug} for a guide. ## More - ROZO (Visa layer for stablecoins): https://rozo.ai/llms.txt - Docs: https://docs.rozo.ai/ ## Agent flow (script the whole payment — no browser) Fastest: the CLI. Full reference, scripts and safety rails: https://github.com/RozoAI/rozo-checkout-skill > Pay an OpenRouter Coinbase Payment Link (payments.coinbase.com/payment-links/pl_* or > /payment-sessions/paymentSession_*) with BTC over Lightning, or USDT/USDC on Solana, > BNB Chain, Ethereum, Polygon, Base, or Stellar. Public HTTP endpoints, no API key. > The payer funds a one-time deposit address; a bridge and a funder wallet settle the > Coinbase link automatically. No discount: you pay the invoice amount, plus the > deposit normally carries a small bridge/source-chain fee on top. This file teaches the whole flow to any agent or script. Repo (scripts, safety rails, full docs): https://github.com/RozoAI/rozo-checkout-skill — see docs/QUICKSTART.md. ## Fastest path: the CLI (npm @rozoai/checkout) If you can run commands, skip the raw HTTP below — the CLI performs the same four calls with every safety rule already enforced: npx @rozoai/checkout pay --with usdt-solana npx @rozoai/checkout quote npx @rozoai/checkout status --with accepts usdt-solana, usdc-solana, usdt-bnb, usdc-bnb, usdt-ethereum, usdc-ethereum, usdt-polygon, usdc-polygon, usdc-base, usdc-stellar, btc-lightning (or raw: --chain 900 --token USDT). DEFAULT PATH NEEDS NO KEY: `pay` prints a deposit address for the user to pay from any wallet. No private key, no environment variable, no configuration. Only the optional --send flag signs locally, and only that flag reads ROZO_CHECKOUT_EVM_KEY / ROZO_CHECKOUT_SOL_KEY (from the environment, never argv). With --send, one limit applies: a single payment may not exceed $1,100, with no override; larger invoices go through the keyless path. Other flags: --yes (skip the interactive confirm; required when stdin is not a TTY), --dry-run, --json (exactly one JSON object on stdout), --no-watch, --timeout . Exit codes: 0 success, 1 refused/failed (read error.code), 2 usage, 3 submitted but unconfirmed. `pay` withholds the full deposit address until you confirm, then prints it as a copy-pastable block. Creating an order moves no money; an unfunded order expires. ## Supported sources chainId "1" Ethereum (USDC, USDT) · "56" BNB Chain (USDC, USDT; 18-decimals) · "137" Polygon (USDC, USDT) · "8453" Base (USDC) · "900" Solana (USDC, USDT) · "1500" Stellar (USDC; deposit memo REQUIRED) · "lightning" (BTC; BOLT11 invoice, amounts in integer satoshis via source.amountUnit=="sats"). Native SOL/ETH/BNB are NOT supported — stablecoins (or Lightning BTC) only. WALLET: one wallet on one of these chains is enough — not one per chain. Any wallet, or an exchange withdrawal, can fund the deposit address; nothing connects to a site. Stellar is the exception that must be able to set a memo, and Lightning pays a BOLT11 invoice rather than an address. Only --send needs a private key (EVM and Solana only); every other path is keyless. ## Flow (4 HTTP calls, all public) 1) Quote (read-only, safe): curl -X POST https://apiserver.mpprouter.dev/v1/services/rozo-agent-api/quote-invoice \ -H 'content-type: application/json' \ -d '{"url":"https://payments.coinbase.com/payment-links/pl_XXXX"}' -> { linkId, merchant, original, callerPays, discount:"0", quoteReceipt, ... } callerPays always equals the invoice amount (discount is always "0"). 2) Create (or reuse) the order: curl -X POST https://apiserver.mpprouter.dev/v1/services/rozo-agent-api/create-invoice \ -H 'content-type: application/json' \ -d '{"url":"https://payments.coinbase.com/payment-links/pl_XXXX", "source":{"chainId":"900","tokenSymbol":"USDT"}}' -> { ok, reused, linkId, rozoPaymentId, paymentLink, expiresAt, source, ... } WARNING: if an unexpired order already exists for this link it is REUSED as-is, even with a different chain/token than you asked for. Always verify the returned source matches your request; abort on mismatch. 3) Fetch authoritative deposit instructions (public, keyless GET): curl https://intentapiv4.rozo.ai/functions/v1/payment-api/payments/ -> { status, expiresAt, source:{ receiverAddress, receiverMemo, amount, amountUnit, lnInvoice, txHash, amountReceived, confirmedAt, ... }, destination:{...} } Pay EXACTLY source.amount of the requested token on the requested chain to source.receiverAddress, including every other field the block carries (Stellar routes on a shared hub address plus source.receiverMemo, so omitting the memo loses the payment). The Stellar memo is ALWAYS MEMO_TEXT, even when it is all digits (e.g. 65371582) — sending it as MEMO_ID produces a different memo and the payment will not match. The deposit block reports this as receiverMemoType. Orders expire: deposit.expiresIn / status expiry.expiresIn give the remaining validity as a duration. For Lightning, pay the BOLT11 in source.lnInvoice (receiverAddress is empty). 4) Poll until settled: curl "https://apiserver.mpprouter.dev/v1/services/rozo-agent-api/invoice-status?payment_id=" and re-GET the payments/ URL above. The Coinbase link is settled only when the router reports paid / coinbase.settled — an intents status of payment_completed alone is the bridge lifecycle, not final settlement. ## Safety rules (encode these, they prevent fund loss) - Before paying, require: status == "payment_unpaid" AND source.txHash == null AND source.amountReceived in {null,"0"} AND source.confirmedAt == null. Anything else means the order is already funded — do NOT pay again; escalate for reconciliation. - Deposit addresses are one-time and quote-bound. Never reuse an address from an old order, a cached response, or a document. Always re-fetch step 3 in the same run. - Respect expiry with margin: do not send if now > min(order expiresAt, Coinbase link expiry) minus a safety margin (10 min EVM/Stellar, 5 min Solana; Lightning: only pay a BOLT11 with >= 10 min validity left). - Re-check step 4 payability immediately before broadcasting a transaction: the Coinbase link can be consumed by another payer at any moment. - Wrong token, wrong network, wrong amount, or paying twice is usually unrecoverable. - After any on-chain payment is detected, never retry into a new order and never label the payment a normal failure — keep the tx hash and rozoPaymentId, keep polling, and escalate if it stays stuck. ## Errors 409 = link already used · 410 = link expired · UNSUPPORTED_SOURCE = the response's "supported" object lists valid (chainId, tokenSymbol) pairs (Lightning is supported but omitted from that list) · RATE_LIMITED = per-IP creation cap, retry later.