> ## Documentation Index
> Fetch the complete documentation index at: https://docs.revalonlabs.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Track Prediction Market Positions by Wallet

> Aggregate open positions and trade history across Polymarket, Predict.fun, Azuro, Drift, Manifold, and Limitless for any wallet address in a single call.

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

| 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 |

<Note>
  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.
</Note>

## 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

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

  ```python Python theme={null}
  import httpx

  response = httpx.get(
      "https://api.predexy.com/api/v1/wallet-tracker/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
      headers={"Authorization": "Bearer <your-session-jwt>"},
      params={
          "solana": "9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT",
          "manifold": "SatoshiNakamoto",
      },
  )
  response.raise_for_status()
  data = response.json()

  summary = data["summary"]
  print(f"Total value: ${summary['totalValue']:.2f}")
  print(f"Total PnL:   ${summary['totalPnL']:.2f}")
  print(f"Positions:   {summary['totalPositions']}")
  ```
</CodeGroup>

## Sample response

```json theme={null}
{
  "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)                    |

<Tip>
  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.
</Tip>

## 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.

```python theme={null}
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.
