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 也会作为别名接受。
以响应中的要求为准
请从 402 响应中读取 network、asset 和 amount,不要硬编码。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
真人可用于认领账户的令牌。
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 付款页面。

客服
客服
您好!有什么可以协助?
请留下消息,我们会尽快回复。