My Up/Down Summary
All numbers are decimal strings. Stakes are amounts of the asset's pool token (18 decimals). Payouts and refunds are paid in the asset's settle asset (its main's pair asset), in that asset's decimals: payouts lists them per settle asset. A stake (pool tokens) and a payout (settle asset) are different units, so "am I up or down" is netBySettle (per settle asset, over closed positions paid in that asset) or netUsdE18 (USD × 1e18, null when a USD value is unknown). A no-winner round (nobody on the winning side) still reads bull_wins / bear_wins and refunds every bet. A claim can be partial (remainingPoolTokens). totalStake adds across assets' pool tokens; use stakes[] per asset or stakeUsdE18. stakeUsdE18 is the USD of what was paid (gross input, fee included) at bet time. Each USD total has its own source field (stakeUsdSource, payoutUsdSource, netUsdSource), null when the rows use different sources. Fields ending in Usdb are deprecated aliases: they are not USDB.
summaryCapped is true when the wallet has more than 50,000 bets or more than 50,000 claims. The summary figures, active bets and claimable list then cover the newest 50,000 of each, a recent window rather than the full record. The paged history is not cut.
{
"wallet": "0x1234...abcd",
"summaryCapped": false,
"totalBetEvents": 27,
"distinctRoundsBet": 18,
"totalStake": "12500000000000000000",
"stakes": [{ "token": "btc", "asset": 0, "poolToken": "0x…", "amount": "12500000000000000000" }],
"stakeUsdE18": "12500000000000000000",
"stakeUsdSource": "feed",
"payouts": [
{ "settle": "0x...", "pairAsset": "0x...", "pairSymbol": "USDG", "pairDecimals": 6, "amount": "15000000" }
],
"payoutUsdE18": "15000000000000000000",
"payoutUsdSource": "feed",
"netUsdE18": "2500000000000000000",
"netUsdSource": "feed",
"netBySettle": [
{ "settle": "0x...", "pairSymbol": "USDG", "pairDecimals": 6, "amount": "2500000", "positions": 15 }
],
"totalStakeUsdb": "12500000000000000000",
"totalPayoutUsdb": "15000000",
"netUsdb": "2500000000000000000",
"wins": 7,
"losses": 8,
"refunds": 1,
"activeBetsCount": 2,
"claimableCount": 1,
"activeBets": [
{
"token": "btc",
"contract": "0x...",
"asset": 0,
"main": "0x...",
"settle": "0x...",
"pairAsset": "0x...",
"pairDecimals": 6,
"tf": 2,
"roundId": 14,
"side": "bull",
"stakeUsdb": "1000000000000000000",
"stakePoolTokens": "1000000000000000000",
"paid": [{ "inputToken": "0x...", "amount": "1010000000000000000" }],
"placedAt": "2026-04-30T18:42:11.000Z",
"endTime": "2026-04-30T19:00:00.000Z"
}
],
"claimableBets": [
{
"token": "btc",
"contract": "0x...",
"asset": 0,
"main": "0x...",
"settle": "0x...",
"pairAsset": "0x...",
"pairDecimals": 6,
"tf": 0,
"roundId": 12,
"side": "bear",
"stakeUsdb": "500000000000000000",
"stakePoolTokens": "500000000000000000",
"paid": [{ "inputToken": "0x...", "amount": "505000000000000000" }],
"outcome": "bear_wins",
"refund": false,
"partlyClaimed": false,
"remainingPoolTokens": null
}
],
"unclaimed": [{ "settle": "0x...", "pairAsset": "0x...", "pairSymbol": "USDG", "pairDecimals": 6, "positions": 1 }]
}The API does not quote payouts. For the amount a claimableBets entry will pay, call quoteClaimPayout(asset, tf, roundId, user) on the MultiPrediction contract, one multicall over every claimable round (the SDK's upDown.quoteClaimPayout). It returns an amount of the asset's settle asset (assets(asset).settle), in that token's decimals; 0 means "not quotable right now", not "nothing to claim". Then the wallet sends claim(asset, tf, roundId, 10000, 1, minOut) itself. An open bet on a round the index has not stored yet has endTime null (getRound(asset, tf, roundId).endTime on chain).