Docs menu

Pricing — API reference

Price table, quotes and estimates.

MethodPathSummary
GET/v1/feesThe service fee tiers
GET/v1/pricesCurrent price table
GET/v1/prices/activationPrice of activating addresses
GET/v1/marketPublic energy rental market board
GET/v1/market/historyOne provider’s collected price history
GET/v1/market/justlendWhat a JustLend rental costs its renter
GET/v1/market/hourly-patternPrice windows by hour of day
GET/v1/market/dailyThe market day by day
GET/v1/statsOpen order statistics, 7 and 30 days
GET/v1/address-checkWhat an address spent on energy, and what it would have cost through us
GET/v1/address-check/rentalsEvery rental of an address check, a page at a time
GET/v1/market/summaryOne month of market prices in figures
GET/v1/orderbookThe ask ladder for one resource and tier
GET/v1/estimateStateless price estimate
POST/v1/quotesCreate a binding quote
POST/v1/wallet-paymentsBuild 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

StatusMeaning
200The tiers in force
500Something broke on our side.

Response fields

FieldTypeRequiredDescription
tiersarray of object (FeeTier)yes
tiers[].from_sunintegeryesThe tier starts at this 30-day spend, SUN, fee included.
tiers[].fee_bpsintegeryes

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

NameInTypeRequiredDescription
resourcequeryenum: energy, bandwidth, activationRestrict the response to one resource type.

Responses

StatusMeaning
200OK
401Missing, malformed or rejected credentials.
429Too many requests.
500Something broke on our side.

Response fields (PriceTable)

