Solana & Pump.fun Token Autopsy: Bundle & Rug Risk Scanner avatar

Solana & Pump.fun Token Autopsy: Bundle & Rug Risk Scanner

Pricing

$2.50 / 1,000 token autopsies

Go to Apify Store
Solana & Pump.fun Token Autopsy: Bundle & Rug Risk Scanner

Solana & Pump.fun Token Autopsy: Bundle & Rug Risk Scanner

Read-only Solana & Pump.fun rug-risk scanner: mint/freeze authority, liquidity depth, buy/sell flow, dump simulation and a SKIP/WATCH verdict per token. Holder & bundle data with your RPC.

Pricing

$2.50 / 1,000 token autopsies

Rating

0.0

(0)

Developer

Almandine Data

Almandine Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Security

Limited permissions

Share

Paste a contract address, get a structured post-mortem before you even open a chart. This Actor pulls live DexScreener market data and Solana on-chain account state for every token you give it (or for whatever is trending and boosted right now), runs a fixed set of deterministic risk rules, and returns one clean row per token with a 0-10 autopsyScore, ranked red flags, and a SKIP / WATCH / VALID_SETUP label.

Without your own RPC the best possible verdict is WATCH (score capped at 7.0, confidence: limited), because holder concentration has not been checked. A default run full of WATCH and SKIP rows is working as designed; add rpcUrl to unlock VALID_SETUP.

It is built for people who already ask Claude, ChatGPT, or a Telegram bot "is this token a rug?" and are tired of copy-pasting numbers out of five browser tabs. Every row carries a claudePromptContext string so an AI agent can reason over facts instead of vibes.

Read-only. No wallets, no private keys, no trading, no signing. Output is analytical research data from public sources. It is not financial advice and never tells you to buy anything.

Holder analysis is an optional add-on (off by default)

Holder concentration needs getTokenLargestAccounts, and the free public Solana RPC rate-limits that call so hard that results from it are unreliable. Rather than hand you half-filled numbers, the Actor skips the holder lookup entirely unless you bring your own RPC URL (a free Helius, QuickNode, or Triton key is enough).

  • Without rpcUrl (default): market, flow, liquidity, mint/freeze authority, dump simulation, and verdict are all computed. bundleSuspectScore is null with bundleDataStatus: partial_no_rpc, because the bundle signal depends on holder shape and a 0 would wrongly read as clean. top10HoldersPct and top1HolderPct are null, holderDataStatus is skipped_no_rpc, and the two holder rules report pass: null and do not count against autopsyScore. Because concentration is unverified, autopsyScore is capped at 7.0, confidence is limited, verdict is capped at WATCH, and a holder check skipped, verify concentration before acting note is added to redFlags.
  • With rpcUrl: holder %, largestHolders (pool vault excluded), and the holder rules switch on. holderDataStatus is ok, or rate_limited if your RPC refuses the call (then the WATCH cap still applies). Only ok rows can reach VALID_SETUP.
  • Price is the same either way: $2.50 per 1,000 autopsy rows. Holder data is never charged extra.

What you get per token

  • Market: priceUsd, marketCapUsd, liquidityUsd, liquidityToMcapPct, ageHours, dexId (pumpfun, pumpswap, raydium, meteora, orca...), pairAddress, pairUrl.
  • Flow: volume5mUsd / volume1hUsd / volume24hUsd, buys and sells for 5m / 1h / 24h, buySellRatio1h, priceChange5mPct / 1hPct / 24hPct.
  • On-chain safety: mintAuthorityRevoked and freezeAuthorityRevoked read straight from the mint account (getMultipleAccounts, jsonParsed).
  • Holders: top10HoldersPct and top1HolderPct with the liquidity-pool vault excluded, plus a largestHolders table (getTokenLargestAccounts). Optional, needs your own rpcUrl.
  • Bundle heuristic (with your RPC): bundleSuspectScore 0-100, raised by clusters of equally sized top wallets, heavy top-10 concentration, very young thin pools, and lopsided buy pressure. null plus bundleDataStatus explaining why when holders are not checked.
  • Rules: ruleChecks object, one entry per rule with pass, value, and limit.
  • Verdict: autopsyScore (capped at 7.0 without holder data), rawScore (same formula, uncapped, so you can rank tokens inside a default run), confidence (high with holder data, limited without), verdict, redFlags (most dangerous first), greenFlags.
  • Dump simulation: graduationDumpSimulation estimates price impact if the top 5 holders, or 1% / 5% / 10% of supply, are market-sold into the current pool (constant-product approximation).
  • AI context: claudePromptContext, a one-paragraph factual summary ready to paste into any LLM.

Why not just use DexScreener and Solscan?

