TronEnergy

API 文档

为交易所、钱包和支付系统自动化租赁 TRON 能量。

创建 API Key

概述

通过 Open API,交易所、钱包和支付系统可以自动化租赁 TRON 能量:下单、查询订单状态、预估价格,并在订单完成时接收回调通知。

项目值
Base URLhttps://api.tronhub.net
请求方法所有接口均为 POST
请求格式application/json
金额单位sun(1 TRX = 1,000,000 sun)
能量发放方式链上委托到 receive_address

订单费用从账户余额中扣除。请在 API 密钥 页面创建 API Key,API Secret 仅在创建时显示一次。

API 仅用于服务端之间调用,请勿在浏览器或移动端暴露 API Secret。

签名认证

每个请求都必须携带以下三个请求头:

Header说明
API-KEYAPI Key(以 ak_ 开头)
TIMESTAMP当前 Unix 时间戳(秒),与服务器时间相差超过 300 秒的请求会被拒绝
SIGNATURE小写十六进制的 HMAC-SHA256 签名,见下文

签名算法

signature = hex( HMAC-SHA256( key = api_secret, message = TIMESTAMP + "&" + body ) )
  • body 是你实际发送的原始请求体字符串。请先序列化一次 JSON,对这个字符串签名,再原样发送;签名后不要重新序列化。
  • 请求体为空时,对字符串 {} 签名。
  • 直接使用 API Secret 字符串作为 HMAC 密钥(不要做十六进制解码)。
  • 签名结果必须是小写十六进制。

Key 设置

  • 权限:order(创建订单)、query(查询订单)、price(预估价格与市场数据)、balance(账户余额),或 * 表示全部。
  • IP 白名单:可选,多个 IP 用英文逗号分隔,需完全匹配;设置后其他 IP 的请求会被拒绝。
  • 频率限制:可选,每个 Key 每分钟的请求上限(0 表示不限制)。

代码示例

import hashlib, hmac, json, time
import requests

API_KEY = "ak_your_api_key"
API_SECRET = "your_api_secret"
BASE_URL = "https://api.tronhub.net"

def call(path, payload=None):
    body = json.dumps(payload or {}, separators=(",", ":"))
    timestamp = str(int(time.time()))
    signature = hmac.new(API_SECRET.encode(), f"{timestamp}&{body}".encode(), hashlib.sha256).hexdigest()
    headers = {
        "Content-Type": "application/json",
        "API-KEY": API_KEY,
        "TIMESTAMP": timestamp,
        "SIGNATURE": signature,
    }
    # 发送的必须是签名时使用的同一个字符串
    return requests.post(BASE_URL + path, data=body, headers=headers, timeout=15).json()

print(call("/api/open/price", {"period": "1H", "energy_amount": 65000}))
import crypto from "node:crypto"

const API_KEY = "ak_your_api_key"
const API_SECRET = "your_api_secret"
const BASE_URL = "https://api.tronhub.net"

async function call(path, payload = {}) {
  const body = JSON.stringify(payload)
  const timestamp = Math.floor(Date.now() / 1000).toString()
  const signature = crypto.createHmac("sha256", API_SECRET).update(`${timestamp}&${body}`).digest("hex")
  const res = await fetch(BASE_URL + path, {
    method: "POST",
    headers: { "Content-Type": "application/json", "API-KEY": API_KEY, "TIMESTAMP": timestamp, "SIGNATURE": signature },
    body,
  })
  return res.json()
}

console.log(await call("/api/open/balance"))
func call(path string, payload any) (*http.Response, error) {
	body, _ := json.Marshal(payload)
	timestamp := strconv.FormatInt(time.Now().Unix(), 10)
	mac := hmac.New(sha256.New, []byte(apiSecret))
	mac.Write([]byte(timestamp + "&" + string(body)))
	signature := hex.EncodeToString(mac.Sum(nil))

	req, _ := http.NewRequest(http.MethodPost, baseURL+path, bytes.NewReader(body))
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("API-KEY", apiKey)
	req.Header.Set("TIMESTAMP", timestamp)
	req.Header.Set("SIGNATURE", signature)
	return http.DefaultClient.Do(req)
}

