{"openapi": "3.1.0", "info": {"title": "DigitalDon Analysis API", "version": "2.0.0", "summary": "Machine-readable crypto token analysis \u2014 the engine behind @DigitalDonAnalyzeBot and analyzer.digitaldon.net.", "description": "Structured technical + on-chain analysis for a crypto token.\n\nThis is the same analysis engine behind the DigitalDon Telegram bot (`/don`) and\nthe Web Analyzer, exposed as JSON. All three run one implementation, so the same\ntoken at the same moment scores the same on every surface.\n\n**Depth** controls what is fetched. `basic` is chart + on-chain and costs two\nOHLCV requests. `holders` adds a wallet-cluster scan, `social` adds an X\ncredibility check on the token's linked account, `full` adds both -- each is\nslower and rate-limited harder, so ask for what you will read. The `depth` enum\nbelow is this deployment's live menu -- a depth whose feature is switched off is\nnot listed and cannot be bought -- so read the enum, not this prose.\n\n**Asset class is stated, never implied.** `data.token.asset_class` is `crypto` or\n`stock`, matched against a verified issuer registry rather than guessed from the\nchain. It matters most on Robinhood Chain, an Arbitrum Orbit L2 for tokenized\nequities: a token there is usually a share, not a meme. For one,\n`data.token.underlying` carries the ticker, the issuer, and whether the\nunderlying market is open right now. Holder depths are not sold for tokenized\nstocks -- their supply sits in custody wallets, which clustering would report as\ninsiders.\n\n**Partial results are normal.** A block that could not be produced comes back\n`null` with an entry in `data.warnings` explaining why, and the rest of the\nresponse is still valid. Only a request that could produce nothing at all fails.\n\n**No analysis is not an error.** A token too new to have candles returns 200\nwith `data.analysis.available = false`, `state` telling you whether it is a\nfresh launch or a dormant pool, and a populated `data.onchain` block -- which is\nthe useful read at that point anyway.\n\n**This endpoint is paid, per call, in USDC over\n[x402](https://github.com/x402-foundation/x402).** Call it without payment and\nyou get a 402 carrying the price and the accepted chains; sign and retry with a\n`PAYMENT-SIGNATURE` header. Payment is verified before the analysis runs and\nsettled only after it succeeds, so a failed scan costs you nothing.\n\n**You only pay for a complete answer.** If any block the depth promised comes\nback empty, the request is refused with `depth_undeliverable` and no funds move.\n\nA small number of free calls per day per IP is available at the cheapest depth,\nso you can see the output shape before wiring up a wallet. See `x-402` below for\nthe live price list.\n\nNumbers are advisory, not financial advice.", "x-engine-version": "1.29.0", "contact": {"name": "DigitalDon", "url": "https://digitaldon.net", "email": "digitaldon.bot@gmail.com"}}, "servers": [{"url": "https://api.digitaldon.net", "description": "This deployment."}], "tags": [{"name": "crypto", "description": "Token and market data."}, {"name": "analysis", "description": "Technical analysis: score, entry and take-profit zones, momentum, structure."}, {"name": "onchain", "description": "Liquidity, holder distribution and wallet-cluster risk."}, {"name": "x402", "description": "Paid per call in USDC. No account, no API key."}], "externalDocs": {"url": "https://digitaldon.gitbook.io/digitaldon/using/api", "description": "Reference documentation."}, "paths": {"/v1/analyze": {"post": {"operationId": "analyzeToken", "tags": ["crypto", "analysis", "onchain", "x402"], "summary": "Analyse a token.", "description": "Structured technical + on-chain analysis for a crypto token.\n\nThis is the same analysis engine behind the DigitalDon Telegram bot (`/don`) and\nthe Web Analyzer, exposed as JSON. All three run one implementation, so the same\ntoken at the same moment scores the same on every surface.\n\n**Depth** controls what is fetched. `basic` is chart + on-chain and costs two\nOHLCV requests. `holders` adds a wallet-cluster scan, `social` adds an X\ncredibility check on the token's linked account, `full` adds both -- each is\nslower and rate-limited harder, so ask for what you will read. The `depth` enum\nbelow is this deployment's live menu -- a depth whose feature is switched off is\nnot listed and cannot be bought -- so read the enum, not this prose.\n\n**Asset class is stated, never implied.** `data.token.asset_class` is `crypto` or\n`stock`, matched against a verified issuer registry rather than guessed from the\nchain. It matters most on Robinhood Chain, an Arbitrum Orbit L2 for tokenized\nequities: a token there is usually a share, not a meme. For one,\n`data.token.underlying` carries the ticker, the issuer, and whether the\nunderlying market is open right now. Holder depths are not sold for tokenized\nstocks -- their supply sits in custody wallets, which clustering would report as\ninsiders.\n\n**Partial results are normal.** A block that could not be produced comes back\n`null` with an entry in `data.warnings` explaining why, and the rest of the\nresponse is still valid. Only a request that could produce nothing at all fails.\n\n**No analysis is not an error.** A token too new to have candles returns 200\nwith `data.analysis.available = false`, `state` telling you whether it is a\nfresh launch or a dormant pool, and a populated `data.onchain` block -- which is\nthe useful read at that point anyway.\n\n**This endpoint is paid, per call, in USDC over\n[x402](https://github.com/x402-foundation/x402).** Call it without payment and\nyou get a 402 carrying the price and the accepted chains; sign and retry with a\n`PAYMENT-SIGNATURE` header. Payment is verified before the analysis runs and\nsettled only after it succeeds, so a failed scan costs you nothing.\n\n**You only pay for a complete answer.** If any block the depth promised comes\nback empty, the request is refused with `depth_undeliverable` and no funds move.\n\nA small number of free calls per day per IP is available at the cheapest depth,\nso you can see the output shape before wiring up a wallet. See `x-402` below for\nthe live price list.\n\nNumbers are advisory, not financial advice.", "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["token"], "properties": {"token": {"type": "string", "minLength": 1, "maxLength": 128, "description": "Ticker, name, or contract address.", "examples": ["SOL", "So11111111111111111111111111111111111111112"]}, "chain": {"type": "string", "default": "auto", "enum": ["arb", "arbitrum", "arc", "base", "bnb", "bsc", "eth", "ethereum", "mantle", "mnt", "rh", "robinhood", "sol", "solana", "auto"], "description": "`auto` searches every active chain and analyses the deepest pool, reporting the rest in `data.request.alternatives`. Active on this deployment: arbitrum, arc, base, bsc, ethereum, mantle, robinhood, solana."}, "depth": {"type": "string", "default": "basic", "enum": ["basic", "holders"], "description": "`basic` = chart + on-chain. `holders` adds wallet clustering, `social` adds an X credibility check, `full` adds both. Only depths this deployment can currently deliver are listed here, and only those can be bought. Holder depths are sold only on solana, where the clustering has a funder graph behind it; asked for elsewhere they are refused with `depth_unavailable` (named chain) or `depth_undeliverable` (chain=auto) and nothing is charged either way."}, "options": {"type": "object", "properties": {"include_chart_raw": {"type": "boolean", "default": false, "description": "Return the OHLCV the analysis ran on. Large."}, "include_raw_metrics": {"type": "boolean", "default": false, "description": "Return every engine field, unshaped and uncontracted."}}}}}}}}, "responses": {"200": {"description": "Analysis produced. Check `data.analysis.available` and `data.warnings`.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": ["object", "null"], "required": ["schema_version", "engine_version", "token", "market", "analysis", "onchain"], "properties": {"schema_version": {"type": "string", "description": "Shape of this document. Parse against it."}, "engine_version": {"type": "string", "description": "Analysis-logic contract that produced the numbers. Cache against it."}, "generated_at": {"type": "string", "format": "date-time"}, "request": {"type": "object", "properties": {"token": {"type": "string"}, "chain": {"type": "string"}, "depth": {"type": "string"}, "resolved_chain": {"type": "string"}, "alternatives": {"type": "array", "description": "Other chains this query matched. The deepest pool was analysed; re-request with an explicit `chain` for another.", "items": {"type": "object", "properties": {"chain": {"type": "string"}, "symbol": {"type": "string"}, "address": {"type": "string"}, "pair_address": {"type": "string"}, "liquidity_usd": {"type": "number"}}}}}}, "token": {"type": "object", "properties": {"name": {"type": "string"}, "symbol": {"type": "string"}, "address": {"type": "string"}, "chain": {"type": "string"}, "dex": {"type": "string"}, "pair_address": {"type": "string"}, "dexscreener_url": {"type": ["string", "null"]}, "x_url": {"type": ["string", "null"]}, "age_days": {"type": ["number", "null"]}, "age_label": {"type": "string"}, "asset_class": {"type": "string", "enum": ["crypto", "stock"], "description": "What this token IS. `stock` means a tokenized claim on a listed security, matched against a verified issuer registry -- NOT inferred from the chain. Branch on it before applying memecoin priors: Robinhood Chain is an Arbitrum Orbit L2 for tokenized equities, so a token there is usually a share, not a meme. Holder depths are not sold for `stock` -- see `depth`."}, "underlying": {"type": ["object", "null"], "description": "The security a tokenized stock is a claim on -- non-null exactly when `asset_class` is `stock`. Read from the curated issuer registry, which is the authority on what is official: a ticker search alone returns copycats. Such a token is also scored on the `STOCK` profile, so `analysis.profile.key` moves with this field.", "properties": {"ticker": {"type": ["string", "null"], "description": "e.g. `NVDA`."}, "name": {"type": ["string", "null"]}, "kind": {"type": "string", "enum": ["stock", "etf", "commodity", "private"]}, "issuer": {"type": ["string", "null"], "description": "Who issued the token -- e.g. Robinhood, xStocks."}, "dual_listed": {"type": "boolean", "description": "The same underlying is listed by more than one issuer; the other route is in `request.alternatives`."}, "market_status": {"type": "object", "description": "The UNDERLYING equity market, not the token's pool. The token trades around the clock; its reference price does not.", "properties": {"open": {"type": "boolean"}, "label": {"type": "string", "description": "e.g. `market open \u00b7 closes 16:00 ET`."}}}}}, "profile": {"type": "object", "properties": {"key": {"type": ["string", "null"], "description": "Profile the engine scored against \u2014 an age band (FRESH / EARLY / ESTABLISHED) or STOCK for a tokenized equity, which is chosen by what the token is rather than by its age. Branch on this."}, "label": {"type": ["string", "null"]}}}}}, "market": {"type": "object", "properties": {"price_usd": {"type": ["number", "null"]}, "market_cap": {"type": ["number", "null"]}, "fdv": {"type": ["number", "null"]}, "liquidity_usd": {"type": ["number", "null"]}, "volume_24h": {"type": ["number", "null"]}, "volume_6h": {"type": ["number", "null"]}, "vol_mcap_ratio": {"type": ["number", "null"]}, "price_change_pct": {"type": "object", "properties": {"m5": {"type": ["number", "null"]}, "h1": {"type": ["number", "null"]}, "h6": {"type": ["number", "null"]}, "h24": {"type": ["number", "null"]}}}, "txns_24h": {"type": "object", "properties": {"buys": {"type": "integer"}, "sells": {"type": "integer"}, "total": {"type": "integer"}, "buy_ratio": {"type": ["number", "null"], "description": "`null` on a token with no trades -- an empty book is not a balanced one."}}}}}, "analysis": {"type": "object", "description": "Technical analysis. Check `available` before reading the rest.", "properties": {"available": {"type": "boolean"}, "state": {"type": "string", "enum": ["ok", "fresh_launch", "dormant"], "description": "`fresh_launch` = too new for candles. `dormant` = old enough, but has barely traded since launch. Do not describe a dormant token as new."}, "reason": {"type": ["string", "null"]}, "score": {"type": ["integer", "null"], "minimum": 0, "maximum": 100}, "score_label": {"type": ["string", "null"]}, "thesis": {"type": ["string", "null"]}, "data_quality": {"type": ["string", "null"], "description": "Candle count, and whether the series was short."}, "launch_spike_ath": {"type": ["boolean", "null"], "description": "True when the high in the history is a launch wick; long-term targets were measured without it."}, "native": {"type": ["object", "null"], "description": "Non-null only for DigitalDon's own token, which carries a declared house policy: the score is lifted by `score_lift` and floored at `score_floor`, and the short-term plan is withheld. Null for every other token."}, "signals": {"type": ["object", "null"], "description": "Four verdicts, each carrying the raw inputs behind it.", "properties": {"momentum": {"type": "object", "properties": {"signal": {"type": "string", "enum": ["bullish", "bearish", "mixed", "unknown"]}, "detail": {"type": "string", "description": "The same wording the Telegram card prints."}, "rsi": {"type": ["number", "null"]}, "rsi_divergence": {"type": ["string", "null"]}, "stoch_k": {"type": ["number", "null"]}, "stoch_d": {"type": ["number", "null"]}, "stoch_signal": {"type": ["string", "null"]}}}, "trend": {"type": "object", "properties": {"signal": {"type": "string", "enum": ["bullish", "bearish", "mixed", "unknown"]}, "detail": {"type": "string", "description": "The same wording the Telegram card prints."}, "long_term": {"type": "string"}, "long_term_detail": {"type": "string"}, "short_term": {"type": "string"}, "short_term_detail": {"type": "string"}, "ema_position": {"type": "string"}, "ema_cross_signal": {"type": ["string", "null"]}, "ema_cross_confirmed": {"type": "boolean"}}}, "structure": {"type": "object", "properties": {"signal": {"type": "string", "enum": ["bullish", "bearish", "mixed", "unknown"]}, "detail": {"type": "string", "description": "The same wording the Telegram card prints."}, "pattern": {"type": ["string", "null"]}}}, "volume": {"type": "object", "properties": {"signal": {"type": "string", "enum": ["bullish", "bearish", "mixed", "unknown"]}, "detail": {"type": "string", "description": "The same wording the Telegram card prints."}, "trend_ratio": {"type": ["number", "null"], "description": "Recent volume vs its own average. 1.0 = average."}}}}}, "levels": {"type": ["object", "null"], "properties": {"short_term": {"type": "object", "properties": {"horizon": {"type": "string"}, "entry": {"type": ["object", "null"], "description": "A price band. `null` when the engine produced no zone -- which is different from a zone at zero.", "properties": {"low": {"type": ["number", "null"]}, "high": {"type": ["number", "null"]}, "width_pct": {"type": ["number", "null"], "description": "Band width as % of `low`."}}}, "take_profit": {"type": ["object", "null"], "description": "A price band. `null` when the engine produced no zone -- which is different from a zone at zero.", "properties": {"low": {"type": ["number", "null"]}, "high": {"type": ["number", "null"]}, "width_pct": {"type": ["number", "null"], "description": "Band width as % of `low`."}}}, "upside_pct": {"type": ["number", "null"], "description": "From the TOP of the entry zone to the target."}, "upside_from_spot_pct": {"type": ["number", "null"], "description": "From the current price. `null` when price is already above the target."}, "tradable": {"type": "boolean"}, "no_setup": {"type": "boolean"}, "no_setup_reason": {"type": ["string", "null"]}, "range_pct": {"type": ["number", "null"]}}}, "long_term": {"type": "object", "properties": {"horizon": {"type": "string"}, "entry": {"type": ["object", "null"], "description": "A price band. `null` when the engine produced no zone -- which is different from a zone at zero.", "properties": {"low": {"type": ["number", "null"]}, "high": {"type": ["number", "null"]}, "width_pct": {"type": ["number", "null"], "description": "Band width as % of `low`."}}}, "take_profit": {"type": ["object", "null"], "description": "A price band. `null` when the engine produced no zone -- which is different from a zone at zero.", "properties": {"low": {"type": ["number", "null"]}, "high": {"type": ["number", "null"]}, "width_pct": {"type": ["number", "null"], "description": "Band width as % of `low`."}}}, "upside_pct": {"type": ["number", "null"]}, "upside_from_spot_pct": {"type": ["number", "null"]}, "stretch": {"type": "boolean", "description": "The upper target extrapolates past measured resistance -- treat as lower confidence."}}}}}, "position": {"type": ["object", "null"], "description": "Where price sits in the ANALYSED WINDOW (~3 weeks of hourly bars), not in the token's lifetime.", "properties": {"range_position": {"type": ["number", "null"], "minimum": 0, "maximum": 1}, "range_position_label": {"type": ["string", "null"]}, "pct_above_chart_low": {"type": ["number", "null"]}, "pct_below_chart_high": {"type": ["number", "null"]}}}}}, "onchain": {"type": "object", "description": "Liquidity and unlock read. Needs no candles, so it is present even when `analysis.available` is false.", "properties": {"fdv_mcap": {"type": "object", "properties": {"label": {"type": ["string", "null"]}, "risk": {"type": ["string", "null"], "enum": [null, "low", "medium", "high"]}}}, "liquidity": {"type": "object", "properties": {"label": {"type": ["string", "null"]}, "risk": {"type": ["string", "null"], "enum": [null, "healthy", "low", "medium", "high", "critical"]}}}, "vol_mcap_label": {"type": ["string", "null"]}, "notes": {"type": "array", "items": {"type": "string"}}}}, "holders": {"type": ["object", "null"], "description": "Wallet concentration and cluster analysis. Present only at depth=holders|full, and only on the chains those depths are sold for (solana). Same payload as GET /api/holder-intel?stage=full.", "properties": {"concentration": {"type": ["string", "null"]}, "top10_pct": {"type": ["number", "null"]}, "top20_pct": {"type": ["number", "null"]}, "largest_wallet_pct": {"type": ["number", "null"]}, "holder_count": {"type": ["integer", "null"]}, "clustered_pct": {"type": ["number", "null"]}, "bubble_risk": {"type": ["string", "null"]}, "bubble_risk_note": {"type": ["string", "null"], "description": "Why the verdict differs from the raw clusters -- currently only for DigitalDon's own token, whose treasury group is excluded from it."}, "team_pct": {"type": ["number", "null"], "description": "Supply attributed to the project treasury (own token only)."}, "clusters": {"type": "array", "items": {"type": "object"}}, "top_owners": {"type": "array", "items": {"type": "object"}}}}, "social": {"type": ["object", "null"], "description": "X credibility for the token's linked account. Present only at depth=social|full, and only when an account is linked.", "properties": {"handle": {"type": ["string", "null"]}, "score": {"type": ["integer", "null"], "minimum": 0, "maximum": 100}, "sub_scores": {"type": "object"}, "stats": {"type": "object"}, "flags": {"type": "object"}, "content_mix": {"type": "object"}, "notes": {"type": "array", "items": {"type": "string"}}}}, "warnings": {"type": "array", "description": "Why a requested block is null. An empty array means nothing was degraded.", "items": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}, "chart": {"type": ["object", "null"], "description": "Only when options.include_chart_raw. The candles the analysis actually ran on, most recent 300.", "properties": {"timeframe": {"type": "string"}, "candle_count": {"type": "integer"}, "truncated": {"type": "boolean"}, "candles": {"type": "array", "items": {"type": "object", "description": "t=ISO timestamp, o/h/l/c=price, v=volume.", "properties": {"t": {"type": ["string", "null"], "format": "date-time"}, "o": {"type": ["number", "null"]}, "h": {"type": ["number", "null"]}, "l": {"type": ["number", "null"]}, "c": {"type": ["number", "null"]}, "v": {"type": ["number", "null"]}}}}}}, "raw": {"type": ["object", "null"], "additionalProperties": true, "description": "Only when options.include_raw_metrics. NOT part of the schema contract -- keys track the engine's internals and may change without a schema major. Prototype against it; ship against the structured blocks."}, "payment": {"type": ["object", "null"], "description": "What this call cost. `charged` is '$0' on a free-trial call, which also reports how many remain today.", "properties": {"charged": {"type": "string"}, "payer": {"type": ["string", "null"]}, "free_calls_remaining_today": {"type": ["integer", "null"]}}}, "disclaimer": {"type": "string"}}}}}, "examples": {"basic": {"summary": "depth=basic -- chart + on-chain. What the free daily call returns.", "value": {"ok": true, "error": null, "detail": null, "data": {"schema_version": "2.0.0", "engine_version": "1.29.0", "generated_at": "2026-10-29T12:10:37Z", "request": {"token": "EXMPL", "chain": "auto", "depth": "basic", "resolved_chain": "solana", "alternatives": []}, "token": {"name": "Example Token", "symbol": "EXMPL", "address": "So11111111111111111111111111111111111111112", "chain": "solana", "dex": "raydium", "pair_address": "PairAddr1", "dexscreener_url": "https://dexscreener.com/solana/PairAddr1", "x_url": "https://x.com/example", "age_days": 900.0, "age_label": "2y 5mo", "asset_class": "crypto", "underlying": null, "profile": {"key": "ESTABLISHED", "label": "\ud83c\udfdb Established (60d+)"}}, "market": {"price_usd": 150.0, "market_cap": 70000000.0, "fdv": 72000000.0, "liquidity_usd": 5600000.0, "volume_24h": 5000000.0, "volume_6h": 900000.0, "vol_mcap_ratio": 0.07, "price_change_pct": {"m5": 0.1, "h1": -0.4, "h6": 1.2, "h24": 3.5}, "txns_24h": {"buys": 600, "sells": 400, "total": 1000, "buy_ratio": 0.6}}, "analysis": {"available": true, "state": "ok", "reason": null, "score": 68, "score_label": "Bullish, accumulation zone", "thesis": "Bullish, accumulation zone", "signals": {"momentum": {"signal": "bullish", "detail": "oversold (RSI 41, Stoch oversold)", "rsi": 41.2, "rsi_divergence": null, "stoch_k": 22.0, "stoch_d": 25.0, "stoch_signal": "oversold"}, "trend": {"signal": "bullish", "detail": "uptrend (short & long-term)", "long_term": "Uptrend", "long_term_detail": "EMA50 > EMA200", "short_term": "Uptrend", "short_term_detail": "higher lows holding", "ema_position": "above EMA50", "ema_cross_signal": null, "ema_cross_confirmed": false}, "structure": {"signal": "mixed", "detail": "ascending triangle, bullish continuation", "pattern": "Ascending Triangle -- bullish continuation"}, "volume": {"signal": "bullish", "detail": "rising (+32% vs avg)", "trend_ratio": 1.32}}, "levels": {"short_term": {"horizon": "1d", "entry": {"low": 140.0, "high": 145.0, "width_pct": 3.57}, "take_profit": {"low": 165.0, "high": 172.0, "width_pct": 4.24}, "upside_pct": 13.79, "upside_from_spot_pct": 10.0, "tradable": true, "no_setup": false, "no_setup_reason": null, "range_pct": 18.0}, "long_term": {"horizon": "weeks", "entry": {"low": 120.0, "high": 132.0, "width_pct": 10.0}, "take_profit": {"low": 190.0, "high": 240.0, "width_pct": 26.32}, "upside_pct": 43.94, "upside_from_spot_pct": 26.67, "stretch": true}}, "position": {"range_position": 0.68, "range_position_label": "upper range", "pct_above_chart_low": 24.0, "pct_below_chart_high": 11.0}, "data_quality": "500 candles", "launch_spike_ath": false, "native": null}, "onchain": {"fdv_mcap": {"label": "FDV ~= MCap (1.0x) -- fully circulating", "risk": "low"}, "liquidity": {"label": "Liq 8.0% of MCap -- healthy", "risk": "healthy"}, "vol_mcap_label": null, "notes": []}, "holders": null, "social": null, "warnings": [], "disclaimer": "Analysis only. Not financial advice.", "payment": {"charged": "$0", "free_calls_remaining_today": 0}}}}, "holders": {"summary": "depth=holders -- the same document with the wallet-cluster block filled in.", "value": {"ok": true, "error": null, "detail": null, "data": {"schema_version": "2.0.0", "engine_version": "1.29.0", "generated_at": "2026-10-29T12:10:37Z", "request": {"token": "EXMPL", "chain": "sol", "depth": "holders", "resolved_chain": "solana", "alternatives": []}, "token": {"name": "Example Token", "symbol": "EXMPL", "address": "So11111111111111111111111111111111111111112", "chain": "solana", "dex": "raydium", "pair_address": "PairAddr1", "dexscreener_url": "https://dexscreener.com/solana/PairAddr1", "x_url": "https://x.com/example", "age_days": 900.0, "age_label": "2y 5mo", "asset_class": "crypto", "underlying": null, "profile": {"key": "ESTABLISHED", "label": "\ud83c\udfdb Established (60d+)"}}, "market": {"price_usd": 150.0, "market_cap": 70000000.0, "fdv": 72000000.0, "liquidity_usd": 5600000.0, "volume_24h": 5000000.0, "volume_6h": 900000.0, "vol_mcap_ratio": 0.07, "price_change_pct": {"m5": 0.1, "h1": -0.4, "h6": 1.2, "h24": 3.5}, "txns_24h": {"buys": 600, "sells": 400, "total": 1000, "buy_ratio": 0.6}}, "analysis": {"available": true, "state": "ok", "reason": null, "score": 68, "score_label": "Bullish, accumulation zone", "thesis": "Bullish, accumulation zone", "signals": {"momentum": {"signal": "bullish", "detail": "oversold (RSI 41, Stoch oversold)", "rsi": 41.2, "rsi_divergence": null, "stoch_k": 22.0, "stoch_d": 25.0, "stoch_signal": "oversold"}, "trend": {"signal": "bullish", "detail": "uptrend (short & long-term)", "long_term": "Uptrend", "long_term_detail": "EMA50 > EMA200", "short_term": "Uptrend", "short_term_detail": "higher lows holding", "ema_position": "above EMA50", "ema_cross_signal": null, "ema_cross_confirmed": false}, "structure": {"signal": "mixed", "detail": "ascending triangle, bullish continuation", "pattern": "Ascending Triangle -- bullish continuation"}, "volume": {"signal": "bullish", "detail": "rising (+32% vs avg)", "trend_ratio": 1.32}}, "levels": {"short_term": {"horizon": "1d", "entry": {"low": 140.0, "high": 145.0, "width_pct": 3.57}, "take_profit": {"low": 165.0, "high": 172.0, "width_pct": 4.24}, "upside_pct": 13.79, "upside_from_spot_pct": 10.0, "tradable": true, "no_setup": false, "no_setup_reason": null, "range_pct": 18.0}, "long_term": {"horizon": "weeks", "entry": {"low": 120.0, "high": 132.0, "width_pct": 10.0}, "take_profit": {"low": 190.0, "high": 240.0, "width_pct": 26.32}, "upside_pct": 43.94, "upside_from_spot_pct": 26.67, "stretch": true}}, "position": {"range_position": 0.68, "range_position_label": "upper range", "pct_above_chart_low": 24.0, "pct_below_chart_high": 11.0}, "data_quality": "500 candles", "launch_spike_ath": false, "native": null}, "onchain": {"fdv_mcap": {"label": "FDV ~= MCap (1.0x) -- fully circulating", "risk": "low"}, "liquidity": {"label": "Liq 8.0% of MCap -- healthy", "risk": "healthy"}, "vol_mcap_label": null, "notes": []}, "holders": {"concentration": "Top 10 hold 28.4% -- moderate", "top10_pct": 28.4, "top20_pct": 37.1, "largest_wallet_pct": 6.2, "holder_count": 18402, "clustered_pct": 9.7, "bubble_risk": "low", "bubble_risk_note": null, "team_pct": null, "clusters": [{"pct": 5.1, "wallets": 4, "reason": "common funder", "funder_is_holder": false, "evidence": "strong", "weak_reason": null, "owner": null, "owner_label": null}], "top_owners": [{"address": "9xQe...4kPz", "pct": 6.2, "rank": 1, "roles": ["exchange"]}]}, "social": null, "warnings": [], "disclaimer": "Analysis only. Not financial advice.", "payment": {"charged": "$0.05", "payer": "0xA0b8...6eB48"}}}}, "tokenized_stock": {"summary": "A tokenized equity on Robinhood Chain. `token.asset_class` is `stock` and `token.underlying` names the security -- do not score this against memecoin priors, and note the engine does not either: `analysis.profile.key` is `STOCK`. Listed by a second issuer too, so the other route is in `request.alternatives`.", "value": {"ok": true, "error": null, "detail": null, "data": {"schema_version": "2.0.0", "engine_version": "1.29.0", "generated_at": "2026-10-29T12:10:37Z", "request": {"token": "NVDA", "chain": "auto", "depth": "basic", "resolved_chain": "robinhood", "alternatives": [{"chain": "solana", "symbol": "NVDAx", "address": "Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh", "pair_address": "PairAddr3", "liquidity_usd": 1813491.0}]}, "token": {"name": "NVIDIA \u2022 Robinhood Token", "symbol": "NVDA", "address": "0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec", "chain": "robinhood", "dex": "uniswap", "pair_address": "PairAddr2", "dexscreener_url": "https://dexscreener.com/robinhood/PairAddr2", "x_url": null, "age_days": 900.0, "age_label": "2y 5mo", "asset_class": "stock", "underlying": {"ticker": "NVDA", "name": "NVIDIA", "kind": "stock", "issuer": "Robinhood", "dual_listed": true, "market_status": {"open": true, "label": "market open \u00b7 closes 16:00 ET"}}, "profile": {"key": "STOCK", "label": "\ud83d\udcc8 Tokenized equity"}}, "market": {"price_usd": 150.0, "market_cap": 70000000.0, "fdv": 72000000.0, "liquidity_usd": 5600000.0, "volume_24h": 5000000.0, "volume_6h": 900000.0, "vol_mcap_ratio": 0.07, "price_change_pct": {"m5": 0.1, "h1": -0.4, "h6": 1.2, "h24": 3.5}, "txns_24h": {"buys": 600, "sells": 400, "total": 1000, "buy_ratio": 0.6}}, "analysis": {"available": true, "state": "ok", "reason": null, "score": 68, "score_label": "Bullish, accumulation zone", "thesis": "Bullish, accumulation zone", "signals": {"momentum": {"signal": "bullish", "detail": "oversold (RSI 41, Stoch oversold)", "rsi": 41.2, "rsi_divergence": null, "stoch_k": 22.0, "stoch_d": 25.0, "stoch_signal": "oversold"}, "trend": {"signal": "bullish", "detail": "uptrend (short & long-term)", "long_term": "Uptrend", "long_term_detail": "EMA50 > EMA200", "short_term": "Uptrend", "short_term_detail": "higher lows holding", "ema_position": "above EMA50", "ema_cross_signal": null, "ema_cross_confirmed": false}, "structure": {"signal": "mixed", "detail": "ascending triangle, bullish continuation", "pattern": "Ascending Triangle -- bullish continuation"}, "volume": {"signal": "bullish", "detail": "rising (+32% vs avg)", "trend_ratio": 1.32}}, "levels": {"short_term": {"horizon": "days", "entry": {"low": 140.0, "high": 145.0, "width_pct": 3.57}, "take_profit": {"low": 165.0, "high": 172.0, "width_pct": 4.24}, "upside_pct": 13.79, "upside_from_spot_pct": 10.0, "tradable": true, "no_setup": false, "no_setup_reason": null, "range_pct": 18.0}, "long_term": {"horizon": "weeks", "entry": {"low": 120.0, "high": 132.0, "width_pct": 10.0}, "take_profit": {"low": 190.0, "high": 240.0, "width_pct": 26.32}, "upside_pct": 43.94, "upside_from_spot_pct": 26.67, "stretch": true}}, "position": {"range_position": 0.68, "range_position_label": "upper range", "pct_above_chart_low": 24.0, "pct_below_chart_high": 11.0}, "data_quality": "500 candles", "launch_spike_ath": false, "native": null}, "onchain": {"fdv_mcap": {"label": "FDV ~= MCap (1.0x) -- fully circulating", "risk": "low"}, "liquidity": {"label": "Liq 8.0% of MCap -- healthy", "risk": "healthy"}, "vol_mcap_label": null, "notes": []}, "holders": null, "social": null, "warnings": [], "disclaimer": "Analysis only. Not financial advice.", "payment": {"charged": "$0.01", "payer": "0xA0b8...6eB48"}}}}}}}}, "400": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "402": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "404": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "422": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "429": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "502": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "503": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}}}, "get": {"operationId": "analyzeTokenByQuery", "tags": ["crypto", "analysis", "onchain", "x402"], "summary": "Analyse a token (query-string form of POST /v1/analyze).", "description": "Identical semantics and identical validation; options are passed flat rather than nested.", "parameters": [{"name": "token", "in": "query", "required": true, "example": "SOL", "schema": {"type": "string", "maxLength": 128, "examples": ["SOL", "So11111111111111111111111111111111111111112"]}}, {"name": "chain", "in": "query", "required": false, "example": "auto", "schema": {"type": "string", "default": "auto"}}, {"name": "depth", "in": "query", "required": false, "example": "basic", "schema": {"type": "string", "enum": ["basic", "holders"], "default": "basic"}}, {"name": "include_chart_raw", "in": "query", "required": false, "schema": {"type": "boolean", "default": false}}, {"name": "include_raw_metrics", "in": "query", "required": false, "schema": {"type": "boolean", "default": false}}], "responses": {"200": {"description": "Analysis produced. Check `data.analysis.available` and `data.warnings`.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": ["object", "null"], "required": ["schema_version", "engine_version", "token", "market", "analysis", "onchain"], "properties": {"schema_version": {"type": "string", "description": "Shape of this document. Parse against it."}, "engine_version": {"type": "string", "description": "Analysis-logic contract that produced the numbers. Cache against it."}, "generated_at": {"type": "string", "format": "date-time"}, "request": {"type": "object", "properties": {"token": {"type": "string"}, "chain": {"type": "string"}, "depth": {"type": "string"}, "resolved_chain": {"type": "string"}, "alternatives": {"type": "array", "description": "Other chains this query matched. The deepest pool was analysed; re-request with an explicit `chain` for another.", "items": {"type": "object", "properties": {"chain": {"type": "string"}, "symbol": {"type": "string"}, "address": {"type": "string"}, "pair_address": {"type": "string"}, "liquidity_usd": {"type": "number"}}}}}}, "token": {"type": "object", "properties": {"name": {"type": "string"}, "symbol": {"type": "string"}, "address": {"type": "string"}, "chain": {"type": "string"}, "dex": {"type": "string"}, "pair_address": {"type": "string"}, "dexscreener_url": {"type": ["string", "null"]}, "x_url": {"type": ["string", "null"]}, "age_days": {"type": ["number", "null"]}, "age_label": {"type": "string"}, "asset_class": {"type": "string", "enum": ["crypto", "stock"], "description": "What this token IS. `stock` means a tokenized claim on a listed security, matched against a verified issuer registry -- NOT inferred from the chain. Branch on it before applying memecoin priors: Robinhood Chain is an Arbitrum Orbit L2 for tokenized equities, so a token there is usually a share, not a meme. Holder depths are not sold for `stock` -- see `depth`."}, "underlying": {"type": ["object", "null"], "description": "The security a tokenized stock is a claim on -- non-null exactly when `asset_class` is `stock`. Read from the curated issuer registry, which is the authority on what is official: a ticker search alone returns copycats. Such a token is also scored on the `STOCK` profile, so `analysis.profile.key` moves with this field.", "properties": {"ticker": {"type": ["string", "null"], "description": "e.g. `NVDA`."}, "name": {"type": ["string", "null"]}, "kind": {"type": "string", "enum": ["stock", "etf", "commodity", "private"]}, "issuer": {"type": ["string", "null"], "description": "Who issued the token -- e.g. Robinhood, xStocks."}, "dual_listed": {"type": "boolean", "description": "The same underlying is listed by more than one issuer; the other route is in `request.alternatives`."}, "market_status": {"type": "object", "description": "The UNDERLYING equity market, not the token's pool. The token trades around the clock; its reference price does not.", "properties": {"open": {"type": "boolean"}, "label": {"type": "string", "description": "e.g. `market open \u00b7 closes 16:00 ET`."}}}}}, "profile": {"type": "object", "properties": {"key": {"type": ["string", "null"], "description": "Profile the engine scored against \u2014 an age band (FRESH / EARLY / ESTABLISHED) or STOCK for a tokenized equity, which is chosen by what the token is rather than by its age. Branch on this."}, "label": {"type": ["string", "null"]}}}}}, "market": {"type": "object", "properties": {"price_usd": {"type": ["number", "null"]}, "market_cap": {"type": ["number", "null"]}, "fdv": {"type": ["number", "null"]}, "liquidity_usd": {"type": ["number", "null"]}, "volume_24h": {"type": ["number", "null"]}, "volume_6h": {"type": ["number", "null"]}, "vol_mcap_ratio": {"type": ["number", "null"]}, "price_change_pct": {"type": "object", "properties": {"m5": {"type": ["number", "null"]}, "h1": {"type": ["number", "null"]}, "h6": {"type": ["number", "null"]}, "h24": {"type": ["number", "null"]}}}, "txns_24h": {"type": "object", "properties": {"buys": {"type": "integer"}, "sells": {"type": "integer"}, "total": {"type": "integer"}, "buy_ratio": {"type": ["number", "null"], "description": "`null` on a token with no trades -- an empty book is not a balanced one."}}}}}, "analysis": {"type": "object", "description": "Technical analysis. Check `available` before reading the rest.", "properties": {"available": {"type": "boolean"}, "state": {"type": "string", "enum": ["ok", "fresh_launch", "dormant"], "description": "`fresh_launch` = too new for candles. `dormant` = old enough, but has barely traded since launch. Do not describe a dormant token as new."}, "reason": {"type": ["string", "null"]}, "score": {"type": ["integer", "null"], "minimum": 0, "maximum": 100}, "score_label": {"type": ["string", "null"]}, "thesis": {"type": ["string", "null"]}, "data_quality": {"type": ["string", "null"], "description": "Candle count, and whether the series was short."}, "launch_spike_ath": {"type": ["boolean", "null"], "description": "True when the high in the history is a launch wick; long-term targets were measured without it."}, "native": {"type": ["object", "null"], "description": "Non-null only for DigitalDon's own token, which carries a declared house policy: the score is lifted by `score_lift` and floored at `score_floor`, and the short-term plan is withheld. Null for every other token."}, "signals": {"type": ["object", "null"], "description": "Four verdicts, each carrying the raw inputs behind it.", "properties": {"momentum": {"type": "object", "properties": {"signal": {"type": "string", "enum": ["bullish", "bearish", "mixed", "unknown"]}, "detail": {"type": "string", "description": "The same wording the Telegram card prints."}, "rsi": {"type": ["number", "null"]}, "rsi_divergence": {"type": ["string", "null"]}, "stoch_k": {"type": ["number", "null"]}, "stoch_d": {"type": ["number", "null"]}, "stoch_signal": {"type": ["string", "null"]}}}, "trend": {"type": "object", "properties": {"signal": {"type": "string", "enum": ["bullish", "bearish", "mixed", "unknown"]}, "detail": {"type": "string", "description": "The same wording the Telegram card prints."}, "long_term": {"type": "string"}, "long_term_detail": {"type": "string"}, "short_term": {"type": "string"}, "short_term_detail": {"type": "string"}, "ema_position": {"type": "string"}, "ema_cross_signal": {"type": ["string", "null"]}, "ema_cross_confirmed": {"type": "boolean"}}}, "structure": {"type": "object", "properties": {"signal": {"type": "string", "enum": ["bullish", "bearish", "mixed", "unknown"]}, "detail": {"type": "string", "description": "The same wording the Telegram card prints."}, "pattern": {"type": ["string", "null"]}}}, "volume": {"type": "object", "properties": {"signal": {"type": "string", "enum": ["bullish", "bearish", "mixed", "unknown"]}, "detail": {"type": "string", "description": "The same wording the Telegram card prints."}, "trend_ratio": {"type": ["number", "null"], "description": "Recent volume vs its own average. 1.0 = average."}}}}}, "levels": {"type": ["object", "null"], "properties": {"short_term": {"type": "object", "properties": {"horizon": {"type": "string"}, "entry": {"type": ["object", "null"], "description": "A price band. `null` when the engine produced no zone -- which is different from a zone at zero.", "properties": {"low": {"type": ["number", "null"]}, "high": {"type": ["number", "null"]}, "width_pct": {"type": ["number", "null"], "description": "Band width as % of `low`."}}}, "take_profit": {"type": ["object", "null"], "description": "A price band. `null` when the engine produced no zone -- which is different from a zone at zero.", "properties": {"low": {"type": ["number", "null"]}, "high": {"type": ["number", "null"]}, "width_pct": {"type": ["number", "null"], "description": "Band width as % of `low`."}}}, "upside_pct": {"type": ["number", "null"], "description": "From the TOP of the entry zone to the target."}, "upside_from_spot_pct": {"type": ["number", "null"], "description": "From the current price. `null` when price is already above the target."}, "tradable": {"type": "boolean"}, "no_setup": {"type": "boolean"}, "no_setup_reason": {"type": ["string", "null"]}, "range_pct": {"type": ["number", "null"]}}}, "long_term": {"type": "object", "properties": {"horizon": {"type": "string"}, "entry": {"type": ["object", "null"], "description": "A price band. `null` when the engine produced no zone -- which is different from a zone at zero.", "properties": {"low": {"type": ["number", "null"]}, "high": {"type": ["number", "null"]}, "width_pct": {"type": ["number", "null"], "description": "Band width as % of `low`."}}}, "take_profit": {"type": ["object", "null"], "description": "A price band. `null` when the engine produced no zone -- which is different from a zone at zero.", "properties": {"low": {"type": ["number", "null"]}, "high": {"type": ["number", "null"]}, "width_pct": {"type": ["number", "null"], "description": "Band width as % of `low`."}}}, "upside_pct": {"type": ["number", "null"]}, "upside_from_spot_pct": {"type": ["number", "null"]}, "stretch": {"type": "boolean", "description": "The upper target extrapolates past measured resistance -- treat as lower confidence."}}}}}, "position": {"type": ["object", "null"], "description": "Where price sits in the ANALYSED WINDOW (~3 weeks of hourly bars), not in the token's lifetime.", "properties": {"range_position": {"type": ["number", "null"], "minimum": 0, "maximum": 1}, "range_position_label": {"type": ["string", "null"]}, "pct_above_chart_low": {"type": ["number", "null"]}, "pct_below_chart_high": {"type": ["number", "null"]}}}}}, "onchain": {"type": "object", "description": "Liquidity and unlock read. Needs no candles, so it is present even when `analysis.available` is false.", "properties": {"fdv_mcap": {"type": "object", "properties": {"label": {"type": ["string", "null"]}, "risk": {"type": ["string", "null"], "enum": [null, "low", "medium", "high"]}}}, "liquidity": {"type": "object", "properties": {"label": {"type": ["string", "null"]}, "risk": {"type": ["string", "null"], "enum": [null, "healthy", "low", "medium", "high", "critical"]}}}, "vol_mcap_label": {"type": ["string", "null"]}, "notes": {"type": "array", "items": {"type": "string"}}}}, "holders": {"type": ["object", "null"], "description": "Wallet concentration and cluster analysis. Present only at depth=holders|full, and only on the chains those depths are sold for (solana). Same payload as GET /api/holder-intel?stage=full.", "properties": {"concentration": {"type": ["string", "null"]}, "top10_pct": {"type": ["number", "null"]}, "top20_pct": {"type": ["number", "null"]}, "largest_wallet_pct": {"type": ["number", "null"]}, "holder_count": {"type": ["integer", "null"]}, "clustered_pct": {"type": ["number", "null"]}, "bubble_risk": {"type": ["string", "null"]}, "bubble_risk_note": {"type": ["string", "null"], "description": "Why the verdict differs from the raw clusters -- currently only for DigitalDon's own token, whose treasury group is excluded from it."}, "team_pct": {"type": ["number", "null"], "description": "Supply attributed to the project treasury (own token only)."}, "clusters": {"type": "array", "items": {"type": "object"}}, "top_owners": {"type": "array", "items": {"type": "object"}}}}, "social": {"type": ["object", "null"], "description": "X credibility for the token's linked account. Present only at depth=social|full, and only when an account is linked.", "properties": {"handle": {"type": ["string", "null"]}, "score": {"type": ["integer", "null"], "minimum": 0, "maximum": 100}, "sub_scores": {"type": "object"}, "stats": {"type": "object"}, "flags": {"type": "object"}, "content_mix": {"type": "object"}, "notes": {"type": "array", "items": {"type": "string"}}}}, "warnings": {"type": "array", "description": "Why a requested block is null. An empty array means nothing was degraded.", "items": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}, "chart": {"type": ["object", "null"], "description": "Only when options.include_chart_raw. The candles the analysis actually ran on, most recent 300.", "properties": {"timeframe": {"type": "string"}, "candle_count": {"type": "integer"}, "truncated": {"type": "boolean"}, "candles": {"type": "array", "items": {"type": "object", "description": "t=ISO timestamp, o/h/l/c=price, v=volume.", "properties": {"t": {"type": ["string", "null"], "format": "date-time"}, "o": {"type": ["number", "null"]}, "h": {"type": ["number", "null"]}, "l": {"type": ["number", "null"]}, "c": {"type": ["number", "null"]}, "v": {"type": ["number", "null"]}}}}}}, "raw": {"type": ["object", "null"], "additionalProperties": true, "description": "Only when options.include_raw_metrics. NOT part of the schema contract -- keys track the engine's internals and may change without a schema major. Prototype against it; ship against the structured blocks."}, "payment": {"type": ["object", "null"], "description": "What this call cost. `charged` is '$0' on a free-trial call, which also reports how many remain today.", "properties": {"charged": {"type": "string"}, "payer": {"type": ["string", "null"]}, "free_calls_remaining_today": {"type": ["integer", "null"]}}}, "disclaimer": {"type": "string"}}}}}, "examples": {"basic": {"summary": "depth=basic -- chart + on-chain. What the free daily call returns.", "value": {"ok": true, "error": null, "detail": null, "data": {"schema_version": "2.0.0", "engine_version": "1.29.0", "generated_at": "2026-10-29T12:10:37Z", "request": {"token": "EXMPL", "chain": "auto", "depth": "basic", "resolved_chain": "solana", "alternatives": []}, "token": {"name": "Example Token", "symbol": "EXMPL", "address": "So11111111111111111111111111111111111111112", "chain": "solana", "dex": "raydium", "pair_address": "PairAddr1", "dexscreener_url": "https://dexscreener.com/solana/PairAddr1", "x_url": "https://x.com/example", "age_days": 900.0, "age_label": "2y 5mo", "asset_class": "crypto", "underlying": null, "profile": {"key": "ESTABLISHED", "label": "\ud83c\udfdb Established (60d+)"}}, "market": {"price_usd": 150.0, "market_cap": 70000000.0, "fdv": 72000000.0, "liquidity_usd": 5600000.0, "volume_24h": 5000000.0, "volume_6h": 900000.0, "vol_mcap_ratio": 0.07, "price_change_pct": {"m5": 0.1, "h1": -0.4, "h6": 1.2, "h24": 3.5}, "txns_24h": {"buys": 600, "sells": 400, "total": 1000, "buy_ratio": 0.6}}, "analysis": {"available": true, "state": "ok", "reason": null, "score": 68, "score_label": "Bullish, accumulation zone", "thesis": "Bullish, accumulation zone", "signals": {"momentum": {"signal": "bullish", "detail": "oversold (RSI 41, Stoch oversold)", "rsi": 41.2, "rsi_divergence": null, "stoch_k": 22.0, "stoch_d": 25.0, "stoch_signal": "oversold"}, "trend": {"signal": "bullish", "detail": "uptrend (short & long-term)", "long_term": "Uptrend", "long_term_detail": "EMA50 > EMA200", "short_term": "Uptrend", "short_term_detail": "higher lows holding", "ema_position": "above EMA50", "ema_cross_signal": null, "ema_cross_confirmed": false}, "structure": {"signal": "mixed", "detail": "ascending triangle, bullish continuation", "pattern": "Ascending Triangle -- bullish continuation"}, "volume": {"signal": "bullish", "detail": "rising (+32% vs avg)", "trend_ratio": 1.32}}, "levels": {"short_term": {"horizon": "1d", "entry": {"low": 140.0, "high": 145.0, "width_pct": 3.57}, "take_profit": {"low": 165.0, "high": 172.0, "width_pct": 4.24}, "upside_pct": 13.79, "upside_from_spot_pct": 10.0, "tradable": true, "no_setup": false, "no_setup_reason": null, "range_pct": 18.0}, "long_term": {"horizon": "weeks", "entry": {"low": 120.0, "high": 132.0, "width_pct": 10.0}, "take_profit": {"low": 190.0, "high": 240.0, "width_pct": 26.32}, "upside_pct": 43.94, "upside_from_spot_pct": 26.67, "stretch": true}}, "position": {"range_position": 0.68, "range_position_label": "upper range", "pct_above_chart_low": 24.0, "pct_below_chart_high": 11.0}, "data_quality": "500 candles", "launch_spike_ath": false, "native": null}, "onchain": {"fdv_mcap": {"label": "FDV ~= MCap (1.0x) -- fully circulating", "risk": "low"}, "liquidity": {"label": "Liq 8.0% of MCap -- healthy", "risk": "healthy"}, "vol_mcap_label": null, "notes": []}, "holders": null, "social": null, "warnings": [], "disclaimer": "Analysis only. Not financial advice.", "payment": {"charged": "$0", "free_calls_remaining_today": 0}}}}, "holders": {"summary": "depth=holders -- the same document with the wallet-cluster block filled in.", "value": {"ok": true, "error": null, "detail": null, "data": {"schema_version": "2.0.0", "engine_version": "1.29.0", "generated_at": "2026-10-29T12:10:37Z", "request": {"token": "EXMPL", "chain": "sol", "depth": "holders", "resolved_chain": "solana", "alternatives": []}, "token": {"name": "Example Token", "symbol": "EXMPL", "address": "So11111111111111111111111111111111111111112", "chain": "solana", "dex": "raydium", "pair_address": "PairAddr1", "dexscreener_url": "https://dexscreener.com/solana/PairAddr1", "x_url": "https://x.com/example", "age_days": 900.0, "age_label": "2y 5mo", "asset_class": "crypto", "underlying": null, "profile": {"key": "ESTABLISHED", "label": "\ud83c\udfdb Established (60d+)"}}, "market": {"price_usd": 150.0, "market_cap": 70000000.0, "fdv": 72000000.0, "liquidity_usd": 5600000.0, "volume_24h": 5000000.0, "volume_6h": 900000.0, "vol_mcap_ratio": 0.07, "price_change_pct": {"m5": 0.1, "h1": -0.4, "h6": 1.2, "h24": 3.5}, "txns_24h": {"buys": 600, "sells": 400, "total": 1000, "buy_ratio": 0.6}}, "analysis": {"available": true, "state": "ok", "reason": null, "score": 68, "score_label": "Bullish, accumulation zone", "thesis": "Bullish, accumulation zone", "signals": {"momentum": {"signal": "bullish", "detail": "oversold (RSI 41, Stoch oversold)", "rsi": 41.2, "rsi_divergence": null, "stoch_k": 22.0, "stoch_d": 25.0, "stoch_signal": "oversold"}, "trend": {"signal": "bullish", "detail": "uptrend (short & long-term)", "long_term": "Uptrend", "long_term_detail": "EMA50 > EMA200", "short_term": "Uptrend", "short_term_detail": "higher lows holding", "ema_position": "above EMA50", "ema_cross_signal": null, "ema_cross_confirmed": false}, "structure": {"signal": "mixed", "detail": "ascending triangle, bullish continuation", "pattern": "Ascending Triangle -- bullish continuation"}, "volume": {"signal": "bullish", "detail": "rising (+32% vs avg)", "trend_ratio": 1.32}}, "levels": {"short_term": {"horizon": "1d", "entry": {"low": 140.0, "high": 145.0, "width_pct": 3.57}, "take_profit": {"low": 165.0, "high": 172.0, "width_pct": 4.24}, "upside_pct": 13.79, "upside_from_spot_pct": 10.0, "tradable": true, "no_setup": false, "no_setup_reason": null, "range_pct": 18.0}, "long_term": {"horizon": "weeks", "entry": {"low": 120.0, "high": 132.0, "width_pct": 10.0}, "take_profit": {"low": 190.0, "high": 240.0, "width_pct": 26.32}, "upside_pct": 43.94, "upside_from_spot_pct": 26.67, "stretch": true}}, "position": {"range_position": 0.68, "range_position_label": "upper range", "pct_above_chart_low": 24.0, "pct_below_chart_high": 11.0}, "data_quality": "500 candles", "launch_spike_ath": false, "native": null}, "onchain": {"fdv_mcap": {"label": "FDV ~= MCap (1.0x) -- fully circulating", "risk": "low"}, "liquidity": {"label": "Liq 8.0% of MCap -- healthy", "risk": "healthy"}, "vol_mcap_label": null, "notes": []}, "holders": {"concentration": "Top 10 hold 28.4% -- moderate", "top10_pct": 28.4, "top20_pct": 37.1, "largest_wallet_pct": 6.2, "holder_count": 18402, "clustered_pct": 9.7, "bubble_risk": "low", "bubble_risk_note": null, "team_pct": null, "clusters": [{"pct": 5.1, "wallets": 4, "reason": "common funder", "funder_is_holder": false, "evidence": "strong", "weak_reason": null, "owner": null, "owner_label": null}], "top_owners": [{"address": "9xQe...4kPz", "pct": 6.2, "rank": 1, "roles": ["exchange"]}]}, "social": null, "warnings": [], "disclaimer": "Analysis only. Not financial advice.", "payment": {"charged": "$0.05", "payer": "0xA0b8...6eB48"}}}}, "tokenized_stock": {"summary": "A tokenized equity on Robinhood Chain. `token.asset_class` is `stock` and `token.underlying` names the security -- do not score this against memecoin priors, and note the engine does not either: `analysis.profile.key` is `STOCK`. Listed by a second issuer too, so the other route is in `request.alternatives`.", "value": {"ok": true, "error": null, "detail": null, "data": {"schema_version": "2.0.0", "engine_version": "1.29.0", "generated_at": "2026-10-29T12:10:37Z", "request": {"token": "NVDA", "chain": "auto", "depth": "basic", "resolved_chain": "robinhood", "alternatives": [{"chain": "solana", "symbol": "NVDAx", "address": "Xsc9qvGR1efVDFGLrVsmkzv3qi45LTBjeUKSPmx9qEh", "pair_address": "PairAddr3", "liquidity_usd": 1813491.0}]}, "token": {"name": "NVIDIA \u2022 Robinhood Token", "symbol": "NVDA", "address": "0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec", "chain": "robinhood", "dex": "uniswap", "pair_address": "PairAddr2", "dexscreener_url": "https://dexscreener.com/robinhood/PairAddr2", "x_url": null, "age_days": 900.0, "age_label": "2y 5mo", "asset_class": "stock", "underlying": {"ticker": "NVDA", "name": "NVIDIA", "kind": "stock", "issuer": "Robinhood", "dual_listed": true, "market_status": {"open": true, "label": "market open \u00b7 closes 16:00 ET"}}, "profile": {"key": "STOCK", "label": "\ud83d\udcc8 Tokenized equity"}}, "market": {"price_usd": 150.0, "market_cap": 70000000.0, "fdv": 72000000.0, "liquidity_usd": 5600000.0, "volume_24h": 5000000.0, "volume_6h": 900000.0, "vol_mcap_ratio": 0.07, "price_change_pct": {"m5": 0.1, "h1": -0.4, "h6": 1.2, "h24": 3.5}, "txns_24h": {"buys": 600, "sells": 400, "total": 1000, "buy_ratio": 0.6}}, "analysis": {"available": true, "state": "ok", "reason": null, "score": 68, "score_label": "Bullish, accumulation zone", "thesis": "Bullish, accumulation zone", "signals": {"momentum": {"signal": "bullish", "detail": "oversold (RSI 41, Stoch oversold)", "rsi": 41.2, "rsi_divergence": null, "stoch_k": 22.0, "stoch_d": 25.0, "stoch_signal": "oversold"}, "trend": {"signal": "bullish", "detail": "uptrend (short & long-term)", "long_term": "Uptrend", "long_term_detail": "EMA50 > EMA200", "short_term": "Uptrend", "short_term_detail": "higher lows holding", "ema_position": "above EMA50", "ema_cross_signal": null, "ema_cross_confirmed": false}, "structure": {"signal": "mixed", "detail": "ascending triangle, bullish continuation", "pattern": "Ascending Triangle -- bullish continuation"}, "volume": {"signal": "bullish", "detail": "rising (+32% vs avg)", "trend_ratio": 1.32}}, "levels": {"short_term": {"horizon": "days", "entry": {"low": 140.0, "high": 145.0, "width_pct": 3.57}, "take_profit": {"low": 165.0, "high": 172.0, "width_pct": 4.24}, "upside_pct": 13.79, "upside_from_spot_pct": 10.0, "tradable": true, "no_setup": false, "no_setup_reason": null, "range_pct": 18.0}, "long_term": {"horizon": "weeks", "entry": {"low": 120.0, "high": 132.0, "width_pct": 10.0}, "take_profit": {"low": 190.0, "high": 240.0, "width_pct": 26.32}, "upside_pct": 43.94, "upside_from_spot_pct": 26.67, "stretch": true}}, "position": {"range_position": 0.68, "range_position_label": "upper range", "pct_above_chart_low": 24.0, "pct_below_chart_high": 11.0}, "data_quality": "500 candles", "launch_spike_ath": false, "native": null}, "onchain": {"fdv_mcap": {"label": "FDV ~= MCap (1.0x) -- fully circulating", "risk": "low"}, "liquidity": {"label": "Liq 8.0% of MCap -- healthy", "risk": "healthy"}, "vol_mcap_label": null, "notes": []}, "holders": null, "social": null, "warnings": [], "disclaimer": "Analysis only. Not financial advice.", "payment": {"charged": "$0.01", "payer": "0xA0b8...6eB48"}}}}}}}}, "400": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "402": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "404": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "422": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "429": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "502": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}, "503": {"description": "- `depth_unavailable` \u2014 `depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.\n- `depth_undeliverable` \u2014 This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.\n- `feature_disabled` \u2014 The endpoint is switched off on this deployment.\n- `inactive_chain` \u2014 `chain` is known but switched off on this deployment.\n- `internal` \u2014 An upstream call failed. Transient; retry.\n- `invalid_depth` \u2014 `depth` was not one of the documented values.\n- `invalid_request` \u2014 Malformed body, or a missing/oversized `token`.\n- `no_chart_data` \u2014 The token resolved but the OHLCV source returned nothing. Transient; retry.\n- `payment_failed` \u2014 Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.\n- `payment_required` \u2014 No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.\n- `payment_unavailable` \u2014 The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry.\n- `rate_limited` \u2014 Per-IP rate limit exceeded.\n- `token_not_found` \u2014 No pool matched the query (on the requested chain, if one was given).\n- `unknown_chain` \u2014 `chain` is not a chain this API knows.", "content": {"application/json": {"schema": {"type": "object", "required": ["ok", "error", "data"], "properties": {"ok": {"type": "boolean"}, "error": {"type": ["string", "null"], "enum": [null, "depth_unavailable", "depth_undeliverable", "feature_disabled", "inactive_chain", "internal", "invalid_depth", "invalid_request", "no_chart_data", "payment_failed", "payment_required", "payment_unavailable", "rate_limited", "token_not_found", "unknown_chain"]}, "detail": {"type": ["string", "null"], "description": "Human-readable explanation. Present on every failure."}, "data": {"type": "null"}}}}}}}}}, "/openapi.json": {"get": {"operationId": "getOpenApiSpecRoot", "summary": "This document. The address x402 directories look at.", "security": [], "responses": {"200": {"description": "OpenAPI 3.1 document.", "content": {"application/json": {"schema": {"type": "object"}}}}}}}, "/v1/openapi.json": {"get": {"operationId": "getOpenApiSpec", "summary": "This document, at its versioned address.", "security": [], "responses": {"200": {"description": "OpenAPI 3.1 document.", "content": {"application/json": {"schema": {"type": "object"}}}}}}}, "/health": {"get": {"operationId": "getHealth", "summary": "Liveness probe.", "security": [], "responses": {"200": {"description": "Service is up.", "content": {"application/json": {"schema": {"type": "object"}}}}}}}}, "x-cache": {"analysis_seconds": 60, "candles_max_age_seconds": 90, "holders_seconds": 900, "social_seconds": 1800, "shared_with": ["telegram", "web-analyzer", "mcp"], "note": "Repeat calls for the same token inside `analysis_seconds` are served from one memoised scan, so the numbers are identical -- `generated_at` is when the DOCUMENT was built, not when the data was read. A cache hit is still charged: the price is for the answer, not for our upstream request. The cache is in-memory and per-process, so treat these as freshness bounds, not guarantees. Key your own cache on `engine_version`."}, "x-rate-limit": {"analyze_per_minute_per_ip": 6, "note": "Exceeding it returns 429 with error `rate_limited`. Depth beyond `basic` is additionally bounded by a server-side concurrency cap, so a burst of deep scans queues rather than failing."}, "x-error-codes": {"invalid_request": "Malformed body, or a missing/oversized `token`.", "invalid_depth": "`depth` was not one of the documented values.", "depth_unavailable": "`depth` is valid but not sellable on this deployment right now (the feature behind it is switched off). The `detail` names what is.", "unknown_chain": "`chain` is not a chain this API knows.", "inactive_chain": "`chain` is known but switched off on this deployment.", "payment_required": "No or invalid payment. The PAYMENT-REQUIRED header and the `accepts` body field carry what to pay; retry with PAYMENT-SIGNATURE.", "payment_failed": "Settlement failed after the analysis ran, so the result is withheld. No funds moved. Retry.", "depth_undeliverable": "This token could not be served at the depth paid for, so you were NOT charged. Retry at a depth that fits it; `basic` always works.", "token_not_found": "No pool matched the query (on the requested chain, if one was given).", "feature_disabled": "The endpoint is switched off on this deployment.", "no_chart_data": "The token resolved but the OHLCV source returned nothing. Transient; retry.", "rate_limited": "Per-IP rate limit exceeded.", "internal": "An upstream call failed. Transient; retry.", "payment_unavailable": "The payment layer is unreachable. The endpoint fails closed rather than serving unpaid. Transient; retry."}, "x-mcp": {"endpoint": "/mcp", "transport": "http", "protocol_versions": ["2024-11-05", "2025-03-26", "2025-06-18", "2025-11-25"], "tools": ["analyze_token", "get_pricing"], "payment": "x402, negotiated inside the tool call (_meta['x402/payment']); get_pricing is free."}, "x-402": {"enabled": true, "protocol": "x402", "version": 2, "facilitator": "https://api.cdp.coinbase.com/platform/v2/x402", "request_header": "PAYMENT-SIGNATURE", "challenge_header": "PAYMENT-REQUIRED", "receipt_header": "PAYMENT-RESPONSE", "pricing": {"currency": "USDC", "networks": ["eip155:8453", "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"], "depth": {"basic": "$0.01", "holders": "$0.05"}, "surcharges": {"include_chart_raw": "$0.01", "include_raw_metrics": "$0.005"}, "free_calls_per_day": 1, "free_trial_depth": "basic"}, "policy": "Verified before the analysis runs, settled only after it succeeds. An incomplete answer is never charged."}}