BazaarLinkBazaarLink
ログイン
ドキュメントAPIリファレンスSDKリファレンスエージェント利用AIスキル

OKX x402決済:agent登録と残高チャージ

x402では、クライアントがstablecoinでリクエストの支払いを行えます。BazaarLinkは、X LayerでOKXのx402 facilitatorを通じて決済されるx402決済で、agentアカウントを登録し、既存残高をチャージできます。このページでは2つのルートの実際の動作を説明します。

402の流れ

どちらのルートも同じ3段階です:リクエスト、署名、再送。

  1. 支払いなしでリクエストを送ります。サーバーは402 Payment Requiredと、x402Version、resource、accepts(network、asset、amount、payTo、maxTimeoutSeconds)を含むJSONを返します。
  2. 自分のウォレットキーで、acceptsの項目の1つに対する支払い承認へ署名します。
  3. 同じリクエストを再度送り、base64でエンコードした支払いペイロードをX-PAYMENTヘッダーに入れます。payment-signatureというヘッダー名も別名として受け付けます。
レスポンスの要件を読む
network、asset、amountは固定値にせず、402レスポンスから取得してください。amountはアセットの最小単位です(USDT0は小数点以下6桁)。2回のリクエストでは同じJSONボディを送ります。

agentを登録する

POSThttps://bazaarlink.ai/api/v1/agents/register/x402

POST /api/v1/agents/register/x402は、1回の支払い付きリクエストでagentアカウント、API key、初期残高を作成します。API keyもログインも不要です。

リクエストボディ

name必須
string
agent名、1〜100文字。
description
string
任意の説明、最大4000文字。
amountUsd必須
number
支払う金額(米ドル)、正の数。402を作成する前に許容範囲(現在は$1〜$50)へ収められるため、レスポンスのamountを使用してください。

不明なフィールドは400 bad_requestで拒否されます。

1. 支払いなしでリクエストする

レスポンスは支払い要件付きの402です。まだ何も作成されません。

curl -i -X POST https://bazaarlink.ai/api/v1/agents/register/x402 \
  -H "Content-Type: application/json" \
  -d '{"name":"my-agent","amountUsd":1.1}'
HTTP/1.1 402 Payment Required
Content-Type: application/json

{
  "x402Version": 2,
  "resource": {
    "url": "https://bazaarlink.ai/api/v1/agents/register/x402",
    "description": "BazaarLink paid agent registration",
    "mimeType": "application/json"
  },
  "accepts": [
    {
      "scheme": "exact",
      "network": "eip155:196",
      "payTo": "0xPAY_TO_ADDRESS",
      "asset": "0xASSET_CONTRACT",
      "amount": "1100000",
      "maxTimeoutSeconds": 300,
      "extra": { "name": "USD₮0", "version": "1" }
    }
  ]
}

2. 署名して再送する

自分のウォレットで署名し、X-PAYMENTヘッダー付きで同じリクエストを送ります。curlコマンドでリクエストを確認でき、下のTypeScript例でヘッダー値を生成できます。

curl -i -X POST https://bazaarlink.ai/api/v1/agents/register/x402 \
  -H "Content-Type: application/json" \
  -H "X-PAYMENT: <base64 payment payload>" \
  -d '{"name":"my-agent","amountUsd":1.1}'

TypeScriptの例

この例では@okxweb3/x402クライアントパッケージとviemを使います。OKX Walletまたは任意のウォレットキーで署名できます。秘密鍵は自分のマシンに残り、送信するのは署名済み承認だけです。

import { x402Client } from "@okxweb3/x402-core/client";
import type { Network } from "@okxweb3/x402-core/types";
import { toClientEvmSigner } from "@okxweb3/x402-evm";
import { ExactEvmScheme } from "@okxweb3/x402-evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const URL = "https://bazaarlink.ai/api/v1/agents/register/x402";
const HEADERS = { "content-type": "application/json" };
const BODY = JSON.stringify({ name: "my-agent", amountUsd: 1.1 });

// 1. Ask without paying. The 402 body lists what the server accepts.
const challenge = await fetch(URL, { method: "POST", headers: HEADERS, body: BODY });
if (challenge.status !== 402) throw new Error("unexpected status " + challenge.status);
const paymentRequired = await challenge.json();

// 2. Sign the payment authorization with your own wallet key.
const privateKey = readSecret("payer-private-key") as `0x${string}`; // from your own secret store, never from source code
const signer = toClientEvmSigner(privateKeyToAccount(privateKey));
const client = new x402Client().register(
  paymentRequired.accepts[0].network as Network,
  new ExactEvmScheme(signer),
);
const payload = await client.createPaymentPayload(paymentRequired);
const xPayment = Buffer.from(JSON.stringify(payload), "utf8").toString("base64");

