문제가 하나 있습니다. 결제 방식은 엔드포인트가 정하고, 에이전트가 만나는 x402 엔드포인트는 보통 Base나 Solana 같은 특정 네트워크의 USDC를 요구합니다. 그런데 에이전트가 가진 것은 다를 수 있습니다. Solana의 USDT, Stellar의 USDC, 또는 BNB Chain의 USDT일 수도 있습니다. 호출할 때마다 브리지하는 것도 통하지 않습니다. x402 결제 요구 사항은 몇 분 동안만 유효한데, 체인 간 송금은 보통 그보다 오래 걸리기 때문입니다.
ROZO는 독립 서비스이며 어떤 x402 판매자와도 제휴 관계가 없습니다.
한 번 충전하고 여러 번 결제
ROZO의 x402 결제 기능은 문제를 둘로 나눕니다. 이미 가진 코인으로, 이미 쓰는 체인에서 ROZO 잔액을 한 번 충전합니다. 그 다음부터는 Base의 USDC를 받는 엔드포인트에 대한 x402 호출마다 그 잔액에서 몇 초 안에, 결제 유효 시간 안에 결제됩니다.
에이전트가 셸 명령을 실행할 수 있다면 연동은 이것으로 끝입니다.
- 잔액을 한 번 충전합니다. 일회용 입금 주소가 출력되면 본인 지갑에서 결제합니다: npx @rozoai/checkout x402 topup 20 --with usdt-solana
- 유료 엔드포인트를 호출합니다. CLI가 402를 읽고, ROZO가 서명하고, 결제와 함께 요청이 다시 전송됩니다: npx @rozoai/checkout x402 pay https://api.example.com/v1/search --method POST --body '{"q":"..."}'
- 남은 잔액을 확인합니다: npx @rozoai/checkout x402 balance
x402 pay에서 일어나는 일
요청은 내 컴퓨터에서 엔드포인트로 바로 전송됩니다. 402가 돌아오면 CLI는 결제 요구 사항을 읽고 Base의 USDC 옵션만 남긴 뒤, 그 한 건의 결제에 서명해 달라고 ROZO에 요청합니다. 그런 다음 PAYMENT-SIGNATURE 헤더를 붙여 원래 요청을 다시 보내고 응답을 출력합니다.
모든 결제에는 idempotencyKey가 붙고, 같은 결제를 재시도할 때는 같은 키를 다시 쓰므로 타임아웃이 나도 두 번 청구되지 않습니다.
셸이 없나요? 같은 결제를 두 개의 핵심 HTTP 엔드포인트 /v1/x402/topup과 /v1/x402/sign으로 할 수 있으며, 에이전트 키를 bearer token으로 보냅니다. 에이전트는 서명을 붙여 자기 요청을 다시 보냅니다. x402 페이지에 두 호출 예시가 모두 있습니다.
내 돈을 지키는 장치
에이전트에게 지갑을 맡기는 것은 실제 위험이므로, 결제 기능은 최소 권한을 기준으로 만들어졌습니다.
- 키는 잔액만 쓸 수 있습니다. 첫 충전 때 ak_로 시작하는 에이전트 키가 만들어집니다. 이 키는 ROZO 잔액에서 결제만 할 수 있고 그 밖의 일은 할 수 없습니다. 본인 지갑에는 절대 접근하지 않고, ROZO는 사용자의 지갑 키를 보관하지 않으며, 에이전트 키는 해시만 저장합니다.
- 모든 결제에는 상한이 있습니다. 기본값으로 한 번의 결제는 최대 $5, 키 하나가 하루에 쓸 수 있는 금액은 최대 $100입니다. 둘 다 기본값이며 키별로 조정할 수 있습니다. 키를 payTo 주소 목록으로 제한할 수도 있고, CLI는 --max-usd로 정한 한도를 넘는 결제를 거부합니다.
- 매번 일회성 결제이며 구독이 아닙니다. 호출마다 판매자의 새 402와 ROZO의 새 서명이 필요합니다. 판매자는 나중에 돈을 더 가져갈 수 있는 지속적인 권한을 받지 않습니다.
- 요청 내용은 내 것으로 남습니다. 유료 요청은 내 컴퓨터에서 엔드포인트로 갑니다. ROZO는 요청 본문, 헤더, 해당 서비스에 쓰는 API 키를 보지 않습니다. ROZO가 보는 것은 서명을 요청받은 결제 요구 사항, 즉 누구에게, 얼마를, 어느 네트워크에서 결제하는지뿐입니다.
충전할 수 있는 것과 결제되는 것
두 구간이 있으며, 일부러 나누어 보여 드립니다.
충전 구간 (나에게서 ROZO로):
- Solana, BNB Chain, Ethereum, Polygon의 USDT
- Solana, BNB Chain, Ethereum, Polygon, Base, Stellar의 USDC
네이티브 코인이나 sats를 갖고 계신가요? checkout.rozo.ai의 ROZO Checkout에서 OpenRouter 충전에 쓸 수 있습니다.
결제 구간 (ROZO에서 x402 판매자로):
- Base (eip155:8453): USDC, x402 scheme exact
- Solana: 추후 지원
판매자는 항상 USDC로 받습니다. x402 exact 결제는 토큰 전송이기 때문입니다. USDT는 잔액 충전에만 쓰이고, 판매자는 USDC로 받습니다. 엔드포인트가 Solana의 USDC만 받는다면 CLI는 청구가 일어나기 전에 X402_UNSUPPORTED로 멈춥니다.
최소 충전 금액은 $5이고 충전에는 1% 수수료가 붙습니다. 잔액에서 나가는 x402 결제는 판매자가 요구하는 금액만 듭니다. 잔액 출금은 아직 셀프 서비스가 아닙니다. 마스킹한 키와 금액을 hi@rozo.ai로 이메일하면 원하는 체인으로 잔액을 돌려 드립니다.
지금 바로 시작하기
결제 기능은 지금 사용할 수 있습니다. checkout.rozo.ai/x402 페이지에 세 가지 명령, HTTP 호출, 한도, FAQ가 한곳에 정리되어 있습니다. 모든 오류 코드를 담은 전체 레퍼런스는 docs.rozo.ai에 있습니다. 에이전트는 같은 안내를 안전 규칙, 재시도 지침과 함께 checkout.rozo.ai/llms.txt와 GitHub의 RozoAI/rozo-checkout-skill 저장소에서 읽을 수 있습니다.
가진 코인으로 한 번 충전하고, 에이전트가 호출하는 API 결제는 에이전트에게 맡기세요.