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

    1

    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.

    2

    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/intelligence
    3

    Read 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.

    Current coverage: pump.fun graduates only. Tokens that graduate from pump.fun's bonding curve to PumpSwap and meet our quality and liquidity criteria receive a full behavioral scan.

    Authentication

    Bearer token authentication. Include your API key in every request:

    Authorization: Bearer YOUR_API_KEY

    Get 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

    ParameterTypeDescription
    mintstringThe 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:

    ReasonDescription
    not_discoveredToken has never been seen by Blindspotr
    filteredToken was discovered but filtered before scanning (failed quality gates)
    scan_abortedScan started but was aborted (low liquidity, insufficient data)
    out_of_coverageToken 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

    FieldDescription
    mintToken mint address
    nameToken name from on-chain metadata
    symbolToken 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.

    FieldDescription
    levelRisk tier: LOW / MODERATE / NEUTRAL / HIGH
    normalizedNormalized score (0–100)
    levelDescriptionUser-friendly explanation of what this level means
    signalsArray of all evaluated signals, each with name, description, and active (whether signal fired)
    signalsFiredArray 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.

    FieldDescription
    labelSetup quality: STRONG_SETUP / MODERATE_SETUP / WEAK_SETUP
    labelDescriptionUser-friendly explanation of what this label means
    pumpRateHistorical pump rate for tokens with this profile (0.0–1.0)
    avgMultWhenPumpsAverage peak multiplier when tokens with this profile do pump
    sampleSizeNumber of historical tokens in this cohort
    signalsArray of favorable signals evaluated, each with name and description
    signalsFiredArray of signal names that were active for this token

    scanConditions

    Market snapshot captured at the time of scan.

    FieldDescription
    marketCapAtScanMarket cap in USD at scan time
    bundleRatePercentage of early buyers that arrived via Jito bundles (0–100)
    buySellRatioBuy-to-sell transaction ratio (e.g. "4.0:1")
    totalTransactions5mTotal transactions in the 5 minutes before scan
    volume5mTrading volume in USD in the 5 minutes before scan
    scanTimestampUtcISO 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.

    FieldDescription
    walletAgeProfileHow new/old the early buyer wallets are. High = mostly fresh wallets
    buyerTrackRecordCross-token history of early buyers. High = buyers associated with past rugs
    holderConcentrationHow concentrated token holdings are among top holders
    fundingConnectionsDegree of shared funding sources among early buyers
    walletClusteringDegree 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.

    FieldDescription
    cohortKeyMatched cohort identifier
    cohortSizeNumber of historical tokens in this cohort
    confidencePrediction confidence: high (100+), medium (30–99), low (10–29), insufficient (<10)
    staleWhether cohort data needs recomputation
    priceTrajectory.multiplier1h1-hour price return distribution: median, p25, p75. Values: 1.0 = flat, <1.0 = down, >1.0 = up
    priceTrajectory.multiplier6h6-hour price return distribution: median, p25, p75
    priceTrajectory.pctPumpedOver1_5xPercentage of cohort that pumped >1.5x in the first hour
    priceTrajectory.pctCrashedBelow0_5xPercentage of cohort that crashed below 0.5x in the first hour
    outcomeDistributionLong-term outcome percentages: RUGGED, DUMPED, DECLINED, GREW, STABLE, LIQUIDITY_PULL, DEAD, PUMP_AND_DUMP
    avgTimeToRugAverage 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.

    FieldDescription
    statusTrajectory confirmation: CONFIRMED (holding up) / WARNING (mixed signals) / EXIT (deteriorating)
    computedAtISO timestamp of when the trajectory was computed
    minutesPostScanMinutes elapsed since the original scan
    mcapShape.ratioMarket cap ratio (check 6 / check 1). >1.0 = growing, <1.0 = declining
    mcapShape.classificationok or bad
    volumeShape.ratioVolume ratio (check 6 / check 1). >1.0 = increasing, <1.0 = fading
    volumeShape.classificationok or fading
    historicalContext.crashRateHistorical crash rate for tokens with this trajectory shape (0.0–1.0)
    historicalContext.pumpRateHistorical pump rate for tokens with this trajectory shape (0.0–1.0)
    historicalContext.sampleSizeNumber of historical tokens with this trajectory shape
    Post-scan trajectory data is only meaningful within ~2 hours of the scan. After that, the data becomes stale.

    deployerProfile

    Intelligence on the wallet that deployed this token, based on their prior token launch history.

    FieldDescription
    addressDeployer wallet address
    typeClassification: first_time (1 token), low_repeat (2–4), serial (5+)
    totalTokensTotal tokens deployed by this wallet
    outcomesBreakdown of prior token outcomes: rugged, dead, stable, grew, unknown
    rugRateHistorical rug rate (0.0–1.0, null if no resolved outcomes)
    riskAssessmentDeployer 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.

    FieldDescription
    totalBuyersNumber of early buyers analyzed
    coverageRatePercentage of buyers with prior on-chain history in dataset
    reputationBreakdownCount by behavioral tier: orchestrators (consistent rug profiteers), victims (repeatedly caught in rugs), knownGood (established positive track record), neutral (insufficient history), unknown (no prior appearances)
    avgReputationScoreAverage reputation score across all analyzed buyers (0–100)
    pnlProfileP&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.

    FieldDescription
    classificationFunding pattern: NONE / SHALLOW_SHARED / DEEP_SHARED / SINGLE_FUNDER
    sharedFunderCountNumber of common funding ancestors found across buyer wallets
    linkedBuyerCountNumber of buyers linked through shared funding
    descriptionSummary of the funding pattern
    fundersArray of funder details (see below)

    Each funder object:

    FieldDescription
    addressFunder wallet address
    buyersFundedInTokenHow many buyers in this token were funded by this wallet
    totalTokensFundedTotal tokens where this funder has funded buyers (across entire dataset)
    rugRateHistorical rug rate of tokens this funder has been involved in
    reputationLevelKNOWN_ORCHESTRATOR / KNOWN_VICTIM / KNOWN_GOOD / NEUTRAL
    isCabalMemberWhether this funder is a known member of a coordinated group
    cabalIdCabal 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.

    FieldDescription
    detectedWhether known coordinated group members were found among buyers
    summary.uniqueCabalsNumber of distinct cabal groups detected
    summary.totalMembersFoundTotal cabal members found among this token's buyers
    summary.highestRugRateHighest historical rug rate among detected cabals
    summary.dominantArchetypeMost common operator type among detected cabals
    summary.dominantActivityStatusMost common activity level among detected cabals
    summary.fundingTraceabilityHow traceable the funding patterns are: HIGH / MEDIUM / LOW

    Each cabal object in the cabals array:

    FieldDescription
    cabalIdUnique cabal identifier
    rugRateHistorical rug rate for tokens this cabal has been involved in
    archetypeOperator type (see Cabal Archetypes below)
    memberCountTotal members in this cabal group
    totalTokensTotal tokens this cabal has been involved in
    activityStatusCurrent activity level: ACTIVE / MODERATE / MINIMAL / DORMANT
    fundingTraceabilityHow traceable this cabal's funding is: HIGH / MEDIUM / LOW
    membersFoundInTokenHow many members of this cabal were found buying this specific token

    Cabal Archetypes:

    ArchetypeDescription
    PERSISTENT_BOTNETLarge automated wallet networks operating consistently over long periods
    SMALL_BOTNETSmaller automated wallet clusters
    EVOLVING_FLEETGroups that rotate wallets and adapt tactics over time
    HIGH_VOLUME_SYNDICATEHigh-frequency coordinated trading operations
    ROTATING_OPERATOROperators that regularly cycle through new wallet sets
    LINKED_PAIRSimple two-wallet coordination
    UNCLASSIFIEDCoordinated group that doesn't fit established patterns

    meta

    FieldDescription
    scannedAtISO timestamp of the original scan
    dataAgeHuman-readable time since scan
    pipelineVersionScoring engine version
    planAPI plan tier of the requesting key
    datasetSizeTotal tokens in the scoring dataset

    Webhooks

    Real-time notifications when new tokens are scanned. Requires Business or Enterprise plan.

    Registration

    EndpointMethodDescription
    /v1/webhooksPOSTRegister a webhook URL
    /v1/webhooksGETList your active webhooks
    /v1/webhooks/:idDELETERemove a webhook
    /v1/webhooks/:id/testPOSTSend 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
    Pro plan users will receive a 403 response when attempting to register webhooks. Upgrade to Business or Enterprise for webhook access.

    Plans & Rate Limits

    ProBusinessEnterprise
    Intelligence endpoint
    Rate limit60 req/min300 req/minCustom
    Webhooks

    Rate limit headers are included in every response:

    X-RateLimit-Limit: 60
    X-RateLimit-Remaining: 47
    X-RateLimit-Reset: 1711202400

    Error Codes

    StatusCodeMeaning
    400INVALID_MINTInvalid mint address format
    401UNAUTHORIZEDMissing or invalid API key
    403TIER_RESTRICTEDFeature requires a higher plan tier (e.g. webhooks on Pro plan)
    429RATE_LIMITEDRate limit exceeded
    500INTERNAL_ERRORInternal 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/intelligence

    JavaScript

    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%}")