{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/cabal-hunter-com/json-schema/cabal-hunter-com-cabal-report-schema.json",
  "title": "CabalReport",
  "x-generated": "2026-11-03",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/cabal-hunter-com-openapi.json#/components/schemas/CabalReport",
  "type": "object",
  "properties": {
    "mint": {
      "type": "string"
    },
    "risk_level": {
      "type": "string",
      "enum": [
        "HIGH",
        "ELEVATED",
        "LOW_SIGNAL"
      ],
      "description": "What we observed. HIGH = strong coordinated-control signals. LOW_SIGNAL = our checks did not fire, which is NOT a safety rating: most tokens lose value anyway."
    },
    "disclaimer": {
      "type": "string",
      "description": "Always returned. On-chain signals, not financial advice."
    },
    "recommendation": {
      "type": "string",
      "enum": [
        "SAFE",
        "REVIEW",
        "AVOID"
      ],
      "description": "DEPRECATED — prefer risk_level. Values are frozen because existing agents gate on the literal string AVOID; renaming them would fail open."
    },
    "cabal_score": {
      "type": "integer",
      "description": "0-100. >=65 HIGH risk, >=35 caution."
    },
    "risk": {
      "type": "string",
      "enum": [
        "HIGH",
        "MEDIUM",
        "CLEAN"
      ]
    },
    "is_controlled": {
      "type": "boolean",
      "description": "true when score >= 35 (insiders positioned to dump)."
    },
    "confidence": {
      "type": "string",
      "enum": [
        "HIGH",
        "LOW"
      ],
      "description": "Confidence in THIS scan's completeness (HIGH when wallets_checked >= 5). Check the validator's own output, not just the verdict."
    },
    "scan_complete": {
      "type": "boolean",
      "description": "True only when the trace had enough coverage. A SAFE result with scan_complete=false is auto-downgraded to REVIEW — never trust a clean verdict from an incomplete scan."
    },
    "wallets_checked": {
      "type": "integer",
      "description": "Holder wallets actually traced — the scan-depth signal. Low = shallow/sparse trace, treat a clean result as suspect."
    },
    "analysis_time_ms": {
      "type": "integer",
      "description": "Processing latency; with 'source', lets the caller gauge data completeness."
    },
    "liquidity_usd": {
      "type": "number",
      "description": "Live liquidity (USD) on the deepest pair."
    },
    "market_cap": {
      "type": "number",
      "description": "Live market cap (USD)."
    },
    "honeypot_risk": {
      "type": "string",
      "enum": [
        "LOW",
        "HIGH"
      ],
      "description": "Solana-native honeypot verdict: live freeze authority or Token-2022 fee/hook/delegate traps"
    },
    "mint_authority_revoked": {
      "type": "boolean"
    },
    "freeze_authority_revoked": {
      "type": "boolean"
    },
    "token2022_risks": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "exit_liquidity_risk": {
      "type": "boolean",
      "description": "True when liquidity is too thin vs market cap to exit without heavy slippage — the soft-rug / dev-dump risk, independent of cabal coordination."
    },
    "verdict": {
      "type": "string",
      "description": "Plain-English summary."
    },
    "time_sync": {
      "type": "boolean",
      "description": "Same-block bundled buy group detected."
    },
    "coordinated_exit": {
      "type": "boolean",
      "description": "Same-block coordinated dump detected."
    },
    "top_holder_pct": {
      "type": "number"
    },
    "deployer": {
      "type": "object",
      "description": "{ creator, tokens_launched, dead, sampled, dead_pct, verdict, reputation, best_peak_usd, median_peak_usd, pump_and_dumps, dead_on_arrival, still_alive }. Launch history covers pump.fun, Raydium, Orca, Meteora and PumpSwap; a launch counts only where the transaction created the mint, so re-minting an existing token is never counted. verdict FIRST_LAUNCH = checked, no earlier launches found; verdict UNKNOWN = the history could not be established and is NOT a clean record. Paid: launches[] — full per-launch trajectory (mint, symbol, peak_mcap_usd, now_mcap_usd, drawdown_from_peak, status)."
    },
    "coordinated_clusters": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Scored coordination groups with evidence_txs[]."
    },
    "filtered_clusters": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "CEX/infra groups excluded from the score."
    },
    "top_reasons": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "free_queries_remaining": {
      "type": "integer"
    },
    "source": {
      "type": "string",
      "enum": [
        "pre_indexed",
        "real_time"
      ]
    },
    "computed_at": {
      "type": "number"
    }
  }
}