Manage Earn Instruments
client.http.finance covers Bybit's earn products: fixed_saving, easy_onchain,
hold_to_earn, advanced_earn, and byusdt. They share the same list/position/subscribe/redeem
shape; this guide works through fixed_saving as the worked example. Listing products is
public; everything else needs credentials — see API Keys Setup.
List Available Products
finance.fixed_saving.product needs no authentication:
from typed_bybit import Bybit
async with Bybit.new(public=True) as client:
products = await client.http.finance.fixed_saving.product(coin='USDT')
for product in products['list']:
print(product['productId'], product['category'], product['duration'], product['status'])Omit coin to list every coin's products. category is one of 'FixedTermSaving',
'FundPool', or 'FundPoolPremium' — only 'FundPool' positions support early redemption.
List Your Positions
finance.fixed_saving.position requires the API key's "Earn" permission:
from typed_bybit import Bybit
async with Bybit.new() as client:
positions = await client.http.finance.fixed_saving.position(category='FundPool')
for position in positions['list']:
print(position['positionId'], position['coin'], position['amount'], position['status'])Filter with product_id and/or coin instead of category to narrow further; all three are
optional and combine as filters.
Subscribe
finance.fixed_saving.place_order takes one request dict and stakes into a product. Supply your
own orderLinkId, up to 36 characters, as an idempotency key — Bybit rejects the call if you
reuse one:
import uuid
from typed_bybit import Bybit
async with Bybit.new() as client:
order = await client.http.finance.fixed_saving.place_order({
'productId': '10001',
'category': 'FundPool',
'coin': 'USDT',
'amount': '100',
'accountType': 'UNIFIED',
'orderLinkId': str(uuid.uuid4()),
})
print(order['orderId'], order['orderLinkId'])accountType is 'FUND' or 'UNIFIED' and picks which wallet funds the stake. Get productId
from finance.fixed_saving.product.
Redeem Early
finance.fixed_saving.redeem only works on a 'FundPool' position — FixedTermSaving and
FundPoolPremium positions run to maturity instead:
from typed_bybit import Bybit
async with Bybit.new() as client:
redemption = await client.http.finance.fixed_saving.redeem({
'productId': '10001',
'category': 'FundPool',
'positionId': '20001',
})
print(redemption['redeemAmount'], redemption['estEarnings'])Both fields in the result are estimates: the redeemed principal and the earnings paid out at the early-redemption APY, which is usually lower than the product's full-term rate.