FieldTypeRequiredDescription
networkenum: mainnet, nileyes
burn_sun_per_energyintegerWhat 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.
refillsobjectRefills (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.availablebooleanyes
refills.itemsarray of objectyes
refills.items[].resourceenum: energy, bandwidthyes
refills.items[].min_amountintegeryes
refills.items[].max_amountintegeryes
refills.items[].price_sunnumber | nullyes
subscriptions_availablebooleanyesWhether a subscription can be created now. False while the deployment has subscriptions switched off; existing subscriptions keep running and stay manageable.
as_ofstring (date-time)yes
valid_untilstring (date-time)yesWhen the quoted prices may change. Re-read after this instant; do not cache past it.
periodobjectThe pricing period currently in force. Periods are configured server-side and their number, labels and boundaries change — iterate, never hardcode.
period.idstring
period.labelstring
period.startstringHH:MM UTC
period.endstringHH:MM UTC
schedulearray of objectEvery 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[].idstringyes
schedule[].labelstringyes
schedule[].start_utc_minuteintegeryesInclusive start, minutes after 00:00 UTC.
schedule[].end_utc_minuteintegeryesExclusive end, minutes after 00:00 UTC.
schedule[].factor_bpsintegeryesThe time-of-day factor of this period, basis points (10,000 = ×1.00).
schedule[].price_sun_per_unitnumber | nullyesEnergy 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_energyinteger (int64)Energy available to buy right now for the 1h tier.
delivered_todayinteger (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_addressesobjectWhere 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_bandwidthinteger (int64)
itemsarray of objectyes
items[].resourceenum: energy, bandwidth, activationyesenergy — 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[].tierenum (14 values, Tier)yesRental 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[].availablebooleanyesWhether 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_unitintegeryesSUN 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_sunintegerSUN 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_amountintegeryes
items[].max_amountintegeryes
items[].volume_tiersarray of objectCheaper rates above a threshold. The highest matching entry wins.
items[].volume_tiers[].min_amountintegeryes
items[].volume_tiers[].price_sun_per_unitintegeryes
items[].price_stepsarray of objectPrice 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_amountintegeryes
items[].price_steps[].max_amountintegeryes
items[].price_steps[].price_sun_per_unitnumberyesSUN per unit
activationobjectCost of activating an inactive receiver, charged on top of an order.
activation.price_suninteger (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):

json
{
  "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

NameInTypeRequiredDescription
addressesqueryintegerHow many new addresses are activated together, 1 to 100.

Responses

StatusMeaning
200OK
400Malformed request — bad JSON, unknown field, wrong type.
429Too many requests.
500Something broke on our side.

Response fields

FieldTypeRequiredDescription
addressesintegeryes
price_per_address_sunintegeryesSUN per address.
total_sunintegeryesSUN for all the addresses.
availablebooleanyesWhether activation is sold now.
as_ofstring (date-time)yes

Example 200 response, from the contract (illustrative values — live numbers come from the API):

json
{
  "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

StatusMeaning
200The board.
401Missing, malformed or rejected credentials.
429Too many requests.
500Something broke on our side.

Response fields (MarketBoard)

FieldTypeRequiredDescription
as_ofstring (date-time)yes
burn_sunnumberyesSUN burned per energy unit without rental (100).
providersarray of objectyes
providers[].slugstringyes
providers[].namestringyes
providers[].rankinteger | nullyes1 = cheapest 1h price; an equal price shares the place (1, 2, 2, 3); null when unpriced.
providers[].price_sun_1hnumber | nullyes
providers[].price_sun_1dnumber | nullyes
providers[].price_sun_5mnumber | 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_5mstring | nullThe term price_sun_5m comes from (5m, 15m, 1h, …); null with it.
providers[].bandwidth_sun_1hnumber | nullyesSUN per bandwidth unit for 1 hour where the provider publishes one; null otherwise.
providers[].bandwidth_sun_1dnumber | nullyesSUN per bandwidth unit for 1 day where the provider publishes one; null otherwise.
providers[].savings_pctnumber | nullyes(1 − price_sun_1h / burn_sun) × 100, two decimals.
providers[].routedbooleanyesTrue 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_bandwidthbooleanyesThe same for bandwidth: a fresh bandwidth offer in a term on sale. Always false on the TEnergy row.
providers[].off_for_ordersbooleanTrue 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[].benchedbooleanTrue 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_energyinteger | nullyes
providers[].total_energyinteger | nullyes
providers[].kindsarray of enum: api, bot, pool, market, webyes
providers[].linksobjectyes
providers[].links.sitestring | null
providers[].links.telegramstring | null
providers[].links.twitterstring | null
providers[].links.githubstring | null
providers[].links.docsstring | null
providers[].links.referralstring | nullReferral link to the provider’s site; null when there is none and on our own row.
providers[].links.logostring | nullProvider 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[].tsstring (date-time) | nullyes
providers[].stalebooleanyes
summaryobjectyes
summary.avg_price_sun_1hnumber | nullyesMean 1h price over fresh priced rows.
summary.active_providersintegeryes

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

NameInTypeRequiredDescription
slugquerystringyes
hoursqueryinteger

Responses

StatusMeaning
200The series.
400Malformed request — bad JSON, unknown field, wrong type.
401Missing, malformed or rejected credentials.
429Too many requests.
500Something broke on our side.

Response fields

FieldTypeRequiredDescription
slugstringyes
hoursintegeryes
pointsarray of objectyes
points[].tsstring (date-time)yes
points[].price_sun_1hnumber | nullyes
points[].price_sun_1dnumber | nullyes
points[].bandwidth_sun_1hnumber | nullyesSUN per bandwidth unit for 1 hour; null where the provider publishes none.
points[].bandwidth_sun_1dnumber | nullyesSUN per bandwidth unit for 1 day; null where the provider publishes none.
points[].available_energyinteger | nullyes

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

StatusMeaning
200The current state.
401Missing, malformed or rejected credentials.
429Too many requests.
500Something broke on our side.
503Temporarily 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

FieldTypeRequiredDescription
as_ofstring (date-time)yes
stalebooleanyes
rate_sun_per_energy_daynumberyes
energy_per_trxnumberyes
consumed_charge_daysnumberyesDays of rent kept when the rental is returned with its energy used up.
deposit_daysnumberyesDays of rent taken as a deposit on top of the hold
ownerobjectyes
owner.addressstringyes
owner.energy_limitintegeryes
owner.energy_usedintegeryes
owner.caller_share_pctintegeryes
owner.origin_energy_limitintegeryes
burnobjectyes
burn.energy_sunintegeryesgetEnergyFee
burn.bandwidth_sunintegeryesgetTransactionFee
callsobjectyes
calls.rentobject (JustLendCallCost)yes
calls.rent.energyintegeryesEnergy of the whole call
calls.rent.bandwidthintegeryesBandwidth bytes the caller pays.
calls.returnobject (JustLendCallCost)yes
calls.return.energyintegeryesEnergy of the whole call
calls.return.bandwidthintegeryesBandwidth bytes the caller pays.
calls.measured_onstring (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

NameInTypeRequiredDescription
daysqueryenum: 1, 7, 30
comparequerystringA venue’s slug from GET /v1/market; its median 1 h price per hour comes back as compare_median_1h.
basisqueryenum: history, forecasthistory (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

StatusMeaning
200The hourly pattern.
400Malformed request — bad JSON, unknown field, wrong type.

Response fields

FieldTypeRequiredDescription
daysintegeryes
fromstring (date-time)yes
tostring (date-time)yes
generated_atstring (date-time)yes
comparestringThe venue asked for with compare.
basisenum: history, forecastWhat tenergy_median_1h and the windows are.
hoursarray of objectyes
hours[].hourintegeryes
hours[].tenergy_median_1hnumber | nullyes
hours[].market_median_1hnumber | nullyes
hours[].tenergy_low_1hnumber | nullThe 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_1hnumber | nullThe highest of them - the high edge.
hours[].compare_median_1hnumber | nullOnly with compare - that venue’s median 1 h price in this hour.
windowsarray of objectyes
windows[].start_hourintegeryesUTC hour the window starts at.
windows[].end_hourintegeryesUTC hour it ends at (exclusive
windows[].price_sun_1hnumberyes
windows[].labelenum: cheapest, low, rising, peak, flatyes
cheapestobject | nullyes
cheapest.price_sun_1hnumberyes
cheapest.per_65k_sunintegeryes
cheapest.hoursarray of integeryes

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

NameInTypeRequiredDescription
daysqueryinteger

Responses

StatusMeaning
200The days, oldest first.
400Malformed request — bad JSON, unknown field, wrong type.

Response fields

FieldTypeRequiredDescription
fromstring (date-time)yes
tostring (date-time)yes
daysarray of objectyes
days[].daystring (date)yes
days[].market_median_sun_1hnumber | nullyes
days[].market_min_sun_1hnumber | nullyes
days[].cheapestobject | nullyes
days[].cheapest.slugstringyes
days[].cheapest.namestringyes
days[].cheapest.median_sun_1hnumber | nullyes
days[].ours_sun_1hnumber | nullyes
days[].providersintegeryes
days[].readingsintegeryes

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

StatusMeaning
200The windows.
401Missing, malformed or rejected credentials.
429Too many requests.
500Something broke on our side.

Response fields

FieldTypeRequiredDescription
updated_atstring (date-time)yes
networkenum: mainnet, nileyes
burn_sunobjectyesThe chain’s burn price per unit (getEnergyFee, getTransactionFee) of the newest counted hour.
burn_sun.energynumber | nullyes
burn_sun.bandwidthnumber | nullyes
windowsobjectyes
windows.7dobject (OpenStatsWindow)yes
windows.7d.fromstring (date-time)yesStart of the first hourly bucket in the window.
windows.7d.tostring (date-time)yes
windows.7d.energyobject (OpenStatsResource)yes
windows.7d.bandwidthobject (OpenStatsResource)yes
windows.30dobject (OpenStatsWindow)yes
windows.30d.fromstring (date-time)yesStart of the first hourly bucket in the window.
windows.30d.tostring (date-time)yes
windows.30d.energyobject (OpenStatsResource)yes
windows.30d.bandwidthobject (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

NameInTypeRequiredDescription
addressquerystringyesTRON base58 address.
daysqueryenum: 7, 30

Responses

StatusMeaning
200The check. An address with nothing in the window answers zeros and empty lists.
400Malformed request — bad JSON, unknown field, wrong type.
429Too many requests.
500Something broke on our side.
503Temporarily 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)

FieldTypeRequiredDescription
addressstringyes
daysenum: 7, 30yes
fromstring (date-time)yesStart of the UTC day days - 1 days ago.
tostring (date-time)yes
summaryobjectyes
summary.usdt_transfersintegeryes
summary.transfers_without_energyintegeryesTransactions (every contract) that burned TRX for all or part of their energy.
summary.burned_energy_trxnumberyes
summary.burned_bandwidth_trxnumberyes
summary.rentalsintegeryes
summary.rented_energyintegeryes
summary.providersintegeryesKnown providers
summary.rent_cost_est_trxnumberyes
summary.spent_est_trxnumberyesburned_energy_trx + rent_cost_est_trx.
summary.tenergy_trxnumberyes
summary.tenergy_fee_pctnumberyesOur routing fee included in every ‘with TEnergy’ figure but the TEnergy row: the tier of this address’s 30-day spend.
summary.saved_trxnumberyes
summary.saved_pctintegeryes0 when nothing was saved.
providersarray of objectyesTEnergy first, then by rentals; the unknown provider last.
providers[].slugstring | nullyes
providers[].namestring | nullyesnull = unknown provider.
providers[].via_tenergybooleanyes
providers[].rentalsintegeryes
providers[].energyintegeryes
providers[].termstring | nullyes1h, 1d, 15m, 3d, … or mixed.
providers[].price_suninteger | nullyesAverage SUN per unit of the priced rentals.
providers[].cost_trxnumber | nullyes
providers[].tenergy_trxnumber | nullyes
providers[].auto_rentalsintegeryesRentals 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_dayarray of objectyes
burn_by_day[].daystring (date)yes
burn_by_day[].transfers_without_energyintegeryes
burn_by_day[].burned_trxnumberyes
burn_tenergy_trxnumberyesBurned 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

NameInTypeRequiredDescription
addressquerystringyesTRON base58 address.
daysqueryenum: 7, 30
providerquerystringA provider slug, tenergy or unknown: only its rentals.
beforequeryintegerThe previous page’s next_before.
limitqueryinteger

Responses

StatusMeaning
200One page.
400Malformed request — bad JSON, unknown field, wrong type.
429Too many requests.
500Something broke on our side.
503Temporarily 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)

FieldTypeRequiredDescription
addressstringyes
daysenum: 7, 30yes
fromstring (date-time)yes
tostring (date-time)yes
tenergy_fee_pctnumberyes
totalintegeryesRentals matching the filter in the window.
providersarray of objectyesEvery provider of the window with its rentals, in the order of the check’s provider table.
providers[].keystringyestenergy, a provider slug, or unknown.
providers[].namestring | nullyes
providers[].rentalsintegeryes
activityarray of object | nullyesFirst page only; hours with a rental.
activity[].hourstring (date-time)yes
activity[].energyobjectyesEnergy rented that hour by provider key.
rentalsarray of objectyes
rentals[].timestring (date-time)yes
rentals[].blockintegeryes
rentals[].ownerstring | nullyesThe stake’s owner; null on TEnergy rows.
rentals[].keystringyes
rentals[].namestring | nullyesnull = unknown provider.
rentals[].via_tenergybooleanyes
rentals[].label_autobooleanyesThe provider is an automatic label (see auto_rentals); show it marked, e.g. Netts (auto).
rentals[].energyintegeryes
rentals[].termstring | nullyes
rentals[].price_sunnumber | nullyesSUN per unit
rentals[].cost_trxnumber | nullyes
rentals[].tenergy_trxnumber | nullyes
next_beforeinteger | nullyes

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

NameInTypeRequiredDescription
monthquerystringyes

Responses

StatusMeaning
200The month’s figures.
400Malformed request — bad JSON, unknown field, wrong type.
401Missing, malformed or rejected credentials.
429Too many requests.
500Something broke on our side.

Response fields

FieldTypeRequiredDescription
monthstringyes
fromstring (date-time)yes
tostring (date-time)yes
generated_atstring (date-time)yes
providersarray of objectyes
providers[].slugstringyes
providers[].namestringyes
providers[].samplesintegeryesReadings in the month
providers[].ok_sharenumberyes
providers[].price_sun_1hobject (MarketPriceStats) | nullyesSUN per energy unit over the month’s ok readings with a price; null when there are none.
providers[].price_sun_1h.minnumberyes
providers[].price_sun_1h.mediannumberyes
providers[].price_sun_1h.maxnumberyes
providers[].price_sun_1h.pointsintegeryes
providers[].price_sun_1dobject (MarketPriceStats) | nullyesSUN per energy unit over the month’s ok readings with a price; null when there are none.
providers[].price_sun_1d.minnumberyes
providers[].price_sun_1d.mediannumberyes
providers[].price_sun_1d.maxnumberyes
providers[].price_sun_1d.pointsintegeryes
hourlyarray of objectyes
hourly[].hourintegeryesUTC hour of day.
hourly[].market_median_1hnumber | nullyesMedian over every listed provider’s 1 h readings in that hour.
hourly[].tenergy_median_1hnumber | nullyes

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:

classwhat it is
instantthe platform’s own capacity, delivered immediately
marketbought for you on the wholesale market
deepthe 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

NameInTypeRequiredDescription
resourcequeryenum: energy, bandwidth
tierqueryenum (14 values, Tier)
amountqueryintegerWalk the ladder for this many units and return the fills as well.

Responses

StatusMeaning
200OK
429Too many requests.
500Something broke on our side.

Response fields (OrderBook)

FieldTypeRequiredDescription
resourceenum: energy, bandwidthyes
tierenum (14 values, Tier)yesRental 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_ofstring (date-time)yes
valid_untilstring (date-time)yesThe book is rebuilt every few seconds; do not cache past this instant.
floor_sunnumberyesNo level is published below this price, SUN per unit.
depthintegeryesEverything the ladder can deliver right now, in units.
levelsarray of object (OrderBookLevel)yes
levels[].price_sunnumberyesSUN per unit for this level, a multiple of 0.01.
levels[].amountintegeryesUnits available at this price.
levels[].classenum: instant, market, deepyesHow the energy reaches you: instant from the platform’s own capacity, market bought on the wholesale market, deep from the on-chain market.
walkobject (OrderBookWalk) | nullPresent only when amount was supplied.
walk.amountintegeryesThe requested amount, as asked (amounts are never rounded).
walk.fillsarray of object (OrderBookFill)yes
walk.fills[].price_sunnumberyes
walk.fills[].amountintegeryes
walk.fills[].classenum: instant, market, deepyes
walk.unit_price_sunnumberyesThe volume-weighted price over the fills, SUN per unit.
walk.total_suninteger (int64)yesAn amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
walk.completebooleanyesfalse when the ladder is shallower than the amount asked for. The fills then cover only what the book can deliver right now.
walk.outstandingintegerUnits the ladder could not cover. 0 whenever complete is true.
cheaper_fromstring (date-time) | nullWhen 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):

json
{
  "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

NameInTypeRequiredDescription
resourcequeryenum: energy, bandwidth, activationyes
amountqueryinteger (int64)yesEnergy or bandwidth units.
tierqueryenum (14 values, Tier)yes
receiverquerystringWhen 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

StatusMeaning
200OK
400Malformed request — bad JSON, unknown field, wrong type.
401Missing, malformed or rejected credentials.
429Too many requests.
500Something broke on our side.

Response fields (Estimate)

FieldTypeRequiredDescription
resourceenum: energy, bandwidth, activationyesenergy — 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.
amountintegeryes
tierenum (14 values, Tier)yesRental 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.
receiverstring | null
price_sun_per_unitintegeryesRounded to whole SUN; unit_price_sun is the exact value.
unit_price_sunnumberThe 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_suninteger (int64)Cost of the resource itself, before activation.
activate_amount_suninteger (int64)0 when the receiver is already active or was not supplied.
total_amount_suninteger (int64)yesAn amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
provider_amount_suninteger | nullThe 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).
feeobject (ServiceFee) | null
fee.bpsintegeryesBasis points of the provider price: 500 = 5 %.
fee.amount_suninteger (int64)yesAn amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
fee.sourceenum: tier, promoyes
receiver_activatedboolean | nullnull when receiver was not supplied.
as_ofstring (date-time)yes

Example 200 response, from the contract (illustrative values — live numbers come from the API):

json
{
  "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

NameInTypeRequiredDescription
Idempotency-KeyheaderstringClient-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.

FieldTypeRequiredDescription
resourceenum: energy, bandwidth, activationyesenergy — 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.
amountintegerRequired for energy and bandwidth; ignored for activation.
tierenum (14 values, Tier)yesRental 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.
receiverstringBase58Check TRON address (starts with T, 34 characters).
whole_onlybooleantrue: 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):

json
{"resource":"energy","amount":65000,"tier":"1h","receiver":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"}

Responses

StatusMeaning
201Quote created
400Malformed request — bad JSON, unknown field, wrong type.
401Missing, malformed or rejected credentials.
422Syntactically valid but semantically impossible.
429Too many requests.
500Something broke on our side.

Response fields (Quote)

FieldTypeRequiredDescription
idstringyes
resourceenum: energy, bandwidth, activationyesenergy — 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.
amountinteger
tierenum (14 values, Tier)yesRental 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.
receiverstring | null
price_sun_per_unitinteger
unit_price_sunnumberThe 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.
fillsarray 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_sunnumberyes
fills[].amountintegeryes
fills[].classenum: instant, market, deepyes
energy_amount_suninteger (int64)An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
activate_amount_suninteger (int64)An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
total_amount_suninteger (int64)yesAn amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
provider_amount_suninteger | nullThe 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).
feeobject (ServiceFee) | null
fee.bpsintegeryesBasis points of the provider price: 500 = 5 %.
fee.amount_suninteger (int64)yesAn amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
fee.sourceenum: tier, promoyes
delivered_amountintegerThe 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_onlybooleanThe whole_only you asked for (false when not sent).
created_atstring (date-time)yes
expires_atstring (date-time)yesAfter 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):

json
{
  "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.

FieldTypeRequiredDescription
payerstringyesBase58Check TRON address (starts with T, 34 characters).
receiverstringyesBase58Check TRON address (starts with T, 34 characters).
tierenum (14 values)
amount_sunintegeryesWhat 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):

json
{
  "payer": "TYBSbQwqDgbdBghzsukTxFbTdR2nQ6u3ig",
  "receiver": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
  "tier": "1h",
  "amount_sun": 1684000
}

Responses

StatusMeaning
201Unsigned transfer built and its receiver bound
400Malformed request — bad JSON, unknown field, wrong type.
422Syntactically valid but semantically impossible.
429Too many requests.
500Something broke on our side.
503Temporarily 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)

FieldTypeRequiredDescription
txidstringyesThe hash the receiver is bound to; also the transfer’s on-chain id.
transactionobjectyesThe unsigned transaction (txID, raw_data, raw_data_hex) to sign and broadcast unchanged.
payment_addressstringyesBase58Check TRON address (starts with T, 34 characters).
payerstringyesBase58Check TRON address (starts with T, 34 characters).
receiverstringyesBase58Check TRON address (starts with T, 34 characters).
tierstringyes
amount_sunintegeryes
expires_atstring (date-time)yesThe 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

NameInTypeRequiredDescription
quoteIdpathstringyes

Responses

StatusMeaning
200OK
401Missing, malformed or rejected credentials.
404No such object, or it belongs to another account. The two are not distinguished.
429Too many requests.
500Something broke on our side.

Response fields (Quote)

FieldTypeRequiredDescription
idstringyes
resourceenum: energy, bandwidth, activationyesenergy — 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.
amountinteger
tierenum (14 values, Tier)yesRental 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.
receiverstring | null
price_sun_per_unitinteger
unit_price_sunnumberThe 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.
fillsarray 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_sunnumberyes
fills[].amountintegeryes
fills[].classenum: instant, market, deepyes
energy_amount_suninteger (int64)An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
activate_amount_suninteger (int64)An amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
total_amount_suninteger (int64)yesAn amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
provider_amount_suninteger | nullThe 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).
feeobject (ServiceFee) | null
fee.bpsintegeryesBasis points of the provider price: 500 = 5 %.
fee.amount_suninteger (int64)yesAn amount in SUN (1 TRX = 1 000 000 SUN). Always an integer.
fee.sourceenum: tier, promoyes
delivered_amountintegerThe 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_onlybooleanThe whole_only you asked for (false when not sent).
created_atstring (date-time)yes
expires_atstring (date-time)yesAfter 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.

    ↑ ↓ to move · Enter to open · Esc to close