wallet/unfreezebalance
curl --request POST \
--url https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance \
--header 'Content-Type: application/json' \
--data '
{
"owner_address": "41608f8da72479edc7dd921e4c30bb7e7cddbe722e",
"resource": "BANDWIDTH",
"visible": false
}
'import requests
url = "https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance"
payload = {
"owner_address": "41608f8da72479edc7dd921e4c30bb7e7cddbe722e",
"resource": "BANDWIDTH",
"visible": False
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
owner_address: '41608f8da72479edc7dd921e4c30bb7e7cddbe722e',
resource: 'BANDWIDTH',
visible: false
})
};
fetch('https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'owner_address' => '41608f8da72479edc7dd921e4c30bb7e7cddbe722e',
'resource' => 'BANDWIDTH',
'visible' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance"
payload := strings.NewReader("{\n \"owner_address\": \"41608f8da72479edc7dd921e4c30bb7e7cddbe722e\",\n \"resource\": \"BANDWIDTH\",\n \"visible\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance")
.header("Content-Type", "application/json")
.body("{\n \"owner_address\": \"41608f8da72479edc7dd921e4c30bb7e7cddbe722e\",\n \"resource\": \"BANDWIDTH\",\n \"visible\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"owner_address\": \"41608f8da72479edc7dd921e4c30bb7e7cddbe722e\",\n \"resource\": \"BANDWIDTH\",\n \"visible\": false\n}"
response = http.request(request)
puts response.read_body{
"visible": true,
"txID": "<string>",
"raw_data": {
"contract": "<array>",
"ref_block_bytes": "<string>",
"ref_block_hash": "<string>",
"expiration": 123,
"timestamp": 123
},
"raw_data_hex": "<string>"
}{
"Error": "class org.tron.core.exception.ContractValidateException : receiverAddress must not be the same as ownerAddress"
}TRON node API
wallet/unfreezebalance | TRON
deprecated
TRON API method that unstakes TRX previously frozen for bandwidth or energy resources (deprecated method). Chainstack TRON reference.
POST
/
95e61622bf6a8af293978377718e3b77
/
wallet
/
unfreezebalance
wallet/unfreezebalance
curl --request POST \
--url https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance \
--header 'Content-Type: application/json' \
--data '
{
"owner_address": "41608f8da72479edc7dd921e4c30bb7e7cddbe722e",
"resource": "BANDWIDTH",
"visible": false
}
'import requests
url = "https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance"
payload = {
"owner_address": "41608f8da72479edc7dd921e4c30bb7e7cddbe722e",
"resource": "BANDWIDTH",
"visible": False
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
owner_address: '41608f8da72479edc7dd921e4c30bb7e7cddbe722e',
resource: 'BANDWIDTH',
visible: false
})
};
fetch('https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'owner_address' => '41608f8da72479edc7dd921e4c30bb7e7cddbe722e',
'resource' => 'BANDWIDTH',
'visible' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance"
payload := strings.NewReader("{\n \"owner_address\": \"41608f8da72479edc7dd921e4c30bb7e7cddbe722e\",\n \"resource\": \"BANDWIDTH\",\n \"visible\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance")
.header("Content-Type", "application/json")
.body("{\n \"owner_address\": \"41608f8da72479edc7dd921e4c30bb7e7cddbe722e\",\n \"resource\": \"BANDWIDTH\",\n \"visible\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"owner_address\": \"41608f8da72479edc7dd921e4c30bb7e7cddbe722e\",\n \"resource\": \"BANDWIDTH\",\n \"visible\": false\n}"
response = http.request(request)
puts response.read_body{
"visible": true,
"txID": "<string>",
"raw_data": {
"contract": "<array>",
"ref_block_bytes": "<string>",
"ref_block_hash": "<string>",
"expiration": 123,
"timestamp": 123
},
"raw_data_hex": "<string>"
}{
"Error": "class org.tron.core.exception.ContractValidateException : receiverAddress must not be the same as ownerAddress"
}TRON API method that unstakes TRX previously frozen for bandwidth or energy resources (deprecated method). This method releases TRX tokens that were previously frozen, making them available for transfer after the lock period expires. This is the legacy unstaking mechanism; for the current staking model, use
unfreeze delegated resources to another account (receiver must differ from owner):
unfreezebalancev2.
legacy unstake works only for legacy freezesOn mainnet, new legacy freezes are disabled. You can only use
wallet/unfreezebalance if your account still has legacy‑frozen balance. For v2 staking, use wallet/unfreezebalancev2.Get your own node endpoint todayStart for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.
Parameters
owner_address— the address that owns the frozen TRX to unfreeze (hex format)resource— the resource type to release (“BANDWIDTH” or “ENERGY”)receiver_address— optional address that was receiving the resources. Omit to unfreeze to yourself. If provided, it must be different fromowner_address.visible— optional boolean to specify address format (default: false for hex format)
Response
visible— boolean indicating address format usedtxID— transaction ID hashraw_data— raw transaction data objectraw_data_hex— hexadecimal representation of raw transaction data
Use case
Thewallet/unfreezebalance method is used for:
- Unstaking TRX to make tokens transferable again (legacy method).
- Releasing bandwidth or energy resources that are no longer needed (legacy method).
- Supporting older applications that still use the original unstaking mechanism.
- Migrating from the deprecated unstaking system to the new
unfreezebalancev2method.
curl examples
unfreeze to yourself (omitreceiver_address):
Shell
curl --request POST \
--url 'https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance' \
--header 'Content-Type: application/json' \
--data '{
"owner_address": "41608f8da72479edc7dd921e4c30bb7e7cddbe722e",
"resource": "BANDWIDTH",
"visible": false
}'
Shell
curl --request POST \
--url 'https://tron-mainnet.core.chainstack.com/95e61622bf6a8af293978377718e3b77/wallet/unfreezebalance' \
--header 'Content-Type: application/json' \
--data '{
"owner_address": "41608f8da72479edc7dd921e4c30bb7e7cddbe722e",
"resource": "ENERGY",
"receiver_address": "41e9d79cc47518930bc322d9bf7cddd260a0260a8d",
"visible": false
}'
if you pass For the current staking model, use
receiver_address equal to owner_address, the node returns:{
"Error": "class org.tron.core.exception.ContractValidateException : receiverAddress must not be the same as ownerAddress"
}
wallet/unfreezebalancev2. After the v2 waiting period ends, withdraw with wallet/withdrawexpireunfreeze.Body
application/json
Available options:
BANDWIDTH, ENERGY Optional. Address that was receiving the resources. Omit to unfreeze to yourself. Must not equal owner_address.
Last modified on June 22, 2026
Was this page helpful?