MadeOnSolMade on Sol
Pricing
Try freeGet real-time feedsSign in
MadeOnSolMade on Sol

Solana and Robinhood Chain intelligence — KOL wallet tracking, deployer intelligence, all-DEX trade streams, and a developer API. Discover, compare, and build.

Product

  • Solana Data API
  • Robinhood Chain API
  • Robinhood Chain x402
  • MCP Servers & SDKs
  • x402 for AI Agents
  • Pricing
  • Enterprise / For Businesses

Solutions

  • Trading Bots
  • Wallet Tracking
  • Copy Trading
  • Token Scanners
  • Trading Terminals
  • DEX Data
  • Smart Money
  • Token Risk
  • View all solutions

Developers

  • API Docs
  • WebSocket Streaming
  • Changelog
  • API Status
  • Latency Benchmarks
  • Data Integrity
  • Data Dictionary
  • Methodology

Resources

  • All Tools
  • Compare Tools
  • Best Trading Bots
  • Best DEXs
  • Best Wallets
  • Best Analytics
  • Best DeFi
  • Best Snipers
  • Blog
  • Blog Archive
  • Signal Scorecard
  • Tool Uptime
  • Community
  • Submit a Tool
  • Advertise

Company

  • About
  • Contact
  • Security
  • Privacy
  • Terms
  • DPA
  • Disclaimer

© 2026 MadeOnSol

MadeOnSol — eenmanszaak, Hulshout, Belgium · KBO/BTW BE 1039.535.538 (art. 56bis, no VAT charged)

Runs on our own dedicated EU servers — self-hosted data stack, own Robinhood Chain node · security

Follow us on XPowered by:constant·k — Private Solana RPC Services
SolutionsToken Risk

Solutions · Token risk

Solana token risk as evidence, not a verdict

The MadeOnSol token risk API returns, for a Solana mint, a 0 to 100 risk score in which every point is attributed to a named factor, together with the raw inputs, the inputs it could not observe and the creator's own activity on that mint.

Read the token risk reference Look up a token
Deployers profiledElite → cold · of 1.2M+ indexed
98K
Named factors behind the score
11
Deployer tiers, elite to unranked
6

Check a mint before your bot, scanner or review queue acts on it.

Free API key · plans from €43

Scoring starts on Pro. A Free key reads the raw checks (GET /token/{mint}) and creator profiles (GET /deployer-hunter/{wallet}), without the score.

One call, four blocks

GET /tokens/{mint}/riskPro

  • risk_score · band

    0 to 100, higher is riskier: "safe" under 30, "caution" to 65, "danger" above.

    risk_scorebandscore_version

  • factors[]

    Each factor's status and points. The score is their sum.

    keystatuspointsdetail

  • assessment

    What could not be observed, and why.

    statusunknown_inputsnot_assessedexplanations

  • dev

    The creator's own buys, sells and live balance on this mint.

    buy_supply_pctsold_tokenswallet_emptytransfer_status

The problem

A single safety number hides what matters: whether the authorities are live, how thin the pool is, who bought the launch, what the creator did before and with this mint, and what could not be observed at all. A green light built on missing data is the failure to design against.

Show me

One mint, one request, the evidence behind the number