响应与错误

所有接口使用统一的响应结构。请根据 code 字段判断结果,而不是 HTTP 状态码:业务错误同样以 HTTP 200 返回。

{
  "code": 200,
  "message": "success",
  "data": {}
}

data 仅在成功时返回;出错时 message 为错误说明。

错误信息默认为中文。如需英文,可在请求头中加上可选的 X-Locale: en:

X-Locale: en

X-Locale 请求头不参与签名。

code含义常见原因
200成功—
400参数错误缺少字段、字段不合法、JSON 格式错误
401认证失败缺少请求头、时间戳过期、Key 无效或已禁用、签名错误
403无权限Key 没有该接口权限,或 IP 不在白名单
429请求过于频繁超过该 Key 的频率限制
500业务错误余额不足、订单不存在、不支持的租赁周期、下单失败

系统还有按 IP 的全局限流,超出时返回 HTTP 429 且 code: 429,请退避后重试。

创建订单

POST /api/open/order/create · 权限 order

从账户余额扣除订单费用,并将能量委托到 receive_address。

参数类型必填说明
energy_amountint是能量数量,需在 市场数据 返回的范围内
periodstring是租赁周期:1H、1D、3D 或 30D(区分大小写)
receive_addressstring是接收能量的 TRON 地址(需已激活)
callback_urlstring否订单完成或失败时的回调地址,须为公网可访问的 http/https 地址,内网、回环等地址会被拒绝,见 回调通知
out_trade_nostring否你方订单号,同一账户内唯一。建议填写,可保证重试安全(见下文)
{
  "energy_amount": 65000,
  "period": "1H",
  "receive_address": "TXk8rQSAvPvBBNtqSoY6nCfsXWCSSpTVQF",
  "callback_url": "https://example.com/tron-energy/callback",
  "out_trade_no": "ORDER-10001"
}

扣费金额与 预估价格 返回的 total_price 一致,低于 small_amount 的订单包含小额手续费。

重试与 out_trade_no:下单请求超时时,请使用同一个 out_trade_no 重试:

  • out_trade_no 相同,且 energy_amount、period、receive_address 也相同:返回已有订单,不会重复扣费。
  • out_trade_no 相同但参数不同:请求被拒绝。
  • 首次请求仍在处理中时重试:请求被拒绝,并提示稍后查询订单。

不传 out_trade_no 时,每次请求都会创建新订单。

响应 data:

字段类型说明
order_nostring系统订单号
energy_amountint能量数量
periodstring租赁周期
receive_addressstring接收地址
amountint扣费金额(sun)
statusint订单状态,正常为 1(处理中),见 订单状态码
out_trade_nostring你方订单号
created_atstring创建时间(RFC 3339)
{
  "code": 200,
  "message": "success",
  "data": {
    "order_no": "E20260928103000a1b2c3d4",
    "energy_amount": 65000,
    "period": "1H",
    "receive_address": "TXk8rQSAvPvBBNtqSoY6nCfsXWCSSpTVQF",
    "amount": 1885000,
    "status": 1,
    "out_trade_no": "ORDER-10001",
    "created_at": "2026-09-28T10:30:00+08:00"
  }
}

如果下单失败,响应为 code: 500,费用会退回账户余额,且不会发送回调。

查询订单

POST /api/open/order/query · 权限 query

传 order_no 或 out_trade_no 之一;两者都传时以 order_no 为准。

参数类型必填说明
order_nostring二选一系统订单号
out_trade_nostring二选一你方订单号

响应 data:

字段类型说明
order_nostring系统订单号
energy_amountint能量数量
periodstring租赁周期
receive_addressstring接收地址
statusint订单状态
amountint扣费金额(sun)
refund_amountint退款金额(sun)
out_trade_nostring你方订单号
api_namestring本次请求所用 API Key 的名称
detailsarray | null委托记录,按时间倒序;暂无记录时为 null
created_atstring创建时间(RFC 3339)
updated_atstring更新时间(RFC 3339)

details 中每一项:

字段类型说明
txidstring委托交易哈希(委托完成前为空)
energy_amountint能量数量
amountint费用(sun)
statusint0 等待结果、1 成功、2 失败、3 已退款
created_atstring提交时间(RFC 3339)

预估价格

POST /api/open/price · 权限 price

参数类型必填说明
periodstring是1H、1D、3D 或 30D
energy_amountint是能量数量

响应 data:

字段类型说明
periodstring租赁周期
energy_amountint能量数量
priceint单价:1H 为 sun / 能量,按天的周期为 sun / 能量 / 天
daysint计费天数:1H 为 1,其余为天数
total_priceintprice × energy_amount × days 加小额手续费(sun),即下单时的实际扣费金额
additionint小额手续费(sun);energy_amount 不低于 small_amount 时为 0

市场数据

POST /api/open/market · 权限 price · 无需请求参数

响应 data:

字段类型说明
tiered_pricingarray[{ "period": "1H", "price": 29 }, ...]。1H 单位为 sun / 能量;1D/3D/30D 为 sun / 能量 / 天(3 天的订单总价 = price × 能量 × 3)
minimum_order_energyint单笔最小能量
maximum_order_energyint单笔最大能量
small_amountint低于该能量的订单收取小额手续费
small_additionnumber小额手续费(TRX)
usdt_energy_need_oldint向已持有 USDT 的地址转一笔 USDT 所需能量
usdt_energy_need_newint向从未持有 USDT 的地址转一笔 USDT 所需能量
burn_rateint不使用能量、直接燃烧 TRX 的成本(sun / 能量)

账户余额

POST /api/open/balance · 权限 balance · 无需请求参数

{ "code": 200, "message": "success", "data": { "balance": 150000000 } }

balance 单位为 sun(150,000,000 sun = 150 TRX)。

回调通知

订单进入最终状态(已完成 2 或失败 3)时,系统会向订单的 callback_url 发送 POST 请求,请求体为 JSON:

{
  "order_no": "E20260928103000a1b2c3d4",
  "out_trade_no": "ORDER-10001",
  "energy_amount": 65000,
  "period": "1H",
  "receive_address": "TXk8rQSAvPvBBNtqSoY6nCfsXWCSSpTVQF",
  "status": 2,
  "amount": 1885000,
  "refund_amount": 0
}

回调验签

回调携带 API-KEY、TIMESTAMP、SIGNATURE 请求头,签名方式与请求签名相同。请在解析 JSON 之前,使用原始请求体验签:

expected = hmac.new(API_SECRET.encode(), f"{timestamp}&{raw_body}".encode(), hashlib.sha256).hexdigest()
valid = hmac.compare_digest(expected, signature)

回调使用下单时所用 Key 的 Secret 签名;如果该 Key 已被禁用,则使用你最近创建的已启用 Key。如果没有任何已启用的 Key,回调不带签名请求头,请视为未验证,并通过 查询订单 确认。

投递规则

  • 请返回 HTTP 200 表示接收成功,其他状态码(包括 201、204)均视为失败。
  • 每次请求超时时间为 10 秒,最多共尝试 3 次,每次间隔几秒。
  • 回调可能重复送达,也可能最终未送达。请保证处理逻辑幂等,并通过 查询订单 核对未确认的订单。

订单状态码

status含义
0待处理:已创建,尚未提交
1处理中:已提交,等待委托
2已完成:能量已委托
3失败:费用已退回账户余额(见 refund_amount)
4已退款(预留)