TRON Gas Station

Overview

To sponsor a TRC-20 transfer (for example USDT) with the Gas Station, pass the gas station's resource name as sponsor in an assetTransfer. The Gas Station, powered by Tronex, rents the energy and bandwidth the transfer needs and delegates them to the sending wallet, so no TRX is burned from that wallet.

One dedicated endpoint covers the Gas Station itself. The transfer flow uses the standard transaction endpoints.

EndpointMethod and pathUse it to
ListGasStationsGET /v2/vaults/{vault_id}/gasStationsGet the gas station's resource name, deposit address, balance and alert threshold
InitiateTransactionPOST /v2/vaults/{vault_id}/transactions:initiateTop up the gas station, and create sponsored transfers
GetTransactionGET /v2/vaults/{vault_id}/transactions/{transaction_id}Track the transfer. request.gasStation shows the sponsor

Base URL: https://api.utila.io. All calls need a service account bearer token.

Resource names returned by the API are already paths, append them after /v2/.

name:  vaults/abc123/transactions/tx789
call:  GET https://api.utila.io/v2/vaults/abc123/transactions/tx789

Overview of the sequence

1. List gas stations and store the name and deposit address
2. Fund the deposit address with USDT, sponsored by the gas station
3. Estimate the fee, then initiate a sponsored TRC-20 transfer
4. After signing, track the transaction to CONFIRMED

Prerequisites

Complete the console setup in the TRON Gas Station help article before making any API call.

The API can read and use a gas station, but it cannot create or configure one.

  1. Create the gas station. Go to Vault Settings → Gas Stations → Create deposit address. It is created without a confirmation prompt and cannot be undone.
  2. Prepare the deposit address. Save it in your address book and adjust your transaction policy so transfers to it are allowed.
  3. Choose where to fund it. Use Top up Gas Station in the console, or fund it through the API in Step 2. Either way, deposits cannot be withdrawn.
  4. Set an alert threshold so you are notified when the balance runs low.
  5. Have a signer ready. The matching Transaction Policy rule is a Transfer rule on the source wallet and the token amount. A signer allowed by that rule signs the transfer. The gas station is not the source.

When this is done, Step 1 confirms the setup through the API.

Step 1 - Find your gas station

Call ListGasStations once and store two values: the gas station name and its deposit address.

GET /v2/vaults/{vault_id}/gasStations

Response:

{
  "gasStations": [
    {
      "name": "vaults/abc123/gasStations/gs456",
      "network": "networks/tron-mainnet",
      "provider": "TRONEX",
      "balance": "15",
      "balanceAsset": "<asset resource name>",
      "alertThreshold": 50,
      "depositAddresses": [
        {
          "depositAddress": { "value": "T..." },
          "supportedAssets": ["<asset resource name>", "<asset resource name>"]
        }
      ]
    }
  ]
}
FieldWhat it isUsed in
nameResource name, vaults/{vault_id}/gasStations/{gas_station_id}. The last segment is the gas_station_id.sponsor in Steps 2 and 3
depositAddresses[].depositAddress.valueThe address you send top-ups to. Use this, not the deprecated depositAddressDeprecated.Step 2
depositAddresses[].supportedAssetsThe assets that deposit address accepts.Step 2
balanceCached balance, in balanceAsset units.Monitoring
balanceAssetThe asset the balance and alert threshold are measured in.Monitoring
alertThresholdBalance level that triggers a low-balance alert. Not set = no alert.Monitoring

Step 2 - Fund the gas station

Fund the gas station with USDT and set the gas station itself as sponsor, so your vault never needs to hold TRX.

  1. A new gas station starts with a 15 TRX balance. That balance pays the fee of your first top-up.
  2. Send USDT from a vault wallet to the deposit address from Step 1, with sponsor set to the gas station name.
  3. From then on, the gas station balance pays for later transfers, including later USDT top-ups.
