Layer 2 — Wallet Intelligence
FIFO cost-basis PnL, multi-dimensional behavior profiling, wallet similarity search, enriched labels (45+ fields), and provenance chain resolution tracing funding origins across curated CEX hot wallets.
Rate limits: 300 REST req/min, 20 WebSocket connections, 500 tracked wallets, 1,000 similarity queries/day, full PnL history.
WebSocket Streams
events.wallet.{addr}.pnl
Channel: wallet:{addr}:pnl
Real-time realized PnL events, published on every sell.
- Rich event payload: entry/exit timestamps, signatures, slots, prices, amounts
- Fee allocation: entry fees (pro-rata) + exit fees
- PnL in both USD and SOL, percentage gain, position type (Full/DCA)
- Exit classification: Full/Partial, exit number, remaining cost basis
- Bot detection flags, DEX info
events.wallet.{addr}.position
Channel: wallet:{addr}:positions
Live position deltas — every open/close/partial-exit as it happens.
- FIFO cost-basis accounting: buys create entries, sells pop from front of queue
- Handles partial exits with pro-rata fee allocation
- Transfer-out detection: inventory consumed without PnL attribution
events.wallet.{addr}.labels
Channel: wallet:{addr}:labels
Enriched wallet label payload with 45+ fields, published on state change.
- Deduplicated — only publishes on actual state change
- Rate limited to prevent flooding
- Fields include: trader_type, performance_level, badges, activity metrics
REST Endpoints
GET /v1/wallet/{addr}/profile
Multi-dimensional behavior vector breakdown with raw and normalized values.
Feature Groups
| Group | Covers |
|---|---|
| Hold timing | Exit timing patterns and hold duration |
| Exit discipline | Win rate, exit behavior, DCA patterns |
| Performance | Return metrics, risk-adjusted performance |
| Velocity & sizing | Trading frequency, position sizing, diversification |
| Infrastructure | DEX usage, automation level, tool patterns |
| Provenance | Funding origin, account history |
Gating
A wallet must meet minimum activity thresholds to have a profile (minimum closed positions, activity span, and trade count).
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
addr | path | string | yes | Solana wallet address |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/wallet/7xKXtg.../profile"Response
{
"wallet": "7xKXtg...",
"has_vector": true,
"trader_type": "DAY_TRADER",
"performance_level": "PROFITABLE",
"features": {
"hold_first_exit_p50": { "raw": 1200.0, "normalized": 0.45 },
"win_rate": { "raw": 0.63, "normalized": 0.72 },
"profit_factor": { "raw": 2.1, "normalized": 0.68 },
"trade_frequency": { "raw": 12.5, "normalized": 0.55 },
"bot_share": { "raw": 0.05, "normalized": 0.05 },
"is_cex_funded": { "raw": 1.0, "normalized": 1.0 }
},
"trade_badges": ["CONSISTENT_WINNER", "RUNNER_KEEPER"],
"identity_badges": ["ROOT_CEX"]
}Features are normalized to a 0-1 scale for comparability. Cache TTL: 60 seconds.
GET /v1/wallet/{addr}/similar
k-NN wallet similarity search powered by Qdrant.
Parameters
| Parameter | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
addr | path | string | yes | — | Solana wallet address |
limit | query | integer | no | 20 | Max results (max 100) |
min_trades | query | integer | no | — | Minimum trade count filter |
performance_level | query | string | no | — | Filter: PROFITABLE, BREAK_EVEN, etc. |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/wallet/7xKXtg.../similar?limit=10&performance_level=PROFITABLE"Response
{
"query_wallet": "7xKXtg...",
"results": [
{
"wallet": "4mNqR...",
"similarity": 0.94,
"trader_type": "DAY_TRADER",
"performance_level": "PROFITABLE",
"total_pnl_usd": 45000.0,
"win_rate": 0.65,
"shared_traits": ["high win rate", "runner keeper", "quick exit timing"],
"key_differences": ["larger position sizing", "more DEX diversity"]
}
],
"count": 10
}Returns similar wallets ranked by behavioral similarity. Includes explainability: top shared traits and key differences.
GET /v1/wallet/{addr}/provenance
Funding chain resolution — where did this wallet’s SOL come from?
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
addr | path | string | yes | Solana wallet address |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/wallet/7xKXtg.../provenance"Response
{
"wallet": "7xKXtg...",
"root_entity": "Binance",
"root_source": "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9",
"hops": 3,
"direct_funder": "9aBcD...",
"last_funded_ts": "2026-03-01T08:30:00Z"
}- Traces funding chain back to originating CEX or known entity
- Curated root wallet database covering major exchanges
- When no known root is found, the response is
{ "wallet": ..., "root_entity": null, "hops": null, "funding_path": null }— theroot_source,direct_funder, andlast_funded_tskeys appear only when a root is resolved
GET /v1/wallet/{addr}/trades
Historical realized-PnL trade records for a wallet — one row per closed or partial exit.
/pnl endpoint. A wallet’s realized-PnL trade history is served here at /trades; aggregate stats live on /performance.Parameters
| Parameter | In | Type | Required | Default | Constraints |
|---|---|---|---|---|---|
addr | path | string | yes | — | — |
limit | query | integer | no | 50 | — |
offset | query | integer | no | 0 | — |
token | query | string | no | — | Filter by token mint |
Example
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
}Full FIFO cost-basis accounting. Includes entry/exit signatures for on-chain verification.
GET /v1/wallet/{addr}/positions
Current open positions with FIFO cost basis. Mark-to-market unrealized PnL is not part of this response — derive it client-side by combining remaining_amount * entry_price_usd (cost basis) against the latest tick from GET /v1/token/{mint}/ohlcv?timeframe=1s&limit=1.
Parameters
| Parameter | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
addr | path | string | yes | — | Solana wallet address |
status | query | string | no | all | open, closed, or all |
Example
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"
}
]
}FIFO-ordered position entries with entry price, remaining amount, and per-token cost basis. Aggregated by token mint. (No mark-to-market / current value is included — see the note above.)
GET /v1/wallet/{addr}/labels
Full enriched label set with 45+ fields.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
addr | path | string | yes | Solana wallet address |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/wallet/7xKXtg.../labels"Response
{
"wallet": "7xKXtg...",
"trader_type": "DAY_TRADER",
"performance_level": "PROFITABLE",
"size_class": "SHARK",
"exit_style": "DCA_OUT",
"automation_label": "ORGANIC",
"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", "STOP_LOSS_USER"],
"identity_badges": ["ROOT_CEX", "TOOL_PHOTON"],
"special_labels": [],
"description": "Profitable day trader, DCA exits, funded by a known CEX root.",
"label_hash": "a1b2c3d4e5f6"
}Cache TTL: 60 seconds.
GET /v1/wallet/{addr}/quality
The position-correct skill signal — Conyr’s differentiator. Most providers (and our own /performance) report a per-exit win rate, which a DCA-out over many partial sells inflates. This endpoint exposes the position-correct (full-exit) win rate alongside the commodity per-exit rate and the inflation gap between them.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
addr | path | string | yes | Solana wallet address |
Example
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/wallet/7xKXtg.../quality"Response
Returns 200 with the object below, or 200 with literal null when the wallet has no snapshot row yet.
{
"wallet": "7xKXtg...",
"rated": true,
"skill_score": 72.4,
"performance_level": "PROFITABLE",
"trader_type": "SWING_TRADER",
"exit_style": "RUNNER_KEEPER",
"size_class": "SHARK",
"closed_positions": 184,
"position_win_rate_pct": 41.2,
"raw_exit_win_rate_pct": 63.7,
"win_rate_inflation_pts": 22.5,
"disposition_index": 0.84,
"conviction_sizing": 1.32,
"profit_factor": 2.1,
"sharpe_ratio": 1.8,
"runner_score": 0.61,
"avg_loss_roi_pct": -18.3,
"loss_consistency_stddev": 12.4,
"roi_p10_pct": -42.0,
"roi_p50_pct": 6.1,
"roi_p90_pct": 88.0,
"big_wins": 14,
"big_losses": 6,
"realized_pnl_usd": 18243.55,
"trade_badges": ["RUNNER_KEEPER", "CONSISTENT_WINNER"]
}ratedistruewhenclosed_positions >= 10.skill_score(0–100) =0.40·position_win_rate + 0.30·profit_factor + 0.15·disposition + 0.15·runner, each normalized and clamped — heuristic and explainable, not a calibrated probability.position_win_rate_pctis the differentiated metric;raw_exit_win_rate_pctis the commodity per-exit rate;win_rate_inflation_pts=raw_exit − position, floored at 0.
GET /v1/token/{mint}/buyer-quality
Buyer-quality is a Free-tier endpoint, available on every tier (higher tiers include all lower endpoints). The response is identical at all tiers — there is no Layer-2-specific enrichment. Supports ?window_hours= (default 1).
See Free Tier → Buyer Quality for the full response schema.