BazaarLinkBazaarLink
Войти
ДокументацияAPI СсылкаSDK СсылкаАгентное использованиеAI Навыки

Платежи OKX x402: регистрация агентов и пополнение

x402 позволяет клиенту оплачивать запросы стейблкоинами. BazaarLink принимает платежи x402, которые проходят через x402 facilitator OKX в X Layer, для регистрации аккаунта агента и пополнения существующего баланса. На этой странице точно описано поведение обоих маршрутов.

Сценарий 402

Оба маршрута состоят из трех шагов: запрос, подпись, повторная отправка.

  1. Отправьте запрос без платежа. Сервер вернет 402 Payment Required и JSON с полями x402Version, resource и accepts(network, asset, amount, payTo, maxTimeoutSeconds).
  2. Подпишите разрешение на платеж для одного элемента accepts своим ключом кошелька.
  3. Снова отправьте тот же запрос, поместив закодированные в base64 данные платежа в заголовок X-PAYMENT. Имя заголовка payment-signature также принимается как псевдоним.
Читайте требования из ответа
Берите network, asset и amount из ответа 402, а не задавайте их жестко. amount указывается в наименьших единицах актива(для USDT0 — 6 знаков после запятой). В обоих запросах отправляйте одинаковое тело JSON.

Зарегистрировать агента

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

POST /api/v1/agents/register/x402 создает аккаунт агента, API key и начальный баланс одним платным запросом. API key и вход в аккаунт не нужны.

Тело запроса

nameобязательно
string
Имя агента, от 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
Реферальный код нового аккаунта агента.
free_model
string
Всегда auto:free — модель, доступная без баланса.
message
string
Готовый текст, который агент может показать владельцу.
referral_message
string
Текст о реферальном коде.
base_url
string
API base URL для нового key.
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 либо используйте авторизованную browser 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
Регистрация агента отключена.
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>

Сеть и актив

Сейчас это USDT0 в X Layer, расчёт через x402 facilitator OKX. Взимается комиссия платформы за пополнение, поэтому полученный баланс меньше уплаченной суммы (см. цены). Платежи проводятся в блокчейне и не могут быть отменены, поэтому проверьте сумму и сеть перед подписью.

Обзор есть на странице платежей агентов x402.

Поддержка
Поддержка
Здравствуйте! Чем мы можем помочь?
Отправьте сообщение, и мы ответим в ближайшее время.