x402로 첫 유료 요청 보내기

이 가이드는 Solana 요청 하나를 예로 x402의 흐름을 따라갑니다. 가격을 확인하고 결제한 뒤, 정산 영수증과 함께 응답을 받기까지의 과정입니다. 나머지 15개 체인도 각자의 경로에서 같은 방식으로 동작합니다.
Solana의 USDC, 또는 Base의 USDC나 EURC가 들어 있는 지갑과 x402 클라이언트가 필요합니다. x402 클라이언트는 402 응답을 읽고, 지갑에서 결제에 서명한 뒤 그 결제와 함께 요청을 다시 보내는 소프트웨어입니다. x402 클라이언트에 대해서는 x402.org의 x402 문서를 참고하세요.

1. 요청 보내기

결제 없이 RPC 요청을 보내세요.
bash
curl -i https://x402.erpc.global/v1/solana-mainnet \
  --header 'Content-Type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
응답은 402 Payment Required입니다. 헤더에 메서드와 가격이 들어 있습니다.
http
HTTP/2 402
x-payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…
x-rpc-methods: getSlot
x-rpc-weight: 1000
x-rpc-price-usd: 0.001
본문의 accepts에는 이 요청을 결제할 수 있는 스테이블코인마다 결제 옵션이 하나씩 나열됩니다. amount는 스테이블코인의 최소 단위로 나타낸 금액이므로, 1000은 0.001 USDC 또는 0.001 EURC입니다.
json
{
  "error": { "code": "payment_required", "message": "Payment required", "request_id": "…" },
  "x402Version": 2,
  "accepts": [
    { "scheme": "exact", "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "amount": "1000", "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", … },
    { "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", … },
    { "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42", … }
  ],
  "pricing": { "methods": ["getSlot"], …, "weight": 1000, "rawWeight": 42, …, "price": "$0.001", … },
  …
}

2. x402 클라이언트로 결제하기

402 응답을 x402 클라이언트에 넘기세요. 클라이언트는 지갑으로 결제할 수 있는 옵션을 고르고, 그 금액의 결제에 서명한 뒤 X-Payment 헤더에 넣을 값으로 인코딩합니다. 이 결제에는 네트워크 수수료용 SOL이나 ETH가 필요 없습니다.

3. 결제를 붙여 요청 다시 보내기

X-Payment 헤더에 결제를 넣어 같은 본문을 다시 보내세요.
bash
curl -i https://x402.erpc.global/v1/solana-mainnet \
  --header 'Content-Type: application/json' \
  --header 'X-Payment: <PAYMENT_PAYLOAD>' \
  --data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
본문은 바꾸지 마세요. 가격은 본문을 기준으로 계산되므로, 바꾼 본문의 가격이 달라지면 결제가 그 가격과 맞지 않게 되어 price_mismatch가 반환됩니다.
결제가 검증되고 정산되면 RPC 응답이 돌아오고, 정산 영수증은 X-Payment-Response 헤더에 들어 있습니다.
http
HTTP/2 200
x-payment-response: <RECEIPT>
json
{ "jsonrpc": "2.0", "id": 1, "result": … }
결제 하나는 요청 하나에만 쓸 수 있습니다. 같은 결제를 다시 보내면 402 payment_invalid 또는 409 duplicate_payment로 거부되고, 요청은 다시 전달되지 않습니다.

응답

x402.erpc.global이 결제를 요청하기 전에 오류로 응답한 요청에는 요금이 들지 않습니다.
상태error.code발생한 일
402payment_required결제가 전송되지 않았습니다. 본문에 가격과 결제 옵션이 들어 있습니다.
402payment_invalid결제가 검증을 통과하지 못했습니다. 새 결제에 서명해 요청을 다시 보내세요.
402price_mismatch결제가 이 요청의 402 응답이 제시한 옵션과 맞지 않습니다(가격 등).
402payment_amount_too_low결제 금액이 x402.erpc.global에서 정산하는 최소 금액보다 적습니다.
402settlement_failed정산이 실패했다고 보고되었습니다. 응답에는 결제 옵션이 다시 들어 있습니다.
409duplicate_payment이미 사용된 결제입니다.
400method_not_supported, invalid_request해당 경로에서 판매하지 않는 메서드이거나, 받지 않는 본문입니다. 요금은 청구되지 않습니다.
413batch_too_large배치의 호출이 100개를 넘습니다. 요금은 청구되지 않습니다.
500configuration_error해당 경로가 지금은 요청을 처리할 수 없습니다. 요금은 청구되지 않습니다.
503payment_unavailable지금은 결제 옵션을 제시할 수 없습니다. 요금은 청구되지 않습니다. Retry-After에 표시된 초만큼 기다린 뒤 다시 시도하세요.
503service_busy동시 요청이 너무 많습니다. 요금은 청구되지 않습니다. Retry-After에 표시된 초만큼 기다린 뒤 다시 시도하세요.
502settlement_failed정산 결과를 알 수 없습니다. 결제가 처리되었을 수도 있으며, 영수증은 첨부되지 않습니다. 새 결제에 서명하기 전에, 서명한 결제가 Solana 또는 Base에서 처리되었는지 확인하세요.
502, 504upstream_error, upstream_timeout결제는 정산되었지만 체인이 응답하지 않았거나 제시간에 응답하지 않았습니다. 영수증은 그대로 첨부됩니다. 요청을 다시 보내려면 새 결제가 필요합니다.
Solana에서는 큰 프로그램에 필터 없이 보내는 getProgramAccounts처럼 읽는 데이터가 너무 많은 호출에 대해, 결제를 요청하기 전에 HTTP 200과 JSON-RPC 오류를 반환하므로 요금이 들지 않습니다.

다음 단계