文档目录

注册入驻 — API 参考

在尚未拥有任何凭据时创建账户:地址挑战、签名校验、创建账户,以及在生成首个 API 密钥前获取专属充值地址。

方法路径概览
POST/v1/accounts/challenge为 TRON 地址签发签名挑战码
POST/v1/accounts/challenge/verify校验已签名的挑战码并获取引导令牌 (Bootstrap token)
POST/v1/accounts创建新账户
GET/v1/accounts/deposit-address在首个 API 密钥创建前读取充值地址

基于 openapi.yaml 在构建时生成。基准 URL 为 https://api.tenergy.me/v1,Nile 测试网环境为 https://api-nile.tenergy.me/v1(详见环境说明)。下述每个请求均遵循身份鉴权规范进行签名,除非鉴权行另有说明。

为 TRON 地址签发签名挑战码

POST /v1/accounts/challenge · createAccountChallenge

鉴权: 公开 —— 无需凭据。

这是基于地址挑战签名的注册与找回模型(平台唯一的注册认证模型)的步骤 1:通过脱机在用户本地使用 TRON 地址对一段随机数(nonce)进行签名来证明账户所有权。我方服务器永不接触私钥,且完全免疫网络钓鱼 —— 签名仅用于证明对该链上地址的控制权。

返回的 message 具有良好的人类可读性并绑定了域名上下文(包含品牌标识、操作意图、随机数 nonce 及过期时间),以便用户在钱包中确认签名时清楚知晓授权内容。请在钱包中以标准的 TIP-191 格式(个人签名规范)进行签名;签名必须能推导还原出原 address。

匿名调用,按 IP 及目标地址进行限流。对已有账户的地址调用和对全新地址调用在行为上完全无差别 —— 此端点刻意不暴露任何“账户是否存在”的侧信道探测信息。

请求体

JSON (AccountChallengeRequest),必填。

字段类型必选说明
addressstring是Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。
purposeenum: signup, login, recovery签名的用途;会展示在待签名的消息内容中。

来自规范的请求体示例(示意数值):

json
{"address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE","purpose":"signup"}

响应

状态码含义
201挑战码已签发。
400格式错误的请求 —— 无效 JSON、未知字段或字段类型错误。
429请求过于频繁。
500服务端内部错误。

响应字段 (AccountChallenge)

字段类型必选说明
noncestring是一次性随机数
addressstring是Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。
purposeenum: signup, login, recovery
messagestring是供签名的完整原始文本,符合 TIP-191 个人签名规范。绑定域名且清晰易读。请对该字符串的原文字节进行签名 —— 切勿添加额外换行、修剪空格或二次编码。
issued_atstring (date-time)是
expires_atstring (date-time)是签发后 10 分钟过期。过期的随机数会返回 1010 challenge_invalid。

来自规范的 201 响应示例(示意数值):

json
{
  "nonce": "9f2a7c1e4b6d8a0f3e5c7b9d1f3a5c7e",
  "address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
  "purpose": "signup",
  "message": "tenergy.me wants you to prove control of this address.\nPurpose: signup\nAddress: TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE\nNonce: 9f2a7c1e4b6d8a0f3e5c7b9d1f3a5c7e\nExpires: 2026-09-11T18:14:05.123Z\nSigning this creates no transaction and moves no funds.\n",
  "issued_at": "2026-09-11T18:04:05.123Z",
  "expires_at": "2026-09-11T18:14:05.123Z"
}

校验已签名的挑战码并获取引导令牌

POST /v1/accounts/challenge/verify · verifyAccountChallenge

鉴权: 公开 —— 无需凭据。

步骤 2。验证 signature 是否由对应 address 针对 message 签名生成,并下发一个短时有效的引导令牌 (Bootstrap token) —— 作为从“无账户”跨越到“拥有首个 API 密钥”期间的过渡授权凭据。

引导令牌在请求头中以 Authorization: Bearer abt_… 传递,严格限定仅能执行四个操作:POST /v1/accounts、GET /v1/accounts/deposit-address、GET /v1/account 和 POST /v1/api-keys。有效期 15 分钟,单账户绑定,绝不可替代长期使用的 API 密钥。

