Skip to main content
This guide walks through a systematic process for evaluating Solana token safety. It combines the Token Risk Assessment (which evaluates 17 risk factors) with Address Risk Score (which checks the token deployer) to produce a comprehensive risk picture.
Prerequisites: You need a Risk API key and familiarity with the Token Risk Assessment and Address Risk Score endpoints.

When to Use This

  • Exchanges - Before listing a new token for trading
  • DEX aggregators - Before including a token in routing
  • Portfolio trackers - Before displaying a token’s price and details
  • DeFi protocols - Before accepting a token as collateral or in liquidity pools
  • Wallet providers - Before showing token metadata to users

Step 1: Assess Token Risk

Submit the token’s mint address to get a multi-factor risk assessment.
curl -X GET "https://api.range.org/api/v1/ml/risk/assessment/token?mint_address=MINT_ADDRESS&network=solana" \
  -H "Authorization: Bearer your_api_key_here"
async function assessToken(mintAddress) {
  const params = new URLSearchParams({
    mint_address: mintAddress,
    network: "solana",
  });
  const response = await fetch(
    `https://api.range.org/api/v1/ml/risk/assessment/token?${params}`,
    { headers: { Authorization: `Bearer ${API_KEY}` } }
  );
  return response.json();
}

Interpreting the Response

The response contains an overall_assessment with the aggregate risk, and risk_factors with individual assessments.
Overall Risk LevelRisk PercentageInterpretation
LOW<30%Token passes most risk checks. Suitable for listing with standard monitoring.
MEDIUM30–60%Some risk factors flagged. Requires manual review before listing.
HIGH≥60%Multiple risk factors flagged. Not recommended for listing without thorough investigation.

Step 2: Understand the Risk Factors

The 17 risk factors fall into 5 categories. Focus on the factors most relevant to your use case:

Critical Factors for Listing Decisions

FactorWhy It MattersWhat HIGH Means
Mint AuthorityCan new tokens be created?Active - unlimited supply inflation possible
Freeze AuthorityCan token accounts be frozen?Active - users could be blocked from transferring
Top Holder ConcentrationIs supply concentrated?>90% held by top holders - coordinated dump risk
LiquidityCan holders sell?<$10K liquidity - holders may be trapped
Wash TradingIs volume real?Suspicious patterns in ≥2 timeframes

Contextual Factors

FactorWhy It MattersWhat HIGH Means
Token AgeIs there a track record?<7 days old - insufficient history
Market CapSize and manipulation risk<$1M - more susceptible to manipulation
Organic ActivityIs demand genuine?Low organic score - bot-driven trading activity
Exchange ListingsHas it passed other due diligence?No exchange listings

Using the errors Array

Not all 17 factors can be assessed for every token. The errors array lists skipped assessments:
"errors": [
  "Dev migration data not available - dev_migrations assessment skipped",
  "Exchange listing data not available - exchange_listings assessment skipped"
]
Tokens with fewer assessed factors need extra caution. A LOW score based on 3 factors is less reliable than one based on 13. The API adjusts the maximum possible score accordingly, but partial data should prompt additional manual review.

Step 3: Check the Deployer Address

For additional context, check the risk score of the address that deployed the token. A high-risk deployer is a strong signal of a problematic token.
curl -G https://api.range.org/v1/risk/address \
  --data-urlencode "address=DEPLOYER_ADDRESS" \
  --data-urlencode "network=solana" \
  -H "Authorization: Bearer your_api_key_here"
The deployer address isn’t returned by the Token Risk Assessment API - you’ll need to look it up onchain (e.g., via the Solana Explorer or your own indexer). If you don’t have the deployer address, you can skip this step. The Token Risk Assessment is comprehensive on its own.

Step 4: Make a Listing Decision

Combine the token risk assessment and deployer check into a decision framework. Different platforms have different risk tolerances:

Exchange Listing Criteria

Token RiskDeployer RiskAssessed FactorsDecision
LOW1–3≥10List - Comprehensive data, low risk
LOW1–3<10Review - Low risk but limited data
MEDIUMAnyAnyReview - Manual investigation required
HIGHAnyAnyReject - Multiple risk signals
Any8–10AnyReject - Deployer connected to malicious activity

DEX Aggregator / Portfolio Tracker Criteria

DEX aggregators and portfolio trackers typically have broader inclusion criteria since users are selecting tokens themselves:
Token RiskAction
LOWInclude with no warnings
MEDIUMInclude with a risk indicator
HIGHInclude with a prominent warning, or exclude from default lists

Step 5: Monitor Over Time

Token risk is not static. Tokens that pass initial due diligence can deteriorate:
  • Rug pull preparation - Authority controls re-enabled, liquidity removed
  • Wash trading emergence - Artificial volume after listing
  • Holder concentration shifts - Token accumulation by few addresses
Set up periodic re-assessment for listed tokens:
async function periodicTokenCheck(mintAddresses) {
  const results = [];

  for (const mint of mintAddresses) {
    const risk = await assessToken(mint);
    results.push({
      mint,
      risk_level: risk.overall_assessment.risk_level,
      risk_percentage: risk.overall_assessment.risk_percentage,
      high_risk_factors: risk.summary.high_risk_count,
      checked_at: new Date().toISOString(),
    });
  }

  // Flag tokens whose risk has increased
  return results.filter((r) => r.risk_level !== "LOW");
}

Complete Due Diligence Function

async function tokenDueDiligence(mintAddress, deployerAddress = null) {
  // Token risk assessment
  const tokenRisk = await assessToken(mintAddress);

  const result = {
    token: tokenRisk.token_info,
    risk_level: tokenRisk.overall_assessment.risk_level,
    risk_percentage: tokenRisk.overall_assessment.risk_percentage,
    factors_assessed: tokenRisk.summary.total_factors,
    high_risk_factors: tokenRisk.summary.high_risk_count,
    critical_flags: [],
  };

  // Check critical factors
  const factors = tokenRisk.risk_factors;
  if (factors.minting_authority?.level === "HIGH")
    result.critical_flags.push("Mint authority active");
  if (factors.freeze_authority?.level === "HIGH")
    result.critical_flags.push("Freeze authority active");
  if (factors.top_holder_concentration?.level === "HIGH")
    result.critical_flags.push("High holder concentration (>90%)");
  if (factors.wash_trading?.level === "HIGH")
    result.critical_flags.push("Wash trading detected");

  // Deployer check (optional)
  if (deployerAddress) {
    const deployerRisk = await checkAddressRisk(deployerAddress, "solana");
    result.deployer_risk = {
      score: deployerRisk.riskScore,
      level: deployerRisk.riskLevel,
      reasoning: deployerRisk.reasoning,
    };
    if (deployerRisk.riskScore >= 6) {
      result.critical_flags.push(
        `Deployer risk score: ${deployerRisk.riskScore}/10`
      );
    }
  }

  // Recommendation
  if (
    result.risk_level === "HIGH" ||
    result.critical_flags.length >= 3 ||
    result.deployer_risk?.score >= 8
  ) {
    result.recommendation = "reject";
  } else if (
    result.risk_level === "MEDIUM" ||
    result.critical_flags.length >= 1 ||
    result.factors_assessed < 10
  ) {
    result.recommendation = "review";
  } else {
    result.recommendation = "list";
  }

  return result;
}

What’s Next

Last modified on March 2, 2026