Real keys, illustrative values. This input produces exactly this score in the scorer.

  1. 1 · Ask about a mint

    One GET per mint. A PumpSwap pool address is answered for its mint; a wallet or token account gets a named 400.

    Request
    GET /api/v1/tokens/9kQuW3...pump/risk
    Authorization: Bearer msk_...
    
    // SDK: await rest.tokenRisk("9kQuW3...pump")
  2. 2 · Read the breakdown

    Nine factors fired here and add up to 47, "caution". The creator factor is at danger, LP custody is not assessed, and the creator has sold most of its self-buy, with a balance that matches its trades.

    Response (abridged)
    {
      "mint": "9kQuW3...pump",
      "risk_score": 47,
      "band": "caution",
      "factors": [
        { "key": "mint_authority", "label": "Mint authority", "status": "ok", "points": 0, "detail": "Mint authority revoked …" },
        { "key": "freeze_authority", "label": "Freeze authority", "status": "ok", "points": 0, "detail": "Freeze authority revoked …" },
        { "key": "liquidity", "label": "Liquidity", "status": "warn", "points": 8, "detail": "Low liquidity ($6,400)." },
        { "key": "liquidity_ratio", "label": "Liquidity vs market cap", "status": "warn", "points": 5, "detail": "Liquidity is 3.1% of market cap." },
        { "key": "transfer_fee", "label": "Transfer fee", "status": "ok", "points": 0, "detail": "No transfer fee." },
        { "key": "lp_burn", "label": "LP burn/lock", "status": "warn", "points": 8, "detail": "LP burn/lock status unknown …" },
        { "key": "bundled_open", "label": "Launch concentration", "status": "warn", "points": 6, "detail": "Elevated launch concentration (27.4 SOL in the first 20 buyers)." },
        { "key": "deployer_reputation", "label": "Deployer track record", "status": "danger", "points": 12, "detail": "Deployer has bonded only 4% of 50 tokens." },
        { "key": "kol_distribution", "label": "Smart-money flow", "status": "warn", "points": 8, "detail": "Tracked KOLs are net-distributing this token." }
      ],
      "inputs": {
        "mint_authority_revoked": true,
        "freeze_authority_revoked": true,
        "liquidity_usd": 6400,
        "liquidity_to_mc_ratio": 0.031,
        "transfer_fee_bps": 0,
        "is_token_2022": false,
        "token_supply_burn_detected": false,
        "burn_detected": false,
        "lp_burn_status": "unknown",
        "launch_cohort_sol": 27.4,
        "launch_cohort_size": 20,
        "sniper_footprint": { "buys": 11, "buyers": 7, "sol": 9.8, "supply_pct": 4.2, "sniper_wallet_buys": 3, "data_available": true, "as_of": "2026-09-25T09:40:00.000Z" },
        "deployer_bonding_rate": 0.04,
        "deployer_total_deployed": 50,
        "deployer_history_status": "established",
        "deployer_reputation_scored": true,
        "kol_signal": "distributing",
        "is_blacklisted": false,
        "supply_inflation_pct": null,
        "liquidity_observed_at": "2026-09-25T09:58:12.000Z"
      },
      "assessment": {
        "status": "complete",
        "unknown_inputs": [],
        "not_assessed": ["lp_custody"],
        "explanations": { "lp_custody": "LP-token custody (burn/lock) is not observed for Solana pools; no LP evidence source exists yet." }
      },
      "score_version": "v2",
      "dev": {
        "wallet": "7Dv4tP...Qm2e",
        "launchpad": "pumpfun",
        "deployed_at": "2026-09-25T09:31:07.000Z",
        "buy_sol": 1.2,
        "buy_tokens": 34120000,
        "buy_supply_pct": 3.41,
        "bought_tokens_after": 0,
        "sold_tokens": 30000000,
        "sold_sol": 1.7,
        "first_sell_at": "2026-09-25T09:36:44.000Z",
        "holdings_tokens": 4120000,
        "holdings_supply_pct": 0.412,
        "wallet_empty": false,
        "holdings_observed_at": "2026-09-25T09:59:58.000Z",
        "expected_tokens_from_trades": 4120000,
        "transfer_status": "none_detected",
        "transfer_reason": "on-chain balance is consistent with the dev's recorded trades"
      },
      "dev_status": "ok",
      "coverage": {
        "scope": "pump.fun pipeline (pump.fun, LaunchLab/bonk, bags)",
        "in_scope": true,
        "eligibility": "eligible",
        "eligibility_basis": "unresolved_launch",
        "completeness": "not_verified"
      },
      "as_of": "2026-09-25T10:00:00.000Z"
    }
  3. 3 · Follow the creator

    dev.wallet leads to the record behind that factor: 2 bonds in 50 launches, ten straight dumps, tier cold.

    Follow the creator (abridged)
    GET /api/v1/deployer-hunter/7Dv4tP...Qm2e
    
    {
      "is_deployer": true,
      "deployer": {
        "wallet_address": "7Dv4tP...Qm2e",
        "tier": "cold",
        "is_tracked": false,
        "total_tokens_deployed": 50,
        "total_bonded": 2,
        "instant_bonds": 0,
        "bonding_rate": 0.04,
        "recent_bond_rate": 0,
        "recent_outcomes": "DDDDDDDDDD",
        "runner_rate": 0,
        "last_deploy_at": "2026-09-25T09:31:07.000Z"
      },
      "launchpad_tokens": []
    }
  4. 4 · Apply your policy

    Your code decides. These thresholds are an example, not a recommendation.

    TypeScript · your policy, madeonsol-x402
    import { MadeOnSolREST } from "madeonsol-x402";
    
    const rest = new MadeOnSolREST({ apiKey: process.env.MADEONSOL_API_KEY! });
    type Decision = "allow" | "review" | "warn" | "ignore";
    
    // Your thresholds. A 503 risk_inputs_unavailable is retryable, never a pass.
    export async function decide(mint: string): Promise<Decision> {
      const r = await rest.tokenRisk(mint);
      const f = Object.fromEntries(r.factors.map((x) => [x.key, x]));
    
      if (r.inputs.is_blacklisted) return "ignore";
      if (f.mint_authority?.status === "danger" || f.freeze_authority?.status === "danger") return "ignore";
      if (r.assessment?.status === "incomplete") return "review"; // score is a lower bound
      if (r.dev?.transfer_status === "suspected") return "review";
      if (f.deployer_reputation?.status === "danger") return "warn";
      return r.risk_score < 30 ? "allow" : "review";
    }

