Skip to main content
The wallet tracker lets you pull a unified view of prediction market activity for any wallet address. Instead of querying six different platform APIs, you make one call to Predexy and get back positions and trade history across all supported platforms, aggregated with totals. This is useful for building portfolio dashboards, PnL tracking tools, or monitoring a wallet you don’t own.

Endpoint

GET https://api.predexy.com/api/v1/wallet-tracker/{address}
The {address} path parameter is an Ethereum wallet address. It is used directly for lookups on Polymarket, Predict.fun, Azuro, and Limitless. Authentication: session JWT via Authorization: Bearer <token> or the predex_siwe cookie from a SIWE wallet session.

Supported platforms

PlatformIdentifierNotes
PolymarketEthereum address (path)EVM-based, requires your wallet address
Predict.funEthereum address (path)EVM-based, requires your wallet address
AzuroEthereum address (path)EVM-based, requires your wallet address
LimitlessEthereum address (path)EVM-based, requires your wallet address
DriftSolana address (?solana=)Pass your Solana address as a query parameter
ManifoldUsername (?manifold=)Manifold uses usernames, not wallet addresses
Polymarket, Predict.fun, Azuro, and Limitless all use your Ethereum address from the path. To also track Drift or Manifold positions in the same call, pass the optional solana and manifold query parameters.

Query parameters

ParameterRequiredDescription
addressYes (path)Ethereum wallet address
solanaNoSolana wallet address for Drift BET positions
manifoldNoManifold Markets username

Example request

curl "https://api.predexy.com/api/v1/wallet-tracker/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\
?solana=9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT\
&manifold=SatoshiNakamoto" \
  -H "Authorization: Bearer <your-session-jwt>"

Sample response

{
  "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "solanaAddress": "9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT",
  "manifoldUser": "SatoshiNakamoto",
  "platforms": {
    "polymarket": {
      "positions": [
        {
          "platform": "polymarket",
          "marketTitle": "Will BTC reach $100k by 2026?",
          "marketUrl": "https://polymarket.com/event/will-btc-reach-100k-by-2026",
          "outcome": "Yes",
          "size": 250.00,
          "avgPrice": 0.42,
          "currentPrice": 0.48,
          "currentValue": 120.00,
          "pnl": 15.00,
          "pnlPercent": 14.28,
          "status": "open",
          "endDate": "2026-12-31",
          "platformMarketId": "0x1234abcd",
          "fee": 0.02,
          "timestamp": "2026-03-15T09:20:00Z"
        }
      ],
      "history": [
        {
          "platform": "polymarket",
          "type": "BUY",
          "side": "BUY",
          "marketTitle": "Will BTC reach $100k by 2026?",
          "marketUrl": "https://polymarket.com/event/will-btc-reach-100k-by-2026",
          "outcome": "Yes",
          "price": 0.42,
          "size": 250.00,
          "usdcSize": 105.00,
          "status": "confirmed",
          "transactionHash": "0xabc123def456...",
          "platformMarketId": "0x1234abcd",
          "timestamp": "2026-03-15T09:20:00Z",
          "icon": "https://polymarket.com/images/btc.png"
        }
      ],
      "totalValue": 120.00,
      "totalPnL": 15.00,
      "positionCount": 1
    },
    "manifold": {
      "positions": [],
      "history": [],
      "totalValue": 0,
      "totalPnL": 0,
      "positionCount": 0
    },
    "azuro": {
      "positions": [],
      "history": [],
      "totalValue": 0,
      "totalPnL": 0,
      "positionCount": 0,
      "error": "No bets found for this address"
    }
  },
  "summary": {
    "totalValue": 120.00,
    "totalPnL": 15.00,
    "totalPositions": 1,
    "activePlatforms": 1
  }
}

Response structure

Top-level fields

FieldDescription
addressThe Ethereum address that was queried
solanaAddressSolana address (if provided)
manifoldUserManifold username (if provided)
platformsObject keyed by platform slug, each containing positions and history
summaryAggregated totals across all platforms

TrackedPosition fields

Each object in a platform’s positions array:
FieldDescription
platformPlatform slug (polymarket, predictfun, azuro, drift, manifold, limitless)
marketTitleHuman-readable market title
marketUrlDirect link to the market on the platform
outcomeThe outcome held (e.g. Yes, No, Buy, Portfolio)
sizeNumber of shares or amount invested
avgPriceAverage entry price
currentPriceCurrent market price for this outcome
currentValueCurrent value of the position
pnlProfit or loss in base currency
pnlPercentPnL as a percentage of entry value
statusopen, closed, or resolved
endDateMarket expiry date
platformMarketIdPlatform’s own market identifier
feeFee paid on entry
timestampWhen the position was opened
resolutionResolution outcome for resolved Manifold markets (e.g. YES, NO)

TradeHistoryItem fields

Each object in a platform’s history array:
FieldDescription
platformPlatform slug
typeTrade type: BUY, SELL, BET, REDEMPTION
sideSide of the trade: BUY, SELL, YES, NO
marketTitleMarket title
marketUrlDirect link to the market
outcomeOutcome traded
pricePrice at execution
sizeNumber of shares
amountAmount wagered (Manifold, Azuro)
usdcSizeUSDC value of the trade (Polymarket)
sharesShares received (Manifold)
oddsDecimal odds at bet time (Azuro)
potentialPayoutMaximum payout if bet wins (Azuro)
probBefore / probAfterMarket probability before and after trade (Manifold)
resultBet result on Azuro: won or lost
isRedeemedWhether winnings were redeemed (Azuro)
transactionHashOn-chain transaction hash (Polymarket)
statusTrade status
timestampWhen the trade occurred
resolvedAtWhen the bet was resolved (Azuro)
For Polymarket trades, the transactionHash field contains the on-chain Polygon transaction hash. You can verify the trade independently on any Polygon block explorer by looking up this hash.

Error handling per platform

If a platform’s lookup fails (e.g. the upstream API is unavailable), the response still returns 200. The platform object includes an error string describing what went wrong, and its positions and history arrays will be empty. Check for the error field in each platform block when processing results.
for platform_slug, platform_data in data["platforms"].items():
    if "error" in platform_data and platform_data["error"]:
        print(f"{platform_slug}: {platform_data['error']}")
    else:
        print(f"{platform_slug}: {platform_data['positionCount']} positions")
Results are cached for 60 seconds. Repeated calls within that window return the cached result.