若该地址已在该品牌下创建过账户,则仅向该调用方返回 account_id 与 account_status。

随机数 nonce 为单次使用。被重用、过期或签名错误的 nonce 均统一返回错误码 1010 challenge_invalid,防止泄露地址存在性信息。

请求体

JSON (AccountChallengeVerifyRequest),必填。

字段类型必选说明
addressstring是Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。
noncestring是
signaturestring是对 message 的十六进制签名。必须能恢复出 address;0x 前缀可选。

来自规范的请求体示例(示意数值):

json
{
  "address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
  "nonce": "9f2a7c1e4b6d8a0f3e5c7b9d1f3a5c7e",
  "signature": "1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b"
}

响应

状态码含义
200签名有效。
400格式错误的请求 —— 无效 JSON、未知字段或字段类型错误。
4011010 challenge_invalid —— 未知、过期或已被使用的随机数,或签名无法推导出该地址。请重新获取挑战。
429请求过于频繁。
500服务端内部错误。

响应字段 (BootstrapToken)

字段类型必选说明
bootstrap_tokenstring是在头部以 Authorization: Bearer abt_… 传递。有效时间 15 分钟,允许执行 4 个基础初始化接口,无直接下单扣费权限。请仅在注册流程期间使用。
expires_atstring (date-time)是
account_idstring | null该地址已拥有的账户 ID;首次注册时为 null。
account_statusenum: unfunded, active, suspended, closed | null

来自规范的 200 响应示例(示意数值):

json
{
  "bootstrap_token": "abt_3f8c2d1e9b7a4c6e8f0a2b4d6e8f0a2b",
  "expires_at": "2026-09-11T18:19:05.123Z",
  "account_id": "acc_01J9Z4K2M7Q8",
  "account_status": "active"
}

创建新账户

POST /v1/accounts · createAccount

鉴权: 引导令牌 (Bootstrap token) 或公开请求。

步骤 3。创建归属于签名地址的账户,并返回账户基础信息及专属充值地址。新创建的账户初始状态为 status: "unfunded":账户已创建,支持信息查询,可以接收充值并能签发 API 密钥;在充值到账确认前无法下单消耗资金。

认证方式二选一:可使用 POST /v1/accounts/challenge/verify 返回的引导令牌认证,亦可在请求体中同时附带 nonce 与 signature 一键完成创建。两者证明能力等同。

按地址幂等。 若该地址在该品牌平台已拥有账户,则直接返回已有账户信息与 HTTP 200 状态码,不会重复创建。

email 为选填项且在此处不进行校验 —— 仅作为后续恢复与账单接收渠道,可在控制台中绑定。邮箱魔法链接和 Telegram 登录是人类用户登录同一账户的补充凭据,而非另一套独立的注册体系。

API 密钥无需等待充值到账即可创建(自 2026-09-26 起)。资金消耗由余额控制而非阻断凭据:在账本未入账确认前,POST /v1/orders 将返回 4001 insufficient_funds。

请求体

JSON (AccountCreateRequest),必填。

字段类型必选说明
addressstring是Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。
noncestring
signaturestring
emailstring (email) | null可选的恢复与账单联系邮箱。此处不验证亦非必填。
labelstring | null

来自规范的请求体示例(示意数值):

json
{"address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"}

响应

状态码含义
200该地址已拥有账户;返回已有账户。
201账户创建成功,状态为 unfunded。
400格式错误的请求 —— 无效 JSON、未知字段或字段类型错误。
4011010 challenge_invalid 或 1011 bootstrap_token_expired。
422语法合法但逻辑上无法满足操作要求。
429请求过于频繁。
500服务端内部错误。

响应字段 (AccountCreated)