// 3. Send the same request again with the signed payment.
const res = await fetch(URL, { method: "POST", headers: { ...HEADERS, "x-payment": xPayment }, body: BODY });
const account = await res.json(); // 201: api_key, credits, claim_token, payment ...
console.log(res.status, account.credits_usd);

ウォレットの秘密鍵は環境変数またはシークレットストアに置き、ソースコードには書かないでください。

登録レスポンス

登録に成功すると、次のフィールドを含む201が返ります。API keyはここで一度だけ表示されるため、すぐに保存してください。

HTTP/1.1 201 Created
Content-Type: application/json

{
  "api_key": "sk-bl-...",
  "credits": 1,
  "credits_usd": "$1.0000",
  "claim_token": "...",
  "claim_expires": "2026-10-08T00:00:00.000Z",
  "upgrade_url": "https://bazaarlink.ai/claim?token=...",
  "referral_code": "...",
  "free_model": "auto:free",
  "message": "...",
  "referral_message": "...",
  "base_url": "https://bazaarlink.ai/api/v1",
  "docs": "https://bazaarlink.ai/llms.txt",
  "payment": {
    "txHash": "0xTX_HASH",
    "network": "eip155:196",
    "amountUsd": 1.1,
    "paidUsd": 1.1,
    "creditedUsd": 1,
    "serviceFeeUsd": 0.1
  }
}
api_key
string
新しいAPI key。
credits
number
追加される残高(米ドル):支払額からプラットフォームのチャージ手数料を引いた額。
credits_usd
string
同じ残高を整形した文字列。
claim_token
string
人がアカウントを引き継ぐためのトークン。
claim_expires
string
アカウント引き継ぎの期限(ISO 8601)。
upgrade_url
string
人が使う引き継ぎリンク。末尾は/claim?token=です。
referral_code
string
新しいagentアカウントの紹介コード。
free_model
string
常にauto:free。残高なしで使えるモデルです。
message
string
agentが所有者に表示できる定型文。
referral_message
string
紹介コードに関するテキスト。
base_url
string
新しいkeyで使うAPI base URL。
docs
string
機械可読なドキュメント入口。
payment
object
決済された支払いのtxHash、network、amountUsdに加え、paidUsd、creditedUsd、serviceFeeUsdを含むオブジェクト。

既存残高をチャージする

POSThttps://bazaarlink.ai/api/x402/topup

POST /api/x402/topupは、API keyを所有するアカウントまたはログイン済みsessionの残高を増やします。402の流れは同じで、ボディはamountUsdだけです。

Authorization: Bearerと自分のAPI keyで認証するか、ログイン済みのブラウザsessionを使います。

curl -i -X POST https://bazaarlink.ai/api/x402/topup \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "X-PAYMENT: <base64 payment payload>" \
  -d '{"amountUsd":1.1}'

チャージに成功すると200が返り、statusがcredited、米ドルの新しい残高、txHash、そしてpaidUsd・creditedUsd・serviceFeeUsd(支払額、入金額、プラットフォームのチャージ手数料)が含まれます。

HTTP/1.1 200 OK
Content-Type: application/json

{
  "status": "credited",
  "balance": 12.5,
  "txHash": "0xTX_HASH",
  "paidUsd": 1.1,
  "creditedUsd": 1,
  "serviceFeeUsd": 0.1
}
// Same three steps against /api/x402/topup; only the URL, body and auth header change.
const URL = "https://bazaarlink.ai/api/x402/topup";
const HEADERS = {
  "content-type": "application/json",
  authorization: "Bearer " + process.env.BAZAARLINK_API_KEY,
};
const BODY = 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を返します。

curl https://bazaarlink.ai/api/x402/topup
{ "minUsd": 1, "maxUsd": 50, "network": "eip155:196" }

重複した支払いと再送

署名済み承認は1回だけ使えます。サーバーは支払いネットワークへ接続する前に重複を認識するため、再試行で二重に支払うことはありません。

チャージ:すでに入金済みの支払いを再送すると、statusがalready_creditedの200が返ります。

登録:15分間は同じ署名済み支払いに同じ201レスポンス(API keyを含む)が返るため、ネットワーク失敗時に安全に再試行できます。その後はstatusがalready_registeredの200と支払いのtxHashが返り、API keyは再表示されません。

エラーレスポンス

x402ルートは{ "error": { "message", "code" } }としてエラーを返します。異なるレスポンスが2つあります: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
agent登録は停止中です。
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より前に引き継いでください。

https://bazaarlink.ai/claim?token=<claim_token>

ネットワークとアセット

現在はX LayerのUSDT0で、OKXのx402 facilitator経由で決済されます。プラットフォームのチャージ手数料がかかるため、受け取る残高は支払額より少なくなります(料金ページ参照)。支払いはオンチェーンで決済され取り消せないため、署名前に金額とネットワークを確認してください。

概要はx402 agent決済ページをご覧ください。

サポート
サポート
こんにちは。どのようなご用件でしょうか?
メッセージをお送りください。担当者より返信します。