POST /v2/vaults/{vault_id}/transactions:initiate
{
  "details": {
    "assetTransfer": {
      "asset": "assets/trc20.tron-mainnet.TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "amount": "100",
      "source": "vaults/abc123/wallets/treasury",
      "destination": "TXyz...deposit",
      "sponsor": "vaults/abc123/gasStations/gs456"
    }
  },
  "note": "Gas Station top-up - sponsored by Gas Station"
}
  • Minimum per deposit: 50 USDT, or 150 TRX. Check supportedAssets from Step 1 for the exact asset names.
  • Deposits cannot be withdrawn. Fund only what you expect to use in the near term and top up as you go.
  • Top up before it runs out. A sponsored top-up is paid from the gas station balance. Once the balance is empty, the source wallet needs its own TRX to send a top-up, and other transfers burn TRX from their wallets. Use the console alert threshold as your signal.
  • Policy: the top-up goes through your transaction policy like any transfer. Add the deposit address to your address book (BatchCreateAddressBookEntries) and make sure a rule allows transfers to it.

Funding with TRX. Use TRX only if your vault already holds it. Send assets/native.tron-mainnet to the same deposit address without a sponsor. A plain TRX transfer uses only bandwidth, which the wallet's free daily allowance often covers, so it is cheaper to send than a USDT top-up. Don't buy TRX just to fund the gas station.

Step 3 - Create a sponsored transfer

On TRON, the sponsor of an assetTransfer must be a gas station in the same vault. A wallet or address cannot be the sponsor.

To preview resource needs before creating the transfer, send the same details to EstimateTransactionFee. The response includes a tronFee breakdown with energy and bandwidth, and totalFee in TRX.

POST /v2/vaults/{vault_id}/transactions:estimateFee
{
  "details": {
    "assetTransfer": {
      "asset": "assets/trc20.tron-mainnet.TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "amount": "250",
      "source": "vaults/abc123/wallets/deposit",
      "destination": "TXyz...recipient",
      "sponsor": "vaults/abc123/gasStations/gs456"
    }
  }
}

Response:

{
  "tronFee": {
    "bandwidthUsed": "345",
    "energyUsed": "131000"
  },
  "totalFee": "6.45"
}

Create the transfer with the same details and set sponsor to the gas station name from Step 1.

POST /v2/vaults/{vault_id}/transactions:initiate
{
  "details": {
    "assetTransfer": {
      "asset": "assets/trc20.tron-mainnet.TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
      "amount": "250",
      "source": "vaults/abc123/wallets/deposit",
      "destination": "TXyz...recipient",
      "sponsor": "vaults/abc123/gasStations/gs456"
    }
  },
  "note": "USDT payout - sponsored by Gas Station"
}

Save transaction.name. You use it in Step 4. transaction.request.gasStation is the gas station sponsoring the transfer.

Step 4 - Sign and track the transfer

The transfer matches a Transfer rule in your transaction policy, on the source wallet and the token amount. A signer allowed by that rule signs it. After signing, Utila rents the energy and bandwidth, delegates them to the sending wallet, and publishes the transfer.

GET /v2/vaults/{vault_id}/transactions/{transaction_id}

request.gasStation is the gas station from Step 3.

Happy path:

AWAITING_POLICY_CHECK → AWAITING_SIGNATURE → SIGNED → AWAITING_PUBLISH → PUBLISHED → MINED → CONFIRMED

Policy-gated vaults may include AWAITING_APPROVAL before signing. For production, subscribe to transaction webhooks instead of polling.

How fees are calculated

For the full explanation, see How fees are calculated in the TRON Gas Station help article.

Console-only actions, limits and troubleshooting

Creating the gas station and setting its alert threshold are done in the console; the API reads both but cannot change them.

ActionAPIConsole
Activate the featureNoNo, ask your Customer Success Manager
Create a gas stationNoYes, cannot be undone
Read gas station, deposit address, balanceListGasStationsYes
Top upInitiateTransaction (assetTransfer, sponsored by the gas station)Yes, Top up Gas Station
Set alert thresholdNo, read-only in ListGasStationsYes
Sponsor a transferInitiateTransaction with sponsorYes, select the Gas Station as sponsor
Withdraw deposited fundsNoNo, deposits are final

Troubleshooting

  • Transfer rejected because of the sponsor: on TRON the sponsor must be a gas station in the same vault. Check that sponsor is the full name from ListGasStations, not a wallet or the deposit address.
  • Signed transfer stays unpublished: request.gasStationOrder names the resource rental. GET that name. If order.state is FAILED, order.error has the reason. Check the gas station balance and top up if it is low.
  • Top-up blocked: your transaction policy needs a rule allowing transfers to the gas station deposit address.