Token risk / safety score
Transparent 0–100 rug-risk score (higher = riskier) with a per-factor breakdown — mint/freeze authority, liquidity depth & thinness, Token-2022 transfer fee, LP burn, bundled/sniped open, deployer track record, KOL distribution, supply inflation (on-chain supply grown above expected = stealth-mint/dilution), and blacklist. Composed from the same data layer as GET /token/{mint} (no extra latency). Returns band (safe/caution/danger), factors[] (each with status + points + detail), and the raw inputs (including supply_inflation_pct and sniper_footprint). The top-level dev block (nullable) is the deployer self-activity read: create-tx self-buy (buy_sol/buy_tokens/buy_supply_pct), post-create own-mint trading (bought_tokens_after, sold_tokens, sold_sol, first_sell_at/last_sell_at), and live on-chain holdings (holdings_tokens, holdings_supply_pct, wallet_empty), each with its own observation time (holdings_observed_at, activity_rollup_through), plus transfer_status (none_detected | suspected | unknown): a balance below what the dev's own recorded trades explain is only ever SUSPECTED (a sell on an uncaptured venue looks identical), and misaligned or missing observations are unknown; transferred_out is its deprecated boolean view. Carries score_version (now v2) and as_of (response time — not an observation time).
Score v2 (2026-09-21): the LP factor no longer credits a token-SUPPLY burn (mc-tracker's burn flag) — LP custody is not observed for Solana pools, so lp_burn is warn/8 with inputs.lp_burn_status: unknown unless verified LP evidence exists; an unknown transfer fee is warn/4, not "No transfer fee"; deployer reputation scores only an established history. assessment says whether every input was observed: incomplete lists unknown_inputs and the band is never safe; a failed lookup of a score-critical input is a retryable 503 (code: risk_inputs_unavailable), never a score computed without it. Same loader on every transport: POST /tokens/batch/risk and x402 return identical scores for identical evidence; batch skips only the live dev-holdings RPC (dev.holdings_* null, transfer_status: unknown). The coverage object (shared TradeCoverage shape) discloses whether the mint sits inside the launchpad trade capture, with a note naming which sub-fields are trade-derived (cohort/sniper/bundle factors, dev sell rollup) vs pure on-chain reads (authorities, liquidity, live holdings) that are unaffected. PRO+.
Request
- Base URL: https://madeonsol.com/api/v1
- URL: https://madeonsol.com/api/v1/tokens/{mint}/risk
- Auth: HTTP bearer
Path parameters
Response
OK
Example response
{
"resolved_from": {
"dex": "pumpswap"
},
"coverage": {
"history_start": 1775984757,
"scope": "pump.fun pipeline (pump.fun, LaunchLab/bonk, bags)",
"size_floor": {
"min_sol": 0.05,
"min_stable_usd": 3.5,
"applies_to": "buys and SOL-spending legs; SOL-receiving sells of any size are kept"
}
}
}Changes
No recorded changes to this operation across all 1 revision of this API.