Skip to main content

Rewards & History

My Subscription Records

Query all subscription records for the authenticated user.

Authentication Required
Authorization: Bearer <JWT_TOKEN>
GET /earn/subscriptions

Response

Returns an array of UserSubscriptionDetail objects. Returns empty array [] if the user has no subscriptions.

[
{
"id": "a1b2c3d4-...",
"product_id": "123204f6-...",
"product_name": "USDT Earn 900% APY",
"chain_product_id": 1769524310,
"amount": "100000000",
"nft_amount": "100000000",
"expected_return": "855",
"actual_return": "855",
"total_return": "100000855",
"nft_status": "matured",
"claimed": false,
"product_status": "settled",
"annual_rate": "900.00%",
"period_rate": "0.00%",
"subscribed_at": "2026-01-27T14:35:00Z",
"settle_time": "2026-01-27T14:43:00Z",
"settled_at": "2026-01-27T14:43:12Z",
"claimed_at": null,
"subscribe_tx_hash": "0xabc...",
"claim_tx_hash": null
}
]

Subscription Fields (UserSubscriptionDetail)

FieldTypeDescription
idstringSubscription record UUID
product_idstringProduct UUID
product_namestringProduct name
chain_product_idnumberOn-chain product ID
amountstringSubscription amount (Wei)
nft_amountstringNFT holding amount
expected_returnstringExpected interest (Wei)
actual_returnstring | nullActual interest (available after settlement)
total_returnstringTotal claimable amount: principal + interest (Wei)
nft_statusstringNFT status: created / active / matured / redeemed
claimedbooleanWhether claimed
product_statusstringParent product status
annual_ratestringAnnual rate at subscription time
period_ratestringPeriod rate
subscribed_atstringSubscription time (ISO 8601)
settle_timestringExpected settlement time (ISO 8601)
settled_atstring | nullActual settlement time
claimed_atstring | nullClaim time
subscribe_tx_hashstring | nullOn-chain subscription tx hash
claim_tx_hashstring | nullOn-chain claim tx hash

Interpreting Subscription Status

Use the combination of nft_status, claimed, and product_status to determine actionable state:

nft_statusclaimedproduct_statusUser Action
activefalseactiveWaiting — funds locked
maturedfalsesettledCan claim — call claim(productId)
redeemedtruesettled / endedCompleted — already claimed
activefalsecancelledCan emergency refund — call emergencyClaim(productId)

Historical Performance

Get historical performance data for ended products. Useful for displaying platform track record.

GET /earn/performance

Query Parameters

ParameterTypeRequiredDescription
limitnumberNoNumber of results, default 10

Response

Returns an array of HistoricalPerformance objects, sorted from most recent to oldest. Returns empty array [] if no historical data exists.

[
{
"product_name": "USDT Earn 50% APY",
"duration_seconds": 2592000,
"annual_rate": "50.00%",
"period_rate": "4.11%",
"total_subscribed": "10000000000",
"total_interest_paid": "411000000",
"subscriber_count": 256,
"settled_at": "2026-01-15T00:00:00Z"
}
]

Performance Fields (HistoricalPerformance)

FieldTypeDescription
product_namestringProduct name
duration_secondsnumberLock duration in seconds
annual_ratestringAnnual yield rate
period_ratestringActual period yield rate
total_subscribedstringTotal subscribed amount (Wei)
total_interest_paidstringTotal interest distributed (Wei)
subscriber_countnumberNumber of participants
settled_atstringSettlement time (ISO 8601)
tip

Performance data is cached server-side for 60 seconds. Repeated requests within this window return cached results.

Display Conversion

Code Examples

Python — My Subscriptions (JWT Required)

import requests

BASE_URL = "https://api.ztdx.io"
JWT_TOKEN = "your_jwt_token"

resp = requests.get(
f"{BASE_URL}/earn/subscriptions",
headers={"Authorization": f"Bearer {JWT_TOKEN}"},
)
for sub in resp.json():
status = f"{sub['nft_status']}, claimed={sub['claimed']}"
amount_usdt = int(sub['amount']) / 1e6
print(f" {sub['product_name']}{amount_usdt:.2f} USDT, status={status}")
if sub['nft_status'] == 'matured' and not sub['claimed']:
print(f" ↳ Ready to claim! call earnContract.claim({sub['chain_product_id']})")

Python — Historical Performance (Public)

import requests

BASE_URL = "https://api.ztdx.io"

resp = requests.get(f"{BASE_URL}/earn/performance", params={"limit": 5})
for perf in resp.json():
total = int(perf['total_subscribed']) / 1e6
interest = int(perf['total_interest_paid']) / 1e6
days = perf['duration_seconds'] / 86400
print(f" {perf['product_name']} — APY: {perf['annual_rate']}, {days:.0f}d, "
f"Subscribed: {total:.2f} USDT, Interest: {interest:.2f} USDT")

Display Conversion

// Convert Wei amounts for display
const totalSubscribedUSDT = (parseInt(total_subscribed) / 1_000_000).toFixed(2);
const totalInterestUSDT = (parseInt(total_interest_paid) / 1_000_000).toFixed(2);

// Convert duration to human-readable
const durationDays = (duration_seconds / 86400).toFixed(0);

// Example:
// total_subscribed: "10000000000" → "10000.00 USDT"
// total_interest_paid: "411000000" → "411.00 USDT"
// duration_seconds: 2592000 → "30 days"