Full REST API documentation for TronEnergy Energy delegation. Endpoints, parameters, response formats, and error codes.
Base URL:https://api.tronnrg.comAuth: None required. All endpoints are public.
Rate limit: 20 requests/second per IP
Payment address:TFqUiCu1JwLHHnBNeaaVKH7Csm4aA3YhZx (API only, not for manual rentals)
How It Works
Three steps. No API key, no sign-up, no wallet connection. Ownership is proved cryptographically.
Sign — Sign the message {tx_hash}:{delegate_to} using the wallet that sent the TRX. This proves you authorised the delegation.
Claim — POST /delegate with tx_hash, delegate_to, and signature. Energy arrives in ~3 seconds.
Payment Address
TFqUiCu1JwLHHnBNeaaVKH7Csm4aA3YhZx
API payment address only. This address is for programmatic integrations via the API. Do not use this for manual energy rentals. The manual rental address is different and available on .tronnrg.com.
Send TRX to this address. The transaction hash of your payment is your token to trigger the delegation. Each hash can only be used once.
TRX Sent
Energy Delegated
Use Case
4 TRX
65,000
Standard USDT transfer to an existing wallet (minimum order)
8 TRX
130,000
USDT transfer to a first-time recipient
16 TRX
260,000
Four standard transfers in one order
40 TRX
650,000
Ten standard transfers
100 TRX
1,625,000
~25 standard transfers — common for small platforms
1,000 TRX
16,250,000
Maximum order, ~250 standard transfers
Any amount in between
trx × 16,250
Fully linear. No tiers, no packages, no discounts.
Formula:energy = trxSent × 16,250. Bounds: min 4 TRX (65,000 energy), max 1,000 TRX (16,250,000 energy). Both are enforced at the API level — amounts below the minimum are rejected with below_minimum and refunded; amounts above the maximum are rejected before delegation. Always read the live values from GET /supply before hardcoding them in production — see below.
GET /supply
GET/supply
Get pricing info and the payment address. This is an informational endpoint — energy is always available, you do not need to check before sending payment.
curl https://api.tronnrg.com/supply
const supply = awaitfetch('https://api.tronnrg.com/supply')
.then(r => r.json());
// Energy is always available. Use supply.pay_to for the payment address.
console.log('Pay to:', supply.pay_to);
import requests
supply = requests.get('https://api.tronnrg.com/supply').json()
# Energy is always available. Use supply['pay_to'] for the payment address.print(supply['pay_to'])
$supply = json_decode(
file_get_contents('https://api.tronnrg.com/supply'),
true
);
// if less than you require, wait and retry// Energy is always available. Use $supply['pay_to'] for the payment address.echo$supply['pay_to'];
var client = newHttpClient();
var json = await client.GetStringAsync("https://api.tronnrg.com/supply");
var supply = JsonSerializer.Deserialize<JsonElement>(json);
// Energy is always available. Use pay_to for the payment address.var payTo = supply.GetProperty("pay_to").GetString();
Claim an energy delegation. You must have already sent TRX to the payment address on-chain. Pass the transaction hash, the recipient address, and a signature proving you are the sender.
Parameter
Type
Description
tx_hash
string
required
64-character hex hash of the TRX payment
delegate_to
string
required
Tron address to receive the energy
signature
string
required
Sign {tx_hash}:{delegate_to} using tronWeb.trx.signMessageV2(). Proves you are the payment sender.
TronNRG reference ID. Log this for support queries.
energy
number
Total energy delegated
cost
number
TRX charged
status
string
"delegated" on success
delegations
array
On-chain delegation transaction hashes. Each tx is verifiable on TronScan. This is your receipt.
GET /health
GET/health
Liveness check for monitoring and uptime tools. Returns 200 OK when the API process is up. Does not check upstream nodes or providers.
Response 200
{ "status": "ok" }
Error Codes
Every error response has error (stable, machine-readable) and message (human-readable). Always switch on error.
Code
HTTP
Meaning
invalid_tx_hash
400
Not a 64-character hex string
invalid_address
400
Not a valid Tron address
missing_signature
400
No signature provided
invalid_signature
401
Signature could not be verified
signature_mismatch
403
Signer address does not match payment sender
hash_already_used
409
Transaction hash already claimed
payment_verification_failed
404 / 400
On-chain verification of the payment failed. Read the message field for the specific cause: tx not found yet (404, retry in a few seconds), wrong recipient, not a TRX transfer, or below the 4 TRX minimum.
delegation_failed
400 / 500
Provider could not deliver energy. If the failure happened after the payment was verified, an automatic refund is queued. The error response includes a refund object when this happens.
rate_limited
429
Too many requests per second from this IP. Limit is 20/sec.
server_error
500
Unexpected internal error. Retry in a few seconds.
const result = awaitfetch('https://api.tronnrg.com/delegate', { ... })
.then(r => r.json());
if (result.error) {
switch (result.error) {
case'payment_verification_failed':
// Most common cause: tx not yet indexed. Wait 3s and retry.// Read result.message for the specific cause.break;
case'hash_already_used':
// Already claimed. Don't retry.break;
case'signature_mismatch':
// Signer != payment sender. Sign with the same key that sent TRX.break;
case'delegation_failed':
// Refund queued automatically if payment was verified.if (result.refund) console.log('Refund queued:', result.refund);
break;
}
}
result = requests.post('https://api.tronnrg.com/delegate', json=data).json()
if'error'in result:
if result['error'] == 'payment_verification_failed':
# Most common cause: tx not yet indexed. Wait 3s and retry.passelif result['error'] == 'hash_already_used':
# Already claimed. Don't retry.passelif result['error'] == 'signature_mismatch':
# Signer != payment sender. Sign with the same key.passelif result['error'] == 'delegation_failed':
# Refund queued automatically if payment was verified.pass
if (isset($result['error'])) {
switch ($result['error']) {
case'payment_verification_failed':
// Most common cause: tx not yet indexed. Wait 3s and retry.break;
case'hash_already_used':
// Already claimed. Don't retry.break;
case'signature_mismatch':
// Signer != payment sender. Sign with the same key.break;
case'delegation_failed':
// Refund queued automatically if payment was verified.break;
}
}
Refunds
If delegation fails after your payment is verified, a TRX refund is automatically queued and sent back to the sender address on-chain. Look for the refund object in the error response.
Error with refund
{
"error": "delegation_failed",
"message": "Energy delegation failed. Your payment will be refunded.",
"ref": "nrg_d_43",
"refund": {
"type": "queued",
"to": "TSenderAddress",
"amount": 4
}
}
Complete Example
Full end-to-end flow: send TRX, sign, claim with retry. Copy and run.
const API = 'https://api.tronnrg.com';
const ADDR = 'TFqUiCu1JwLHHnBNeaaVKH7Csm4aA3YhZx';
async functionrentEnergy(delegateTo, trxAmount = 4) {
// 1. Send TRX to the payment addressconst payment = await tronWeb.trx.sendTransaction(ADDR, trxAmount * 1e6);
// 2. Sign: proves you are the senderconst message = `${payment.txid}:${delegateTo}`;
const signature = await tronWeb.trx.signMessageV2(message);
// 3. Claim delegation (retry if tx not indexed yet)let result;
for (let i = 0; i < 3; i++) {
result = awaitfetch(`${API}/delegate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
tx_hash: payment.txid,
delegate_to: delegateTo,
signature,
}),
}).then(r => r.json());
if (!result.error) break;
if (result.error !== 'payment_verification_failed') throw newError(result.message);
await newPromise(r => setTimeout(r, 3000));
}
if (result.error) throw newError(result.message);
return result;
}
// Usage — send any amount between 4 and 1,000 TRXconst result = awaitrentEnergy('TWalletThatNeedsEnergy', 4); // 4 TRX → 65k energy// rentEnergy(addr, 8) // → 130,000 energy (new-wallet transfer)// rentEnergy(addr, 40) // → 650,000 energy (10 transfers)// rentEnergy(addr, 1000) // → 16,250,000 energy (max)
console.log(result.energy); // trxAmount × 16,250
console.log(result.delegations[0].tx); // on-chain tx hash
console.log(result.ref); // "nrg_d_42"
import requests
import time
API = 'https://api.tronnrg.com'
ADDR = 'TFqUiCu1JwLHHnBNeaaVKH7Csm4aA3YhZx'defrent_energy(delegate_to, trx_amount=4):
# 1. Send TRX to ADDR (via your Tron library)
tx_hash = send_trx(ADDR, trx_amount) # your TRX send function# 2. Sign: proves you are the sender
message = f'{tx_hash}:{delegate_to}'
signature = tron.trx.sign_message_v2(message)
# 3. Claim delegation (retry if tx not indexed yet)for attempt inrange(3):
result = requests.post(f'{API}/delegate', json={
'tx_hash': tx_hash,
'delegate_to': delegate_to,
'signature': signature,
}).json()
if'error'not in result:
return result
if result['error'] != 'payment_verification_failed':
raiseException(result['message'])
time.sleep(3)
raiseException('Transaction not found after retries')
# Usage
result = rent_energy('TWalletThatNeedsEnergy', 4)
print(f"Delegated: {result['energy']} energy")
print(f"Delegation tx: {result['delegations'][0]['tx']}")
print(f"Ref: {result['ref']}")
# 1. Send TRX to TFqUiCu1JwLHHnBNeaaVKH7Csm4aA3YhZx# Pricing is linear at 16,250 energy per TRX.# Min 4 TRX (65,000 energy), max 1,000 TRX (16.25M energy).# (use your wallet or tronweb CLI)# 2. Sign the message {tx_hash}:{delegate_to} (proves you are the sender)# (use tronWeb.trx.signMessageV2 in your code)# 3. Claim delegation with tx hash + signature
curl -X POST https://api.tronnrg.com/delegate \
-H "Content-Type: application/json" \
-d '{
"tx_hash": "YOUR_PAYMENT_TX_HASH",
"delegate_to": "TWalletThatNeedsEnergy",
"signature": "YOUR_SIGNATURE"
}'# Response includes delegations[].tx — the on-chain hash you can verify on TronScan