API ReferenceWallets

Wallets

The wallets endpoints let you query any Solana wallet’s trading performance, trade history, open positions, and behavioral labels.

GET /v1/wallet/{address}/performance

Returns aggregate trading statistics for a wallet over a time window.

Parameters

ParameterTypeDefaultDescription
address (path)stringSolana wallet address
window (query)string7dTime window: 1d, 7d, or 30d

Example

curl -H "Authorization: Bearer $API_KEY" \
  "https://api.conyr.ai/v1/wallet/7xKXtg.../performance?window=30d"

Response

{
  "wallet_address": "7xKXtg...",
  "total_trades": 142,
  "wins": 89,
  "losses": 53,
  "win_rate": 0.6267,
  "total_pnl_usd": 12450.32,
  "total_volume_usd": 98230.50,
  "total_fees_usd": 142.80,
  "avg_hold_time_seconds": 3420.5,
  "cash_pnl_usd": 11200.00
}

Understanding the Fields

  • win_rate: Ratio from 0.0 to 1.0. A wallet with 89 wins out of 142 trades has a 62.67% win rate.
  • total_pnl_usd: Sum of realized PnL across all closed trades. This is the “paper” number.
  • cash_pnl_usd: Net SOL flow converted to USD. This is what actually hit the wallet. The difference from total_pnl_usd reflects token positions that were entered but not fully exited in SOL terms.
  • avg_hold_time_seconds: Average time between entry and exit. A sniper might hold for 30 seconds; a swing trader for hours.

If the wallet has no trades in the given window, all numeric fields return 0.


GET /v1/wallet/{address}/trades

Returns paginated trade history with entry/exit details and realized PnL for each round-trip.

Live stream available: Subscribe to wallet:{address}:pnl via WebSocket to receive realized PnL events the instant a trade closes. CONYR is the only Solana API that streams realized PnL in real-time.

Parameters

ParameterTypeDefaultConstraintsDescription
address (path)stringSolana wallet address
limit (query)integer50max 200Results per page
offset (query)integer0Pagination offset
token (query)stringFilter by token mint address

Example

# Get last 20 trades for a specific token
curl -H "Authorization: Bearer $API_KEY" \
  "https://api.conyr.ai/v1/wallet/7xKXtg.../trades?limit=20&token=EPjFWd..."

Response

{
  "trades": [
    {
      "wallet_address": "7xKXtg...",
      "token_mint": "EPjFWd...",
      "entry_signature": "5vGk...",
      "exit_signature": "3mPq...",
      "entry_timestamp": "2026-03-05 14:30:00",
      "exit_timestamp": "2026-03-05 15:45:00",
      "hold_time_seconds": 4500,
      "entry_price_usd": 0.00234,
      "exit_price_usd": 0.00312,
      "realized_pnl_usd": 78.50,
      "realized_pnl_sol": 0.52,
      "percentage_gain": 33.33,
      "position_type": "FULL_POSITION",
      "exit_type": "FULL",
      "exit_dex": "raydium",
      "entry_dex": "raydium"
    }
  ],
  "limit": 20,
  "offset": 0
}

Each trade represents a completed round-trip: an entry (buy) matched to an exit (sell) using FIFO accounting. If a wallet bought 1M tokens and sold them in 3 batches, you’ll see 3 trade records with the same entry_signature.

Live PnL Stream

Instead of polling this endpoint, subscribe to real-time PnL events via WebSocket:

{"op": "subscribe", "channels": ["wallet:7xKXtg...:pnl"]}

Every time this wallet closes a trade (partial or full exit), you’ll receive an event with the realized PnL, hold time, entry/exit prices, and percentage gain — with no delay.


GET /v1/wallet/{address}/unrealized-pnl

⚠️

Coming soon. This endpoint and its companion wallet:{address}:unrealized-pnl WebSocket channel are on the roadmap and are not yet live. Until they ship, derive unrealized exposure client-side from GET /v1/wallet/{address}/positions?status=open plus the most recent token price from GET /v1/token/{mint}/ohlcv?timeframe=1s&limit=1.

When shipped, this endpoint will return mark-to-market unrealized PnL for every open position a wallet holds, calculated using vetted live prices. The request and response shapes below describe the planned contract and are not yet callable.

Planned Parameters

ParameterTypeDefaultConstraintsDescription
address (path)stringSolana wallet address
token (query)stringFilter by token mint address

Planned Example

# Not yet available — illustrative only
curl -H "Authorization: Bearer $API_KEY" \
  "https://api.conyr.ai/v1/wallet/7xKXtg.../unrealized-pnl"

