ROZO Checkout para agentes de IA
ROZO Checkout permite que un agente de IA pague una factura de OpenRouter — un enlace de pago de Coinbase — con BTC por Lightning, o con USDT/USDC en Solana, BNB Chain, Ethereum, Polygon, Base y Stellar, en lugar del USDC en Base que espera el enlace. Todos los endpoints de abajo son HTTP público: sin clave de API, sin cuenta, sin navegador y sin ventana emergente de conexión de wallet, así que el pago completo cabe dentro de un script o de una llamada a herramienta.
El único comando
Si tu agente puede ejecutar un comando de shell, esta es toda la integración. Cotiza el enlace, crea la orden, te muestra lo que se va a enviar y cuánto tiempo sigue siendo válida, y espera hasta que la factura quede liquidada.
npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx
Esa URL es tu enlace de pago de OpenRouter, copiado del flujo Buy Credits → Crypto de OpenRouter. La terminación xxx solo está para marcarlo como ejemplo: el tuyo acabará en caracteres reales.
En una terminal te pregunta con qué moneda quieres pagar. Puedes pegar la dirección de tu wallet en el prompt y marcará qué monedas puedes permitirte realmente — una ayuda visual que nunca cambia lo que se firma — y recordará esa dirección y tu moneda para la próxima vez. Después imprime una dirección de depósito que pagas desde cualquier wallet: sin clave privada, sin variable de entorno, sin configuración.
¿Ya sabes qué moneda vas a usar, o estás escribiendo un script? Indícala y sáltate la pregunta. Los agentes y los scripts siempre deben pasar --with: el selector solo aparece en una terminal y deliberadamente no hay moneda por defecto.
npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana
--with acepta usdt-solana, usdc-solana, usdt-bnb, usdc-bnb, usdt-ethereum, usdc-ethereum, usdt-polygon, usdc-polygon, usdc-base, usdc-stellar y btc-lightning — consulta las cadenas admitidas. Añade --yes cuando stdin no sea una TTY, y --json para obtener exactamente un objeto JSON en stdout. Todo lo que sigue es este mismo pago expresado en la herramienta que ya usas.
Elige tu herramienta
Abre la que uses. En la mayoría de las herramientas el contenido es idéntico: el comando npx de arriba, o apuntar al agente a /llms.txt. En todas ellas pagas desde tu propia wallet y no interviene ninguna clave; solo la opción --send firma localmente.
Claude Codeinstala la skill o pega el comando
El repositorio es una skill de Claude Code: incluye SKILL.md y los ejecutables en scripts/dist/. Clónalo en tu directorio de skills para que Claude Code lo detecte automáticamente.
git clone https://github.com/RozoAI/rozo-checkout-skill ~/.claude/skills/rozo-checkout
O sáltate la configuración por completo y pega esto en cualquier sesión:
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 CLIAGENTS.md, o ejecútalo directamente
Codex lee AGENTS.md desde la raíz del proyecto. Añade una instrucción permanente para que sepa cómo pagar sin que se lo indiques cada vez:
## 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
O simplemente ejecuta tú mismo el comando en la sesión: no necesita configuración alguna.
OpenCodeAGENTS.md, o ejecútalo directamente
OpenCode también lee AGENTS.md desde la raíz del proyecto, así que el fragmento de Codex sirve sin cambios. El camino más corto sigue siendo el propio comando:
npx @rozoai/checkout pay https://payments.coinbase.com/payment-sessions/paymentSession_3230343499xxx --with usdt-solana
Cline.clinerules, o ejecútalo directamente
Cline lee las instrucciones permanentes desde .clinerules en la raíz del proyecto. Añade ahí la misma regla:
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 pedirá confirmación antes de ejecutar el comando, que es justo el comportamiento que quieres para un pago.
Cursor.cursor/rules, o ejecútalo directamente
Añade una regla de proyecto en .cursor/rules/ para que el agente conozca el comando:
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
O ejecuta el comando en la terminal de Cursor: no hace falta ninguna regla.
Hermes Agentejecuta el comando en una sesión
Hermes Agent (Nous Research) tiene acceso a shell y su propio sistema de skills. Arráncalo con hermes y pídele que ejecute el comando:
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
El punto de entrada headless de OpenClaw ejecuta una tarea puntual, lo que encaja bien con un pago que disparas desde un script o un canal de chat:
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"
Piejecuta el comando en una sesión
Pi es un agente de terminal BYOK cuyas herramientas integradas incluyen bash, así que puede ejecutar el comando directamente. Arráncalo con pi y pídele:
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
Terminal — sin ningún agenteejecuta los scripts paso a paso
Si quieres controlar cada paso, clona el repositorio y ejecuta los scripts. Son bundles autocontenidos: no hay nada que instalar aparte de 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
Cada script imprime exactamente un objeto JSON en stdout; código de salida 0 éxito, 1 rechazado o fallido (lee error.code), 2 uso incorrecto, 3 enviado pero sin confirmar.
Pagar desde tu propia wallet es la vía por defecto y no necesita ninguna clave. Si prefieres que sea esta máquina la que firme — solo cadenas EVM y Solana — usa send-evm.js o send-sol.js. En Solana usan el ~/.config/solana/id.json que solana-keygen ya escribió; en EVM un keystore V3 cifrado cuya contraseña se pide por pantalla y nunca se pasa como flag. Una clave en bruto en el entorno sigue sirviendo para ejecuciones desatendidas. Esa vía tiene un único límite: un solo pago no puede superar los 1.100 USD, sin posibilidad de anularlo. Las facturas mayores se pagan por la vía sin clave de arriba.
Los estados van awaiting_deposit → payin_detected → payin_confirmed → bridging → paying_coinbase → settled. Que tu transacción se confirme en la cadena no es el final: sigue consultando hasta settled.
Cualquier otro agenteapúntalo a /llms.txt
Cualquier agente capaz de descargar una URL y ejecutar un comando puede hacerlo. Una línea, sin configuración:
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
Si el agente no tiene shell pero sí puede hacer peticiones HTTP, usa directamente las cuatro llamadas en crudo de abajo.
HTTP en crudo, para cualquier framework
Cuatro llamadas, todas públicas y sin claves. Es la capa sobre la que se apoyan la CLI y la skill, así que cualquier framework — LangChain, una llamada a herramienta de OpenAI, un cron — puede usarla directamente.
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 tiene límite de frecuencia por IP (unas 30/hora); los endpoints de lectura no. El enlace de Coinbase solo está liquidado cuando el router informa paid / coinbase.settled: un estado de intents payment_completed por sí solo es el ciclo de vida del puente, no la liquidación final.
Errores que conviene contemplar: 409 enlace ya usado · 410 enlace caducado · UNSUPPORTED_SOURCE (el objeto supported de la respuesta lista los pares cadena/token válidos; Lightning está admitido pero no aparece en esa lista) · RATE_LIMITED límite de creación por IP, reinténtalo más tarde.
Qué necesitas
Una wallet con uno de los tokens admitidos, en una de estas cadenas. Las monedas nativas de gas no se aceptan: SOL, ETH, BNB y MATIC no liquidan, ni tampoco BTC on-chain.
| Cadena | Chain id | Tokens | Nota |
|---|---|---|---|
| Ethereum | 1 | USDC, USDT | 6 decimales |
| BNB Chain | 56 | USDC, USDT | 18 decimales — la causa habitual de errores de 1012 |
| Polygon | 137 | USDC, USDT | 6 decimales |
| Base | 8453 | USDC | 6 decimales |
| Solana | 900 | USDC, USDT | 6 decimales; SPL. El SOL nativo no está admitido |
| Stellar | 1500 | USDC | 7 decimales; el depósito requiere memo, y su tipo es MEMO_TEXT — incluso cuando el memo son todo dígitos. Elegir MEMO_ID en tu wallet produce un memo distinto y el pago no se corresponde |
| Bitcoin Lightning | lightning | BTC | los importes son satoshis enteros, pagados mediante una factura BOLT11 |
- Node 18 o superior para las vías de CLI y skill (
node -v). La vía de HTTP en crudo no necesita más que un cliente HTTP. - El enlace de Coinbase, p. ej.
https://payments.coinbase.com/payment-links/pl_01YOURLINKID. - Sin cuenta y sin clave de API. Todos los endpoints de esta página son públicos.
- La vía por defecto no necesita ninguna clave. Pagar a la dirección de depósito desde tu propia wallet no requiere clave privada, ni variable de entorno, ni configuración alguna. Solo la opción
--sendfirma localmente, y toma su clave de~/.config/solana/id.jsonen Solana o de un keystore cifrado (con la contraseña pedida por pantalla) en EVM; una clave en bruto en el entorno sigue sirviendo para automatización desatendida, y una clave jamás se acepta en la línea de comandos. Esa vía de firma limita cada pago a 1.100 USD; por encima de eso se paga por la vía sin clave.
¿Qué wallet necesito?
Una wallet, en una cadena: no hace falta una por cada cadena. Elige de la tabla de arriba la moneda que ya tengas y paga desde donde ya esté.
- Sirve cualquier wallet, y también un retiro desde un exchange. La vía por defecto solo imprime un bloque de depósito: envías exactamente ese importe de ese token, en esa cadena, a esa dirección. Nada se conecta a este sitio ni se aprueba en el navegador. En la práctica la gente usa MetaMask o Rabby en las cadenas EVM, Phantom o Solflare en Solana, y una wallet Lightning como Phoenix o Wallet of Satoshi para BTC.
- Stellar es la que exige cuidado. Sus depósitos se enrutan mediante una dirección compartida más un memo, así que aquello desde lo que envíes — exchange o wallet — debe permitirte fijar un memo. Si lo omites, el pago se pierde. El tipo de memo es siempre
MEMO_TEXT, incluso cuando el memo son todo dígitos:65371582es texto, no un id. Si eligesMEMO_IDen tu wallet se convierte en un memo distinto que no se corresponderá nunca. El bloque de depósito indica el tipo enreceiverMemoType: envíalo exactamente como viene. - Lightning paga una factura, no una dirección. Escaneas o pegas la cadena BOLT11 del bloque de depósito; no hay ninguna dirección a la que enviar.
- Solo
--sendnecesita una clave, y cubre únicamente las cadenas EVM y Solana: no hay--sendpara Stellar ni Lightning. Firma localmente, tomando la clave del~/.config/solana/id.jsonquesolana-keygenya escribió en Solana, o de un keystore cifrado cuya contraseña se pide por pantalla en EVM. Una clave en bruto en el entorno sigue sirviendo para automatización desatendida. Todo lo demás en esta página no usa claves.
Seguridad, con franqueza
Pagar el importe equivocado, el token equivocado, la red equivocada, o pagar dos veces suele ser irrecuperable. Estas son las barreras que más importan; impleméntalas aunque escribas tu propio cliente.
- Las direcciones de depósito son de un solo uso y están ligadas a la cotización. Nunca reutilices una dirección de una orden antigua, de una respuesta cacheada ni de un documento. Vuelve a pedir las instrucciones de depósito en la misma ejecución, justo antes de enviar.
- Respeta la caducidad con margen. No envíes si ya ha pasado el menor de los dos vencimientos (el de la orden y el del enlace de Coinbase) menos un margen por cadena: 10 minutos en EVM y Stellar, 5 minutos en Solana. Una BOLT11 de Lightning necesita al menos 10 minutos de validez restante. El bloque de depósito, el resumen de confirmación y
statusmuestran el tiempo restante como una duración sencilla — expires in 47m — en vez de una marca de tiempo que tengas que convertir. Una orden que nunca financias simplemente caduca y no cuesta nada, así que dejarla vencer y empezar de nuevo siempre es seguro. - Nunca pagues dos veces una orden ya financiada. Crear una orden para un enlace que ya tiene una orden sin caducar devuelve esa orden existente, incluso si ya ha sido financiada y aunque use una cadena o un token distintos de los que pediste. Verifica que el source devuelto coincide con tu petición y exige que la orden esté sin pagar antes de enviar. Una vez que ha salido dinero de tu wallet, no reintentes creando una orden nueva: guarda el
linkId, elrozoPaymentIdy todos los hashes de transacción, sigue consultando el estado y pásalo a una persona para conciliarlo. - No hay descuento. Pagas el importe de la factura:
callerPayssiempre es igual a ella ydiscountsiempre vale"0". El caso de referencia: 1.000 USD de créditos de OpenRouter se facturan como 1.050,00 USD una vez añadida la comisión del 5% que cobra el propio OpenRouter por cripto, y esos 1.050,00 USD son lo que debes. El depósito que envías es algo mayor todavía, porque encima lleva las comisiones del puente y de la cadena de origen. Comprueba el importe de depósito mostrado antes de continuar. - Vuelve a comprobar que se puede pagar justo antes de difundir la transacción. El enlace de Coinbase puede ser consumido por otro pagador en cualquier momento.
La lista completa — confirmación en dos fases, la regla de dinero detectado, la lista negra de direcciones comprometidas, el bloqueo de envío único entre procesos, los límites de la hot wallet y el enmascarado de direcciones — está documentada en Safety design, en el repositorio de GitHub.
Paga tu primera factura
Un comando, sin cuenta y sin clave de API. SKILL.md está escrito para el agente y QUICKSTART.md para quien hace la integración.
Abrir rozo-checkout-skill Leer /llms.txt