BazaarLinkBazaarLink
登入
文件API 參考SDK 參考Agent 應用AI Skills

用 OKX x402 付款:註冊 agent 與儲值

x402 讓客戶端用穩定幣為單一請求付款。BazaarLink 接受 x402 付款(經 OKX 的 x402 facilitator 在 X Layer 結算)來註冊 agent 帳號,也能替既有帳號儲值。這一頁照兩個路由實際的行為來寫。

402 流程

兩個路由都是同樣三步:詢價、簽名、重送。

  1. 先不帶付款送出請求。伺服器回 402 Payment Required,JSON 內容有 x402Version、resource 和 accepts(network、asset、amount、payTo、maxTimeoutSeconds)。
  2. 用你自己的錢包私鑰,替 accepts 裡的其中一項簽付款授權。
  3. 把同一個請求再送一次,並在 X-PAYMENT 標頭放入 base64 編碼的付款內容。標頭名稱 payment-signature 也可以。
付款條件以回應為準
network、asset 和 amount 請直接取自 402 回應,不要寫死。amount 是資產的最小單位(USDT0 有 6 位小數)。兩次請求要送同樣的 JSON 內容。

註冊 agent

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

POST /api/v1/agents/register/x402 用一個付費請求建立 agent 帳號、API key 和初始餘額。不需要 API key,也不需要登入。

請求內容

name必填
string
agent 名稱,1 到 100 個字元。
description
string
選填的說明,最多 4000 個字元。
amountUsd必填
number
要付的金額,單位美元,必須是正數。建立 402 之前會先限制在允許範圍內(目前是 $1 到 $50),所以實際金額請看回應。

多餘的欄位會被拒絕,回 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
真人用來認領帳號的 token。
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" }

重複付款與重送

同一份簽好的授權只能用一次。伺服器在連到付款網路之前就會認出重複的付款,所以重試不會讓你付兩次。

儲值:重送已經入帳的付款,會回 200,status 是 already_credited。

註冊:15 分鐘內,同一筆簽好的付款會回一樣的 201 回應(包含 API key),所以連線失敗時可以放心重試。超過之後會回 200,status 是 already_registered,並附上付款的 txHash,不會再顯示 API key。

錯誤回應

x402 路由的錯誤格式是 { "error": { "message", "code" } }。有兩種例外:410 是 { "error", "code" },429 是 { "error" } 並附 Retry-After 標頭。

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 付款頁。

客服
客服
您好!有什麼可以協助?
請留下訊息,我們會盡快回覆。