Planned Response

{
  "wallet_address": "7xKXtg...",
  "total_unrealized_pnl_usd": 2450.80,
  "positions": [
    {
      "token_mint": "EPjFWd...",
      "entry_price_usd": 0.00234,
      "current_price_usd": 0.00312,
      "token_amount": 500000.0,
      "cost_basis_usd": 1170.00,
      "current_value_usd": 1560.00,
      "unrealized_pnl_usd": 390.00,
      "unrealized_pnl_sol": 2.58,
      "percentage_gain": 33.33,
      "entry_timestamp": 1709654400,
      "entry_dex": "pumpfun"
    }
  ]
}

Each position would show the difference between entry cost basis and current market value, with prices sourced from vetted live feeds — not stale or self-reported data.

Planned Unrealized PnL Stream

The wallet:{address}:unrealized-pnl WebSocket channel is not yet live either; it ships alongside the REST endpoint and is part of the same roadmap entry.


GET /v1/wallet/{address}/positions

Returns the wallet’s current token positions, tracked using first-in-first-out (FIFO) accounting.

Live stream available: Subscribe to wallet:{address}:positions via WebSocket to receive position updates (opened, partially closed, fully closed) in real-time.

Parameters

ParameterTypeDefaultDescription
address (path)stringSolana wallet address
status (query)stringallFilter: open, closed, or all

Example

# Get only open positions
curl -H "Authorization: Bearer $API_KEY" \
  "https://api.conyr.ai/v1/wallet/7xKXtg.../positions?status=open"

Response

{
  "positions": [
    {
      "wallet_address": "7xKXtg...",
      "token_mint": "EPjFWd...",
      "entry_signature": "5vGk...",
      "entry_timestamp": 1709654400,
      "entry_price_usd": 0.00234,
      "original_amount": 1000000.0,
      "remaining_amount": 500000.0,
      "price_per_token": 0.00000234,
      "status": "PARTIAL",
      "exit_count": 2,
      "entry_dex": "pumpfun"
    }
  ]
}

Position Status

StatusMeaning
OPENFull position held, no exits yet
PARTIALSome tokens sold, position partially closed
CLOSEDEntire position has been exited

Returns up to 100 positions, ordered by entry_timestamp descending.


GET /v1/wallet/{address}/labels

Returns behavioral classification labels for a wallet, computed by the analytics pipeline.

Parameters

ParameterTypeDescription
address (path)stringSolana wallet address

Example

curl -H "Authorization: Bearer $API_KEY" \
  "https://api.conyr.ai/v1/wallet/7xKXtg.../labels"

Response

{
  "wallet": "7xKXtg...",
  "trader_type": "sniper",
  "performance_level": "elite",
  "size_class": "shark",
  "exit_style": "quick_flip",
  "automation_label": "bot",
  "primary_terminal": "photon",
  "primary_tool": "photon",
  "primary_tool_pct": 0.85,
  "is_fresh_6h": 0,
  "is_fresh_24h": 0,
  "funded_by_farm": 0,
  "trade_badges": ["CONSISTENT_WINNER", "RUNNER_KEEPER"],
  "identity_badges": ["ROOT_CEX", "TOOL_PHOTON"],
  "special_labels": [],
  "description": "Elite sniper, quick flips, photon terminal.",
  "label_hash": "a1b2c3d4e5f6"
}

Returns null if the wallet hasn’t been classified yet (not enough data or not yet processed by the analytics pipeline).

Label Taxonomy

FieldValuesWhat It Means
trader_typesniper, swing, scalper, …Trading style classification
performance_levelelite, profitable, breakeven, losingPerformance tier
size_classwhale, shark, dolphin, fishTypical position sizes
exit_stylequick_flip, holder, ladder_outExit behavior pattern
automation_labelbot, semi-automated, manualDetected automation level
is_fresh_6h0 or 1Whether the wallet was first funded within the last 6 hours
is_fresh_24h0 or 1Whether the wallet was first funded within the last 24 hours
funded_by_farm0 or 1Whether SOL came from a known farm/airdrop wallet
trade_badgesarrayTrade-behavior badges (e.g. CONSISTENT_WINNER, RUNNER_KEEPER)
identity_badgesarrayIdentity/provenance badges (e.g. ROOT_CEX, TOOL_PHOTON)
special_labelsarrayAdditional special-case labels, when present
descriptionstringHuman-readable summary of the wallet’s classification
label_hashstringComposite hash of the label state, changes when labels change