FeeSaver API
Buying energy and bandwidth, Smart Mode and auto orders.
The FeeSaver API: buying energy and bandwidth, Smart Mode and auto orders. All methods are GET requests that return JSON.
- Base URL:
https://api.feesaver.com - Protocol: HTTPS only, responses are JSON
- Version: v1
- Time zone: all timestamps are GMT+0
- Errors: HTTP 403 with the
errkey in the JSON response (exceptions are noted under the methods)
Authentication
The API key is passed as the token query parameter with every request. You can get the key in the account settings of t.me/FeeSaver_bot. Treat the key as confidential and do not share it with third parties.
https://api.feesaver.comcurl -G "https://api.feesaver.com/balance" \
--data-urlencode "token=YOUR_API_KEY"{
"userName": "example_user",
"full_name": "Example User",
"balance": 17.67,
"message": "Check Balance",
"ip": "100.10.150.30"
}Errors
Errors are returned with HTTP status 403 and the err key in the JSON response, together with message and ip. A few methods differ (see their notes), and some error texts are in Russian. The error cases of each method are listed under it.
{
"message": "Check Balance",
"ip": "100.10.150.30",
"err": "No User by token"
}Common
Top up balance
GET/refill
Account balance top-up: returns the deposit address and the balance.
Query parameters
token | Your API key |
|---|
Response fields
userName | Telegram username |
|---|---|
full_name | Name |
balance | Account balance in TRX |
address | Deposit address |
message | Request type (Refill Balance) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY
curl -G "https://api.feesaver.com/refill" \
--data-urlencode "token=YOUR_API_KEY"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
})
const res = await fetch('https://api.feesaver.com/refill?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/refill",
params={
"token": "YOUR_API_KEY",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"userName": "example_user",
"full_name": "Example User",
"balance": 786.55,
"address": "TD5h9FBtWhqjSoYWKaPe3QDUwf1234567",
"message": "Refill Balance",
"ip": "100.10.150.30"
}{
"message": "Refill Balance",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}Get balance
GET/balance
Get the current account balance.
Query parameters
token | Your API key |
|---|
Response fields
userName | Telegram username |
|---|---|
full_name | Name |
balance | Account balance in TRX |
message | Request type (Check Balance) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY
curl -G "https://api.feesaver.com/balance" \
--data-urlencode "token=YOUR_API_KEY"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
})
const res = await fetch('https://api.feesaver.com/balance?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/balance",
params={
"token": "YOUR_API_KEY",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"userName": "example_user",
"full_name": "Example User",
"balance": 17.67,
"message": "Check Balance",
"ip": "100.10.150.30"
}{
"message": "Check Balance",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}Estimate transfer cost
GET/precountCommission
Make a preliminary calculation of the energy order amount for performing a transaction to the address
Query parameters
token | Your API key |
|---|---|
target | Address |
Response fields
target | Address |
|---|---|
summa | Total order amount in TRX |
message | Request type (Precount Commission) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Invalid address
UnCorrect address
curl -G "https://api.feesaver.com/precountCommission" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
})
const res = await fetch('https://api.feesaver.com/precountCommission?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/precountCommission",
params={
"token": "YOUR_API_KEY",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"summa": 3.01,
"message": "Precount Commission",
"ip": "100.10.150.30"
}{
"message": "Precount Commission",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}1 more error case
{
"message": "Precount Commission",
"ip": "100.10.150.30",
"err": "UnCorrect address"
}Activate address
GET/activate
Activate address
The success response is taken from the published documentation: it was not reproduced in testing because the test address was already activated.
Query parameters
token | Your API key |
|---|---|
address | Address |
Response fields
address | Address |
|---|---|
price | Activation price |
balance | Remaining balance |
message | Request type (Activate Address) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Already activated
Address is already activated - Invalid address format
Invalid TRON address format. Address must start with 'T' and be 34 characters long.
curl -G "https://api.feesaver.com/activate" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "address=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
address: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
})
const res = await fetch('https://api.feesaver.com/activate?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/activate",
params={
"token": "YOUR_API_KEY",
"address": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"address": "TKzYMXrddJpZcuqsbVqtsdfsdf38y4a",
"price": 2,
"balance": 174.30,
"message": "Activate Address",
"ip": "89.234.234.234"
}{
"message": "Activate Address",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}2 more error cases
{
"message": "Activate Address",
"ip": "100.10.150.30",
"err": "Address is already activated"
}{
"message": "Activate Address",
"ip": "100.10.150.30",
"err": "Invalid TRON address format. Address must start with 'T' and be 34 characters long."
}Get prices
GET/prices
Get client prices
Query parameters
token | Your API key |
|---|
Response fields
energy, bandwidth | Prices by duration (15m, 1h, 1d), each with price, volume, unit |
|---|---|
smartMode | Smart Mode price: price, volume, unit |
activationPrice | Address activation price |
message | Request type (Get Prices) |
ip | IP address the request was made from |
curl -G "https://api.feesaver.com/prices" \
--data-urlencode "token=YOUR_API_KEY"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
})
const res = await fetch('https://api.feesaver.com/prices?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/prices",
params={
"token": "YOUR_API_KEY",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"energy": {
"15m": {
"price": 1.5,
"volume": 65000,
"unit": "TRX"
},
"1h": {
"price": 1.5,
"volume": 65000,
"unit": "TRX"
},
"1d": {
"price": 5.2,
"volume": 65000,
"unit": "TRX"
}
},
"bandwidth": {
"15m": {
"price": 0.4,
"volume": 1000,
"unit": "TRX"
},
"1h": {
"price": 0.4,
"volume": 1000,
"unit": "TRX"
},
"1d": {
"price": 0.63,
"volume": 1000,
"unit": "TRX"
}
},
"smartMode": {
"price": 3.21,
"volume": 131000,
"unit": "TRX"
},
"activationPrice": 1.2,
"message": "Get Prices",
"ip": "100.10.150.30"
}Buy once energy
Estimate order
GET/precountOrder
Make a preliminary calculation of the order.
Query parameters
token | Your API key |
|---|---|
days | Duration: 15m, 1h, 1d |
volume | Energy volume minimum 32 000 |
Response fields
duration | Rental duration |
|---|---|
volume | Energy volume |
price | Price per energy unit in SUN |
summa | Total amount in TRX |
message | Request type (Precount Order) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Invalid duration (this text is returned in Russian)
➖ Возможные варианты: 15m, 1h, 1d - Volume below the minimum
Minimal volume 32000 energy
curl -G "https://api.feesaver.com/precountOrder" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "days=15m" \
--data-urlencode "volume=65000"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
days: '15m',
volume: '65000',
})
const res = await fetch('https://api.feesaver.com/precountOrder?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/precountOrder",
params={
"token": "YOUR_API_KEY",
"days": "15m",
"volume": "65000",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"duration": "1h",
"volume": 65000,
"price": 23,
"summa": 1.5,
"message": "Precount Order",
"ip": "100.10.150.30"
}{
"message": "Precount Order",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}2 more error cases
{
"message": "Precount Order",
"ip": "100.10.150.30",
"err": "➖ Возможные варианты: 15m, 1h, 1d"
}{
"message": "Precount Order",
"ip": "100.10.150.30",
"err": "Minimal volume 32000 energy"
}Buy energy
GET/buyEnergy
Buy Energy
If the address is not activated, it is activated automatically and the activation fee is deducted from the balance (see activationPrice in Get prices). Activation is performed via a smart contract, so the address does not inherit AML tagging.
Order statuses:
- Filledenergy has been fully delegated.
- Createdthe order has been created, but the energy has not been delegated. The order is in the queue.
- Reclaimedthe energy rental period has expired, and our service has returned the energy back.
Query parameters
token | Your API key |
|---|---|
days | Duration: 15m, 1h, 1d |
volume | Energy volume minimum 32 000 |
target | Recipient address |
Response fields
days | Rental duration |
|---|---|
volume | Energy volume |
price | Price per energy unit in SUN |
summa | Total payment for the order in TRX |
target | Recipient address |
balance | Remaining balance |
status | Order status: Filled, Created, Reclaimed |
order_id | Order identifier |
activationPrice | Activation fee, present when the address was activated by this order |
txid | Transaction hash, can be null if the energy was not delegated |
message | Request type (Buying Energy) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Invalid duration (this text is returned in Russian)
➖ Возможные варианты: 15m, 1h, 1d - Volume below the minimum
Minimal volume 32000 energy - Invalid address
UnCorrect address
curl -G "https://api.feesaver.com/buyEnergy" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "days=1h" \
--data-urlencode "volume=65000" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
days: '1h',
volume: '65000',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
})
const res = await fetch('https://api.feesaver.com/buyEnergy?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/buyEnergy",
params={
"token": "YOUR_API_KEY",
"days": "1h",
"volume": "65000",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"days": "15m",
"volume": 32000,
"price": 23,
"summa": 0.74,
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"balance": 94.25,
"status": "Filled",
"order_id": 5345345343,
"txid": "dc9ec5e5bc395320d298ef385e1200e22d15b2ee44ff97385dfde34123455273",
"message": "Buying Energy",
"ip": "100.10.150.30"
}{
"message": "Buying Energy",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}3 more error cases
{
"message": "Buying Energy",
"ip": "100.10.150.30",
"err": "➖ Возможные варианты: 15m, 1h, 1d"
}{
"message": "Buying Energy",
"ip": "100.10.150.30",
"err": "Minimal volume 32000 energy"
}{
"message": "Buying Energy",
"ip": "100.10.150.30",
"err": "UnCorrect address"
}Order status
GET/status
Check Order Status
An unknown or foreign order_id returns HTTP 200 with the err key (Not your order_id).
Query parameters
token | Your API Key |
|---|---|
order_id | Id order |
Response fields
duration | Rental duration |
|---|---|
volume | Energy volume |
summa | Order amount in TRX |
target | Recipient address |
order_id | Order identifier |
txid | Transaction hash |
status | Order status: Filled, Created, Reclaimed |
message | Request type (Status order) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Unknown order_id (HTTP 200)
Not your order_id
curl -G "https://api.feesaver.com/status" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "order_id=6471634"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
order_id: '6471634',
})
const res = await fetch('https://api.feesaver.com/status?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/status",
params={
"token": "YOUR_API_KEY",
"order_id": "6471634",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"duration": "15m",
"volume": 32000,
"summa": 0.74,
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"order_id": 5345345343,
"txid": "dc9ec5e5bc395320d298ef385e1200e22d15b2ee44ff97385dfde34123455273",
"status": "Filled",
"message": "Status order",
"ip": "100.10.150.30"
}{
"message": "Status order",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}1 more error case
{
"message": "Status order",
"ip": "100.10.150.30",
"err": "Not your order_id"
}Combinate order
Create combined order
GET/combinateOrder
Combined Order
Orders for purchasing more than 1 million energy units must be placed as a combined order. After creating a combined order, the system automatically generates a group of energy purchase orders, each split into chunks of no more than 1 million units.
Examples:
- 3,250,000 energy units – the system will create 3 orders of 1 million each and 1 order of 250,000.
- 5,000,000 energy units – the system will create 5 orders of 1 million each.
- 2,001,000 energy units – the system will create 2 orders of 1 million each.
Order statuses:
- Createdthe combined order has been created
- Processingthe combined order is being processed
- Completedthe combined order has been completed
Query parameters
token | Your API key |
|---|---|
days | Duration: 15m, 1h, 1d |
volume | Energy volume minimum 1 000 000 |
target | Recipient address |
Response fields
days | Rental duration |
|---|---|
volume | Energy volume |
price | Price per energy unit in SUN |
summa | Total amount in TRX |
target | Recipient address |
balance | Remaining balance |
status | Order status: Created, Processing, Completed |
combinate_order_id | Combined order identifier |
message | Request type (Combinate Order) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Invalid duration (this text is returned in Russian)
➖ Возможные варианты: 15m, 1h, 1d - Volume below the minimum
Minimal volume 1000000 combinate order - Invalid address
UnCorrect address
curl -G "https://api.feesaver.com/combinateOrder" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "days=1h" \
--data-urlencode "volume=1250000" \
--data-urlencode "target=TLsdfsdfsdk8uL6asXdCEjmdBL345SDsdf"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
days: '1h',
volume: '1250000',
target: 'TLsdfsdfsdk8uL6asXdCEjmdBL345SDsdf',
})
const res = await fetch('https://api.feesaver.com/combinateOrder?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/combinateOrder",
params={
"token": "YOUR_API_KEY",
"days": "1h",
"volume": "1250000",
"target": "TLsdfsdfsdk8uL6asXdCEjmdBL345SDsdf",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"days": "1h",
"volume": 1250000,
"price": 23,
"summa": 28.75,
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"balance": 94.25,
"status": "Created",
"combinate_order_id": 71,
"message": "Combinate Order",
"ip": "100.10.150.30"
}{
"message": "Combinate Order",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}3 more error cases
{
"message": "Combinate Order",
"ip": "100.10.150.30",
"err": "➖ Возможные варианты: 15m, 1h, 1d"
}{
"message": "Combinate Order",
"ip": "100.10.150.30",
"err": "Minimal volume 1000000 combinate order"
}{
"message": "Combinate Order",
"ip": "100.10.150.30",
"err": "UnCorrect address"
}Combined order status
GET/combinateOrder/status
Check the status of a combined order.
order.items contains the single orders the combined order was split into. A 1 250 000 order produced two items: 1 000 000 and 250 000.
Query parameters
token | Your API key |
|---|---|
order_id | Id order |
Response fields
order | Object: id, duration, volume, summary (amount in TRX), target, status, items |
|---|---|
order.items | Array of single orders: id, volume, txId, status |
message | Request type (Status combinate order) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Unknown order_id (HTTP 200)
Not your order_id
curl -G "https://api.feesaver.com/combinateOrder/status" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "order_id=7777"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
order_id: '7777',
})
const res = await fetch('https://api.feesaver.com/combinateOrder/status?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/combinateOrder/status",
params={
"token": "YOUR_API_KEY",
"order_id": "7777",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"order": {
"id": 71,
"duration": "1h",
"volume": 1250000,
"summary": 28.75,
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Created",
"items": [
{
"id": 3791377,
"volume": 1000000,
"txId": "dc9ec5e5bc395320d298ef385e1200e22d15b2ee44ff97385dfde34123455273",
"status": "Filled"
},
{
"id": 3791378,
"volume": 250000,
"txId": "dc9ec5e5bc395320d298ef385e1200e22d15b2ee44ff97385dfde34123455273",
"status": "Filled"
}
]
},
"message": "Status combinate order",
"ip": "100.10.150.30"
}{
"message": "Status combinate order",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}1 more error case
{
"message": "Status combinate order",
"ip": "100.10.150.30",
"err": "Not your order_id"
}Smart Mode
List addresses
GET/smart
Smart Mode addresses of the account.
Query parameters
token | Your API key |
|---|
Response fields
orders | Array: createdAt, address, status (Started or Stopped) |
|---|---|
message | Request type (GetSmartModeOrders) |
ip | IP address the request was made from |
curl -G "https://api.feesaver.com/smart" \
--data-urlencode "token=YOUR_API_KEY"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
})
const res = await fetch('https://api.feesaver.com/smart?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/smart",
params={
"token": "YOUR_API_KEY",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"orders": [
{
"createdAt": "2026-01-04T08:26:27.025135",
"address": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Stopped"
}
],
"message": "GetSmartModeOrders",
"ip": "100.10.150.30"
}Add address
GET/smart/add
Add an address to smart mode. IMPORTANT! If the address is already added to smart mode and not removed, or is in auto orders, you will get a 403 error.
Query parameters
token | Your API key |
|---|---|
target | Address |
Response fields
target | Address |
|---|---|
status | Smart Mode status |
message | Request type (AddSmartModeAddress) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Address already added
AddressSmartModeAdded
curl -G "https://api.feesaver.com/smart/add" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
})
const res = await fetch('https://api.feesaver.com/smart/add?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/smart/add",
params={
"token": "YOUR_API_KEY",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Started",
"message": "AddSmartModeAddress",
"ip": "100.10.150.30"
}{
"message": "AddSmartModeAddress",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}1 more error case
{
"message": "AddSmartModeAddress",
"ip": "100.10.150.30",
"err": "AddressSmartModeAdded"
}Get address status
GET/smart/status
Get the smart mode status of an address
Query parameters
token | Your API key |
|---|---|
target | Address |
Response fields
target | Address |
|---|---|
status | Smart Mode status |
message | Request type (SmartModeStatus) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY
curl -G "https://api.feesaver.com/smart/status" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
})
const res = await fetch('https://api.feesaver.com/smart/status?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/smart/status",
params={
"token": "YOUR_API_KEY",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Started",
"message": "SmartModeStatus",
"ip": "100.10.150.30"
}{
"message": "SmartModeStatus",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}Start / stop address
GET/smart/status/change
Toggles the Smart Mode status of an address: Started becomes Stopped and back.
For an address that is not in Smart Mode the API returns HTTP 500 with {"message": "Address not found"} (no err key).
Query parameters
token | Your API key |
|---|---|
target | Address |
Response fields
target | Address |
|---|---|
status | Smart Mode status |
message | Request type (ChangeSmartModeStatus) |
ip | IP address the request was made from |
Errors
- Invalid address
UnCorrect address
curl -G "https://api.feesaver.com/smart/status/change" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
})
const res = await fetch('https://api.feesaver.com/smart/status/change?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/smart/status/change",
params={
"token": "YOUR_API_KEY",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Stopped",
"message": "ChangeSmartModeStatus",
"ip": "100.10.150.30"
}{
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Started",
"message": "ChangeSmartModeStatus",
"ip": "100.10.150.30"
}{
"message": "ChangeSmartModeStatus",
"ip": "100.10.150.30",
"err": "UnCorrect address"
}Remove address
GET/smart/remove
Delete an address from smart mode
Query parameters
token | Your API key |
|---|---|
target | Address |
Response fields
target | Address |
|---|---|
status | Smart Mode status |
message | Request type (RemoveSmartModeAddress) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Address is not in Smart Mode
ErrorAddAddressSmartMode
curl -G "https://api.feesaver.com/smart/remove" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
})
const res = await fetch('https://api.feesaver.com/smart/remove?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/smart/remove",
params={
"token": "YOUR_API_KEY",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Removed",
"message": "RemoveSmartModeAddress",
"ip": "100.10.150.30"
}{
"message": "RemoveSmartModeAddress",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}1 more error case
{
"message": "RemoveSmartModeAddress",
"ip": "100.10.150.30",
"err": "ErrorAddAddressSmartMode"
}Auto orders
List auto orders
GET/auto/orders
Get user auto orders (where NOT removed)
Query parameters
token | Your API key |
|---|
Response fields
orders | Array of active auto orders: orderId, target, minimal (auto-refill only), volume, duration, type (Refill or Renewal), status, createdAt, renewalAt, resourceType (ENERGY or BANDWIDTH) |
|---|---|
message | Request type (GetAutoOrders) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY
curl -G "https://api.feesaver.com/auto/orders" \
--data-urlencode "token=YOUR_API_KEY"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
})
const res = await fetch('https://api.feesaver.com/auto/orders?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/auto/orders",
params={
"token": "YOUR_API_KEY",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"orders": [
{
"orderId": 593,
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"minimal": 65000,
"volume": 65000,
"duration": "1h",
"type": "Refill",
"status": "Started",
"createdAt": "2026-10-28T10:38:22.455194",
"renewalAt": "2026-10-28T11:38:22.455161",
"resourceType": "ENERGY"
}
],
"message": "GetAutoOrders",
"ip": "100.10.150.30"
}{
"message": "GetAutoOrders",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}Add auto-refill
GET/auto/refill/add
Add an address to auto-refill.
Query parameters
token | Your API key |
|---|---|
target | Address |
days | Duration tested: `1h` |
minimal | Minimum threshold for adding energy |
volume | Energy addition amount minimum 65 000 |
Response fields
target | Address |
|---|---|
status | Order status |
id | Auto order id (use it as orderId in start/stop and remove) |
message | Request type (AddAutoRefillAddress) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Address already has an auto order
AddressAutoOrderAdded - Invalid address
UnCorrect address - Volume below the minimum
Minimal volume 65 000 energy
curl -G "https://api.feesaver.com/auto/refill/add" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P" \
--data-urlencode "days=1h" \
--data-urlencode "volume=65000" \
--data-urlencode "minimal=65000"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
days: '1h',
volume: '65000',
minimal: '65000',
})
const res = await fetch('https://api.feesaver.com/auto/refill/add?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/auto/refill/add",
params={
"token": "YOUR_API_KEY",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"days": "1h",
"volume": "65000",
"minimal": "65000",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Started",
"id": 593,
"message": "AddAutoRefillAddress",
"ip": "100.10.150.30"
}{
"message": "AddAutoRefillAddress",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}3 more error cases
{
"message": "AddAutoRefillAddress",
"ip": "100.10.150.30",
"err": "AddressAutoOrderAdded"
}{
"message": "AddAutoRefillAddress",
"ip": "100.10.150.30",
"err": "UnCorrect address"
}{
"message": "AddAutoRefillAddress",
"ip": "100.10.150.30",
"err": "Minimal volume 65 000 energy"
}Add energy auto-renewal
GET/auto/renewal/add
Add an address to the auto-renewal mode.
A 1-day delegation order is created and renewed each day for the chosen volume.
Query parameters
token | Your API key |
|---|---|
target | Address |
volume | Energy volume minimum 32 000 |
Response fields
target | Address |
|---|---|
status | Order status |
id | Auto order id (use it as orderId in start/stop and remove) |
message | Request type (AddAutoRenewalAddress) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Address already has an auto order
AddressAutoOrderAdded
curl -G "https://api.feesaver.com/auto/renewal/add" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P" \
--data-urlencode "volume=65000"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
volume: '65000',
})
const res = await fetch('https://api.feesaver.com/auto/renewal/add?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/auto/renewal/add",
params={
"token": "YOUR_API_KEY",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"volume": "65000",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Started",
"id": 594,
"message": "AddAutoRenewalAddress",
"ip": "100.10.150.30"
}{
"message": "AddAutoRenewalAddress",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}1 more error case
{
"message": "AddAutoRenewalAddress",
"ip": "100.10.150.30",
"err": "AddressAutoOrderAdded"
}Add bandwidth auto-renewal
GET/auto/bw/renewal/add
Adds an address to bandwidth auto-renewal.
Query parameters
token | Your API key |
|---|---|
target | Address |
volume | Bandwidth volume minimum 1 000 |
Response fields
target | Address |
|---|---|
status | Order status |
id | Auto order id (use it as orderId in start/stop and remove) |
message | Request type (AddAutoBandwidthRenewalAddress) |
ip | IP address the request was made from |
Errors
- Address already has an auto order
AddressAutoOrderAdded - Invalid address
UnCorrect address - Volume below the minimum
Minimal volume 1000 bandwidth
curl -G "https://api.feesaver.com/auto/bw/renewal/add" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P" \
--data-urlencode "volume=65000"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
volume: '65000',
})
const res = await fetch('https://api.feesaver.com/auto/bw/renewal/add?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/auto/bw/renewal/add",
params={
"token": "YOUR_API_KEY",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"volume": "65000",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"status": "Started",
"id": 595,
"message": "AddAutoBandwidthRenewalAddress",
"ip": "100.10.150.30"
}{
"message": "AddAutoBandwidthRenewalAddress",
"ip": "100.10.150.30",
"err": "AddressAutoOrderAdded"
}2 more error cases
{
"message": "AddAutoBandwidthRenewalAddress",
"ip": "100.10.150.30",
"err": "UnCorrect address"
}{
"message": "AddAutoBandwidthRenewalAddress",
"ip": "100.10.150.30",
"err": "Minimal volume 1000 bandwidth"
}Start / stop auto order
GET/auto/status/change
Toggles an auto order: Started becomes Stop and back.
Query parameters
token | Your API key |
|---|---|
orderId | Id order |
Response fields
status | Stop or Started |
|---|---|
id | Auto order id |
message | Request type (ChangeAutoModeStatus) |
ip | IP address the request was made from |
Errors
- Order not found
NotFoundOrder
curl -G "https://api.feesaver.com/auto/status/change" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "orderId=12345"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
orderId: '12345',
})
const res = await fetch('https://api.feesaver.com/auto/status/change?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/auto/status/change",
params={
"token": "YOUR_API_KEY",
"orderId": "12345",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"status": "Stop",
"id": 593,
"message": "ChangeAutoModeStatus",
"ip": "100.10.150.30"
}{
"status": "Started",
"id": 593,
"message": "ChangeAutoModeStatus",
"ip": "100.10.150.30"
}{
"message": "ChangeAutoModeStatus",
"ip": "100.10.150.30",
"err": "NotFoundOrder"
}Remove auto order
GET/auto/remove
Delete auto-order
Query parameters
token | Your API key |
|---|---|
orderId | Id order |
Response fields
status | Removed |
|---|---|
id | Auto order id |
message | Request type (AutoModeAddressRemove) |
ip | IP address the request was made from |
Errors
- Order not found
NotFoundOrder
curl -G "https://api.feesaver.com/auto/remove" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "orderId=12345"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
orderId: '12345',
})
const res = await fetch('https://api.feesaver.com/auto/remove?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/auto/remove",
params={
"token": "YOUR_API_KEY",
"orderId": "12345",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"status": "Removed",
"id": 593,
"message": "AutoModeAddressRemove",
"ip": "100.10.150.30"
}{
"message": "AutoModeAddressRemove",
"ip": "100.10.150.30",
"err": "NotFoundOrder"
}Bandwidth
Buy bandwidth
GET/buyBw
Buy Bandwidth
If the address is not activated, it is activated automatically and the activation fee is deducted from the balance (see activationPrice in Get prices). Activation is performed via a smart contract, so the address does not inherit AML tagging.
Order statuses:
- Filledbandwidth has been fully delegated.
- Createdthe order has been created, but the bandwidth has not been delegated. The order is in the queue.
- Reclaimedthe bandwidth rental period has expired, and our service has returned the bandwidth back.
Query parameters
token | Your API key |
|---|---|
days | Duration: 15m, 1h, 1d |
volume | Bandwidth volume minimum 1 000 |
target | Recipient address |
Response fields
days | Rental duration |
|---|---|
volume | Bandwidth volume |
price | Price in TRX per 1 000 bandwidth |
summa | Total payment for the order in TRX |
target | Recipient address |
balance | Remaining balance |
status | Order status: Filled, Created, Reclaimed |
order_id | Order identifier |
activationPrice | Activation fee, present when the address was activated by this order |
txid | Transaction hash, can be null if the bandwidth was not delegated |
message | Request type (Buying Bandwidth) |
ip | IP address the request was made from |
Errors
- Invalid token
No User by token :YOUR_API_KEY - Invalid duration (this text is returned in Russian)
➖ Возможные варианты: 15m, 1h, 1d - Volume below the minimum
Minimal volume 1000 bw - Invalid address
UnCorrect address
curl -G "https://api.feesaver.com/buyBw" \
--data-urlencode "token=YOUR_API_KEY" \
--data-urlencode "days=15m" \
--data-urlencode "volume=1000" \
--data-urlencode "target=TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P"const params = new URLSearchParams({
token: 'YOUR_API_KEY',
days: '15m',
volume: '1000',
target: 'TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P',
})
const res = await fetch('https://api.feesaver.com/buyBw?' + params)
const data = await res.json()
if (data.err) throw new Error(data.err)
console.log(data)import requests
res = requests.get(
"https://api.feesaver.com/buyBw",
params={
"token": "YOUR_API_KEY",
"days": "15m",
"volume": "1000",
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
},
timeout=30,
)
data = res.json()
if "err" in data:
raise RuntimeError(data["err"])
print(data){
"days": "15m",
"volume": 1000,
"price": 0.4,
"summa": 0.4,
"target": "TT2ebtVjf7r9y75Dkbjqu4dfgdfD34P8P",
"balance": 94.25,
"status": "Filled",
"order_id": 5345345344,
"txid": "dc9ec5e5bc395320d298ef385e1200e22d15b2ee44ff97385dfde34123455273",
"message": "Buying Bandwidth",
"ip": "100.10.150.30"
}{
"message": "Buying Bandwidth",
"ip": "100.10.150.30",
"err": "No User by token :YOUR_API_KEY"
}3 more error cases
{
"message": "Buying Bandwidth",
"ip": "100.10.150.30",
"err": "➖ Возможные варианты: 15m, 1h, 1d"
}{
"message": "Buying Bandwidth",
"ip": "100.10.150.30",
"err": "Minimal volume 1000 bw"
}{
"message": "Buying Bandwidth",
"ip": "100.10.150.30",
"err": "UnCorrect address"
}No methods found.
22 methods. Questions or an IP to whitelist: @feesaver_support.