TEnergy vs FeeSaver: price, speed and API compared
The widest tier ladder — 15 minutes to a month — at 3.25 TRX per 65,000 energy for an hour, with white-label and bandwidth products.
- Off-peak until 11:00 UTC UTC
- 1h energy 20 SUN
- 65k · 1h 1.30 TRX
If you already run against FeeSaver, the switch is a constructor change: Your token becomes a key and a secret. Call sites keep their shape; 1w and 1m rentals have no equivalent here. The table below is every difference we can state as a fact, and the section after it is what FeeSaver does that we do not.
Side by side
| Dimension | FeeSaver | TEnergy |
|---|---|---|
| Tiers | 15m, 1h, 3h, 24h, 3d, 1w, 1m | 5m, 1h, 1d today; 3d and 30d in phase 2. 1w and 1m are deliberately not offered |
| Price, 65,000 energy, 1 hour | 3.25 TRX | 1.30 TRX off-peak, 1.95 TRX at peak |
| Auto-refill | Auto-replenish | Subscriptions in phase 2 |
| Bandwidth | Sold | Sold, at 400 SUN per point per day |
| White label | Offered | Not a phase-1 product |
| Credential | A token, passed in the query string | A key and a secret; the secret never travels in a URL |
| Idempotency | None | client_order_id on every order |
| Documentation | Postman collection | Published OpenAPI contract |
| Testnet | None | Nile, on a separate host with separate keys |
What FeeSaver does that we do not
- Rental windows we do not sell: 3 hours, one week and one month. If you rent by the week, we cannot serve you without a product change — say so before you switch.
- White-label and a smart mode built around auto-replenishment.
Migration in 5 minutes
Install @tenergy/feesaver-compat, change the constructor, and your call
sites keep working. The block below is the migration guide itself — it is generated from the
compatibility documentation, so it cannot drift from the shim that implements it.
1. npm install @tenergy/feesaver-compat. 2. Swap the client — your `token` becomes a key and a secret:
- const fs = new FeeSaverClient({ token: process.env.FEESAVER_TOKEN,
- baseUrl: 'https://api.feesaver.com' });
+ const fs = new FeeSaverCompatClient({ apiKey: process.env.TENERGY_KEY,
+ apiSecret: process.env.TENERGY_SECRET, baseUrl: 'https://api.tenergy.me' });If you wrote raw fetch calls with ?token=…, the facade also accepts a token option holding "<key>:<secret>" so you can keep one environment variable during the switch; move to two when you can — the point of this migration is that the secret stops travelling. Call sites keep their shape: fs.buyEnergy({ days: '1h', volume: 65000, target: 'TQn9…' }), then if (order.err) throw new Error(order.err) and order.order_id / .summa / .txid / .status.
3. Check your durations. We sell 5m, 15m, 1h, 1d, 3d, 30d. If you buy 1w or 1m rentals through combinateOrder, there is no equivalent and the call will fail — talk to us before switching; this one needs a product decision, not a code change. 4. Add a `clientOrderId` — one argument (clientOrderId: \invoice-${invoiceId}\`) and the double-purchase risk you have been living with is gone: retry the identical call after a timeout and you get the original order back instead of a second purchase. FeeSaver had no way to do this. **5. Rehearse on Nile:** baseUrl: 'https://api-nile.tenergy.me'` with testnet keys — your first chance to test a payout flow without spending.
Behaves differently: 1 1w and 1m rentals do not exist here (step 3). 2 a failed order reads status: "Created" with err set — FeeSaver had no failure status, so we could not add one without breaking the vocabulary; check err. 3 order_id is a synthesised integer by default, mapped in the facade's local store — set numericOrderIds: false to get our real string ids and fix your column, better done early. 4 combinateOrder's items[] is synthesised from our delegation hashes and our chunk boundaries are not FeeSaver's, so per-chunk reconciliation will not line up. 5 two err strings are ours, not FeeSaver's — Insufficient balance and Rate limited; rate limiting also returns HTTP 429, not 404, so a retry loop backs off. 6 smartMode becomes a refill subscription with a different billing shape (per-refill plus a daily fee rather than a bundled price) — compare the numbers before switching a high-volume address. 7 precountCommission assumes your configured address as the sender; set defaultFromAddress if you send from more than one.
Then leave the facade: the native API gives you signed webhooks instead of polling /status, real order ids, real error codes, price quotes that pin a number, per-order price caps, batch orders for up to 100 receivers in one call, and — most relevant here — a credential that never appears in a URL.