x402를 사용하면 클라이언트가 스테이블코인으로 요청에 결제할 수 있습니다. BazaarLink는 X Layer에서 OKX의 x402 facilitator를 통해 정산되는 x402 결제로 에이전트 계정을 등록하고 기존 잔액을 충전할 수 있습니다. 이 페이지는 두 경로의 실제 동작을 설명합니다.
402 흐름
두 경로 모두 같은 세 단계로 진행됩니다: 요청, 서명, 재전송.
결제 없이 요청을 보냅니다. 서버는 402 Payment Required와 x402Version, resource, accepts(network, asset, amount, payTo, maxTimeoutSeconds)를 담은 JSON을 반환합니다.
자신의 지갑 키로 accepts의 한 항목에 대한 결제 승인을 서명합니다.
같은 요청을 다시 보내고 base64로 인코딩한 결제 페이로드를 X-PAYMENT 헤더에 넣습니다. payment-signature 헤더 이름도 별칭으로 허용됩니다.
응답의 요구사항 확인
network, asset, amount는 하드코딩하지 말고 402 응답에서 가져오세요. amount는 자산의 최소 단위입니다(USDT0은 소수점 이하 6자리). 두 요청에 같은 JSON 본문을 보내세요.
충전에 성공하면 200을 반환하며 status가 credited이고, 미국 달러 기준 새 잔액, txHash, 그리고 paidUsd, creditedUsd, serviceFeeUsd(결제 금액, 입금된 금액, 플랫폼 충전 수수료)가 포함됩니다.
1
2
3
4
5
6
7
8
9
10
11
HTTP/1.1200 OK
Content-Type: application/json
{"status":"credited","balance":12.5,"txHash":"0xTX_HASH","paidUsd":1.1,"creditedUsd":1,"serviceFeeUsd":0.1}
1
2
3
4
5
6
7
8
9
// Same three steps against /api/x402/topup; only the URL, body and auth header change.constURL = "https://bazaarlink.ai/api/x402/topup";
constHEADERS = {
"content-type": "application/json",
authorization: "Bearer " + process.env.BAZAARLINK_API_KEY,
};
constBODY = JSON.stringify({ amountUsd: 1.1 });
// ...reuse the challenge / sign / resend code from the registration example.// 200 -> { "status": "credited", "balance": 12.5, "txHash": "0x...", "paidUsd": 1.1, "creditedUsd": 1, "serviceFeeUsd": 0.1 }
현재 한도 확인
GEThttps://bazaarlink.ai/api/x402/topup
GET /api/x402/topup은 인증 없이 minUsd, maxUsd, network를 반환합니다.
1
curl https://bazaarlink.ai/api/x402/topup
1
{"minUsd":1,"maxUsd":50,"network":"eip155:196"}
중복 결제 및 재전송
서명된 승인은 한 번만 사용할 수 있습니다. 서버는 결제 네트워크에 연결하기 전에 중복 결제를 인식하므로 재시도해도 두 번 결제되지 않습니다.
충전: 이미 credited 처리된 결제를 다시 보내면 status가 already_credited인 200이 반환됩니다.
등록: 15분 동안 같은 서명 결제에는 API key가 포함된 동일한 201 응답이 반환되므로 네트워크 실패 시 안전하게 재시도할 수 있습니다. 그 후에는 status가 already_registered인 200과 결제 txHash가 반환되고 API key는 다시 표시되지 않습니다.
오류 응답
x402 경로는 { "error": { "message", "code" } } 형식으로 오류를 반환합니다. 다른 두 응답이 있습니다: 410은 { "error", "code" }, 429는 Retry-After 헤더가 있는 { "error" }입니다.
HTTP
코드
의미
400bad_request
본문이 올바르지 않습니다: 유형이 잘못되었거나 name이 없거나 알 수 없는 필드가 있습니다.
400topup_unavailable
이 계정에서는 충전할 수 없습니다.
401unauthenticated
충전 전용: 유효한 API key 또는 session이 없습니다.
402(payment requirements body)
사용 가능한 결제가 아직 없습니다. 본문의 요구사항에 서명하고 재전송하세요. 결제가 요구사항과 일치하지 않거나 검증에 실패해도 반환됩니다.
402payment_amount_too_low
정산된 금액이 요청한 금액보다 적습니다.
403geo_blocked
현재 지역에서는 x402를 사용할 수 없습니다.
410agent_register_discontinued
에이전트 등록이 꺼져 있습니다.
429(Retry-After header)
같은 네트워크 출처에서 등록이 너무 많습니다. Retry-After에 표시된 초만큼 기다리세요.
502facilitator_error
결제를 검증하거나 정산할 수 없습니다. 나중에 다시 시도하세요.
502settlement_error
결제를 받았지만 잔액에 반영하지 못했습니다. 새 결제에 서명하지 말고 같은 결제를 다시 보내세요.
502registration_error
결제를 받았지만 계정을 만들지 못했습니다. 새 결제에 서명하지 말고 같은 결제를 다시 보내세요.
503disabled / runtime_disabled
x402가 현재 꺼져 있거나 설정되지 않았습니다.
503asset_unavailable / dedup_unavailable
의존 항목(자산 설정, 중복 확인 또는 충전 확인)에 연결할 수 없습니다. 나중에 다시 시도하세요.
503signup_disabled / agent_register_unavailable
등록이 일시 중지되었거나 사용할 수 없습니다.
계정을 사람에게 전달
응답의 upgrade_url을 계정 소유자에게 보내세요. 소유자가 로그인해 인수하면 API key와 잔액이 소유자의 계정으로 이동합니다. claim_expires 전에 인수해야 합니다.
1
https://bazaarlink.ai/claim?token=<claim_token>
네트워크와 자산
현재는 X Layer의 USDT0이며 OKX의 x402 facilitator를 통해 정산됩니다. 플랫폼 충전 수수료가 적용되므로 받는 잔액은 결제 금액보다 적습니다(요금 안내 참조). 결제는 온체인으로 정산되며 되돌릴 수 없으니 서명 전에 금액과 네트워크를 확인하세요.