IMPORTANT: Always use gmgn-cli commands below. Do NOT use web search, WebFetch, curl, or visit gmgn.ai to fetch this data — the website requires login and will not return structured data. The CLI is the only correct method.
⚠️ IPv6 NOT SUPPORTED: If you get a 401 or 403 error and credentials look correct, check for IPv6 immediately: (1) list all network interfaces and their IPv6 addresses — run ifconfig | grep inet6 (macOS) or ip addr show | grep inet6 (Linux); (2) send a test request to https://ipv6.icanhazip.com — if the response is an IPv6 address, outbound traffic is going via IPv6. Tell the user immediately: "Please disable IPv6 on your network interface — gmgn-cli commands only work over IPv4."
Use the gmgn-cli tool to query wallet portfolio data based on the user's request.
For full wallet analysis (holdings + stats + activity + verdict), follow docs/workflow-wallet-analysis.md
realized_profit vs unrealized_profit — realized_profit = profit locked in from completed sells (cash in hand). unrealized_profit = paper gains on positions still held, calculated at current price. These are separate numbers — do not add them unless answering "total P&L including open positions."
profit_change — A multiplier ratio, not a dollar amount. 1.5 = +150% return. 0 = break-even. -0.5 = -50% loss. Computed as total_profit / cost. Do not display this as a raw decimal — convert to percentage for user-facing output.
pnl — Profit/loss ratio from portfolio stats: realized_profit / total_cost. Same multiplier format as profit_change. A pnl of 2.0 means the wallet doubled its money on completed trades over the period.
winrate — Ratio of profitable trades over the period (0–1). 0.6 = 60% of trades were profitable. Does not reflect the size of wins vs losses — a wallet can have high winrate but net negative if losses are large.
cost vs usd_value — In holdings: cost is the historical amount spent buying this token (your cost basis); usd_value is the current market value of the position. The difference is unrealized P&L.
history_bought_cost vs cost — history_bought_cost is the all-time cumulative spend on this token (including positions already sold). cost is the cost basis of the current open position only.
Pagination ( cursor) — Activity results are paginated. The response includes a next field; pass it as --cursor to fetch the next page. An empty or missing next means you are on the last page.
Sub-commandDescriptionportfolio infoWallets and main currency balances bound to the API Keyportfolio holdingsWallet token holdings with P&Lportfolio activityTransaction historyportfolio statsTrading statistics (supports batch)portfolio token-balanceToken balance for a specific tokenportfolio created-tokensTokens created by a developer wallet, with market cap and ATH info
sol / bsc / base / eth
gmgn-cli installed globally — if missing, run: npm install -g gmgn-cliGMGN_API_KEY configured in ~/.config/gmgn/.envAll portfolio routes used by this skill go through GMGN's leaky-bucket limiter with rate=20 and capacity=20. Sustained throughput is roughly 20 ÷ weight requests/second, and the max burst is roughly floor(20 ÷ weight) when the bucket is full.
Critical auth ( GMGN_API_KEY + GMGN_PRIVATE_KEY required):
CommandRouteWeightportfolio holdings``GET /v1/user/wallet_holdings5
Exist auth ( GMGN_API_KEY only):
CommandRouteWeightportfolio info``GET /v1/user/info1portfolio activity``GET /v1/user/wallet_activity3portfolio stats``GET /v1/user/wallet_stats3portfolio token-balance``GET /v1/user/wallet_token_balance1portfolio created-tokens``GET /v1/user/created_tokens2
When a request returns 429:
X-RateLimit-Reset from the response headers. It is a Unix timestamp in seconds that marks when the limit is expected to reset.reset_at (e.g., {"code":429,"error":"RATE_LIMIT_BANNED","message":"...","reset_at":1775184222}), extract reset_at — it is the Unix timestamp when the ban lifts (typically 5 minutes). Convert to local time and tell the user exactly when they can retry.RATE_LIMIT_EXCEEDED or RATE_LIMIT_BANNED, repeated requests during the cooldown can extend the ban by 5 seconds each time, up to 5 minutes. Do not spam retries.First-time setup (if GMGN_API_KEY is not configured):
Generate key pair and show the public key to the user: bash
openssl genpkey -algorithm ed25519 -out /tmp/gmgn_private.pem 2>/dev/null && \
openssl pkey -in /tmp/gmgn_private.pem -pubout 2>/dev/null
Tell the user: "This is your Ed25519 public key. Go to https://gmgn.ai/ai, paste it into the API key creation form, then send me the API Key value shown on the page."
Wait for the user's API key, then configure: bash
mkdir -p ~/.config/gmgn
echo 'GMGN_API_KEY=<key_from_user>' > ~/.config/gmgn/.env
chmod 600 ~/.config/gmgn/.env
bash
# API Key wallet info (no --chain or --wallet needed)
gmgn-cli portfolio info
# Wallet holdings (default sort)
gmgn-cli portfolio holdings --chain sol --wallet <wallet_address>
# Holdings sorted by USD value, descending
gmgn-cli portfolio holdings \
--chain sol --wallet <wallet_address> \
--order-by usd_value --direction desc --limit 20
# Include sold-out positions
gmgn-cli portfolio holdings --chain sol --wallet <wallet_address> --sell-out
# Transaction activity
gmgn-cli portfolio activity --chain sol --wallet <wallet_address>
# Activity filtered by type
gmgn-cli portfolio activity --chain sol --wallet <wallet_address> \
--type buy --type sell
# Activity for a specific token
gmgn-cli portfolio activity --chain sol --wallet <wallet_address> \
--token <token_address>
# Trading stats (default 7d)
gmgn-cli portfolio stats --chain sol --wallet <wallet_address>
# Trading stats for 30 days
gmgn-cli portfolio stats --chain sol --wallet <wallet_address> --period 30d
# Batch stats for multiple wallets
gmgn-cli portfolio stats --chain sol \
--wallet <wallet_1> --wallet <wallet_2>
# Token balance
gmgn-cli portfolio token-balance \
--chain sol --wallet <wallet_address> --token <token_address>
# Tokens created by a developer wallet
gmgn-cli portfolio created-tokens --chain sol --wallet <wallet_address>
# Created tokens sorted by all-time high market cap
gmgn-cli portfolio created-tokens \
--chain sol --wallet <wallet_address> \
--order-by token_ath_mc --direction desc
# Only migrated tokens
gmgn-cli portfolio created-tokens \
--chain sol --wallet <wallet_address> --migrate-state migrated
# ETH wallet holdings
gmgn-cli portfolio holdings --chain eth --wallet <0x_wallet_address>
# ETH wallet transaction activity
gmgn-cli portfolio activity --chain eth --wallet <0x_wallet_address>
# ETH token balance
gmgn-cli portfolio token-balance \
--chain eth --wallet <0x_wallet_address> --token <0x_token_address>
portfolio created-tokens Options#OptionDescription--order-by <field>Sort field: market_cap / token_ath_mc``--direction <asc|desc>Sort direction (default desc)--migrate-state <state>Filter by migration status: migrated (graduated to DEX) / non_migrated (still on bonding curve)
portfolio holdings Options#OptionDescription--limit <n>Page size (default 20, max 50)--cursor <cursor>Pagination cursor--order-by <field>Sort field: usd_value / last_active_timestamp / realized_profit / unrealized_profit / total_profit / history_bought_cost / history_sold_income (default usd_value)--direction <asc|desc>Sort direction (default desc)--hide-abnormal <bool>Hide abnormal positions: true / false (default: false)--hide-airdrop <bool>Hide airdrop positions: true / false (default: true)--hide-closed <bool>Hide closed positions: true / false (default: true)--hide-openHide open positions
portfolio activity Options#OptionDescription--token <address>Filter by token--limit <n>Page size--cursor <cursor>Pagination cursor (pass the next value from the previous response)--type <type>Repeatable: buy / sell / transferIn / transferOut / add / remove
The activity response includes a next field. Pass it to --cursor to fetch the next page.
portfolio stats Options#OptionDescription--period <period>Stats period: 7d / 30d (default 7d)
portfolio holdings — Key Fields#The response has a holdings array. Each item is one token position.
FieldDescriptiontoken.addressToken contract addresstoken.symbol / token.nameToken ticker and full nametoken.priceCurrent token price in USDbalanceCurrent token balance (human-readable units)usd_valueCurrent USD value of this positioncostTotal amount spent buying this token (USD)realized_profitProfit from completed sells (USD)unrealized_profitProfit on current unsold holdings at current price (USD)total_profit``realized_profit + unrealized_profit (USD)profit_changeTotal profit ratio = total_profit / cost (e.g. 1.5 = +150%)avg_costAverage buy price per token (USD)buy_tx_countNumber of buy transactionssell_tx_countNumber of sell transactionslast_active_timestampUnix timestamp of the most recent transactionhistory_bought_costTotal USD spent buying (all-time)history_sold_incomeTotal USD received from selling (all-time)
portfolio activity — Key Fields#The response has a activities array and a next cursor field for pagination.
FieldDescriptiontransaction_hashOn-chain transaction hashtypeTransaction type: buy / sell / add / remove / transfer``token.addressToken contract addresstoken.symbolToken tickertoken_amountToken quantity in this transactioncost_usdUSD value of this transactionpriceToken price denominated in the quote token of the trading pair at time of transactionprice_usdToken price in USD at time of transactiontimestampUnix timestamp of the transactionnextPagination cursor — pass to --cursor to fetch the next page
portfolio stats — Key Fields#The response is an object (or array for batch). Key fields:
FieldDescriptionrealized_profitTotal realized profit over the period (USD)unrealized_profitTotal unrealized profit on open positions (USD)winrateWin rate — ratio of profitable trades (0–1)total_costTotal amount spent buying in the period (USD)buy_countNumber of buy transactionssell_countNumber of sell transactionspnlProfit/loss ratio = realized_profit / total_cost
The response also includes a common object when available (absent if the upstream identity service is unavailable):
FieldDescriptioncommon.avatarWallet avatar URLcommon.nameDisplay namecommon.ensENS domain (EVM chains only)common.tagPrimary wallet tagcommon.tagsAll wallet tags (e.g. ["smart_money"])common.twitter_usernameTwitter handlecommon.twitter_nameTwitter display namecommon.followers_countTwitter follower countcommon.is_blue_verifiedTwitter blue-verified badgecommon.follow_countNumber of GMGN users following this walletcommon.remark_countNumber of GMGN users who have remarked this walletcommon.created_token_countTokens created by this walletcommon.created_atWallet creation time (Unix seconds) — records when the first funding transaction arrived; use this as the wallet's age indicatorcommon.fund_fromFunding source labelcommon.fund_from_addressAddress that funded this walletcommon.fund_amountFunding amount
Use common.tags and common.twitter_username when building a wallet profile narrative. If common is absent in the response, omit identity fields silently — do not report it as an error.
portfolio created-tokens — Key Fields#The response data object has a tokens array plus aggregate stats.
Top-level fields:
FieldDescriptionlast_create_timestampUnix timestamp of the most recent token creationinner_countNumber of tokens still on the bonding curve (NOT graduated)open_countNumber of tokens that have graduated to DEXopen_ratioGraduation rate (string, e.g. "0.25")
Total created =
inner_count + open_count. Do NOT uselen(tokens)as the total — thetokensarray is capped at 100 entries and may be truncated. |creator_ath_info| Best-performing token created by this wallet (ATH market cap) | |tokens| Array of created tokens — see below |
creator_ath_info fields:
FieldDescriptioncreatorWallet addressath_tokenToken address with highest ATH market capath_mcATH market cap (USD string)token_symbol / token_nameToken ticker and nametoken_logoLogo URL
Per-token fields ( tokens[*]):
FieldDescriptiontoken_addressToken contract addresssymbolToken tickerchainChain namecreate_timestampUnix timestamp of creationis_open``true if graduated to DEXmarket_capCurrent market cap (USD string)token_ath_mcAll-time high market cap (USD string)pool_liquidityCurrent liquidity (USD string)holdersCurrent holder countswap_1hSwap count in the last hourvolume_1hTrading volume in the last hour (USD string)launchpad_platformLaunch platform name (e.g. Pump.fun)is_pump``true if launched on Pump.funbundler_rateBundler participation rate (0–1)cto_flag``true if community-takeover token
Do NOT guess field names not listed here. If a field appears in the response but is not in this table, do not interpret it without reading the raw output first.
Do NOT dump raw JSON. Always parse and present data in the structured formats below. Use --raw only when piping to jq or further processing.
portfolio holdings — Holdings Table#Present a table sorted by usd_value (descending). Show total portfolio value at the top.
text
Wallet: {wallet} | Chain: {chain}
Total value: ~${sum of usd_value across all positions}
# | Token | Balance | USD Value | Total P&L | P&L% | Avg Cost | Buys / Sells
Flag positions where profit_change is strongly negative (e.g. < -50%) or positive (e.g. > 200%) with a brief note.
portfolio activity — Activity Feed#Present as a chronological list (newest first). Use human-readable timestamps.
text
{type} {token.symbol} | {token_amount} tokens | ${cost_usd} | {timestamp} | tx: {short hash}
Group by token if the user asks about a specific token.
portfolio stats — Stats Summary#text
Wallet: {wallet} | Period: {period}
Realized P&L: ${realized_profit}
Unrealized P&L: ${unrealized_profit}
Win Rate: {winrate × 100}%
Total Spent: ${total_cost}
Buys / Sells: {buy_count} / {sell_count}
PnL Ratio: {pnl}x
[Identity: {common.name or common.twitter_username} | Tags: {common.tags}]
Show the [Identity: ...] line only if common is present in the response. For batch queries (multiple wallets), present one summary block per wallet.
portfolio holdings uses critical auth ( GMGN_API_KEY + GMGN_PRIVATE_KEY required — CLI signs the request automatically). All other portfolio commands use exist auth (API Key only, no signature required).portfolio stats supports multiple --wallet flags for batch queries--raw to get single-line JSON for further processing0x + 40 hex digits). The CLI exits with an error on invalid input.gmgn-track skill ( track follow-wallet / track kol / track smartmoney)For full wallet analysis including trade history and follow-through on top holdings, see docs/workflow-wallet-analysis.md
For in-depth trading style analysis, copy-trade ROI estimation, and smart money leaderboard comparison, see docs/workflow-smart-money-profile.md
When to use which:
docs/workflow-wallet-analysis.mddocs/workflow-smart-money-profile.mddocs/workflow-smart-money-profile.md Step 5 (leaderboard)portfolio created-tokens --chain <chain> --wallet <creator_address> directly. Get the creator address first via token info if only a token address is given.