API Documentation
Behavioral intelligence for Solana tokens. Rug risk scoring, setup quality analysis, trajectory predictions, wallet intelligence, and cabal detection — delivered via API.
Getting Started
Get your API key
Sign up at blindspotr.io, go to the dashboard, select a plan, pay with Solana, and your API key will be ready immediately.
Query a token
Make your first request with any pump.fun graduate mint address:
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.blindspotr.io/v1/token/MINT_ADDRESS/intelligenceRead the response
Check the status field. If scored, read canonicalRugScore.level for rug risk and canonicalPeakScore.label for setup quality. If pending, poll again in 30–60 seconds.
Authentication
Bearer token authentication. Include your API key in every request:
Authorization: Bearer YOUR_API_KEYGet your API key from the dashboard at blindspotr.io/dashboard.
Endpoint Reference
GET /v1/token/:mint/intelligence
Returns full behavioral intelligence for any scanned token. Available on all plans.
Base URL: https://api.blindspotr.io
Endpoint: GET /v1/token/:mint/intelligence
| Parameter | Type | Description |
|---|---|---|
mint | string | The token's mint address (base58, 32–44 chars) |
Response time: ~40ms (cached responses).
Intelligence Response
Response envelope: All API responses are wrapped in a standard envelope:
{ "success": true, "data": { ... }, "meta": { "timestamp": "..." } }On error: { "success": false, "error": { "code": "...", "message": "..." } }
Three possible status values: scored, pending, not_found.
Scored
Token has been fully analyzed. All intelligence sections are available.
{
"success": true,
"data": {
"token": {
"mint": "ExAmPLetOkEnaDDrEsSFoRDoCsOnLypump",
"name": "Example Token",
"symbol": "EXAMPLE"
},
"cohort": "canonical",
"canonicalRugScore": {
"level": "HIGH",
"normalized": 67,
"levelDescription": "Multiple rug indicators detected — majority of tokens with this profile were rugged",
"signals": [
{
"name": "BUY_SELL_RATIO",
"description": "Buy-heavy trading activity detected",
"active": true
},
{
"name": "LOW_ACTIVITY",
"description": "Low early trading activity",
"active": false
},
{
"name": "SERIAL_RUGGER",
"description": "Deployer has a history of failed token launches",
"active": false
},
{
"name": "HIGH_MCAP",
"description": "Token already reached significant market cap before scan",
"active": false
}
],
"signalsFired": ["BUY_SELL_RATIO"]
},
"canonicalPeakScore": {
"label": "MODERATE_SETUP",
"labelDescription": "Some favorable conditions present",
"pumpRate": 0.31,
"avgMultWhenPumps": 5.25,
"sampleSize": 1163,
"signals": [
{
"name": "MCAP_WINDOW",
"description": "Market cap between $50K–$250K at scan time"
}
],
"signalsFired": ["MCAP_WINDOW"]
},
"scanConditions": {
"marketCapAtScan": 63395,
"bundleRate": 46,
"buySellRatio": "4.0:1",
"totalTransactions5m": 1778,
"volume5m": 49626.43,
"scanTimestampUtc": "2026-04-28T02:52:32.670Z"
},
"behavioralProfile": {
"walletAgeProfile": 2,
"buyerTrackRecord": 5,
"holderConcentration": 40,
"fundingConnections": 0,
"walletClustering": 100
},
"trajectoryPrediction": {
"cohortKey": "sub-65_serial",
"cohortSize": 1625,
"confidence": "high",
"stale": false,
"priceTrajectory": {
"multiplier1h": {
"median": 0.717,
"p25": 0.220,
"p75": 1.391
},
"multiplier6h": {
"median": 0.120,
"p25": 0.044,
"p75": 0.661
},
"pctPumpedOver1_5x": 21.2,
"pctCrashedBelow0_5x": 40.1
},
"outcomeDistribution": {
"RUGGED": 72.4,
"DUMPED": 4.6,
"LIQUIDITY_PULL": 3.9,
"STABLE": 1.8,
"DECLINED": 1.7,
"PUMP_AND_DUMP": 1.7,
"GREW": 1.5,
"DEAD": 0.4
},
"avgTimeToRug": 2957
},
"postScanTrajectory": {
"status": "CONFIRMED",
"computedAt": "2026-04-28T03:22:32.717Z",
"minutesPostScan": 47,
"mcapShape": {
"check1": 96167,
"check6": 130564,
"ratio": 1.358,
"classification": "ok"
},
"volumeShape": {
"check1": 47860,
"check6": 53319,
"ratio": 1.114,
"classification": "ok"
},
"historicalContext": {
"crashRate": 0.063,
"pumpRate": 0.491,
"sampleSize": 1180,
"cohortLabel": "mcap_ok + vol_ok"
}
},
"deployerProfile": {
"address": "BnnNJJgy9w2MLQ9XBKJKG9FQa2r9qdW7u5VpzEkwUcc3",
"type": "serial",
"totalTokens": 1440,
"outcomes": {
"rugged": 534,
"dead": 16,
"stable": 8,
"grew": 10,
"unknown": 872
},
"rugRate": 0.94,
"riskAssessment": "SERIAL_RUGGER"
},
"walletIntelligence": {
"buyerComposition": {
"totalBuyers": 50,
"coverageRate": 100,
"reputationBreakdown": {
"orchestrators": 1,
"victims": 0,
"knownGood": 0,
"neutral": 49,
"unknown": 0
},
"avgReputationScore": 51,
"pnlProfile": null
},
"fundingPattern": {
"classification": "DEEP_SHARED",
"sharedFunderCount": 10,
"linkedBuyerCount": 25,
"description": "Deep funding network: 10 shared funder(s) linking 25 of 50 buyers",
"funders": [
{
"address": "5Ww9G6...U25H",
"buyersFundedInToken": 19,
"totalTokensFunded": 111,
"rugRate": 1.0,
"reputationLevel": "KNOWN_ORCHESTRATOR",
"isCabalMember": false,
"cabalId": null
}
]
}
},
"cabalPresence": {
"detected": true,
"summary": {
"uniqueCabals": 7,
"totalMembersFound": 7,
"highestRugRate": 0.877,
"dominantArchetype": "EVOLVING_FLEET",
"dominantActivityStatus": "ACTIVE",
"fundingTraceability": "MEDIUM"
},
"cabals": [
{
"cabalId": "CAB-81DC0E14919E0553",
"rugRate": 0.877,
"archetype": "EVOLVING_FLEET",
"memberCount": 421,
"totalTokens": 2448,
"activityStatus": "ACTIVE",
"fundingTraceability": "HIGH",
"membersFoundInToken": 1
}
]
},
"meta": {
"scannedAt": "2026-04-28T02:52:32.670Z",
"dataAge": "47 min",
"pipelineVersion": "4.4.1",
"plan": "business",
"datasetSize": 21698
}
},
"meta": {
"timestamp": "2026-04-28T03:39:11.311Z"
}
}Note: The funders and cabals arrays are truncated in this example. Full arrays are returned in the response.
Pending
Token was discovered but the scan has not completed yet. Poll again in 30–60 seconds.
{
"success": true,
"data": {
"mint": "ExAmPLetOkEnaDDrEsSFoRDoCsOnLypump",
"status": "pending",
"message": "Token discovered, scan in progress",
"discoveredAt": "2026-04-28T14:20:00.000Z"
},
"meta": {
"timestamp": "2026-04-28T14:20:01.000Z"
}
}Not Found
Four sub-cases — all return status: "not_found" with a reason field:
| Reason | Description |
|---|---|
not_discovered | Token has never been seen by Blindspotr |
filtered | Token was discovered but filtered before scanning (failed quality gates) |
scan_aborted | Scan started but was aborted (low liquidity, insufficient data) |
out_of_coverage | Token is outside current coverage (non-pump.fun token) |
{
"success": true,
"data": {
"mint": "ExAmPLetOkEnaDDrEsSFoRDoCsOnLypump",
"status": "not_found",
"reason": "not_discovered"
},
"meta": {
"timestamp": "2026-04-28T14:20:01.000Z"
}
}Field Reference
token
| Field | Description |
|---|---|
mint | Token mint address |
name | Token name from on-chain metadata |
symbol | Token symbol from on-chain metadata |
cohort
Identifies the token type and scoring model applied. Currently all scanned tokens are pump.fun graduates ("canonical").
canonicalRugScore
Rug risk assessment based on validated behavioral signals. Walk-forward validated with 52.7 percentage point spread between HIGH and LOW tiers.
| Field | Description |
|---|---|
level | Risk tier: LOW / MODERATE / NEUTRAL / HIGH |
normalized | Normalized score (0–100) |
levelDescription | User-friendly explanation of what this level means |
signals | Array of all evaluated signals, each with name, description, and active (whether signal fired) |
signalsFired | Array of signal names that were active for this token |
canonicalPeakScore
Setup quality assessment — how favorable this token's conditions are for price action based on historical cohort performance.
| Field | Description |
|---|---|
label | Setup quality: STRONG_SETUP / MODERATE_SETUP / WEAK_SETUP |
labelDescription | User-friendly explanation of what this label means |
pumpRate | Historical pump rate for tokens with this profile (0.0–1.0) |
avgMultWhenPumps | Average peak multiplier when tokens with this profile do pump |
sampleSize | Number of historical tokens in this cohort |
signals | Array of favorable signals evaluated, each with name and description |
signalsFired | Array of signal names that were active for this token |
scanConditions
Market snapshot captured at the time of scan.
| Field | Description |
|---|---|
marketCapAtScan | Market cap in USD at scan time |
bundleRate | Percentage of early buyers that arrived via Jito bundles (0–100) |
buySellRatio | Buy-to-sell transaction ratio (e.g. "4.0:1") |
totalTransactions5m | Total transactions in the 5 minutes before scan |
volume5m | Trading volume in USD in the 5 minutes before scan |
scanTimestampUtc | ISO timestamp of when the scan was performed |
behavioralProfile
Component-level intelligence from the behavioral scan. Each value is 0–100, where higher values indicate more risk.
| Field | Description |
|---|---|
walletAgeProfile | How new/old the early buyer wallets are. High = mostly fresh wallets |
buyerTrackRecord | Cross-token history of early buyers. High = buyers associated with past rugs |
holderConcentration | How concentrated token holdings are among top holders |
fundingConnections | Degree of shared funding sources among early buyers |
walletClustering | Degree of behavioral clustering among early buyer wallets |
trajectoryPrediction
How tokens with a similar behavioral profile have performed historically. Matched from a cohort of previously scanned tokens with similar characteristics.
| Field | Description |
|---|---|
cohortKey | Matched cohort identifier |
cohortSize | Number of historical tokens in this cohort |
confidence | Prediction confidence: high (100+), medium (30–99), low (10–29), insufficient (<10) |
stale | Whether cohort data needs recomputation |
priceTrajectory.multiplier1h | 1-hour price return distribution: median, p25, p75. Values: 1.0 = flat, <1.0 = down, >1.0 = up |
priceTrajectory.multiplier6h | 6-hour price return distribution: median, p25, p75 |
priceTrajectory.pctPumpedOver1_5x | Percentage of cohort that pumped >1.5x in the first hour |
priceTrajectory.pctCrashedBelow0_5x | Percentage of cohort that crashed below 0.5x in the first hour |
outcomeDistribution | Long-term outcome percentages: RUGGED, DUMPED, DECLINED, GREW, STABLE, LIQUIDITY_PULL, DEAD, PUMP_AND_DUMP |
avgTimeToRug | Average time to rug in seconds for tokens in this cohort that rugged |
postScanTrajectory
What happened after the scan — a second-layer confirmation signal computed ~30 minutes post-scan from real price and volume data.
| Field | Description |
|---|---|
status | Trajectory confirmation: CONFIRMED (holding up) / WARNING (mixed signals) / EXIT (deteriorating) |
computedAt | ISO timestamp of when the trajectory was computed |
minutesPostScan | Minutes elapsed since the original scan |
mcapShape.ratio | Market cap ratio (check 6 / check 1). >1.0 = growing, <1.0 = declining |
mcapShape.classification | ok or bad |
volumeShape.ratio | Volume ratio (check 6 / check 1). >1.0 = increasing, <1.0 = fading |
volumeShape.classification | ok or fading |
historicalContext.crashRate | Historical crash rate for tokens with this trajectory shape (0.0–1.0) |
historicalContext.pumpRate | Historical pump rate for tokens with this trajectory shape (0.0–1.0) |
historicalContext.sampleSize | Number of historical tokens with this trajectory shape |
deployerProfile
Intelligence on the wallet that deployed this token, based on their prior token launch history.
| Field | Description |
|---|---|
address | Deployer wallet address |
type | Classification: first_time (1 token), low_repeat (2–4), serial (5+) |
totalTokens | Total tokens deployed by this wallet |
outcomes | Breakdown of prior token outcomes: rugged, dead, stable, grew, unknown |
rugRate | Historical rug rate (0.0–1.0, null if no resolved outcomes) |
riskAssessment | Deployer risk classification: SERIAL_RUGGER / REPEAT_OFFENDER / FIRST_TIME_UNKNOWN / MIXED_RECORD / CLEAN_RECORD |
walletIntelligence
buyerComposition
Analysis of the earliest buyers of this token, based on their historical on-chain behavior across other tokens.
| Field | Description |
|---|---|
totalBuyers | Number of early buyers analyzed |
coverageRate | Percentage of buyers with prior on-chain history in dataset |
reputationBreakdown | Count by behavioral tier: orchestrators (consistent rug profiteers), victims (repeatedly caught in rugs), knownGood (established positive track record), neutral (insufficient history), unknown (no prior appearances) |
avgReputationScore | Average reputation score across all analyzed buyers (0–100) |
pnlProfile | P&L statistics across buyers with history. Contains avgMultiplier, profitableCount, unprofitableCount. Null if insufficient data. |
fundingPattern
Whether early buyers share common funding sources — a key indicator of coordinated activity.
| Field | Description |
|---|---|
classification | Funding pattern: NONE / SHALLOW_SHARED / DEEP_SHARED / SINGLE_FUNDER |
sharedFunderCount | Number of common funding ancestors found across buyer wallets |
linkedBuyerCount | Number of buyers linked through shared funding |
description | Summary of the funding pattern |
funders | Array of funder details (see below) |
Each funder object:
| Field | Description |
|---|---|
address | Funder wallet address |
buyersFundedInToken | How many buyers in this token were funded by this wallet |
totalTokensFunded | Total tokens where this funder has funded buyers (across entire dataset) |
rugRate | Historical rug rate of tokens this funder has been involved in |
reputationLevel | KNOWN_ORCHESTRATOR / KNOWN_VICTIM / KNOWN_GOOD / NEUTRAL |
isCabalMember | Whether this funder is a known member of a coordinated group |
cabalId | Cabal identifier if applicable, null otherwise |
cabalPresence
Detection of known coordinated wallet groups among the token's early buyers. Blindspotr tracks 400+ cabals with 4,400+ members across the pump.fun ecosystem.
| Field | Description |
|---|---|
detected | Whether known coordinated group members were found among buyers |
summary.uniqueCabals | Number of distinct cabal groups detected |
summary.totalMembersFound | Total cabal members found among this token's buyers |
summary.highestRugRate | Highest historical rug rate among detected cabals |
summary.dominantArchetype | Most common operator type among detected cabals |
summary.dominantActivityStatus | Most common activity level among detected cabals |
summary.fundingTraceability | How traceable the funding patterns are: HIGH / MEDIUM / LOW |
Each cabal object in the cabals array:
| Field | Description |
|---|---|
cabalId | Unique cabal identifier |
rugRate | Historical rug rate for tokens this cabal has been involved in |
archetype | Operator type (see Cabal Archetypes below) |
memberCount | Total members in this cabal group |
totalTokens | Total tokens this cabal has been involved in |
activityStatus | Current activity level: ACTIVE / MODERATE / MINIMAL / DORMANT |
fundingTraceability | How traceable this cabal's funding is: HIGH / MEDIUM / LOW |
membersFoundInToken | How many members of this cabal were found buying this specific token |
Cabal Archetypes:
| Archetype | Description |
|---|---|
PERSISTENT_BOTNET | Large automated wallet networks operating consistently over long periods |
SMALL_BOTNET | Smaller automated wallet clusters |
EVOLVING_FLEET | Groups that rotate wallets and adapt tactics over time |
HIGH_VOLUME_SYNDICATE | High-frequency coordinated trading operations |
ROTATING_OPERATOR | Operators that regularly cycle through new wallet sets |
LINKED_PAIR | Simple two-wallet coordination |
UNCLASSIFIED | Coordinated group that doesn't fit established patterns |
meta
| Field | Description |
|---|---|
scannedAt | ISO timestamp of the original scan |
dataAge | Human-readable time since scan |
pipelineVersion | Scoring engine version |
plan | API plan tier of the requesting key |
datasetSize | Total tokens in the scoring dataset |
Webhooks
Real-time notifications when new tokens are scanned. Requires Business or Enterprise plan.
Registration
| Endpoint | Method | Description |
|---|---|---|
/v1/webhooks | POST | Register a webhook URL |
/v1/webhooks | GET | List your active webhooks |
/v1/webhooks/:id | DELETE | Remove a webhook |
/v1/webhooks/:id/test | POST | Send a test payload to verify your endpoint |
Webhook Payload
When a scan completes, Blindspotr delivers a POST request to your registered URL:
{
"event": "scan.completed",
"mintAddress": "ExAmPLetOkEnaDDrEsSFoRDoCsOnLypump",
"scanTimestamp": "2026-04-28T02:52:32.670Z",
"cohort": "canonical",
"canonicalRugScore": {
"level": "HIGH",
"signalsFired": ["BUY_SELL_RATIO"]
},
"canonicalPeakScore": {
"label": "MODERATE_SETUP",
"signalsFired": ["MCAP_WINDOW"],
"pumpRate": 0.31
},
"cabalDetected": true,
"marketCapAtScan": 63395,
"liquidityAtScan": 42000
}Delivery
- Retry policy: 3 attempts (immediate, 1s delay, 3s delay)
- Timeout: 5 seconds per attempt
- Your endpoint must respond with a 2xx status code
Plans & Rate Limits
| Pro | Business | Enterprise | |
|---|---|---|---|
| Intelligence endpoint | ✓ | ✓ | ✓ |
| Rate limit | 60 req/min | 300 req/min | Custom |
| Webhooks | — | ✓ | ✓ |
Rate limit headers are included in every response:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1711202400Error Codes
| Status | Code | Meaning |
|---|---|---|
400 | INVALID_MINT | Invalid mint address format |
401 | UNAUTHORIZED | Missing or invalid API key |
403 | TIER_RESTRICTED | Feature requires a higher plan tier (e.g. webhooks on Pro plan) |
429 | RATE_LIMITED | Rate limit exceeded |
500 | INTERNAL_ERROR | Internal server error |
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid Authorization header. Expected: Bearer <api_key>"
},
"meta": {
"timestamp": "2026-04-28T14:22:18.000Z"
}
}Code Examples
curl
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.blindspotr.io/v1/token/MINT_ADDRESS/intelligenceJavaScript
const response = await fetch(
'https://api.blindspotr.io/v1/token/MINT_ADDRESS/intelligence',
{
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}
);
const data = await response.json();
if (data.success) {
const {
canonicalRugScore,
canonicalPeakScore,
deployerProfile,
cabalPresence,
trajectoryPrediction,
postScanTrajectory
} = data.data;
// Rug risk assessment
console.log(`Rug Risk: ${canonicalRugScore.level}`);
console.log(canonicalRugScore.levelDescription);
// Setup quality
console.log(`Setup: ${canonicalPeakScore.label}`);
console.log(`Pump rate: ${(canonicalPeakScore.pumpRate * 100).toFixed(0)}%`);
console.log(`Avg peak when pumps: ${canonicalPeakScore.avgMultWhenPumps}x`);
// Deployer profile
console.log(`Deployer: ${deployerProfile.type} (${deployerProfile.totalTokens} tokens, ${deployerProfile.riskAssessment})`);
// Cabal detection
if (cabalPresence.detected) {
console.log(`Cabals: ${cabalPresence.summary.uniqueCabals} groups, ${cabalPresence.summary.totalMembersFound} members`);
console.log(`Dominant type: ${cabalPresence.summary.dominantArchetype}`);
}
// Trajectory prediction
if (trajectoryPrediction) {
const t = trajectoryPrediction.priceTrajectory;
console.log(`1h median: ${t.multiplier1h.median.toFixed(2)}x`);
console.log(`Crash risk: ${t.pctCrashedBelow0_5x.toFixed(1)}%`);
}
// Post-scan confirmation
if (postScanTrajectory?.status) {
console.log(`Post-scan: ${postScanTrajectory.status}`);
if (postScanTrajectory.historicalContext) {
console.log(`Historical crash rate: ${(postScanTrajectory.historicalContext.crashRate * 100).toFixed(1)}%`);
}
}
}Python
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY"}
mint = "MINT_ADDRESS"
response = requests.get(
f"https://api.blindspotr.io/v1/token/{mint}/intelligence",
headers=headers
)
data = response.json()
if data["success"]:
payload = data["data"]
# Rug risk assessment
crs = payload["canonicalRugScore"]
print(f"Rug Risk: {crs['level']}")
print(crs["levelDescription"])
# Setup quality
cps = payload["canonicalPeakScore"]
print(f"Setup: {cps['label']}")
print(f"Pump rate: {cps['pumpRate']:.0%}")
print(f"Avg peak when pumps: {cps['avgMultWhenPumps']}x")
# Deployer profile
deployer = payload["deployerProfile"]
print(f"Deployer: {deployer['type']} ({deployer['totalTokens']} tokens, {deployer['riskAssessment']})")
# Cabal detection
cabal = payload["cabalPresence"]
if cabal["detected"]:
s = cabal["summary"]
print(f"Cabals: {s['uniqueCabals']} groups, {s['totalMembersFound']} members")
print(f"Dominant type: {s['dominantArchetype']}")
# Trajectory prediction
traj = payload.get("trajectoryPrediction")
if traj:
t = traj["priceTrajectory"]
print(f"1h median: {t['multiplier1h']['median']:.2f}x")
print(f"Crash risk: {t['pctCrashedBelow0_5x']:.1f}%")
# Post-scan confirmation
pst = payload.get("postScanTrajectory")
if pst and pst.get("status"):
print(f"Post-scan: {pst['status']}")
ctx = pst.get("historicalContext")
if ctx:
print(f"Historical crash rate: {ctx['crashRate']:.1%}")