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.
Side by side
| Dimension | CatFee | TEnergy |
|---|---|---|
| Tiers | 1 hour only in the widget | 5m, 1h and 1d today; 3d and 30d in phase 2 |
| Price, 65,000 energy, 1 hour | 1.30 TRX off-peak, 1.95 TRX at peak | The same numbers — the floor is their live price for the same tier and day-part |
| Activation | 1.2 TRX | 1.20 TRX |
| Direct transfer | 3 TRX = 65,000 energy | 3.00 TRX = 65,000 energy |
| Batch size | Up to 20 addresses | Up to 100 receivers in one batch |
| Auth | CF-ACCESS-KEY / CF-ACCESS-SIGN / CF-ACCESS-TIMESTAMP, 5 s clock tolerance | X-API-KEY / X-API-TIMESTAMP / X-API-SIGN, 5 s clock tolerance |
| Signed string | base64(HMAC-SHA256(ts + method + path?query, secret)), all params in the query | The same, plus the body — which is empty on the endpoints you are already calling |
| Webhooks | X-EVENT-ID / TYPE / VERSION, 10 retries, no documented signature | The same retry schedule, signed — and there is no unsigned mode |
| Idempotency | client_order_id | client_order_id, plus Idempotency-Key elsewhere |
| Testnet | nile.catfee.io | api-nile.tenergy.me, separate keys and ledger |
| Agent surface | llms.txt and llms-full.txt published | llms.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.