字段类型必选说明
account_idstring是
brandstring是
networkenum: mainnet, nile是
statusenum: unfunded, active, suspended, closed是
owner_addressstring是拥有该账户并可恢复控制权的签名者地址。
deposit_addressesarray of object (DepositAddress)是
deposit_addresses[].currencyenum: TRX, USDT是
deposit_addresses[].addressstring是Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。
deposit_addresses[].memostring | null自 2026-09-26 起始终为 null:每个账户分配独立充值地址,无需附带 memo,即使附带也会被忽略。保留此字段以保持客户端向下兼容。
deposit_addresses[].confirmations_requiredinteger充值确认所需的区块数。
deposit_addresses[].contractstring | null该地址接收的 TRC-20 合约(仅在 USDT 行有效;TRX 为 null)。
deposit_addresses[].rate_nownull | object仅适用于 USDT 行。扣除点差前的 SunSwap(或预设固定)TRX 与 USDT 汇率,缓存 60 秒。若暂时不可用则为 null;充值依然会被接收,并在到账时由工作节点进行实时计价。
deposit_addresses[].rate_now.trx_per_usdtstring是
deposit_addresses[].rate_now.sourceenum: sunswap_v3, fixed_env是
deposit_addresses[].rate_now.atstring (date-time)是
deposit_addresses[].spread_bpsinteger | null仅适用于 USDT 行:扣除的基点比例(5 = 0.05%)。
deposit_addresses[].minstring | null仅适用于 USDT 行:单笔最低充值门槛;低于此值的充值将被暂扣(held_below_min)。
deposit_addresses[].maxstring | null仅适用于 USDT 行:单笔自动入账上限;高于此值的充值将进入人工审核(held_for_review)。
nextobject面向 Agent 和脚本的机器可读下一步操作指引。
next.actionstring
next.addressstringBase58Check 编码的 TRON 地址(以 T 开头,34 个字符)。
next.reasonstring
created_atstring (date-time)是

在首个 API 密钥创建前读取充值地址

GET /v1/accounts/deposit-address · getSignupDepositAddress

鉴权: 引导令牌 (Bootstrap token)。

充值目标地址,向其充值后账户将激活变为 active 状态并可发行密钥。支持使用引导令牌直接读取,从而允许新注册账户的 Agent 汇报充值地址及最低充值额度给用户,而无需提前持有长期敏感凭据。

创建 API 密钥后,建议调用返回相同地址信息的 GET /v1/deposit-addresses。

请求参数

参数名位置类型必选说明
currencyqueryenum: TRX, USDT

响应

状态码含义
200OK
401缺少、格式错误或已被拒绝的凭据。
429请求过于频繁。
500服务端内部错误。

响应字段

字段类型必选说明
account_idstring是
statusenum: unfunded, active, suspended, closed是
dataarray of object (DepositAddress)是
data[].currencyenum: TRX, USDT是
data[].addressstring是Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。
data[].memostring | null自 2026-09-26 起恒为 null:单账户独立地址,无需 memo。保留此字段用于兼容老版本 SDK。
data[].confirmations_requiredinteger充值确认所需的区块数。
data[].contractstring | null接收的 TRC-20 合约(仅适用于 USDT)。
data[].rate_nownull | object仅适用于 USDT。扣除点差前的当前汇率,缓存 60 秒。不可用时为 null;充值依然受理并于到账时计价。
data[].rate_now.trx_per_usdtstring是
data[].rate_now.sourceenum: sunswap_v3, fixed_env是
data[].rate_now.atstring (date-time)是
data[].spread_bpsinteger | null仅适用于 USDT:点差基点(5 = 0.05%)。
data[].minstring | null仅适用于 USDT:最低有效充值金额。低于此值将被暂扣。
data[].maxstring | null仅适用于 USDT:单笔自动充值上限。高于此值需人工审核。
min_deposit_suninteger (int64)低于此金额的转账将被视为未认领的小额尾差予以暂扣。由平台参数决定。

来自规范的 200 响应示例(示意数值):

json
{
  "account_id": "acc_01J9Z4K2M7Q8",
  "status": "unfunded",
  "data": [
    {
      "currency": "TRX",
      "address": "TDepositAddressExample1111111111111",
      "memo": null,
      "confirmations_required": 19
    }
  ],
  "min_deposit_sun": 1000000
}

    ↑ ↓ 切换 · Enter 打开 · Esc 关闭