---
title: "Smart Money KOL Detail"
method: GET
path: "/gateway/v1/smart-money/kol/detail"
tags: ["Smart Money"]
---

# Smart Money KOL Detail

`GET /gateway/v1/smart-money/kol/detail`

## Request

- Base URL: `https://api.asksurf.ai`
- URL: `https://api.asksurf.ai/gateway/v1/smart-money/kol/detail`
- Auth: HTTP bearer

Returns one KOL's smart-money profile: scores, board membership, per-market (spot / perp) statistics with weekly PnL, whether they hold what they call on X (big-account KOLs), and the KOLs they most often call the same tokens with.

Look up by X handle (a former handle works too), or by `fomo:<FOMO handle>` for a trader known only from FOMO. A KOL that is tracked but not scored gets its `coverage` and empty scores; returns 404 when the KOL is not tracked.

**Privacy:** responses never include wallet addresses or transaction identifiers. Per-KOL amounts are rounded to 2 significant figures, and per-token KOL lists carry names only.

**Data refresh:** daily

## Query parameters

- `handle` string, required: Trader handle (with or without @, case-insensitive): an X handle, or fomo:<handle> for a trader known only from FOMO

## Response `200`

OK

- DataObjectResponseSmartMoneyKOLDetail
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `data` SmartMoneyKOLDetail, required
    - `avatar` string: Avatar URL
    - `call_audit` SmartMoneyCallAudit
      - `consistency_rate` number, double: (holding + bought_after) / checked calls
      - `handle` string, required: Trader handle: an X handle without @, or fomo:<handle> for a trader known only from FOMO
      - `n_bought_after` integer, required: Calls followed by a buy within 72 hours
      - `n_call_tweets` integer, required: Tweets with an explicit long/short call
      - `n_holding` integer, required: Calls made while holding the token
      - `n_no_position` integer, required: Calls with no position seen
      - `n_opposite` integer, required: Calls against the KOL's own position
      - `n_sold_before` integer, required: Calls made within 7 days after closing the position
      - `n_tokens` integer, required: Distinct tokens called
      - `n_tweets` integer, required: Tweets analyzed
      - `tokens` SmartMoneyCallAuditToken[], nullable, required: Per-token breakdown
        - `consistent` boolean, required: Whether the KOL held or bought the token they called
        - `direction` string, required: Call direction: long or short
        - `first_call_day` integer: Day of the first call (Unix seconds)
        - `is_major` boolean, required: Whether the token is a major asset (BTC, ETH, SOL, ...)
        - `last_call_day` integer: Day of the last call (Unix seconds)
        - `n_calls` integer, required: Number of calls
        - `symbol` string: Token symbol
        - `verdict` string: Position at call time: holding, bought_after, sold_before, opposite_position, no_position, out_of_window
    - `co_callers` SmartMoneyCoCaller[], nullable, required: KOLs who repeatedly called the same tokens
      - `handle` string, required: Trader handle: an X handle without @, or fomo:<handle> for a trader known only from FOMO
      - `n_shared_tokens` integer, required: Tokens both KOLs called bullish
      - `shared_symbols` string[], nullable, required: Sample of shared token symbols
    - `composite_rank` integer: Rank on the composite board
    - `coverage` SmartMoneyKOLCoverage
      - `boards` string[], nullable, required: Boards the KOL is on (composite, smart, bigv); null when not tracked
      - `chains` string[], nullable, required: Chains the tracked wallets are active on; null when not tracked
      - `handle` string, required: Current X/Twitter handle (a former handle in the request is answered with the current one)
      - `last_activity_at` integer, nullable, required: Day of the latest tracked trade (Unix seconds, UTC day); null when unknown
      - `low_confidence_wallets` integer, nullable, required: Tracked wallets attributed with low confidence, shown up to 10; null when not tracked
      - `not_scored_reason` string, nullable, required: Why a tracked KOL is not scored: no_tracked_wallets, inactive_90d, insufficient_sample; null otherwise
      - `scored` boolean, nullable, required: Whether the KOL has scores in the current run; null when not tracked
      - `synced_at` integer, nullable, required: When the KOL's data was last synced (Unix seconds, truncated to the hour); null when unknown
      - `tier` string, nullable, required: Sync tier: hot, warm or cold; null when not tracked
      - `tracked` boolean, required: Whether the KOL's trading is tracked
      - `wallets` integer, nullable, required: Tracked wallets, shown up to 10 (see wallets_capped); null when not tracked
      - `wallets_capped` boolean, required: True when the KOL has more than 10 tracked wallets
    - `flags` string[], nullable, required: Reasons the KOL is kept off the Smart board: insufficient_sample, suspected_bot, not_profitable, inactive_30d, not_kol, no_x_profile
    - `followers_count` integer, required: X follower count
    - `handle` string, required: Trader handle: an X handle without @, or fomo:<handle> for a trader known only from FOMO
    - `is_bigv` boolean, required: On the big-account board (large following and trading volume)
    - `is_smart` boolean, required: On the Smart (trading skill) board
    - `markets` SmartMoneyMarkets, required
      - `perp` SmartMoneyMarketStats
        - `active_weeks` integer, required: Weeks with any trading
        - `mean_return` number, double: Mean return per position
        - `n_positions` integer, required: Scored positions in the last 90 days
        - `payoff_ratio` number, double: Average win / average loss
        - `pnl_usd` number, double: 90-day PnL in USD, rounded to 2 significant figures
        - `positions_30d` integer: Positions opened in the last 30 days
        - `profitable_weeks` integer, required: Weeks with positive PnL
        - `sample_full` boolean, required: Whether the minimum sample size is met
        - `score` number, double, required: Market score (0-100)
        - `volume_usd` number, double: 90-day traded amount in USD (perp: notional), rounded to 2 significant figures
        - `weekly_pnl` SmartMoneyWeeklyPnL[], nullable, required: Weekly PnL, oldest first
          - `pnl_usd` number, double, required: PnL in USD, rounded to 2 significant figures
          - `week_start` integer, required: Week start (Unix seconds, UTC)
        - `win_rate` number, double: Share of profitable positions (0-1)
      - `spot` SmartMoneyMarketStats
        - `active_weeks` integer, required: Weeks with any trading
        - `mean_return` number, double: Mean return per position
        - `n_positions` integer, required: Scored positions in the last 90 days
        - `payoff_ratio` number, double: Average win / average loss
        - `pnl_usd` number, double: 90-day PnL in USD, rounded to 2 significant figures
        - `positions_30d` integer: Positions opened in the last 30 days
        - `profitable_weeks` integer, required: Weeks with positive PnL
        - `sample_full` boolean, required: Whether the minimum sample size is met
        - `score` number, double, required: Market score (0-100)
        - `volume_usd` number, double: 90-day traded amount in USD (perp: notional), rounded to 2 significant figures
        - `weekly_pnl` SmartMoneyWeeklyPnL[], nullable, required: Weekly PnL, oldest first
          - `pnl_usd` number, double, required: PnL in USD, rounded to 2 significant figures
          - `week_start` integer, required: Week start (Unix seconds, UTC)
        - `win_rate` number, double: Share of profitable positions (0-1)
    - `name` string, required: Display name
    - `on_composite_board` boolean, required: On the composite board
    - `perp_notional_90d_usd` number, double: 90-day perp notional in USD, rounded to 2 significant figures
    - `pnl_90d_usd` number, double: 90-day PnL across markets in USD, rounded to 2 significant figures
    - `risks` string[], nullable, required: Risk notes that do not affect ranking: bag_holding (very high win rate with small wins and large losses)
    - `scores` SmartMoneyScores
      - `composite` number, double, required: Composite score (0-100): trading skill blended with influence
      - `followers_pct` number, double, required: Follower count percentile (0-100)
      - `influence` number, double, required: Influence score (0-100): average of the three percentiles below
      - `smart` number, double, required: Trading skill score (0-100), validated out of sample
      - `smart_followers_pct` number, double, required: Smart follower count percentile (0-100)
      - `volume_pct` number, double, required: Trading volume percentile (0-100)
    - `smart_followers_count` integer, required: Number of smart followers
    - `smart_rank` integer: Rank on the Smart board
    - `smart_since` integer: Day the KOL entered the Smart board (Unix seconds)
    - `spot_volume_90d_usd` number, double: 90-day spot buy amount in USD, rounded to 2 significant figures
    - `suspected_bot_markets` string[], nullable, required: Markets (spot, perp) whose activity looks automated
    - `verified` boolean, required: Whether the X account is verified
  - `meta` ObjectResponseMeta, required
    - `cached` boolean, required: Whether this response was served from cache
    - `credits_used` integer, required: Credits deducted for this request
    - `empty_reason` string: Hint explaining why the data array is empty, when applicable

## Other responses

- `default`: Error

## Changes

- **2026-10-27** `80609ba16f51`: 1 info
  - added the optional property `data/coverage` to the response with the `200` status
- **2026-10-23** `cd899b4049b6`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api/changes/gateway/v1/smart-money/kol/detail/get.md)

---

[API](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api.md) - [All operations](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/asksurf/apis/asksurf-public-rest-api/revisions/91774fdd5302?raw)
