API 参考

Agent 端 API - 单次支付#

Buyer 钱包通过 transferWithAuthorization(EIP-3009)直接转账给 Seller 钱包,单笔即时上链。

  • Base URL:https://web3.okx.com
  • 路径前缀:/api/v6/pay/a2a
  • Intent:charge
  • Method:evm
  • Network:X Layer(chainId: 196

鉴权#

Agent 服务的鉴权按接口区分:

接口鉴权方式
POST /api/v6/pay/a2a/payment/create必须:API Key 鉴权(OK-ACCESS-* Header) OnchainOS 内部调用
GET /api/v6/pay/a2a/p/{paymentId}无需鉴权(公开接口)
POST /api/v6/pay/a2a/p/{paymentId}/credential无需鉴权
GET /api/v6/pay/a2a/p/{paymentId}/status无需鉴权
Buyer 一侧(拉取详情、提交凭证、查询状态)不持有 Seller 的 API Key,因此对应接口公开访问;Smart-Account 内部依靠 paymentId 与 challenge 校验请求合法性。

API Key 鉴权使用以下请求头:

Header必传描述
OK-ACCESS-KEYAPI Key
OK-ACCESS-SIGN请求签名
OK-ACCESS-PASSPHRASEAPI 密码短语
OK-ACCESS-TIMESTAMPISO 8601 时间戳
Content-TypePOST 请求需设为 application/json

所有响应统一使用业务包络:

json
{
  "code": "0",
  "msg": "success",
  "data": { /* 业务字段 */ }
}

业务错误时 code 为非 "0"datanull,错误码集中见文末 错误码 章节。


1. /api/v6/pay/a2a/payment/create#

POST
/api/v6/pay/a2a/payment/create

由 Seller Agent 调用,生成 Charge 付款请求并取回付款分发物。

请求参数#

参数类型必传描述
typeString固定 "charge"
amountString金额(面值十进制字符串,如 "0.1"
symbolString代币 symbol,如 "USD₮0" / "USDC" / "USDG"
recipientStringSeller 收款钱包地址
descriptionString付款描述
externalIdStringSeller 业务侧 ID,用于幂等
expiresInInteger付款有效期(秒),默认 1800
realmString业务域,默认取 Seller 注册时绑定的 realm
deliveriesObject分发物开关
deliveries.includeUrlBoolean默认 true,生成付款 URL。一期仅支持 URL 分发
创建请求使用 symbol + 十进制 amount;服务端在响应中将其转换为标准 MPP challenge(含原子单位 amount 和合约地址 currency),供 Buyer 签名。一期 deliveries 仅支持 URL 类型,二维码 / 卡片等其他形式的分发暂不支持。

请求示例#

bash
curl --location --request POST 'https://web3.okx.com/api/v6/pay/a2a/payment/create' \
--header 'Content-Type: application/json' \
--header 'OK-ACCESS-KEY: 37c541a1-****-****-****-10fe7a038418' \
--header 'OK-ACCESS-SIGN: leaV********3uw=' \
--header 'OK-ACCESS-PASSPHRASE: 1****6' \
--header 'OK-ACCESS-TIMESTAMP: 2023-10-18T12:21:41.274Z' \
--data '{
  "type": "charge",
  "amount": "0.1",
  "symbol": "USD₮0",
  "recipient": "0xSellerWalletAddress",
  "description": "Task #5678 direct payment",
  "externalId": "task-5678",
  "expiresIn": 1800,
  "realm": "provider.example.com",
  "deliveries": {
    "includeUrl": true
  }
}'

响应参数#

参数类型描述
paymentIdString付款 ID,格式 a2a_<base58(uuidv7)>
statusString初始固定 "pending"
createdAtString创建时间,RFC 3339
expiresAtString过期时间,RFC 3339
challengeObjectMPP challenge 结构,详见 Challenge
deliveriesArray<Delivery>分发物列表,详见 Delivery

响应示例#

json
{
  "code": "0",
  "msg": "success",
  "data": {
    "paymentId": "a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB",
    "status": "pending",
    "createdAt": "2026-04-21T10:00:00Z",
    "expiresAt": "2026-04-21T10:30:00Z",
    "challenge": {
      "type": "payment-challenge",
      "data": {
        "id": "a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB",
        "realm": "provider.example.com",
        "method": "evm",
        "intent": "charge",
        "request": {
          "amount": "100000",
          "currency": "0x779ded0c9e1022225f8e0630b35a9b54be713736",
          "recipient": "0xSellerWalletAddress",
          "description": "Task #5678 direct payment",
          "externalId": "task-5678",
          "methodDetails": {
            "chainId": 196,
            "authorizationType": "eip-3009"
          }
        },
        "expires": "2026-04-21T10:30:00Z"
      }
    },
    "deliveries": [
      { "type": "url", "value": "https://pay.okx.com/p/a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB", "description": "通用付款链接" }
    ]
  }
}

2. /api/v6/pay/a2a/p/{paymentId}#

GET
/api/v6/pay/a2a/p/{paymentId}

Buyer Agent 根据 paymentId 拉取完整 challenge。同一 URL 在浏览器中访问时返回 HTML 付款页;带 A2A Pay UA 或 Accept: application/json 时返回此 JSON。

请求参数#

参数位置类型必传描述
paymentIdpathString付款 ID

响应参数#

参数类型描述
paymentIdString付款 ID
statusString当前状态(详见 状态字典
createdAtString创建时间
expiresAtString过期时间
challengeObjectMPP challenge 结构(同 create 接口)

响应示例#

json
{
  "code": "0",
  "msg": "success",
  "data": {
    "paymentId": "a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB",
    "status": "pending",
    "createdAt": "2026-04-21T10:00:00Z",
    "expiresAt": "2026-04-21T10:30:00Z",
    "challenge": { "type": "payment-challenge", "data": { "...同 create 响应..." } }
  }
}

3. /api/v6/pay/a2a/p/{paymentId}/credential#

POST
/api/v6/pay/a2a/p/{paymentId}/credential

Buyer Agent 完成 EIP-3009 签名后提交凭证。Smart-Account 验签通过后代发链上交易。

请求体只包含 payload,不再回传 challenge——服务端按 paymentId 查询自己存储的 challenge 与传入的 payload.authorization 校验一致性。

请求参数#

参数位置类型必传描述
paymentIdpathString付款 ID
payloadbodyObject签名数据
payload.typebodyString固定 "transaction"
payload.signaturebodyStringEIP-712 签名(65 字节,0x 前缀)
payload.authorizationbodyObjectEIP-3009 授权参数,详见 Authorization

请求示例#

bash
curl --location --request POST 'https://web3.okx.com/api/v6/pay/a2a/p/a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB/credential' \
--header 'Content-Type: application/json' \
--data '{
  "payload": {
    "type": "transaction",
    "signature": "0xabcdef...01",
    "authorization": {
      "type": "eip-3009",
      "from": "0xBuyerWalletAddress",
      "to": "0xSellerWalletAddress",
      "value": "100000",
      "validAfter": "0",
      "validBefore": "1714521600",
      "nonce": "0xf374661b1c7d5e7a8b3e2f1a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c"
    }
  }
}'

响应参数#

参数类型描述
paymentIdString付款 ID
statusString通过校验后变为 "settling"
acceptedAtString凭证被接收的时间
trackingUrlString状态追踪页 URL

响应示例#

json
{
  "code": "0",
  "msg": "success",
  "data": {
    "paymentId": "a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB",
    "status": "settling",
    "acceptedAt": "2026-04-21T10:05:00Z",
    "trackingUrl": "https://pay.okx.com/status/a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB"
  }
}

4. /api/v6/pay/a2a/p/{paymentId}/status#

GET
/api/v6/pay/a2a/p/{paymentId}/status

查询支付状态。Buyer 提交 credential 后,Seller / Buyer 通过此接口轮询结算结果。

请求参数#

参数位置类型必传描述
paymentIdpathString付款 ID

响应参数#

参数类型描述
paymentIdString付款 ID
statusString当前状态(详见 状态字典
executedObject仅当 status = completed 时返回
executed.txHashString链上交易哈希
executed.blockNumberInteger区块高度
executed.blockTimestampString区块时间,RFC 3339
feeObject平台费(如有)
fee.amountString平台费金额(原子单位)
fee.bpsInteger费率 basis points(1 bps = 0.01%)
failureObject仅当 status = failed 时返回
failure.reasonString机器可读失败原因
failure.messageString人类可读失败说明

响应示例 — 已结算#

json
{
  "code": "0",
  "msg": "success",
  "data": {
    "paymentId": "a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB",
    "status": "completed",
    "executed": {
      "txHash": "0xabc...123",
      "blockNumber": 12345678,
      "blockTimestamp": "2026-04-21T10:05:15Z"
    },
    "fee": { "amount": "300", "bps": 30 }
  }
}

响应示例 — 处理中#

json
{
  "code": "0",
  "msg": "success",
  "data": {
    "paymentId": "a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB",
    "status": "settling"
  }
}

响应示例 — 失败#

json
{
  "code": "0",
  "msg": "success",
  "data": {
    "paymentId": "a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB",
    "status": "failed",
    "failure": {
      "reason": "transaction_reverted",
      "message": "EIP-3009 transferWithAuthorization reverted on chain"
    }
  }
}

公共数据结构#

Challenge#

参数类型必传描述
typeString固定 "payment-challenge"
dataObject业务字段
data.idString等于 paymentId
data.realmString业务域
data.methodString固定 "evm"
data.intentString固定 "charge"
data.requestObject付款请求字段
data.request.amountString金额(原子单位字符串)
data.request.currencyStringERC-20 合约地址
data.request.recipientStringSeller 收款钱包地址
data.request.descriptionString付款描述
data.request.externalIdStringSeller 业务 ID
data.request.methodDetails.chainIdIntegerEVM chainId(X Layer 为 196
data.request.methodDetails.authorizationTypeStringCharge 固定 "eip-3009"
data.expiresStringchallenge 短期过期时间,RFC 3339

Authorization#

参数类型必传描述
typeString固定 "eip-3009"
fromStringBuyer 钱包地址(付款方身份由此字段经 ECDSA 恢复确定)
toString收款方钱包地址
valueString金额(原子单位)
validAfterString生效时间戳(Unix 秒)
validBeforeString过期时间戳(Unix 秒)
nonceString32 字节随机 nonce(0x 前缀 hex)

额外约束:payload.authorization.to 必须与 challenge 中的 request.recipient 完全一致;payload.authorization.value 必须等于 request.amount。否则签名校验失败。

Delivery#

参数类型必传描述
typeString一期固定 "url"
valueString付款链接,格式 https://pay.okx.com/p/{paymentId}
descriptionString说明

状态字典#

状态说明
pending已生成,等待 Buyer 提交 credential
settling凭证已收,Smart-Account 正在代发链上交易
completed链上已确认,资金已到账
failed验签失败 / 链上 revert / 模拟失败
expired已过期

Payment ID 格式#

paymentId = "a2a_" + base58(uuidv7)
示例     = "a2a_01HZX8Q9RK3JWYV7M2N5T8P4AB"

错误码#

错误响应统一使用包络 {"code": "<code>", "msg": "<message>", "data": null}

1. 认证错误(HTTP 401,仅 payment/create#

错误码描述
50103请求头 OK-ACCESS-KEY 不能为空
50104请求头 OK-ACCESS-PASSPHRASE 不能为空
50105请求头 OK-ACCESS-PASSPHRASE 错误
50106请求头 OK-ACCESS-SIGN 不能为空
50107请求头 OK-ACCESS-TIMESTAMP 不能为空
50111无效的 OK-ACCESS-KEY
50112无效的 OK-ACCESS-TIMESTAMP
50113无效的签名

2. 请求错误#

错误码HTTP 状态描述
50011429用户请求频率过快,超过该接口允许的限额
50014400必填参数 {param} 不能为空

3. 通用业务错误#

错误码HTTP 状态描述
50026500系统错误,请稍后重试
81001200{param} 参数错误
81004200不支持的链
80007200风险地址

4. MPP 业务错误#

错误码错误标识描述
70000invalid_params参数校验失败
70001unsupported_chain不支持的链 / chainId
70002payer_blocked付款方地址被风控拦截
70003invalid_credentialcredential 与服务端存储不一致 / 校验失败
70004invalid_signatureEIP-712 / EIP-3009 签名无效