Up/Down

My Up/Down Summary

GET
/api/v1/me/updown
Alias of GET /api/v1/wallet/{address}/updown for the authenticated wallet. Aggregate Up/Down bet and claim summary across every listed asset and all timeframes, the claimable bets (which rounds to claim; no payout quote), the number of claimable positions per settle asset, and a cursor-paged history, all from the database (?cursor=blockNumber:logIndex&limit=, max 100; it used to return everything). Multi-bet on the same round counts as one position for win/loss tallying.
Auth: Session or API Key

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.

Response
{
  "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).

200 Summary returned401 Not authenticated502 Database read failed (db_failed)503 Not deployed on this network