TEnergy vs CatFee: price, speed and API compared

The price reference for the one-hour tier: 20 SUN/unit off-peak (08–20 UTC+8) and 30 SUN/unit at peak, with the widest product range in this market.

  • Off-peak until 11:00 UTC UTC
  • 1h energy 20 SUN
  • 65k · 1h 1.30 TRX

If you already run against CatFee, the switch is a constructor change: Swap the constructor and three header names. For GET requests the signed string is byte-for-byte what you already compute. The table below is every difference we can state as a fact, and the section after it is what CatFee does that we do not.

Every CatFee fact on this page was measured on 2026-09-11 and is re-measured quarterly. Prices move; if something here is out of date, it is our error and we want to hear about it at support. Source: https://catfee.io/.

Side by side

DimensionCatFeeTEnergy
Tiers1 hour only in the widget5m, 1h and 1d today; 3d and 30d in phase 2
Price, 65,000 energy, 1 hour1.30 TRX off-peak, 1.95 TRX at peakThe same numbers — the floor is their live price for the same tier and day-part
Activation1.2 TRX1.20 TRX
Direct transfer3 TRX = 65,000 energy3.00 TRX = 65,000 energy
Batch sizeUp to 20 addressesUp to 100 receivers in one batch
AuthCF-ACCESS-KEY / CF-ACCESS-SIGN / CF-ACCESS-TIMESTAMP, 5 s clock toleranceX-API-KEY / X-API-TIMESTAMP / X-API-SIGN, 5 s clock tolerance
Signed stringbase64(HMAC-SHA256(ts + method + path?query, secret)), all params in the queryThe same, plus the body — which is empty on the endpoints you are already calling
WebhooksX-EVENT-ID / TYPE / VERSION, 10 retries, no documented signatureThe same retry schedule, signed — and there is no unsigned mode
Idempotencyclient_order_idclient_order_id, plus Idempotency-Key elsewhere
Testnetnile.catfee.ioapi-nile.tenergy.me, separate keys and ledger
Agent surfacellms.txt and llms-full.txt publishedllms.txt, llms-full.txt, quickstart.json, MCP server

What CatFee does that we do not

  • The broadest product range here: TRON Mate auto-refill, Flash Refill, Seamless Energy, a Telegram bot builder, a staking vault, Flash Unstake and a C2C partner programme.
  • They publish llms.txt and llms-full.txt already — the only pool in this market that does.
  • A large bilingual documentation tree, in English and Chinese.

Migration in 5 minutes

Install @tenergy/catfee-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. Install: npm install @tenergy/catfee-compat. 2. Swap the constructor; nothing else in your file changes:

- const catfee = new CatFeeClient({ apiKey: process.env.CATFEE_KEY,
-   apiSecret: process.env.CATFEE_SECRET, baseUrl: 'https://api.catfee.io' });
+ const catfee = new CatFeeCompatClient({ apiKey: process.env.TENERGY_KEY,
+   apiSecret: process.env.TENERGY_SECRET, baseUrl: 'https://api.tenergy.me' });

Call sites keep working (catfee.createOrder({quantity, receiver, duration, client_order_id}), then order.code === 0 && order.data.confirm_status === 'DELEGATION_CONFIRMED'). Raw HTTP instead of an SDK: change the three header names (CF-ACCESS-* → X-API-*) and the base URL; the signed string gains the body, which for these endpoints is empty, so for GETs the computation is byte-for-byte what you have.

3. Check your clock. Tolerance is ±5 s, tighter than CatFee's; 1003 returns our clock in details.server_time. 4. Add webhook signature verification — the only change we cannot do for you, fifteen lines copied from ../api/webhooks.md:

const ok = verifyWebhook(rawBody, req.headers, process.env.TENERGY_WEBHOOK_SECRET);
if (!ok) return res.status(400).end();

The retry schedule is identical to CatFee's, so your backoff assumptions hold. 5. Test against Nile first: https://api-nile.tenergy.me, separate host and keys.

Behaves differently, most noticeable first: 1 webhooks are signed — verify them. 2 clock tolerance ±5 s, not 30 s. 3 data.api_secret is empty — read your secret from config. 4 data.staked_sun, energy_flash_price, bandwidth_flash_price are 0. 5 order minimums are lower — check GET /v1/prices rather than hardcoding 65 000. 6 data.balance costs an extra round trip — set fetchBalanceWithOrder: false if unused.

Leaving the facade: it is a shim, not a destination. The native client exposes real HTTP statuses, typed errors, batch orders for up to 100 receivers, auto-refill subscriptions, quotes that pin a price, and per-order price caps — none expressible in CatFee's shape. Move endpoint by endpoint; the two clients share a connection pool and run side by side in one process.