Try it

See the checks on a real mint

The token lookup shows authority, fee and LP checks, liquidity, creator tier and KOL activity, with no key. The scored breakdown needs Pro.

Look up a token Get a free API key

Methodology

What makes up the risk context?

Read from the scorer. Each row is one entry in factors[]; the score is the sum of their points.

FactorReadsHow it scores
Mint authoritymint_authoritymint_authority_revokedRevoked 0. Live 22, and the band cannot read "safe". Unknown 8.
Freeze authorityfreeze_authorityfreeze_authority_revokedRevoked 0. Live 18, and the band cannot read "safe". Unknown 6.
Liquidityliquidityliquidity_usd$10,000 or more 0, under $10,000 8, under $2,000 15. Unknown 6.
Liquidity vs market capliquidity_ratioliquidity_to_mc_ratio5 % or more 0, under 5 % 5, under 2 % 10. Left out without a ratio.
Transfer feetransfer_feetransfer_fee_bpsis_token_2022No fee 0. A Token-2022 fee adds 4 per 1 %, 1 to 12. Unread 4: not "no fee".
LP burn/locklp_burnlp_burn_statusOnly verified LP custody scores 0. Solana LP custody is not observed today, so every token carries these 8 points. A token-supply burn is not LP evidence.
Launch concentrationbundled_openlaunch_cohort_sollaunch_cohort_sizeSOL the first buyers spent: up to 20 is 0, over 20 is 6, over 50 is 12.
Deployer track recorddeployer_reputationdeployer_bonding_ratedeployer_total_deployeddeployer_history_statusBonding rate 20 % or more 0, under 20 % 6, under 5 % 12, for an established creator only; otherwise 0, unknown or not_assessed.
Smart-money flowkol_distributionkol_signalTracked KOLs net-selling adds 8.
Supply inflationsupply_inflationsupply_inflation_pctSupply above expected in the last 30 days: 0.5 % or more 7, 5 % or more 18.
Blacklistblacklistis_blacklistedListed (stablecoins, wrapped SOL, LSTs, flagged rugs): 25, and the band is "danger".

How the total becomes a band

Sum, then bucket

Points are summed, clamped to 0 to 100: under 30 "safe", 30 to 65 "caution", above 65 "danger".

Live authority caps it

A live mint or freeze authority keeps the band at "caution" or worse.

Unknown caps it

Any unknown input makes the assessment incomplete and the score a lower bound; the band stays at "caution" or worse.

No creator, more proof

Without an assessed creator, "safe" also needs healthy liquidity observed in the last 6 hours (a policy threshold; explanations.band_cap says when it applied).

Five statuses, two of them disclosures

ok
Read, no points.
warn
Read, some points.
danger
Read, the factor's highest points.
unknown
Should exist but could not be read or is too thin. In unknown_inputs.
not_assessed
No evidence source applies. 0 points, in not_assessed, never a pass.

