curl --request GET \
--url https://api.range.org/v1/risk/token \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.range.org/v1/risk/token"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.range.org/v1/risk/token', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.range.org/v1/risk/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.range.org/v1/risk/token"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.range.org/v1/risk/token")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v1/risk/token")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"token_info": {
"asset_address": "So11111111111111111111111111111111111111112",
"name": "Wrapped SOL",
"symbol": "SOL"
},
"overall_assessment": {
"risk_level": "LOW",
"risk_score": 123,
"max_score": 123,
"risk_percentage": 72.5
},
"summary": {
"total_factors": 123,
"high_risk_count": 123,
"medium_risk_count": 123,
"low_risk_count": 123
},
"risk_factors": {},
"processing_time_ms": 154,
"errors": [
"<string>"
]
}Token Risk Assessment
Comprehensive risk assessment for Solana tokens using advanced heuristic analysis.
curl --request GET \
--url https://api.range.org/v1/risk/token \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.range.org/v1/risk/token"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.range.org/v1/risk/token', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.range.org/v1/risk/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.range.org/v1/risk/token"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.range.org/v1/risk/token")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v1/risk/token")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"token_info": {
"asset_address": "So11111111111111111111111111111111111111112",
"name": "Wrapped SOL",
"symbol": "SOL"
},
"overall_assessment": {
"risk_level": "LOW",
"risk_score": 123,
"max_score": 123,
"risk_percentage": 72.5
},
"summary": {
"total_factors": 123,
"high_risk_count": 123,
"medium_risk_count": 123,
"low_risk_count": 123
},
"risk_factors": {},
"processing_time_ms": 154,
"errors": [
"<string>"
]
}- Multi-factor analysis across 17 distinct risk dimensions
- Real-time assessment with typical response times under 500ms
- Graceful degradation when some data sources are unavailable
- Human-readable explanations for each risk factor
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
mint_address | string | Yes | Solana token mint address (32-44 character base58 string) |
network | string | No | Blockchain network (default: solana). Currently only Solana is supported. |
Response Schema
Top-Level Fields
| Field | Type | Description |
|---|---|---|
token_info | object | Token metadata: mint_address, name, symbol |
overall_assessment | object | Risk result: risk_level (LOW/MEDIUM/HIGH), risk_score, max_score, risk_percentage |
summary | object | Factor counts: total_factors, high_risk_count, medium_risk_count, low_risk_count |
risk_factors | object | Individual assessments keyed by factor name. Each contains level and explanation. |
processing_time_ms | number | Processing time in milliseconds. |
errors | array | Non-fatal errors (e.g., skipped assessments due to missing data). |
Scoring System
Each risk factor scores: LOW = 0 points, MEDIUM = 1 point, HIGH = 2 points. Risk percentage =(total_score / max_possible_score) × 100
| Classification | Threshold |
|---|---|
| HIGH | ≥60% of maximum possible score |
| MEDIUM | ≥30% but <60% |
| LOW | <30% |
Risk Factors
The API evaluates up to 17 risk factors across 5 categories. Not all factors may be assessed for every token due to data availability.Authority & Control (3 factors)
Authority & Control (3 factors)
Market Structure (5 factors)
Market Structure (5 factors)
Trading Patterns (3 factors)
Trading Patterns (3 factors)
Platform & Social (4 factors)
Platform & Social (4 factors)
Temporal (2 factors)
Temporal (2 factors)
Risk Factor Summary
| Factor | Category | HIGH | MEDIUM | LOW |
|---|---|---|---|---|
| Circulating Supply Ratio | Authority & Control | <80% | 80–95% | >95% |
| Freeze Authority | Authority & Control | Present | — | Absent/Disabled |
| Mint Authority | Authority & Control | Present | — | Absent/Disabled |
| Market Capitalization | Market Structure | <$1M | 1M–100M | >$100M |
| Token Verification | Market Structure | Unverified | — | Verified |
| Liquidity | Market Structure | <$10K | 10K–100K | >$100K |
| Holder Count | Market Structure | <100 | 100–1000 | >1000 |
| Top Holder Concentration | Market Structure | >90% | 80–90% | <80% |
| Price Volatility | Trading Patterns | >50% | 20–50% | <20% |
| Wash Trading | Trading Patterns | Suspicious ≥2 TF | — | Normal |
| Organic Activity | Trading Patterns | Low | Medium | High |
| Developer Migrations | Platform & Social | ≥5 | 2–4 | <2 |
| Exchange Listings | Platform & Social | No listings | <3/no major | Major exchanges |
| Launchpad Platform | Platform & Social | High-risk (pump.fun) | — | Other platforms |
| Social Media Presence | Platform & Social | No presence | — | Active presence |
| Token Age | Temporal | <7 days | 7–30 days | >30 days |
| Graduation Status | Temporal | — | <7 days | >7 days/N/A |
Examples
Low-Risk Token (USDC)
curl -X GET "https://api.range.org/api/v1/ml/risk/assessment/token?mint_address=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&network=solana" \
-H "Authorization: Bearer your-api-key"
{
"token_info": {
"mint_address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"name": "USD Coin",
"symbol": "USDC"
},
"overall_assessment": {
"risk_level": "LOW",
"risk_score": 6,
"max_score": 26,
"risk_percentage": 23.1
},
"summary": {
"total_factors": 13,
"high_risk_count": 3,
"medium_risk_count": 0,
"low_risk_count": 10
},
"risk_factors": {
"circulating_ratio": {
"level": "LOW",
"explanation": ">95% circulating - minimal mint authority usage"
},
"freeze_authority": {
"level": "HIGH",
"explanation": "Freeze authority present - token accounts can be frozen by authority"
},
"minting_authority": {
"level": "HIGH",
"explanation": "Mint authority present - new tokens can be created, diluting existing holders"
},
"market_cap": {
"level": "LOW",
"explanation": "Market cap >$100,000,000 - established project"
},
"token_verification": {
"level": "LOW",
"explanation": "Token verified - passed institutional due diligence"
}
},
"processing_time_ms": 378.2,
"errors": [
"Dev migration data not available - dev_migrations assessment skipped",
"Exchange listing data not available - exchange_listings assessment skipped"
]
}
Medium-Risk Token (Limited Data)
curl -X GET "https://api.range.org/api/v1/ml/risk/assessment/token?mint_address=5aaHbSR47rtH7m7pV5FEyoqkvGjGRE1xv3kzEjVw4YBx&network=solana" \
-H "Authorization: Bearer your-api-key"
{
"token_info": {
"mint_address": "5aaHbSR47rtH7m7pV5FEyoqkvGjGRE1xv3kzEjVw4YBx",
"name": "DEAD LAND SURVIVAL",
"symbol": "$DEADLAND"
},
"overall_assessment": {
"risk_level": "MEDIUM",
"risk_score": 2,
"max_score": 6,
"risk_percentage": 33.3
},
"summary": {
"total_factors": 3,
"high_risk_count": 1,
"medium_risk_count": 0,
"low_risk_count": 2
},
"risk_factors": {
"freeze_authority": {
"level": "LOW",
"explanation": "No freeze authority - accounts cannot be frozen"
},
"minting_authority": {
"level": "LOW",
"explanation": "No mint authority - token supply is fixed"
},
"organic_activity": {
"level": "HIGH",
"explanation": "Low organic score - indicates bot-driven trading activity"
}
},
"processing_time_ms": 403.6,
"errors": [
"Circulating supply data not available - circulating_ratio assessment skipped",
"Market cap data not available - market_cap assessment skipped",
"Token verification data not available - token_verification assessment skipped",
"Liquidity data not available - liquidity assessment skipped"
]
}
Errors
Invalid Address Format (422)
{
"detail": [
{
"type": "string_pattern_mismatch",
"loc": ["query", "mint_address"],
"msg": "String should match pattern '^[1-9A-HJ-NP-Za-km-z]{32,44}$'",
"input": "invalid_address",
"ctx": { "pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$" }
}
]
}
Unsupported Network (400)
{
"error": "Unsupported network",
"error_type": "validation_error",
"detail": "Only 'solana' network is supported",
"mint_address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
}
Best Practices
- Use the
errorsarray to understand which risk factors were skipped due to data unavailability. - Tokens with fewer assessed factors may need additional manual review, a low score based on 3 factors is less reliable than one based on 13.
- For compliance workflows, combine token risk assessment with the Address Risk Score for the token’s deployer address.
- Test with known tokens (USDC, USDT, BONK) to understand response patterns before integrating.
Test Token Addresses
Test Token Addresses
- USDC:
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v - USDT:
Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
- Wrapped SOL:
So11111111111111111111111111111111111111112 - JUP:
JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN - Pyth:
HZ1JovNiVvGrGNiiYvEozEVgZ58xaU3RKwX8eACQBCt3
- BONK:
DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263 - WIF:
EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm - POPCAT:
7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr
TypeScript Types
TypeScript Types
interface TokenRiskResponse {
token_info: {
mint_address: string;
name: string;
symbol: string;
};
overall_assessment: {
risk_level: "LOW" | "MEDIUM" | "HIGH";
risk_score: number;
max_score: number;
risk_percentage: number;
};
summary: {
total_factors: number;
high_risk_count: number;
medium_risk_count: number;
low_risk_count: number;
};
risk_factors: Record<string, {
level: "LOW" | "MEDIUM" | "HIGH";
explanation: string;
}>;
processing_time_ms: number;
errors: string[];
}
Authorizations
Authorization method required to allow user to access the api endpoints.
Query Parameters
Asset identifier (chain-agnostic). Currently only Solana token mint (base58, 32–44 chars) is supported.
"So11111111111111111111111111111111111111112"
Blockchain network for token risk (only solana supported)
solana "solana"
Response
Token risk assessment with detailed factors and scoring
Basic token identification details
Show child attributes
Show child attributes
Overall risk assessment aggregation
Show child attributes
Show child attributes
Summary counts of risk factor severity levels
Show child attributes
Show child attributes
Map of risk factor key to its detailed assessment
Show child attributes
Show child attributes
Processing time in milliseconds for the assessment
154
List of non-fatal errors encountered while computing the assessment
Was this page helpful?