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.
| Platform | Identifier | Notes |
|---|
| Polymarket | Ethereum address (path) | EVM-based, requires your wallet address |
| Predict.fun | Ethereum address (path) | EVM-based, requires your wallet address |
| Azuro | Ethereum address (path) | EVM-based, requires your wallet address |
| Limitless | Ethereum address (path) | EVM-based, requires your wallet address |
| Drift | Solana address (?solana=) | Pass your Solana address as a query parameter |
| Manifold | Username (?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
| Parameter | Required | Description |
|---|
address | Yes (path) | Ethereum wallet address |
solana | No | Solana wallet address for Drift BET positions |
manifold | No | Manifold 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
| Field | Description |
|---|
address | The Ethereum address that was queried |
solanaAddress | Solana address (if provided) |
manifoldUser | Manifold username (if provided) |
platforms | Object keyed by platform slug, each containing positions and history |
summary | Aggregated totals across all platforms |
TrackedPosition fields
Each object in a platform’s positions array:
| Field | Description |
|---|
platform | Platform slug (polymarket, predictfun, azuro, drift, manifold, limitless) |
marketTitle | Human-readable market title |
marketUrl | Direct link to the market on the platform |
outcome | The outcome held (e.g. Yes, No, Buy, Portfolio) |
size | Number of shares or amount invested |
avgPrice | Average entry price |
currentPrice | Current market price for this outcome |
currentValue | Current value of the position |
pnl | Profit or loss in base currency |
pnlPercent | PnL as a percentage of entry value |
status | open, closed, or resolved |
endDate | Market expiry date |
platformMarketId | Platform’s own market identifier |
fee | Fee paid on entry |
timestamp | When the position was opened |
resolution | Resolution outcome for resolved Manifold markets (e.g. YES, NO) |
TradeHistoryItem fields
Each object in a platform’s history array:
| Field | Description |
|---|
platform | Platform slug |
type | Trade type: BUY, SELL, BET, REDEMPTION |
side | Side of the trade: BUY, SELL, YES, NO |
marketTitle | Market title |
marketUrl | Direct link to the market |
outcome | Outcome traded |
price | Price at execution |
size | Number of shares |
amount | Amount wagered (Manifold, Azuro) |
usdcSize | USDC value of the trade (Polymarket) |
shares | Shares received (Manifold) |
odds | Decimal odds at bet time (Azuro) |
potentialPayout | Maximum payout if bet wins (Azuro) |
probBefore / probAfter | Market probability before and after trade (Manifold) |
result | Bet result on Azuro: won or lost |
isRedeemed | Whether winnings were redeemed (Azuro) |
transactionHash | On-chain transaction hash (Polymarket) |
status | Trade status |
timestamp | When the trade occurred |
resolvedAt | When 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.
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.