What the score does not tell you

Not a forecast

It adds up conditions observed at request time. It does not estimate how likely a token is to fail.

LP custody is not observed

No Solana LP-custody source exists yet: a locked LP is not credited, an unlocked one not detected.

Trade-derived fields have a scope

Launch concentration, sniper_footprint and creator sells come from the launchpad pipeline; the rest is read from chain. coverage says which applies.

Transfers are only suspected

A creator balance below its own trades is suspected, never confirmed: an uncaptured sell looks the same.

Versioned weights

score_version (v2) rides on every response, so a re-weighting never silently shifts a stored score.

Data integrity · data dictionary · token risk reference

Risk and deployer intelligence

Who launched it, and what they did before and after

The token check says what the mint looks like now; the creator layer says what its wallet did with every launch, and with this one.

LayerWhat it answersPlan
In the scoreGET /tokens/{mint}/risk · inputsScored only for an established history: a ranked tier, 10 or more observed launches, or 3 or more resolved outcomes. A first launch is not a failure.deployer_bonding_ratedeployer_total_deployeddeployer_history_statusdeployer_reputation_scoredPro
On this mintGET /tokens/{mint}/risk · devIts self-buy, later buys and sells, and live balance, each with an observation time. Returned, not scored.buy_solbuy_supply_pctsold_tokensfirst_sell_atwallet_emptytransfer_statusPro
Across its launchesGET /deployer-hunter/{wallet}Tier, lifetime and recent bonding rate, last ten outcomes, and self-filled bonds.tierbonding_raterecent_bond_raterecent_outcomesinstant_bondsrunner_rateFree
As it stood thenGET /deployer-hunter/{wallet}/as-of · /historyThe record on a past date with no look-ahead, for backtests.snapshot_datetierbonding_ratecarriedPro
When it moveswallet:scores · deployer:tier_changedPushed when a watched creator is reclassified; 25 on Pro, 100 on Ultra, 250 on Business wallets per connection.tier_beforetier_afterentered_rankingstatsFrom Pro

The six tiers, as the classifier applies them

  1. 01 · cold

    Last 10 outcomes without a bond, 3+ launches. Checked first.

  2. 02 · elite

    5+ launches, 5+ bonds, lifetime 40 %+, recent 50 %+.

  3. 03 · good

    3+ launches, 3+ bonds, lifetime 25 %+, recent 30 %+.

  4. 04 · moderate

    3+ launches, 1+ bond, lifetime and recent 15 %+.

  5. 05 · rising

    1 to 3 launches, every resolved one bonded, more than one self-filled bond.

  6. 06 · unranked

    Everything else, long histories included. Not the same as new.

