Pricing — API reference
Price table, quotes and estimates.
| Method | Path | Summary |
|---|---|---|
GET | /v1/fees | The service fee tiers |
GET | /v1/prices | Current price table |
GET | /v1/prices/activation | Price of activating addresses |
GET | /v1/market | Public energy rental market board |
GET | /v1/market/history | One provider’s collected price history |
GET | /v1/market/justlend | What a JustLend rental costs its renter |
GET | /v1/market/hourly-pattern | Price windows by hour of day |
GET | /v1/market/daily | The market day by day |
GET | /v1/stats | Open order statistics, 7 and 30 days |
GET | /v1/address-check | What an address spent on energy, and what it would have cost through us |
GET | /v1/address-check/rentals | Every rental of an address check, a page at a time |
GET | /v1/market/summary | One month of market prices in figures |
GET | /v1/orderbook | The ask ladder for one resource and tier |
GET | /v1/estimate | Stateless price estimate |
POST | /v1/quotes | Create a binding quote |
POST | /v1/wallet-payments | Build a wallet payment for any receiver |
GET | /v1/quotes/{quoteId} | Read a quote |
Base URL https://api.tenergy.me/v1, or https://api-nile.tenergy.me/v1 on Nile (Environments). Every request below is signed as in Authentication unless its Auth line says otherwise.
The service fee tiers
GET /v1/fees · getServiceFees
Auth: Public — no credentials.
Public. The service fee is a percentage of the provider price, by the account’s spend over the last
30 days. A buyer without history pays the first tier. Market prices (/prices, /market) are before it.
Responses
| Status | Meaning |
|---|---|
200 | The tiers in force |
500 | Something broke on our side. |
Response fields
| Field | Type | Required | Description |
|---|---|---|---|
tiers | array of object (FeeTier) | yes | |
tiers[].from_sun | integer | yes | The tier starts at this 30-day spend, SUN, fee included. |
tiers[].fee_bps | integer | yes |
Current price table
GET /v1/prices · getPrices
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
Everything currently sellable, with the price for each tier and the volume tiers that
apply. Prices move with the time of day, so the response carries the window in which the
quoted numbers hold (valid_until), the current pricing period and the whole day’s
schedule of periods with the 1h energy price in each.
Use this to render a tariff table. To pin a price for an order, take a quote
(POST /v1/quotes) — a price table entry is informational and is not binding.
Switched-off products. While the 1d tier is switched off, the energy 1d row is
listed with available: false, its payment_addresses entry is omitted, and orders,
quotes and estimates for it answer 2003 tier_unavailable. While subscriptions are
switched off, subscriptions_available is false and new subscriptions are refused with
409 3021 subscriptions_unavailable.
Public. No credentials are needed; anonymous calls are limited per source IP. A signed request is accepted too and is counted against the key’s own budget instead.
The example below is illustrative; live prices come from this endpoint. It carries
the day-part schedule of 2026-09-25 — energy 1h from 20 SUN/unit off-peak to 34 SUN/unit
at peak, here read in the 30 SUN/unit late-peak period — and activation at 1,200,000 SUN; it
shows one item only. The bandwidth grid, the long-tier prices and the volume steps are
still being finalised, so the example leaves them out rather than publish a number
that is not final yet. Iterate over items; never assume which tiers or resources
appear.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
resource | query | enum: energy, bandwidth, activation | Restrict the response to one resource type. |
Responses
| Status | Meaning |
|---|---|
200 | OK |
401 | Missing, malformed or rejected credentials. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields (PriceTable)
| Field | Type | Required | Description |
|---|---|---|---|
network | enum: mainnet, nile | yes | |
burn_sun_per_energy | integer | What burning one energy costs, SUN: the chain parameter getEnergyFee (read every 10 minutes). An energy order is sold while renting it costs no more than burning it. | |
refills | object | Refills (POST /v1/refills): whether one can be bought now, and per resource the accepted size range and the cheapest enabled venue’s indicative unit price (SUN, before your routing fee). | |
refills.available | boolean | yes | |
refills.items | array of object | yes | |
refills.items[].resource | enum: energy, bandwidth | yes | |
refills.items[].min_amount | integer | yes | |
refills.items[].max_amount | integer | yes | |
refills.items[].price_sun | number | null | yes | |
subscriptions_available | boolean | yes | Whether a subscription can be created now. False while the deployment has subscriptions switched off; existing subscriptions keep running and stay manageable. |
as_of | string (date-time) | yes | |
valid_until | string (date-time) | yes | When the quoted prices may change. Re-read after this instant; do not cache past it. |
period | object | The pricing period currently in force. Periods are configured server-side and their number, labels and boundaries change — iterate, never hardcode. | |
period.id | string | ||
period.label | string | ||
period.start | string | HH:MM UTC | |
period.end | string | HH:MM UTC | |
schedule | array of object | Every pricing period of the day, ordered by start, with the energy 1h price in each — enough to draw the whole day’s price map in the reader’s own time zone. The periods are configured server-side and change over time (a new version applies from its announced instant): iterate, never hardcode their number, ids or bounds. Together they cover the 24 h once. A period whose end_utc_minute is below its start_utc_minute runs across midnight UTC. Informational, like the rest of this table: a quote is what pins a price. | |
schedule[].id | string | yes | |
schedule[].label | string | yes | |
schedule[].start_utc_minute | integer | yes | Inclusive start, minutes after 00:00 UTC. |
schedule[].end_utc_minute | integer | yes | Exclusive end, minutes after 00:00 UTC. |
schedule[].factor_bps | integer | yes | The time-of-day factor of this period, basis points (10,000 = ×1.00). |
schedule[].price_sun_per_unit | number | null | yes | Energy 1h, SUN per unit, for an order placed in this period, a multiple of 0.01. null when the tier is not on sale in that period. |
available_energy | integer (int64) | Energy available to buy right now for the 1h tier. | |
delivered_today | integer (int64) | Energy delivered on this brand’s orders since 00:00 UTC today (sum of delivered_amount over confirmed, active, expired and reclaimed orders). A site may show it as “energy for N transfers delivered today” with N = value ÷ 65,000. | |
payment_addresses | object | Where the no-account “send TRX” path pays, per tier, on this brand: send TRX to the tier’s address with the receiving address in the memo (empty memo: the sender), and the transfer becomes an energy order for that receiver, priced when it arrives. The part of a payment that does not buy a whole unit of energy is kept. Keys are tier ids; a tier without a published address is absent, and the object is empty when the brand publishes none. These are the addresses the platform watches, so a listed address is one a transfer can be matched on. The 1d entry is omitted while that tier is switched off; a transfer that still reaches its address is refunded to the sender minus the network fee, not filled. | |
available_bandwidth | integer (int64) | ||
items | array of object | yes | |
items[].resource | enum: energy, bandwidth, activation | yes | energy — TRON energy, the resource a TRC-20 transfer consumes. · bandwidth — TRON bandwidth (net), consumed by transaction size. · activation — one-off account activation; amount and tier do not apply. |
items[].tier | enum (14 values, Tier) | yes | Rental period, shortest first: minutes (5m–30m), hours (1h–12h) and days (1d–30d). Energy is sold for 5m, 10m, 15m, 30m, 1h and 1d; a term not on sale answers 2003 tier_unavailable. An order is filled by the cheapest provider term not shorter than the one asked (a 5m order may be bought as 15m); the order’s filled_tier says which term was bought. Check available on each GET /v1/prices row; a tier that is not available is rejected with 2003 tier_unavailable. |
items[].available | boolean | yes | Whether this row can be bought now. False for energy 1d while that tier is switched off: the price is shown, an order for it is 2003 tier_unavailable. |
items[].price_sun_per_unit | integer | yes | SUN per one unit of the resource for the whole tier period, before the routing fee (GET /v1/fees); an estimate, quote or order adds it. Rounded to whole SUN; price_steps[] and schedule[] carry the 0.01 SUN step. |
items[].order_fee_sun | integer | SUN charged once per order on top of price_sun_per_unit × amount, where the supply this price comes from has a per-order cost (a venue paid by an on-chain transfer: 268,000 SUN). Absent when there is none. Estimates, quotes and orders include it. | |
items[].min_amount | integer | yes | |
items[].max_amount | integer | yes | |
items[].volume_tiers | array of object | Cheaper rates above a threshold. The highest matching entry wins. | |
items[].volume_tiers[].min_amount | integer | yes | |
items[].volume_tiers[].price_sun_per_unit | integer | yes | |
items[].price_steps | array of object | Price by order size, cheapest first, before the routing fee. Each step is one supply offer, so ranges can overlap; an amount is sold at the cheapest step whose range covers it; a direct transfer buys the largest amount any one step sells for the payment. Present on the energy rows priced from live supply. | |
items[].price_steps[].min_amount | integer | yes | |
items[].price_steps[].max_amount | integer | yes | |
items[].price_steps[].price_sun_per_unit | number | yes | SUN per unit |
activation | object | Cost of activating an inactive receiver, charged on top of an order. | |
activation.price_sun | integer (int64) | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. |
Example 200 response, from the contract (illustrative values — live numbers come from the API):
{
"network": "mainnet",
"as_of": "2026-09-11T18:04:05.123Z",
"valid_until": "2026-09-11T18:09:05.123Z",
"period": {"id":"peak_late","label":"Late peak","start":"16:00","end":"00:00"},
"schedule": [
{
"id": "drop",
"label": "Drop",
"start_utc_minute": 0,
"end_utc_minute": 60,
"factor_bps": 13500,
"price_sun_per_unit": 27
},
{
"id": "off_peak",
"label": "Off-peak",
"start_utc_minute": 60,
"end_utc_minute": 540,
"factor_bps": 10000,
"price_sun_per_unit": 20
},
{
"id": "ramp_9",
"label": "Ramp 09:00",
"start_utc_minute": 540,
"end_utc_minute": 660,
"factor_bps": 11000,
"price_sun_per_unit": 22
},
{
"id": "ramp_11",
"label": "Ramp 11:00",
"start_utc_minute": 660,
"end_utc_minute": 720,
"factor_bps": 12000,
"price_sun_per_unit": 24
},
{
"id": "ramp_12",
"label": "Ramp 12:00",
"start_utc_minute": 720,
"end_utc_minute": 840,
"factor_bps": 15000,
"price_sun_per_unit": 30
},
{
"id": "peak",
"label": "Peak",
"start_utc_minute": 840,
"end_utc_minute": 960,
"factor_bps": 17000,
"price_sun_per_unit": 34
},
{
"id": "peak_late",
"label": "Late peak",
"start_utc_minute": 960,
"end_utc_minute": 1440,
"factor_bps": 15000,
"price_sun_per_unit": 30
}
],
"available_energy": 412000000,
"delivered_today": 80600000,
"available_bandwidth": 1800000,
"items": [
{
"resource": "energy",
"tier": "1h",
"price_sun_per_unit": 30,
"min_amount": 32000,
"max_amount": 3000000,
"volume_tiers": []
}
],
"activation": {"price_sun":1200000}
}
Price of activating addresses
GET /v1/prices/activation · getActivationPrice
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
What activating addresses new TRON addresses together costs now: per address and in all. Addresses activated
together, in one batch, cost less each than one alone; the price per address is never above
activation.price_sun of GET /v1/prices. An activation-only order (resource: activation) is charged the
one-address price; an address that is already active is never charged.
The price moves with the market; to pin it, take a quote (POST /v1/quotes). available is false while
activation is not sold.
Public. No credentials are needed; anonymous calls are limited per source IP.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
addresses | query | integer | How many new addresses are activated together, 1 to 100. |
Responses
| Status | Meaning |
|---|---|
200 | OK |
400 | Malformed request — bad JSON, unknown field, wrong type. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields
| Field | Type | Required | Description |
|---|---|---|---|
addresses | integer | yes | |
price_per_address_sun | integer | yes | SUN per address. |
total_sun | integer | yes | SUN for all the addresses. |
available | boolean | yes | Whether activation is sold now. |
as_of | string (date-time) | yes |
Example 200 response, from the contract (illustrative values — live numbers come from the API):
{
"addresses": 10,
"price_per_address_sun": 900000,
"total_sun": 9000000,
"available": true,
"as_of": "2026-10-24T12:00:00.000Z"
}
Public energy rental market board
GET /v1/market · getMarket
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
The latest 1h / 1d energy price of each public provider (its API rate for instant rental; its website or account may show other prices), refreshed every minute, plus
our own live price (slug: tenergy). Sorted by price_sun_1h, cheapest first; unpriced
providers last. savings_pct = 1 − price /
burn_sun; stale = the price row is older than 15 min (or missing). Anonymous; a
presented key only buys the per-key budget.
Responses
| Status | Meaning |
|---|---|
200 | The board. |
401 | Missing, malformed or rejected credentials. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields (MarketBoard)
| Field | Type | Required | Description |
|---|---|---|---|
as_of | string (date-time) | yes | |
burn_sun | number | yes | SUN burned per energy unit without rental (100). |
providers | array of object | yes | |
providers[].slug | string | yes | |
providers[].name | string | yes | |
providers[].rank | integer | null | yes | 1 = cheapest 1h price; an equal price shares the place (1, 2, 2, 3); null when unpriced. |
providers[].price_sun_1h | number | null | yes | |
providers[].price_sun_1d | number | null | yes | |
providers[].price_sun_5m | number | null | «5+ min»: SUN per energy unit of the provider’s term of 5 minutes or longer whose 65,000-energy order costs least, its own per-order fee included (that fee is order_fees.energy[term_5m]). An order for 5 minutes is filled the same way. On the TEnergy row: our 5-minute price, null while 5 minutes is not on sale. | |
providers[].term_5m | string | null | The term price_sun_5m comes from (5m, 15m, 1h, …); null with it. | |
providers[].bandwidth_sun_1h | number | null | yes | SUN per bandwidth unit for 1 hour where the provider publishes one; null otherwise. |
providers[].bandwidth_sun_1d | number | null | yes | SUN per bandwidth unit for 1 day where the provider publishes one; null otherwise. |
providers[].savings_pct | number | null | yes | (1 − price_sun_1h / burn_sun) × 100, two decimals. |
providers[].routed | boolean | yes | True when the TEnergy router can buy from this provider right now (a fresh 1-hour energy offer in its supply book). Always false on the TEnergy row. |
providers[].routed_bandwidth | boolean | yes | The same for bandwidth: a fresh bandwidth offer in a term on sale. Always false on the TEnergy row. |
providers[].off_for_orders | boolean | True while the TEnergy router does not buy from this provider at all (switched off or held out after a problem): shown as unable to take an order. Always false on the TEnergy row. | |
providers[].benched | boolean | True while a connected provider is held out automatically after a problem (an undelivered or overcharged order) and comes back by itself: the board shows it as unable to take an order. Always false on the TEnergy row. | |
providers[].available_energy | integer | null | yes | |
providers[].total_energy | integer | null | yes | |
providers[].kinds | array of enum: api, bot, pool, market, web | yes | |
providers[].links | object | yes | |
providers[].links.site | string | null | ||
providers[].links.telegram | string | null | ||
providers[].links.twitter | string | null | ||
providers[].links.github | string | null | ||
providers[].links.docs | string | null | ||
providers[].links.referral | string | null | Referral link to the provider’s site; null when there is none and on our own row. | |
providers[].links.logo | string | null | Provider logo URL verified on its own site (apple-touch-icon, svg icon, icon or og:image answering 200 with an image type); null when none was found and on our own row. | |
providers[].ts | string (date-time) | null | yes | |
providers[].stale | boolean | yes | |
summary | object | yes | |
summary.avg_price_sun_1h | number | null | yes | Mean 1h price over fresh priced rows. |
summary.active_providers | integer | yes |
One provider’s collected price history
GET /v1/market/history · getMarketHistory
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
Ok collector points for one provider, oldest first. Unknown slug = empty series.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
slug | query | string | yes | |
hours | query | integer |
Responses
| Status | Meaning |
|---|---|
200 | The series. |
400 | Malformed request — bad JSON, unknown field, wrong type. |
401 | Missing, malformed or rejected credentials. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields
| Field | Type | Required | Description |
|---|---|---|---|
slug | string | yes | |
hours | integer | yes | |
points | array of object | yes | |
points[].ts | string (date-time) | yes | |
points[].price_sun_1h | number | null | yes | |
points[].price_sun_1d | number | null | yes | |
points[].bandwidth_sun_1h | number | null | yes | SUN per bandwidth unit for 1 hour; null where the provider publishes none. |
points[].bandwidth_sun_1d | number | null | yes | SUN per bandwidth unit for 1 day; null where the provider publishes none. |
points[].available_energy | integer | null | yes |
What a JustLend rental costs its renter
GET /v1/market/justlend · getMarketJustLend
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
Inputs of the JustLend rental calculator: the rent rate (SUN per energy per day at 65,000
energy, the 0.75-day charge for used energy not included), energy per staked TRX, the
contract owner’s energy today (the owner pays 100 - caller_share_pct % of each call’s
energy, at most origin_energy_limit, while it has energy left) and the chain burn prices.
calls are medians of mainnet receipts for the whole call (owner and caller together),
dated measured_on. Read live at most once a minute; when the node fails, the last good
read is served with stale: true for 15 minutes, then 503.
Responses
| Status | Meaning |
|---|---|
200 | The current state. |
401 | Missing, malformed or rejected credentials. |
429 | Too many requests. |
500 | Something broke on our side. |
503 | Temporarily unable to serve. On order creation this is fail-secure: nothing was stored and nothing was charged, so retrying verbatim with the same client_order_id is safe. |
Response fields
| Field | Type | Required | Description |
|---|---|---|---|
as_of | string (date-time) | yes | |
stale | boolean | yes | |
rate_sun_per_energy_day | number | yes | |
energy_per_trx | number | yes | |
consumed_charge_days | number | yes | Days of rent kept when the rental is returned with its energy used up. |
deposit_days | number | yes | Days of rent taken as a deposit on top of the hold |
owner | object | yes | |
owner.address | string | yes | |
owner.energy_limit | integer | yes | |
owner.energy_used | integer | yes | |
owner.caller_share_pct | integer | yes | |
owner.origin_energy_limit | integer | yes | |
burn | object | yes | |
burn.energy_sun | integer | yes | getEnergyFee |
burn.bandwidth_sun | integer | yes | getTransactionFee |
calls | object | yes | |
calls.rent | object (JustLendCallCost) | yes | |
calls.rent.energy | integer | yes | Energy of the whole call |
calls.rent.bandwidth | integer | yes | Bandwidth bytes the caller pays. |
calls.return | object (JustLendCallCost) | yes | |
calls.return.energy | integer | yes | Energy of the whole call |
calls.return.bandwidth | integer | yes | Bandwidth bytes the caller pays. |
calls.measured_on | string (date) | yes |
Price windows by hour of day
GET /v1/market/hourly-pattern · getMarketHourlyPattern
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
The median 1 h price per UTC hour of day over the last 1, 7 or 30 days - ours (tenergy)
and the listed venues together - and our hours merged into windows of one price, labelled by
where that price sits between the day’s lowest and highest (cheapest, low, rising,
peak; one price all day is flat). cheapest is our lowest hour and what 65,000 energy (one
USDT transfer) costs then. Hours with no data are null and split windows. Cached for 1 minute.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
days | query | enum: 1, 7, 30 | ||
compare | query | string | A venue’s slug from GET /v1/market; its median 1 h price per hour comes back as compare_median_1h. | |
basis | query | enum: history, forecast | history (default): medians over the last days. forecast: our 1 h price per UTC hour for the next 24 h (hours before the current one are tomorrow’s): the weighted median of that hour over the last 21 days of the same type - weekdays, or Saturday and Sunday - the newest day weighing most, halving every 2 such days; tenergy_low_1h / tenergy_high_1h are the lowest / highest of the days used. The market column and compare stay history over days. |
Responses
| Status | Meaning |
|---|---|
200 | The hourly pattern. |
400 | Malformed request — bad JSON, unknown field, wrong type. |
Response fields
| Field | Type | Required | Description |
|---|---|---|---|
days | integer | yes | |
from | string (date-time) | yes | |
to | string (date-time) | yes | |
generated_at | string (date-time) | yes | |
compare | string | The venue asked for with compare. | |
basis | enum: history, forecast | What tenergy_median_1h and the windows are. | |
hours | array of object | yes | |
hours[].hour | integer | yes | |
hours[].tenergy_median_1h | number | null | yes | |
hours[].market_median_1h | number | null | yes | |
hours[].tenergy_low_1h | number | null | The lowest of this hour’s per-day medians of our price over the window - the low edge of a forecast for this hour. | |
hours[].tenergy_high_1h | number | null | The highest of them - the high edge. | |
hours[].compare_median_1h | number | null | Only with compare - that venue’s median 1 h price in this hour. | |
windows | array of object | yes | |
windows[].start_hour | integer | yes | UTC hour the window starts at. |
windows[].end_hour | integer | yes | UTC hour it ends at (exclusive |
windows[].price_sun_1h | number | yes | |
windows[].label | enum: cheapest, low, rising, peak, flat | yes | |
cheapest | object | null | yes | |
cheapest.price_sun_1h | number | yes | |
cheapest.per_65k_sun | integer | yes | |
cheapest.hours | array of integer | yes |
The market day by day
GET /v1/market/daily · getMarketDaily
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
One row per UTC day over the last days (today is partial): the median and the lowest 1 h price
across the listed venues, the venue with the lowest median that day, our median 1 h price, and how
many venues and readings it rests on. Our price is taken minute by minute: our own reading, or else
the cheapest of CatFee, Netts and SoHu in that minute. Cached for 1 minute.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
days | query | integer |
Responses
| Status | Meaning |
|---|---|
200 | The days, oldest first. |
400 | Malformed request — bad JSON, unknown field, wrong type. |
Response fields
| Field | Type | Required | Description |
|---|---|---|---|
from | string (date-time) | yes | |
to | string (date-time) | yes | |
days | array of object | yes | |
days[].day | string (date) | yes | |
days[].market_median_sun_1h | number | null | yes | |
days[].market_min_sun_1h | number | null | yes | |
days[].cheapest | object | null | yes | |
days[].cheapest.slug | string | yes | |
days[].cheapest.name | string | yes | |
days[].cheapest.median_sun_1h | number | null | yes | |
days[].ours_sun_1h | number | null | yes | |
days[].providers | integer | yes | |
days[].readings | integer | yes |
Open order statistics, 7 and 30 days
GET /v1/stats · getOpenStats
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
Shares, medians and p90 of our paid orders, merged from hourly buckets the worker recounts every minute. No count of orders, energy or TRX is published. A metric with fewer than 30 orders behind it is null. Energy and bandwidth are separate blocks; promo grants and activator rentals are not included.
Responses
| Status | Meaning |
|---|---|
200 | The windows. |
401 | Missing, malformed or rejected credentials. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields
| Field | Type | Required | Description |
|---|---|---|---|
updated_at | string (date-time) | yes | |
network | enum: mainnet, nile | yes | |
burn_sun | object | yes | The chain’s burn price per unit (getEnergyFee, getTransactionFee) of the newest counted hour. |
burn_sun.energy | number | null | yes | |
burn_sun.bandwidth | number | null | yes | |
windows | object | yes | |
windows.7d | object (OpenStatsWindow) | yes | |
windows.7d.from | string (date-time) | yes | Start of the first hourly bucket in the window. |
windows.7d.to | string (date-time) | yes | |
windows.7d.energy | object (OpenStatsResource) | yes | |
windows.7d.bandwidth | object (OpenStatsResource) | yes | |
windows.30d | object (OpenStatsWindow) | yes | |
windows.30d.from | string (date-time) | yes | Start of the first hourly bucket in the window. |
windows.30d.to | string (date-time) | yes | |
windows.30d.energy | object (OpenStatsResource) | yes | |
windows.30d.bandwidth | object (OpenStatsResource) | yes |
What an address spent on energy, and what it would have cost through us
GET /v1/address-check · getAddressCheck
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
Energy rentals to the address in the window by provider (estimated at that provider’s hourly board median for
the term; 1 h and 1 d only), its network burns by UTC day, and the same energy at our price of the same hour.
Delegations that filled one of our orders are one TEnergy row at the price paid. Built once an hour per
(address, days); at most 10 checks a minute per IP. Chain data from our analyzer.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
address | query | string | yes | TRON base58 address. |
days | query | enum: 7, 30 |
Responses
| Status | Meaning |
|---|---|
200 | The check. An address with nothing in the window answers zeros and empty lists. |
400 | Malformed request — bad JSON, unknown field, wrong type. |
429 | Too many requests. |
500 | Something broke on our side. |
503 | Temporarily unable to serve. On order creation this is fail-secure: nothing was stored and nothing was charged, so retrying verbatim with the same client_order_id is safe. |
Response fields (AddressCheck)
| Field | Type | Required | Description |
|---|---|---|---|
address | string | yes | |
days | enum: 7, 30 | yes | |
from | string (date-time) | yes | Start of the UTC day days - 1 days ago. |
to | string (date-time) | yes | |
summary | object | yes | |
summary.usdt_transfers | integer | yes | |
summary.transfers_without_energy | integer | yes | Transactions (every contract) that burned TRX for all or part of their energy. |
summary.burned_energy_trx | number | yes | |
summary.burned_bandwidth_trx | number | yes | |
summary.rentals | integer | yes | |
summary.rented_energy | integer | yes | |
summary.providers | integer | yes | Known providers |
summary.rent_cost_est_trx | number | yes | |
summary.spent_est_trx | number | yes | burned_energy_trx + rent_cost_est_trx. |
summary.tenergy_trx | number | yes | |
summary.tenergy_fee_pct | number | yes | Our routing fee included in every ‘with TEnergy’ figure but the TEnergy row: the tier of this address’s 30-day spend. |
summary.saved_trx | number | yes | |
summary.saved_pct | integer | yes | 0 when nothing was saved. |
providers | array of object | yes | TEnergy first, then by rentals; the unknown provider last. |
providers[].slug | string | null | yes | |
providers[].name | string | null | yes | null = unknown provider. |
providers[].via_tenergy | boolean | yes | |
providers[].rentals | integer | yes | |
providers[].energy | integer | yes | |
providers[].term | string | null | yes | 1h, 1d, 15m, 3d, … or mixed. |
providers[].price_sun | integer | null | yes | Average SUN per unit of the priced rentals. |
providers[].cost_trx | number | null | yes | |
providers[].tenergy_trx | number | null | yes | |
providers[].auto_rentals | integer | yes | Rentals of the group whose provider is an automatic label: the pool filled 3+ of our orders, all through this provider, and has no label of the analyzer’s. |
burn_by_day | array of object | yes | |
burn_by_day[].day | string (date) | yes | |
burn_by_day[].transfers_without_energy | integer | yes | |
burn_by_day[].burned_trx | number | yes | |
burn_tenergy_trx | number | yes | Burned energy at our 1 h price |
Every rental of an address check, a page at a time
GET /v1/address-check/rentals · getAddressCheckRentals
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
The rentals behind /address-check one by one, newest first, with the same figures: our delegations at the
price paid, a provider’s at its hourly board median for the term (1 h and 1 d only) and ours that hour with
the fee of tenergy_fee_pct; null where not priced. The first page (no before) also carries activity,
energy rented per UTC hour by provider. At most 60 pages a minute per IP.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
address | query | string | yes | TRON base58 address. |
days | query | enum: 7, 30 | ||
provider | query | string | A provider slug, tenergy or unknown: only its rentals. | |
before | query | integer | The previous page’s next_before. | |
limit | query | integer |
Responses
| Status | Meaning |
|---|---|
200 | One page. |
400 | Malformed request — bad JSON, unknown field, wrong type. |
429 | Too many requests. |
500 | Something broke on our side. |
503 | Temporarily unable to serve. On order creation this is fail-secure: nothing was stored and nothing was charged, so retrying verbatim with the same client_order_id is safe. |
Response fields (AddressCheckRentals)
| Field | Type | Required | Description |
|---|---|---|---|
address | string | yes | |
days | enum: 7, 30 | yes | |
from | string (date-time) | yes | |
to | string (date-time) | yes | |
tenergy_fee_pct | number | yes | |
total | integer | yes | Rentals matching the filter in the window. |
providers | array of object | yes | Every provider of the window with its rentals, in the order of the check’s provider table. |
providers[].key | string | yes | tenergy, a provider slug, or unknown. |
providers[].name | string | null | yes | |
providers[].rentals | integer | yes | |
activity | array of object | null | yes | First page only; hours with a rental. |
activity[].hour | string (date-time) | yes | |
activity[].energy | object | yes | Energy rented that hour by provider key. |
rentals | array of object | yes | |
rentals[].time | string (date-time) | yes | |
rentals[].block | integer | yes | |
rentals[].owner | string | null | yes | The stake’s owner; null on TEnergy rows. |
rentals[].key | string | yes | |
rentals[].name | string | null | yes | null = unknown provider. |
rentals[].via_tenergy | boolean | yes | |
rentals[].label_auto | boolean | yes | The provider is an automatic label (see auto_rentals); show it marked, e.g. Netts (auto). |
rentals[].energy | integer | yes | |
rentals[].term | string | null | yes | |
rentals[].price_sun | number | null | yes | SUN per unit |
rentals[].cost_trx | number | null | yes | |
rentals[].tenergy_trx | number | null | yes | |
next_before | integer | null | yes |
One month of market prices in figures
GET /v1/market/summary · getMarketSummary
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
The month’s collected prices per provider - every venue on the board plus tenergy - and the
median 1 h price by UTC hour of day. Statistics cover ok readings with a price; ok_share is
the share of readings that succeeded. For the current month to is the time of the request.
A future month or a malformed month is 400. Cached for 1 minute.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
month | query | string | yes |
Responses
| Status | Meaning |
|---|---|
200 | The month’s figures. |
400 | Malformed request — bad JSON, unknown field, wrong type. |
401 | Missing, malformed or rejected credentials. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields
| Field | Type | Required | Description |
|---|---|---|---|
month | string | yes | |
from | string (date-time) | yes | |
to | string (date-time) | yes | |
generated_at | string (date-time) | yes | |
providers | array of object | yes | |
providers[].slug | string | yes | |
providers[].name | string | yes | |
providers[].samples | integer | yes | Readings in the month |
providers[].ok_share | number | yes | |
providers[].price_sun_1h | object (MarketPriceStats) | null | yes | SUN per energy unit over the month’s ok readings with a price; null when there are none. |
providers[].price_sun_1h.min | number | yes | |
providers[].price_sun_1h.median | number | yes | |
providers[].price_sun_1h.max | number | yes | |
providers[].price_sun_1h.points | integer | yes | |
providers[].price_sun_1d | object (MarketPriceStats) | null | yes | SUN per energy unit over the month’s ok readings with a price; null when there are none. |
providers[].price_sun_1d.min | number | yes | |
providers[].price_sun_1d.median | number | yes | |
providers[].price_sun_1d.max | number | yes | |
providers[].price_sun_1d.points | integer | yes | |
hourly | array of object | yes | |
hourly[].hour | integer | yes | UTC hour of day. |
hourly[].market_median_1h | number | null | yes | Median over every listed provider’s 1 h readings in that hour. |
hourly[].tenergy_median_1h | number | null | yes |
The ask ladder for one resource and tier
GET /v1/orderbook · getOrderBook
Auth: Public — no credentials.
Coming soon: not available yet.
A price that rises with size. The platform publishes a ladder of levels -
amount @ price, cheapest first - and an order walks it: the first units come from the
cheapest level, the next from the one above, and so on. A bigger order pays more per unit.
Every level carries a class, which says how the energy reaches you:
| class | what it is |
|---|---|
instant | the platform’s own capacity, delivered immediately |
market | bought for you on the wholesale market |
deep | the on-chain market, highest price |
Prices are monotonic - a level never undercuts the one before it - and no level is ever
below the published floor. Pass amount to get the walk for that size back with the
levels: fills, the volume-weighted unit_price_sun and the total_sun.
Anonymous and cached for a few seconds. This is a price display: to pin a price,
take a quote (POST /v1/quotes), which also holds the own-capacity part of the ladder
for its lifetime so the same units are not sold twice.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
resource | query | enum: energy, bandwidth | ||
tier | query | enum (14 values, Tier) | ||
amount | query | integer | Walk the ladder for this many units and return the fills as well. |
Responses
| Status | Meaning |
|---|---|
200 | OK |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields (OrderBook)
| Field | Type | Required | Description |
|---|---|---|---|
resource | enum: energy, bandwidth | yes | |
tier | enum (14 values, Tier) | yes | Rental period, shortest first: minutes (5m–30m), hours (1h–12h) and days (1d–30d). Energy is sold for 5m, 10m, 15m, 30m, 1h and 1d; a term not on sale answers 2003 tier_unavailable. An order is filled by the cheapest provider term not shorter than the one asked (a 5m order may be bought as 15m); the order’s filled_tier says which term was bought. Check available on each GET /v1/prices row; a tier that is not available is rejected with 2003 tier_unavailable. |
as_of | string (date-time) | yes | |
valid_until | string (date-time) | yes | The book is rebuilt every few seconds; do not cache past this instant. |
floor_sun | number | yes | No level is published below this price, SUN per unit. |
depth | integer | yes | Everything the ladder can deliver right now, in units. |
levels | array of object (OrderBookLevel) | yes | |
levels[].price_sun | number | yes | SUN per unit for this level, a multiple of 0.01. |
levels[].amount | integer | yes | Units available at this price. |
levels[].class | enum: instant, market, deep | yes | How the energy reaches you: instant from the platform’s own capacity, market bought on the wholesale market, deep from the on-chain market. |
walk | object (OrderBookWalk) | null | Present only when amount was supplied. | |
walk.amount | integer | yes | The requested amount, as asked (amounts are never rounded). |
walk.fills | array of object (OrderBookFill) | yes | |
walk.fills[].price_sun | number | yes | |
walk.fills[].amount | integer | yes | |
walk.fills[].class | enum: instant, market, deep | yes | |
walk.unit_price_sun | number | yes | The volume-weighted price over the fills, SUN per unit. |
walk.total_sun | integer (int64) | yes | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. |
walk.complete | boolean | yes | false when the ladder is shallower than the amount asked for. The fills then cover only what the book can deliver right now. |
walk.outstanding | integer | Units the ladder could not cover. 0 whenever complete is true. | |
cheaper_from | string (date-time) | null | When the next cheaper pricing period begins, or null when the current one is already the cheapest of the day. Render it in the buyer’s own clock. |
Example 200 response, from the contract (illustrative values — live numbers come from the API):
{
"resource": "energy",
"tier": "1h",
"as_of": "2026-09-19T18:04:05.123Z",
"valid_until": "2026-09-19T18:04:08.123Z",
"floor_sun": 20,
"depth": 14200000,
"levels": [
{"price_sun":30,"amount":1200000,"class":"instant"},
{"price_sun":34,"amount":3000000,"class":"market"},
{"price_sun":58,"amount":10000000,"class":"deep"}
],
"walk": null,
"cheaper_from": "2026-09-20T01:00:00.000Z"
}
Stateless price estimate
GET /v1/estimate · estimateOrder
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
What an order would cost right now, without creating anything and without reserving a price. Cheap, safe to call on every keystroke.
The example is illustrative — 65,000 energy at the 20 SUN/unit off-peak placeholder —
and live prices come from GET /v1/prices.
The estimate is not binding: between the estimate and the order the pricing period may
roll over. If you need the number you showed the user to be the number you are charged,
take a quote instead and pass quote_id to POST /v1/orders, or send max_price_sun.
Public. Anonymous calls get the retail price and are limited per source IP. A signed request is priced for its own account, so a contract customer sees the contract price.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
resource | query | enum: energy, bandwidth, activation | yes | |
amount | query | integer (int64) | yes | Energy or bandwidth units. |
tier | query | enum (14 values, Tier) | yes | |
receiver | query | string | When given, the estimate includes the activation fee if the address is not yet activated on chain. Without it, activate_amount_sun is 0 and the total may be understated for a fresh address. |
Responses
| Status | Meaning |
|---|---|
200 | OK |
400 | Malformed request — bad JSON, unknown field, wrong type. |
401 | Missing, malformed or rejected credentials. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields (Estimate)
| Field | Type | Required | Description |
|---|---|---|---|
resource | enum: energy, bandwidth, activation | yes | energy — TRON energy, the resource a TRC-20 transfer consumes. · bandwidth — TRON bandwidth (net), consumed by transaction size. · activation — one-off account activation; amount and tier do not apply. |
amount | integer | yes | |
tier | enum (14 values, Tier) | yes | Rental period, shortest first: minutes (5m–30m), hours (1h–12h) and days (1d–30d). Energy is sold for 5m, 10m, 15m, 30m, 1h and 1d; a term not on sale answers 2003 tier_unavailable. An order is filled by the cheapest provider term not shorter than the one asked (a 5m order may be bought as 15m); the order’s filled_tier says which term was bought. Check available on each GET /v1/prices row; a tier that is not available is rejected with 2003 tier_unavailable. |
receiver | string | null | ||
price_sun_per_unit | integer | yes | Rounded to whole SUN; unit_price_sun is the exact value. |
unit_price_sun | number | The exact price behind energy_amount_sun, SUN per unit, to the 0.01 SUN step, as on a quote. price_sun_per_unit × amount can differ from energy_amount_sun; this cannot. | |
energy_amount_sun | integer (int64) | Cost of the resource itself, before activation. | |
activate_amount_sun | integer (int64) | 0 when the receiver is already active or was not supplied. | |
total_amount_sun | integer (int64) | yes | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. |
provider_amount_sun | integer | null | The provider price inside total_amount_sun, before the service fee. null on lines priced without a fee (orders before 2026-10-06, bandwidth, activation, contract prices). | |
fee | object (ServiceFee) | null | ||
fee.bps | integer | yes | Basis points of the provider price: 500 = 5 %. |
fee.amount_sun | integer (int64) | yes | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. |
fee.source | enum: tier, promo | yes | |
receiver_activated | boolean | null | null when receiver was not supplied. | |
as_of | string (date-time) | yes |
Example 200 response, from the contract (illustrative values — live numbers come from the API):
{
"resource": "energy",
"amount": 65000,
"tier": "1h",
"receiver": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"price_sun_per_unit": 20,
"energy_amount_sun": 1300000,
"activate_amount_sun": 0,
"total_amount_sun": 1300000,
"receiver_activated": true,
"as_of": "2026-09-11T18:04:05.123Z"
}
Create a binding quote
POST /v1/quotes · createQuote
Auth: API key (HMAC).
Pins a price for a short window. Pass the returned id as quote_id when creating the
order and you are charged exactly total_amount_sun, even if the pricing period rolled
over in between.
That fixes the charge, not the fill: if the provider the quote was priced at no longer sells
at it, a dearer fill is debited within the order’s max_price_sun, or the order fails and
is refunded (POST /v1/orders, price protection).
A quote reserves a price, not inventory. If supply runs out before the order is
created, the order fails with 5001 insufficient_supply and nothing is charged. A quote
or an order the current supply cannot fill is refused the same way at once, with the
amount that is available in details.available_amount.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
Idempotency-Key | header | string | Client-chosen key making this mutating request safe to retry, 8–128 characters of A-Z a-z 0-9 . _ : -. A repeat with the same key and the same body returns the original result; the same key with a different body is rejected with 3010 idempotency_conflict. Records live for 24 hours. |
Request body
JSON (QuoteRequest), required.
| Field | Type | Required | Description |
|---|---|---|---|
resource | enum: energy, bandwidth, activation | yes | energy — TRON energy, the resource a TRC-20 transfer consumes. · bandwidth — TRON bandwidth (net), consumed by transaction size. · activation — one-off account activation; amount and tier do not apply. |
amount | integer | Required for energy and bandwidth; ignored for activation. | |
tier | enum (14 values, Tier) | yes | Rental period, shortest first: minutes (5m–30m), hours (1h–12h) and days (1d–30d). Energy is sold for 5m, 10m, 15m, 30m, 1h and 1d; a term not on sale answers 2003 tier_unavailable. An order is filled by the cheapest provider term not shorter than the one asked (a 5m order may be bought as 15m); the order’s filled_tier says which term was bought. Check available on each GET /v1/prices row; a tier that is not available is rejected with 2003 tier_unavailable. |
receiver | string | Base58Check TRON address (starts with T, 34 characters). | |
whole_only | boolean | true: the order is filled by ONE order at ONE provider, so it is never delivered in parts and never closed short. Default false: a large order may be split across providers when that is cheaper, and a part nobody can deliver is refunded at its own price. |
Example request body, from the contract (illustrative values):
{"resource":"energy","amount":65000,"tier":"1h","receiver":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"}
Responses
| Status | Meaning |
|---|---|
201 | Quote created |
400 | Malformed request — bad JSON, unknown field, wrong type. |
401 | Missing, malformed or rejected credentials. |
422 | Syntactically valid but semantically impossible. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields (Quote)
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
resource | enum: energy, bandwidth, activation | yes | energy — TRON energy, the resource a TRC-20 transfer consumes. · bandwidth — TRON bandwidth (net), consumed by transaction size. · activation — one-off account activation; amount and tier do not apply. |
amount | integer | ||
tier | enum (14 values, Tier) | yes | Rental period, shortest first: minutes (5m–30m), hours (1h–12h) and days (1d–30d). Energy is sold for 5m, 10m, 15m, 30m, 1h and 1d; a term not on sale answers 2003 tier_unavailable. An order is filled by the cheapest provider term not shorter than the one asked (a 5m order may be bought as 15m); the order’s filled_tier says which term was bought. Check available on each GET /v1/prices row; a tier that is not available is rejected with 2003 tier_unavailable. |
receiver | string | null | ||
price_sun_per_unit | integer | ||
unit_price_sun | number | The volume-weighted price this quote was struck at, SUN per unit - the exact number behind energy_amount_sun, to the 0.01 SUN step. price_sun_per_unit is the same value rounded to a whole SUN and is kept for older clients. | |
fills | array of object (OrderBookFill) | How the quote walks the ask ladder: which part of the amount comes from which class, and at what price. Empty when the amount was priced at a single rate. | |
fills[].price_sun | number | yes | |
fills[].amount | integer | yes | |
fills[].class | enum: instant, market, deep | yes | |
energy_amount_sun | integer (int64) | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. | |
activate_amount_sun | integer (int64) | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. | |
total_amount_sun | integer (int64) | yes | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. |
provider_amount_sun | integer | null | The provider price inside total_amount_sun, before the service fee. null on lines priced without a fee (orders before 2026-10-06, bandwidth, activation, contract prices). | |
fee | object (ServiceFee) | null | ||
fee.bps | integer | yes | Basis points of the provider price: 500 = 5 %. |
fee.amount_sun | integer (int64) | yes | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. |
fee.source | enum: tier, promo | yes | |
delivered_amount | integer | The units you receive for this quote. Equal to amount, or more when the cheapest provider sells only whole blocks or from a larger minimum (ordered 5,000 bandwidth, receive 5,400): you pay for what is bought and get all of it. | |
whole_only | boolean | The whole_only you asked for (false when not sent). | |
created_at | string (date-time) | yes | |
expires_at | string (date-time) | yes | After this instant the quote is dead and an order referencing it is rejected with 3005 quote_expired. The quote TTL is 120 seconds — long enough to survive human latency on a quick-buy flow. Read this field rather than assuming the number. |
Example 201 response, from the contract (illustrative values — live numbers come from the API):
{
"id": "qt_01J9Z5NB2K4R",
"resource": "energy",
"amount": 65000,
"tier": "1h",
"receiver": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"price_sun_per_unit": 20,
"energy_amount_sun": 1300000,
"activate_amount_sun": 0,
"total_amount_sun": 1300000,
"created_at": "2026-09-11T18:04:05.123Z",
"expires_at": "2026-09-11T18:06:05.123Z"
}
Build a wallet payment for any receiver
POST /v1/wallet-payments · createWalletPayment
Auth: Public — no credentials needed; a request signed with an API key (HMAC) is accepted too.
Pay from a connected wallet for any receiver, with no account, no memo and no unique amount. Returns an
UNSIGNED plain TRX transfer payer → this brand's published address for the tier, built by our node and
valid for 10 minutes. Sign it in the payer’s wallet and broadcast it as it is: the energy goes to
receiver, priced at the block exactly like a “Send TRX” transfer to the same address.
The receiver is bound to the transaction hash (txid) of these bytes before they exist on chain. A
transfer built anywhere else has another hash and keeps the plain rule (energy to the sender). Nothing is
charged until the signed transfer is on chain. Anonymous; a presented key only buys the per-key budget.
Request body
JSON (WalletPaymentRequest), required.
| Field | Type | Required | Description |
|---|---|---|---|
payer | string | yes | Base58Check TRON address (starts with T, 34 characters). |
receiver | string | yes | Base58Check TRON address (starts with T, 34 characters). |
tier | enum (14 values) | ||
amount_sun | integer | yes | What the payer sends, in SUN; the energy is priced at the block like any transfer to this address. |
Example request body, from the contract (illustrative values):
{
"payer": "TYBSbQwqDgbdBghzsukTxFbTdR2nQ6u3ig",
"receiver": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"tier": "1h",
"amount_sun": 1684000
}
Responses
| Status | Meaning |
|---|---|
201 | Unsigned transfer built and its receiver bound |
400 | Malformed request — bad JSON, unknown field, wrong type. |
422 | Syntactically valid but semantically impossible. |
429 | Too many requests. |
500 | Something broke on our side. |
503 | Temporarily unable to serve. On order creation this is fail-secure: nothing was stored and nothing was charged, so retrying verbatim with the same client_order_id is safe. |
Response fields (WalletPayment)
| Field | Type | Required | Description |
|---|---|---|---|
txid | string | yes | The hash the receiver is bound to; also the transfer’s on-chain id. |
transaction | object | yes | The unsigned transaction (txID, raw_data, raw_data_hex) to sign and broadcast unchanged. |
payment_address | string | yes | Base58Check TRON address (starts with T, 34 characters). |
payer | string | yes | Base58Check TRON address (starts with T, 34 characters). |
receiver | string | yes | Base58Check TRON address (starts with T, 34 characters). |
tier | string | yes | |
amount_sun | integer | yes | |
expires_at | string (date-time) | yes | The network refuses the bytes after this. |
Read a quote
GET /v1/quotes/{quoteId} · getQuote
Auth: API key (HMAC).
Returns the quote, including whether it is still usable (expires_at in the future).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
quoteId | path | string | yes |
Responses
| Status | Meaning |
|---|---|
200 | OK |
401 | Missing, malformed or rejected credentials. |
404 | No such object, or it belongs to another account. The two are not distinguished. |
429 | Too many requests. |
500 | Something broke on our side. |
Response fields (Quote)
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
resource | enum: energy, bandwidth, activation | yes | energy — TRON energy, the resource a TRC-20 transfer consumes. · bandwidth — TRON bandwidth (net), consumed by transaction size. · activation — one-off account activation; amount and tier do not apply. |
amount | integer | ||
tier | enum (14 values, Tier) | yes | Rental period, shortest first: minutes (5m–30m), hours (1h–12h) and days (1d–30d). Energy is sold for 5m, 10m, 15m, 30m, 1h and 1d; a term not on sale answers 2003 tier_unavailable. An order is filled by the cheapest provider term not shorter than the one asked (a 5m order may be bought as 15m); the order’s filled_tier says which term was bought. Check available on each GET /v1/prices row; a tier that is not available is rejected with 2003 tier_unavailable. |
receiver | string | null | ||
price_sun_per_unit | integer | ||
unit_price_sun | number | The volume-weighted price this quote was struck at, SUN per unit - the exact number behind energy_amount_sun, to the 0.01 SUN step. price_sun_per_unit is the same value rounded to a whole SUN and is kept for older clients. | |
fills | array of object (OrderBookFill) | How the quote walks the ask ladder: which part of the amount comes from which class, and at what price. Empty when the amount was priced at a single rate. | |
fills[].price_sun | number | yes | |
fills[].amount | integer | yes | |
fills[].class | enum: instant, market, deep | yes | |
energy_amount_sun | integer (int64) | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. | |
activate_amount_sun | integer (int64) | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. | |
total_amount_sun | integer (int64) | yes | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. |
provider_amount_sun | integer | null | The provider price inside total_amount_sun, before the service fee. null on lines priced without a fee (orders before 2026-10-06, bandwidth, activation, contract prices). | |
fee | object (ServiceFee) | null | ||
fee.bps | integer | yes | Basis points of the provider price: 500 = 5 %. |
fee.amount_sun | integer (int64) | yes | An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer. |
fee.source | enum: tier, promo | yes | |
delivered_amount | integer | The units you receive for this quote. Equal to amount, or more when the cheapest provider sells only whole blocks or from a larger minimum (ordered 5,000 bandwidth, receive 5,400): you pay for what is bought and get all of it. | |
whole_only | boolean | The whole_only you asked for (false when not sent). | |
created_at | string (date-time) | yes | |
expires_at | string (date-time) | yes | After this instant the quote is dead and an order referencing it is rejected with 3005 quote_expired. The quote TTL is 120 seconds — long enough to survive human latency on a quick-buy flow. Read this field rather than assuming the number. |