注册入驻 — 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),必填。
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
address | string | 是 | Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。 |
purpose | enum: signup, login, recovery | 签名的用途;会展示在待签名的消息内容中。 |
来自规范的请求体示例(示意数值):
{"address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE","purpose":"signup"}
响应
| 状态码 | 含义 |
|---|---|
201 | 挑战码已签发。 |
400 | 格式错误的请求 —— 无效 JSON、未知字段或字段类型错误。 |
429 | 请求过于频繁。 |
500 | 服务端内部错误。 |
响应字段 (AccountChallenge)
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
nonce | string | 是 | 一次性随机数 |
address | string | 是 | Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。 |
purpose | enum: signup, login, recovery | ||
message | string | 是 | 供签名的完整原始文本,符合 TIP-191 个人签名规范。绑定域名且清晰易读。请对该字符串的原文字节进行签名 —— 切勿添加额外换行、修剪空格或二次编码。 |
issued_at | string (date-time) | 是 | |
expires_at | string (date-time) | 是 | 签发后 10 分钟过期。过期的随机数会返回 1010 challenge_invalid。 |
来自规范的 201 响应示例(示意数值):
{
"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),必填。
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
address | string | 是 | Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。 |
nonce | string | 是 | |
signature | string | 是 | 对 message 的十六进制签名。必须能恢复出 address;0x 前缀可选。 |
来自规范的请求体示例(示意数值):
{
"address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"nonce": "9f2a7c1e4b6d8a0f3e5c7b9d1f3a5c7e",
"signature": "1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b"
}
响应
| 状态码 | 含义 |
|---|---|
200 | 签名有效。 |
400 | 格式错误的请求 —— 无效 JSON、未知字段或字段类型错误。 |
401 | 1010 challenge_invalid —— 未知、过期或已被使用的随机数,或签名无法推导出该地址。请重新获取挑战。 |
429 | 请求过于频繁。 |
500 | 服务端内部错误。 |
响应字段 (BootstrapToken)
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
bootstrap_token | string | 是 | 在头部以 Authorization: Bearer abt_… 传递。有效时间 15 分钟,允许执行 4 个基础初始化接口,无直接下单扣费权限。请仅在注册流程期间使用。 |
expires_at | string (date-time) | 是 | |
account_id | string | null | 该地址已拥有的账户 ID;首次注册时为 null。 | |
account_status | enum: unfunded, active, suspended, closed | null |
来自规范的 200 响应示例(示意数值):
{
"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),必填。
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
address | string | 是 | Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。 |
nonce | string | ||
signature | string | ||
email | string (email) | null | 可选的恢复与账单联系邮箱。此处不验证亦非必填。 | |
label | string | null |
来自规范的请求体示例(示意数值):
{"address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"}
响应
| 状态码 | 含义 |
|---|---|
200 | 该地址已拥有账户;返回已有账户。 |
201 | 账户创建成功,状态为 unfunded。 |
400 | 格式错误的请求 —— 无效 JSON、未知字段或字段类型错误。 |
401 | 1010 challenge_invalid 或 1011 bootstrap_token_expired。 |
422 | 语法合法但逻辑上无法满足操作要求。 |
429 | 请求过于频繁。 |
500 | 服务端内部错误。 |
响应字段 (AccountCreated)
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
account_id | string | 是 | |
brand | string | 是 | |
network | enum: mainnet, nile | 是 | |
status | enum: unfunded, active, suspended, closed | 是 | |
owner_address | string | 是 | 拥有该账户并可恢复控制权的签名者地址。 |
deposit_addresses | array of object (DepositAddress) | 是 | |
deposit_addresses[].currency | enum: TRX, USDT | 是 | |
deposit_addresses[].address | string | 是 | Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。 |
deposit_addresses[].memo | string | null | 自 2026-09-26 起始终为 null:每个账户分配独立充值地址,无需附带 memo,即使附带也会被忽略。保留此字段以保持客户端向下兼容。 | |
deposit_addresses[].confirmations_required | integer | 充值确认所需的区块数。 | |
deposit_addresses[].contract | string | null | 该地址接收的 TRC-20 合约(仅在 USDT 行有效;TRX 为 null)。 | |
deposit_addresses[].rate_now | null | object | 仅适用于 USDT 行。扣除点差前的 SunSwap(或预设固定)TRX 与 USDT 汇率,缓存 60 秒。若暂时不可用则为 null;充值依然会被接收,并在到账时由工作节点进行实时计价。 | |
deposit_addresses[].rate_now.trx_per_usdt | string | 是 | |
deposit_addresses[].rate_now.source | enum: sunswap_v3, fixed_env | 是 | |
deposit_addresses[].rate_now.at | string (date-time) | 是 | |
deposit_addresses[].spread_bps | integer | null | 仅适用于 USDT 行:扣除的基点比例(5 = 0.05%)。 | |
deposit_addresses[].min | string | null | 仅适用于 USDT 行:单笔最低充值门槛;低于此值的充值将被暂扣(held_below_min)。 | |
deposit_addresses[].max | string | null | 仅适用于 USDT 行:单笔自动入账上限;高于此值的充值将进入人工审核(held_for_review)。 | |
next | object | 面向 Agent 和脚本的机器可读下一步操作指引。 | |
next.action | string | ||
next.address | string | Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。 | |
next.reason | string | ||
created_at | string (date-time) | 是 |
在首个 API 密钥创建前读取充值地址
GET /v1/accounts/deposit-address · getSignupDepositAddress
鉴权: 引导令牌 (Bootstrap token)。
充值目标地址,向其充值后账户将激活变为 active 状态并可发行密钥。支持使用引导令牌直接读取,从而允许新注册账户的 Agent 汇报充值地址及最低充值额度给用户,而无需提前持有长期敏感凭据。
创建 API 密钥后,建议调用返回相同地址信息的 GET /v1/deposit-addresses。
请求参数
| 参数名 | 位置 | 类型 | 必选 | 说明 |
|---|---|---|---|---|
currency | query | enum: TRX, USDT |
响应
| 状态码 | 含义 |
|---|---|
200 | OK |
401 | 缺少、格式错误或已被拒绝的凭据。 |
429 | 请求过于频繁。 |
500 | 服务端内部错误。 |
响应字段
| 字段 | 类型 | 必选 | 说明 |
|---|---|---|---|
account_id | string | 是 | |
status | enum: unfunded, active, suspended, closed | 是 | |
data | array of object (DepositAddress) | 是 | |
data[].currency | enum: TRX, USDT | 是 | |
data[].address | string | 是 | Base58Check 编码的 TRON 地址(以 T 开头,34 个字符)。 |
data[].memo | string | null | 自 2026-09-26 起恒为 null:单账户独立地址,无需 memo。保留此字段用于兼容老版本 SDK。 | |
data[].confirmations_required | integer | 充值确认所需的区块数。 | |
data[].contract | string | null | 接收的 TRC-20 合约(仅适用于 USDT)。 | |
data[].rate_now | null | object | 仅适用于 USDT。扣除点差前的当前汇率,缓存 60 秒。不可用时为 null;充值依然受理并于到账时计价。 | |
data[].rate_now.trx_per_usdt | string | 是 | |
data[].rate_now.source | enum: sunswap_v3, fixed_env | 是 | |
data[].rate_now.at | string (date-time) | 是 | |
data[].spread_bps | integer | null | 仅适用于 USDT:点差基点(5 = 0.05%)。 | |
data[].min | string | null | 仅适用于 USDT:最低有效充值金额。低于此值将被暂扣。 | |
data[].max | string | null | 仅适用于 USDT:单笔自动充值上限。高于此值需人工审核。 | |
min_deposit_sun | integer (int64) | 低于此金额的转账将被视为未认领的小额尾差予以暂扣。由平台参数决定。 |
来自规范的 200 响应示例(示意数值):
{
"account_id": "acc_01J9Z4K2M7Q8",
"status": "unfunded",
"data": [
{
"currency": "TRX",
"address": "TDepositAddressExample1111111111111",
"memo": null,
"confirmations_required": 19
}
],
"min_deposit_sun": 1000000
}