A bond within 1 minute of the deploy is instant (the creator's own bundle); all-instant wallets stay out of elite, good and moderate. Launches by elite, good, rising creators also fire deployer:alert. Tier definitions · deployer endpoints · Deployer Hunter

Architecture

Evidence in, your decision out

MadeOnSol supplies the evidence and never labels a token for your users; two products can read the same response and act differently.

  1. 1 · Yours

    A mint to check

    From a scanner, a KOL trade, a launch alert or a user.

  2. 2 · MadeOnSol

    Token evidence

    Factors, raw inputs, what was not observed.

  3. 3 · MadeOnSol

    Creator evidence

    The dev block, then tier and record.

  4. 4 · Yours

    Your policy

    Your weights, thresholds and handling of unknowns.

  5. 5 · Yours

    Your action

    In your product, under your name.

    allowreviewwarnignore

Keys stay server-side. Cache per mint as your policy allows; re-read when a risk channel reports a change.

Keep it current

Know when the evidence changes

Two scoped channels on /ws/v1/stream push input changes for the mints and creators you name. Streaming reference

token:riskFrom Pro

risk:authority_changedrisk:supply_inflated

Means: An authority was revoked, the Token-2022 fee changed, or supply drift crossed 0.5 % or 5 %. risk:inputs snapshot on subscribe.

Does not mean: A new score or band; re-read GET /tokens/{mint}/risk.

filters.mints required, 25 on Pro, 100 on Ultra, 250 on Business mints per connection

wallet:scoresFrom Pro

deployer:tier_changed

Means: A watched creator was reclassified, with tier_before, tier_after and stats.

Does not mean: The moment the fact changed: a scheduled recompute can lag; read computed_at and source.

filters.wallets required, 25 on Pro, 100 on Ultra, 250 on Business wallets per connection

Plans

Which plan each check needs

CheckWherePlan
Scored risk, one mintGET /tokens/{mint}/riskFrom Pro
Scored risk, many mintsPOST /tokens/batch/riskFrom ProUp to 50 mints per request
Raw checks and creator tierGET /token/{mint}FreeNo score
Creator profileGET /deployer-hunter/{wallet}Free
Creator record over timeGET /deployer-hunter/{wallet}/as-of, /historyFrom Pro
Early-buyer bundlesGET /tokens/{mint}/bundleFreeSummary on Free; top 10 wallets on Pro; full cohort on Ultra
Live top holdersGET /tokens/{mint}/holdersFrom Pro
Risk-input changestoken:risk channelFrom Pro
Creator tier changeswallet:scores channelFrom Pro
Keyless, per callGET /api/x402/tokens/{mint}/riskNo plan: pay per callx402, same score

Compare plans · x402 pay-per-call endpoints

Build outcomes

What risk-aware products teams build

  • Pre-trade checks in trading bots
  • Review queues for new listings
  • Risk replies in chat bots
  • Factor badges in scanner rows
  • Creator watchlists

Showing MadeOnSol data to your own users requires a Business plan. See pricing

Keep going

Related

Solution

Trading Bots

Check a mint before an order.

Solution

Token Scanners

Risk next to live token activity.

Product

Deployer Hunter

Creator tiers and launches in the browser.

Guide

Build a rug-check Telegram bot

Reply with the factor breakdown.

Guide

How deployer tiers are scored

The model behind the creator record.

Guide

Score a new pump.fun token in 60 seconds

A checklist to automate.

FAQ

Questions about token risk data

Does a low risk score or a "safe" band mean I can trust a token?+
No. A low total means few risk conditions were observed at request time, not that the token cannot lose value or be abandoned. No token earns an LP credit, and the band reads "safe" only when no input is unknown. Treat it as one input to your own rule.
What data contributes to the token risk score?+
Eleven named factors, each with its points in the table above: mint and freeze authority, transfer fee, liquidity and its share of market cap, LP custody, launch concentration, the creator's bonding rate, KOL net selling, supply drift over 30 days and the blacklist. sniper_footprint and the dev block are returned but not scored. Every field is in the API reference.
Can my bot check risk before it acts on a trade?+
Yes: GET /tokens/{mint}/risk for one mint, POST /tokens/batch/risk for up to 50 mints as one request, or keyless through x402. A 503 risk_inputs_unavailable is retryable, never a pass; a 429 means too many heavy queries on your key. Batch skips only the creator's live balance.
How is deployer history used in the risk score?+
Only an established creator is scored (a ranked tier, 10 or more observed launches, or 3 or more resolved outcomes): under 20 % bonding adds 6, under 5 % adds 12, and a first launch reads unknown. The dev block, GET /deployer-hunter/{wallet} and /as-of add what it did with this mint, its record, and that record on a past date.
What is the difference between unknown and not_assessed?+
unknown: the input should exist but could not be read or is too thin, like a first launch. It lands in unknown_inputs, the assessment is incomplete and the band stays off "safe". not_assessed: no evidence source applies, like Solana LP custody or a token from outside tracked launchpads. 0 points, disclosed, never a pass. If the price, blacklist or supply-drift read fails, no score is returned.
Can teams prototype first?+
Yes. A free key from the developer page reads GET /token/{mint} (authorities, fee, LP status, liquidity, launch cohort, KOL flow, creator tier) and GET /deployer-hunter/{wallet}; the token lookup needs no key. Scoring, batch and the risk streams start on Pro; see pricing.

Next step

Read the evidence, then write your own rule.

Check the method, look at a real mint, then score from your own code.

  1. 1 · ProofData integrity Point-in-time, traceable answers.
  2. 2 · TryLook up a token Raw checks, no key.
  3. 3 · DocsToken risk reference Fields and error codes.
  4. 4 · PlanCompare plans Scored risk from Pro.