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.
| Endpoint | Method and path | Use it to |
|---|---|---|
| ListGasStations | GET /v2/vaults/{vault_id}/gasStations | Get the gas station's resource name, deposit address, balance and alert threshold |
| InitiateTransaction | POST /v2/vaults/{vault_id}/transactions:initiate | Top up the gas station, and create sponsored transfers |
| GetTransaction | GET /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.
- Create the gas station. Go to Vault Settings → Gas Stations → Create deposit address. It is created without a confirmation prompt and cannot be undone.
- Prepare the deposit address. Save it in your address book and adjust your transaction policy so transfers to it are allowed.
- 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.
- Set an alert threshold so you are notified when the balance runs low.
- 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>"]
}
]
}
]
}| Field | What it is | Used in |
|---|---|---|
name | Resource name, vaults/{vault_id}/gasStations/{gas_station_id}. The last segment is the gas_station_id. | sponsor in Steps 2 and 3 |
depositAddresses[].depositAddress.value | The address you send top-ups to. Use this, not the deprecated depositAddressDeprecated. | Step 2 |
depositAddresses[].supportedAssets | The assets that deposit address accepts. | Step 2 |
balance | Cached balance, in balanceAsset units. | Monitoring |
balanceAsset | The asset the balance and alert threshold are measured in. | Monitoring |
alertThreshold | Balance 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.
- A new gas station starts with a 15 TRX balance. That balance pays the fee of your first top-up.
- Send USDT from a vault wallet to the deposit address from Step 1, with
sponsorset to the gas stationname. - 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
supportedAssetsfrom 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.
| Action | API | Console |
|---|---|---|
| Activate the feature | No | No, ask your Customer Success Manager |
| Create a gas station | No | Yes, cannot be undone |
| Read gas station, deposit address, balance | ListGasStations | Yes |
| Top up | InitiateTransaction (assetTransfer, sponsored by the gas station) | Yes, Top up Gas Station |
| Set alert threshold | No, read-only in ListGasStations | Yes |
| Sponsor a transfer | InitiateTransaction with sponsor | Yes, select the Gas Station as sponsor |
| Withdraw deposited funds | No | No, 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
sponsoris the fullnamefrom ListGasStations, not a wallet or the deposit address. - Signed transfer stays unpublished:
request.gasStationOrdernames the resource rental.GETthat name. Iforder.stateisFAILED,order.errorhas 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.