TaskManual tab-jugglingThis Actor
Check 60 trending tokens60 x (DexScreener + Solscan holders (with your RPC) + authority check) = an afternoonOne run, about 15-60 seconds
Exclude the pool vault from holder % (with your RPC)Eyeball which wallet is the LPMatched automatically against pooled base
Mint / freeze authorityOpen the token account, read raw fieldsBoolean columns
Apply your thresholdsMental math every timeruleChecks with your limits
Feed an AI agentCopy-paste screenshotsStructured JSON + claudePromptContext
Repeat every 15 minutesNot realisticApify Schedules + webhooks

Input

ParameterTypeDefaultDescription
modestring"autopsy_and_trending"'autopsy_and_trending' autopsies your mints plus trending/boosted Solana tokens; 'mints_only' only your list; 'trending_discovery' only DexScreener boosts, profiles and search results.
mintAddressesarray["pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7Solana token mint addresses (CAs), DexScreener pair/token URLs, or pump.fun/coin URLs.
searchQueriesarray["pump", "pumpswap", "raydium", "solana Free-text DexScreener searches used to discover more Solana pairs (non-Solana results are dropped).
dexFilterarray[]Keep only these DexScreener dexIds (e.g. pumpfun, pumpswap, raydium, meteora, orca). Empty = all.
maxTop10HoldersPctnumber25Rule: top 10 wallets (excluding the pool vault) may hold at most this % of supply.
maxTop1HolderPctnumber8Rule: the largest non-pool wallet may hold at most this % of supply.
minLiquidityUsdnumber5000Rule: minimum pooled liquidity in USD.
minVolume1hUsdnumber2500Rule: minimum 1-hour trading volume in USD.
rpcUrlstring""Holder analysis (bring your own RPC: Helius/QuickNode/Triton). Optional add-on. Paste your own read-only Solana RPC URL to enable top-10/top-1 holder analysis, pool-vault exclusion and the holder rules. Empty = holder lookup skipped (holderDataStatus: skipped_no_rpc). No extra charge.
maxItemsinteger65Maximum tokens to autopsy (each is one billed token-autopsy event).

Run with {} and you get roughly 60+ live autopsies: the PUMP token plus everything currently boosted, profiled, or matched by the default searches on DexScreener.

Holder data and rpcUrl

See Holder analysis is an optional add-on above. Only read methods are ever called on your RPC.

Use it from Claude Desktop or Cursor (MCP)

Add the official Apify MCP server and expose just this Actor as a tool:

{
"mcpServers": {
"apify": {
"command": "npx",
"args": ["-y", "@apify/actors-mcp-server", "--actors", "informed_almandine_vzb/solana-pumpfun-token-autopsy-scanner"],
"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }
}
}
}

In Cursor, put the same block in .cursor/mcp.json. Then ask: "Run the token autopsy on these three CAs and tell me which fail my rules."

A 7-step AI research workflow

This is a discipline, not a signal service. Each step maps to fields the Actor already returns.

  1. Pre-filter. Run trending_discovery with your minLiquidityUsd and minVolume1hUsd. Drop every row whose verdict is SKIP. Most of the noise dies here.
  2. Autopsy. For what remains, read ruleChecks and redFlags top-down. Any mint or freeze authority still live is disqualifying on its own.
  3. Narrative. Ask the model to summarise socials, name, and age: is there a real community, or a ticker launched an hour ago with no links?
  4. Bundle check (with your RPC). Look at bundleSuspectScore and largestHolders. Four wallets holding nearly identical percentages is the classic bundled-launch fingerprint.
  5. Dump simulation. Read graduationDumpSimulation. If the top five holders selling would erase 80%+ of the price, that is your realistic exit, whatever the chart says.
  6. Sizing discipline. Decide your own maximum loss before anything else. Nothing here sizes a position for you and nothing here should.
  7. Review. Re-run the same mints later (Apify Schedules) and compare verdict and flags over time. Keep a log; the dataset already is one.

Example prompt: "Here are 20 token autopsies as JSON. Group them by verdict, list the top red flag for each SKIP, and for each WATCH tell me which single rule would need to change for it to pass. Do not give buy advice."

Reliability

Three consecutive clean cloud runs with empty {} input (build 0.1.5, Apify Cloud, no RPC):

Run IDStarted (UTC)RowsErrorsCharged eventsRuntime
fOzy2gI8mzDx7jpWi2026-10-29 16:53:1665065 token-autopsy14.5s
PSPm9MEsBig4OEnu22026-10-29 16:53:5265065 token-autopsy14.3s
eXHjFfwbfmK7dez952026-10-29 16:54:1165065 token-autopsy14.8s

Every run returned the same row count with zero entries in the ERRORS record. Example 1 below is the first row of run eXHjFfwbfmK7dez95.

Real sample from a live run

First rows of an actual cloud {} run eXHjFfwbfmK7dez95 (2026-10-29T16:54:14+00:00 UTC):

Verdicts in that run: 0 VALID_SETUP, 53 WATCH, 12 SKIP out of 65 tokens (no RPC, so nothing can exceed WATCH or a 7.0 score).

SymbolDEXMarket capLiquidityAge (h)ConfidenceScoreRawVerdict
PUMPpumpswap$2,114,531,163$24,010,74011327.97limited79.8WATCH
AgenCpumpswap$981,156$84,7440.53limited710WATCH
CBUCKSpumpswap$916,833$102,769550.41limited710WATCH
SENSEraydium$1,174,289$136,3572.28limited710WATCH
WDGpumpfun$3,831$0144.11limited6.56.5SKIP
VIpumpswap$288,592$45,0222.7limited710WATCH
STOMPpumpfun$12,355$06718.91limited6.56.5SKIP
STANKraydium$84,505$25,6992.96limited710WATCH

Example 1: real row from cloud run eXHjFfwbfmK7dez95, default {} input, no RPC

{
"mint": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn",
"symbol": "PUMP",
"name": "Pump",
"dexId": "pumpswap",
"pairAddress": "2uF4Xh61rDwxnG9woyxsVQP7zuA6kLFpb3NvnRQeoiSd",
"pairUrl": "https://dexscreener.com/solana/2uf4xh61rdwxng9woyxsvqp7zua6klfpb3nvnrqeoisd",
"discoverySource": "input",
"priceUsd": 0.004592,
"ageHours": 11327.97,
"marketCapUsd": 2114531163,
"liquidityUsd": 24010739.72,
"liquidityToMcapPct": 1.14,
"holderDataStatus": "skipped_no_rpc",
"top10HoldersPct": null,
"top1HolderPct": null,
"largestHolders": [],
"mintAuthorityRevoked": true,
"freezeAuthorityRevoked": true,
"bundleSuspectScore": null,
"bundleDataStatus": "partial_no_rpc",
"volume5mUsd": 13117.76,
"volume1hUsd": 436949.66,
"volume24hUsd": 5549009.31,
"txns5mBuys": 52,
"txns5mSells": 13,
"txns1hBuys": 605,
"txns1hSells": 302,
"txns24hBuys": 15968,
"txns24hSells": 8728,
"buySellRatio1h": 2,
"priceChange5mPct": 0.23,
"priceChange1hPct": 1.62,
"priceChange24hPct": 9.39,
"socials": {
"twitter": "https://x.com/pumpfun",
"website": "https://pump.fun"
},
"ruleChecks": {
"maxTop10HoldersPct": {
"pass": null,
"value": null,
"limit": 25
},
"maxTop1HolderPct": {
"pass": null,
"value": null,
"limit": 8
},
"minLiquidityUsd": {
"pass": true,
"value": 24010739.72,
"limit": 5000
},
"minVolume1hUsd": {
"pass": true,
"value": 436949.66,
"limit": 2500
},
"mintAuthorityRevoked": {
"pass": true,
"value": true,
"limit": true
},
"freezeAuthorityRevoked": {
"pass": true,
"value": true,
"limit": true
},
"minLiquidityToMcapPct": {
"pass": false,
"value": 1.14,
"limit": 5
},
"maxBundleSuspectScore": {
"pass": null,
"value": null,
"limit": 50
}
},
"autopsyScore": 7,
"rawScore": 9.8,
"confidence": "limited",
"verdict": "WATCH",
"redFlags": [
"Liquidity only 1.14% of market cap: thin exit",
"holder check skipped, verify concentration before acting"
],
"greenFlags": [
"Mint authority revoked",
"Freeze authority revoked",
"Deep liquidity $24,010,740",
"Net buying: 605 buys vs 302 sells (1h)",
"Multiple socials listed",
"Survived 472.0 days"
],
"graduationDumpSimulation": {
"model": "constant-product x*y=k on DexScreener pooled base (approximation)",
"poolBaseTokens": 2617867765,
"top5SellPriceImpactPct": null,
"sell1PctSupply": 94.2,
"sell5PctSupply": 99.64,
"sell10PctSupply": 99.91
},
"claudePromptContext": "PUMP (pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn) on pumpswap: age 11327.97h, mcap $2,114,531,163, liq $24,010,740 (1.14% of mcap), 1h vol $436,950, 1h buys/sells 605/302, top10 holders not analysed (skipped_no_rpc), mint revoked True, freeze revoked True, bundle score not computed (partial_no_rpc), autopsy 7.0/10 (raw 9.8, limited confidence) -> WATCH. Red flags: Liquidity only 1.14% of market cap: thin exit; holder check skipped, verify concentration before acting. Analytical only, not financial advice.",
"scrapedAt": "2026-10-29T16:54:14+00:00"
}

Example 2: holder-enabled row (ILLUSTRATIVE SHAPE ONLY)

Not real output. This shows the field shape when rpcUrl is set. Holder numbers and account placeholders below are made up for illustration; only holder-related fields are shown; every other field matches Example 1.

{
"mint": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn",
"symbol": "PUMP",
"holderDataStatus": "ok",
"bundleSuspectScore": 22,
"bundleDataStatus": "ok",
"confidence": "high",
"top10HoldersPct": 18.42,
"top1HolderPct": 4.1,
"largestHolders": [
{
"rank": 1,
"tokenAccount": "<pool vault token account>",
"pct": 0.26,
"isPoolVault": true
},
{
"rank": 2,
"tokenAccount": "<token account>",
"pct": 4.1,
"isPoolVault": false
},
{
"rank": 3,
"tokenAccount": "<token account>",
"pct": 3.65,
"isPoolVault": false
}
],
"ruleChecks": {
"maxTop10HoldersPct": {
"pass": true,
"value": 18.42,
"limit": 25.0
},
"maxTop1HolderPct": {
"pass": true,
"value": 4.1,
"limit": 8.0
},
"minLiquidityUsd": {
"pass": true,
"value": 23982026.9,
"limit": 5000.0
},
"minVolume1hUsd": {
"pass": true,
"value": 440982.3,
"limit": 2500.0
},
"mintAuthorityRevoked": {
"pass": true,
"value": true,
"limit": true
},
"freezeAuthorityRevoked": {
"pass": true,
"value": true,
"limit": true
},
"minLiquidityToMcapPct": {
"pass": false,
"value": 1.14,
"limit": 5
},
"maxBundleSuspectScore": {
"pass": true,
"value": 0,
"limit": 50
}
},
"graduationDumpSimulation": {
"model": "constant-product x*y=k on DexScreener pooled base (approximation)",
"poolBaseTokens": 2620674002.0,
"top5SellPriceImpactPct": "<computed from top-5 balances>",
"sell1PctSupply": 94.19,
"sell5PctSupply": 99.64,
"sell10PctSupply": 99.91
},
"claudePromptContext": "<same summary, with 'top10 holders 18.42%'>"
}

A typical SKIP from the same real run: WDG: Near-zero liquidity ($0); Liquidity only 0.0% of market cap: thin exit; holder check skipped, verify concentration before acting.

API examples

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("informed_almandine_vzb/solana-pumpfun-token-autopsy-scanner").call(run_input={
"mode": "mints_only",
"mintAddresses": ["pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn"],
"maxTop10HoldersPct": 20,
})
for t in client.dataset(run["defaultDatasetId"]).iterate_items():
print(t["symbol"], t["verdict"], t["autopsyScore"], t["redFlags"][:2])

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('informed_almandine_vzb/solana-pumpfun-token-autopsy-scanner').call({ mode: 'trending_discovery', dexFilter: ['pumpswap', 'pumpfun'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((t) => t.verdict !== 'SKIP').map((t) => t.claudePromptContext));

cURL / JSON input

curl -X POST "https://api.apify.com/v2/acts/informed_almandine_vzb~solana-pumpfun-token-autopsy-scanner/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"mints_only","mintAddresses":["https://pump.fun/coin/pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn"]}'

Pricing

Pay per event, $0.00 start fee.

EventPrice
token-autopsy (one token analysed and saved)$0.0025 ($2.50 per 1,000)
  • A default {} run of ~65 tokens costs about $0.16.
  • Scanning 60 trending tokens every hour for a day: 1,440 autopsies = $3.60.
  • Apify's $5 monthly free credit covers about 2,000 autopsies.
  • Tokens with no Solana pair on DexScreener are logged in the ERRORS record and not charged.

Limits and honest caveats

  • DexScreener and RPC data are snapshots; meme-token markets move in seconds.
  • bundleSuspectScore is only computed with your RPC; it is a heuristic from holder shape and flow, not a forensic trace of funding wallets.
  • The dump simulation assumes a single constant-product pool and ignores other pools, fees, and arbitrage.
  • Holder % uses the 20 largest token accounts; exchange or program accounts other than the pool vault are not labelled.

Data, safety, and disclaimer

All data comes from public sources: the DexScreener public API and public Solana JSON-RPC read methods (getMultipleAccounts, getTokenLargestAccounts). The Actor never asks for a seed phrase or private key, never connects a wallet, and never sends a transaction. VALID_SETUP, WATCH, and SKIP describe how a token scores against the rules you set; they are not recommendations to buy, sell, or hold. Crypto tokens, especially new Pump.fun launches, can and do go to zero. Do your own research.