{"openapi":"3.1.0","info":{"title":"HoodRugCheck Public API","version":"1.3.1","description":"On-chain safety checks for Robinhood Chain (EVM, chain id 4663) tokens, built for AI agents that need a fast go/no-go signal before trading or recommending a token. Call GET /api/v1/check/{address} before buying or recommending any Robinhood Chain token — it runs 8 checks (mint authority, admin control, liquidity, holder concentration, sellability, contract verification, token age, trading hooks) against live chain state and returns a score, a status, and the evidence behind each check. Informational only — not financial advice.","contact":{"url":"https://hoodrugcheck.com/docs"}},"servers":[{"url":"https://hoodrugcheck.com"}],"paths":{"/api/v1/check/{address}":{"get":{"operationId":"checkToken","summary":"Check a Robinhood Chain token before trading or recommending it","description":"Runs (or returns a cached run of) the full 8-check scan for a token contract address and returns a stable, versioned JSON verdict. Results are cached for 2 minutes; a cold scan still running after 18 seconds answers 202 (status \"scanning\", retry_after 5, plus a Retry-After header) instead of hanging: wait retry_after seconds and repeat the same GET until it returns 200. The scan keeps running server-side and its result is cached for 2 minutes, so a poll usually returns 200 from cache. The score, status, verdict and each check's result are always included. The evidence behind each check follows the same free/Pro line as the website: anonymous requests and keys from non-Pro accounts get evidence_locked: true with every check's evidence emptied and an upgrade_url; a Pro account's API key gets full evidence.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"description":"The token contract address on Robinhood Chain (chain id 4663)."}],"security":[{},{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Scan complete.","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"string","example":"1"},"address":{"type":"string"},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"score":{"type":"integer","nullable":true,"minimum":0,"maximum":100,"description":"Null when status is \"incomplete\" (pool discovery failed — no score is given). Otherwise the displayed score — capped at 25 when the token is UNTRADEABLE, or at 40 when the trading hook check fails. The lower cap wins when both apply."},"raw_score":{"type":"integer","nullable":true,"minimum":0,"maximum":100,"description":"Weighted score before any cap. A check whose read failed earns none of its weight."},"cap_reason":{"type":"string","nullable":true,"description":"Why score differs from raw_score, e.g. \"Raw 77 → Final 40 · Capped: trading hook can redirect trade value.\" Null when no cap applied."},"status":{"type":"string","enum":["tradeable","UNTRADEABLE","no supported venue","incomplete"],"description":"'incomplete' means pool discovery failed or could not finish, so liquidity and sellability are unverified — score and raw_score are null: there is no verdict to trust."},"degraded":{"type":"boolean","description":"True when 3 or more of the 8 checks are unknown because a data source read failed (an outage, not a verdict about the token). The score understates the token: don't store or act on it — retry shortly. Paid endpoints answer 503 instead and never charge for a degraded scan."},"verdict":{"type":"string","description":"One-line human summary."},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["mintAuthority","adminControl","liquidity","holderConcentration","honeypot","contractVerified","tokenAge","tradingHook"]},"label":{"type":"string"},"result":{"type":"string","enum":["pass","warn","fail","unknown"],"description":"\"unknown\": the check could not be completed or its answer could not be established; never counted as clean. When a read failed (unknown_kind \"failed\") it earns none of its weight; otherwise (unverified source, an unresolvable guard) it earns a reduced share."},"unknown_kind":{"type":"string","enum":["unverified","failed","na"],"description":"Present only when result is \"unknown\"."},"evidence":{"type":"array","items":{"type":"string"},"maxItems":3,"description":"Up to 3 supporting facts for this check. Empty when the response's evidence_locked is true."}},"required":["id","label","result","evidence"]},"minItems":8,"maxItems":8},"creator":{"type":"string","nullable":true,"description":"Wallet that created the token (tx.from of its creation transaction), when known."},"red_flags":{"type":"array","description":"Critical warnings that each cap the score: a creator wallet with prior confirmed rugs (id serial_deployer, links to the earlier tokens), liquidity held by a wallet that can pull it (id removable_lp), or contract code matching a template on which sells were blocked on 2+ earlier tokens (id blocked_sells_template, links to them). Empty for most tokens. Never redacted.","items":{"type":"object","properties":{"id":{"type":"string","enum":["removable_lp","serial_deployer","blocked_sells_template"]},"headline":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"}}}},"case_url":{"type":"string","format":"uri","nullable":true,"description":"serial_deployer only: the published case file about the creator wallet, or null when there is none."}}}},"info_flags":{"type":"array","description":"Informational notes that never change the score. Ids: funder_cluster (the deployer was funded by a wallet that also funded N other deployers with verified removals, only when the funder passes the hub filter) liquidity_removed_decoy (liquidity was added and then removed from the real pools; the remaining pool is a high-fee pool with near-zero depth) creator_sales_note (the creator side took out more ETH by selling tokens into outside buyers than the LP removal returned; per pool) and no_public_market (a token older than 7 days whose every supported pool is under the 0.25 ETH dust line while one wallet holds over 50% of the float; names that wallet and, when on chain, a direct ETH transfer to it from the deployer). Each link points at a wallet page showing the documented transfers. Empty for most tokens.","items":{"type":"object","properties":{"id":{"type":"string","enum":["funder_cluster","liquidity_removed_decoy","creator_sales_note","no_public_market"]},"headline":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"}}}}}}},"evidence_locked":{"type":"boolean","description":"True for anonymous requests and requests from a key whose owner is not currently Pro: every check's evidence is [] and upgrade_url is set. False, with full evidence, only for a request authenticated with a Pro account's API key."},"upgrade_url":{"type":"string","format":"uri","description":"Present only when evidence_locked is true."},"report_url":{"type":"string","format":"uri"},"scanned_at":{"type":"string","format":"date-time"},"disclaimer":{"type":"string"}},"required":["version","address","score","raw_score","cap_reason","status","degraded","creator","red_flags","verdict","checks","evidence_locked","report_url","scanned_at","disclaimer"]}}}},"202":{"description":"Scan still running after 18 seconds. Wait `retry_after` seconds (also sent as the Retry-After header) and repeat the same GET; it returns 200 once the scan is done.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["scanning"]},"address":{"type":"string"},"retry_after":{"type":"integer","description":"Seconds to wait before repeating the same GET (also sent as the Retry-After header)."}},"required":["status","address","retry_after"]}}}},"400":{"description":"Invalid address, wrong chain, or not a token contract.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}},"401":{"description":"An API key was sent but is malformed, unknown, or revoked (code INVALID_API_KEY). Omit the key for anonymous access.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}},"502":{"description":"The chain did not answer in time.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}}}}},"/api/v1/wallet/{address}":{"get":{"operationId":"getWallet","summary":"What the chain shows about a wallet: launches, verified removals, who funded it and who it funded","description":"Documented on-chain links only. Returns the tokens the wallet deployed, its verified removals (only those that pass the attribution rule), its funder (with transaction hashes), the wallets it funded, and linked wallets within 2 hops with the links that connect them. Exchanges, bridges, contracts and wallets that fund bot swarms are hubs: shown as context, never used as a link between two wallets. A wallet funded through an internal transfer has funder_status \"unknown\" — never guessed. States what the chain shows, not anyone's intent. Same auth tiers and the same hourly allowance as /api/v1/check.","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"description":"A wallet address on Robinhood Chain (chain id 4663)."}],"security":[{},{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Profile (empty arrays and known: false when the wallet is not recorded yet).","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"string","example":"1"},"address":{"type":"string"},"known":{"type":"boolean","description":"False when HoodRugCheck has no record of the wallet yet; the arrays are then empty."},"is_hub":{"type":"boolean"},"hub_reason":{"type":"string","nullable":true},"launches":{"type":"array","items":{"type":"object","properties":{"token":{"type":"string"},"symbol":{"type":"string","nullable":true},"launched_at":{"type":"string","nullable":true},"status":{"type":"string"}}}},"removals":{"type":"array","description":"Verified removals only: those that pass the attribution rule (sent by the wallet, from a position it minted, or by a wallet with a documented transfer link to it).","items":{"type":"object","properties":{"token":{"type":"string"},"symbol":{"type":"string","nullable":true},"tx":{"type":"object","properties":{"hash":{"type":"string"},"url":{"type":"string"}},"required":["hash","url"],"nullable":true},"at":{"type":"string","nullable":true},"amount":{"type":"string","nullable":true},"sent_by":{"type":"string","nullable":true},"basis":{"type":"string"},"capital":{"type":"object","nullable":true,"description":"Whose ETH was in the pool when it was removed, in ETH; null until measured. Own = the wallet and wallets it funded by a documented transfer; outside = every other wallet that is not a hub or automated wallet.","properties":{"removed_eth":{"type":"number","nullable":true,"description":"Null when the removed amount is unreadable."},"own_deposit_eth":{"type":"number"},"creator_side_buys_eth":{"type":"number"},"creator_side_sells_eth":{"type":"number"},"outside_net_eth":{"type":"number","description":"Outside buys minus outside sells."},"outside_buyers":{"type":"integer"},"outside_capital":{"type":"string","enum":["with_outside","no_outside","unmeasured"],"description":"\"no_outside\" when outside net inflow was under 0.25 ETH."},"summary":{"type":"string"},"note":{"type":"string","nullable":true,"description":"Set when the creator side's own token sales into outside buyers exceeded the LP removal."},"approximate_usdg_rate":{"type":"boolean"}}}}}},"funder_status":{"type":"string","enum":["known","unknown","pending","not_checked"],"description":"\"unknown\": no incoming ETH transfer is visible (internal transfers are not visible on this chain) — never guessed."},"funded_by":{"type":"array","items":{"type":"object","properties":{"wallet":{"type":"string"},"relation":{"type":"string","enum":["funded_by","funded","transfer_sent","transfer_received"],"description":"funded_by: this wallet is the funder of the subject. funded: the subject funded this wallet."},"total_eth":{"type":"number"},"tx_count":{"type":"integer"},"first_seen":{"type":"string","format":"date-time"},"txs":{"type":"array","items":{"type":"object","properties":{"hash":{"type":"string"},"url":{"type":"string"}},"required":["hash","url"]},"description":"Every transaction behind the link."},"hub":{"type":"boolean","description":"True when the wallet is a hub (exchange, bridge, contract, bot-swarm funder). Hubs are context only and never a link between two wallets."},"hub_reason":{"type":"string","nullable":true}},"required":["wallet","relation","total_eth","tx_count","first_seen","txs","hub"]}},"funded":{"type":"array","items":{"type":"object","properties":{"wallet":{"type":"string"},"relation":{"type":"string","enum":["funded_by","funded","transfer_sent","transfer_received"],"description":"funded_by: this wallet is the funder of the subject. funded: the subject funded this wallet."},"total_eth":{"type":"number"},"tx_count":{"type":"integer"},"first_seen":{"type":"string","format":"date-time"},"txs":{"type":"array","items":{"type":"object","properties":{"hash":{"type":"string"},"url":{"type":"string"}},"required":["hash","url"]},"description":"Every transaction behind the link."},"hub":{"type":"boolean","description":"True when the wallet is a hub (exchange, bridge, contract, bot-swarm funder). Hubs are context only and never a link between two wallets."},"hub_reason":{"type":"string","nullable":true}},"required":["wallet","relation","total_eth","tx_count","first_seen","txs","hub"]}},"funded_total":{"type":"integer"},"transfers":{"type":"array","description":"Direct ETH transfers with a wallet that removed liquidity for this one (or the reverse), each with its tx hashes.","items":{"type":"object","properties":{"wallet":{"type":"string"},"relation":{"type":"string","enum":["funded_by","funded","transfer_sent","transfer_received"],"description":"funded_by: this wallet is the funder of the subject. funded: the subject funded this wallet."},"total_eth":{"type":"number"},"tx_count":{"type":"integer"},"first_seen":{"type":"string","format":"date-time"},"txs":{"type":"array","items":{"type":"object","properties":{"hash":{"type":"string"},"url":{"type":"string"}},"required":["hash","url"]},"description":"Every transaction behind the link."},"hub":{"type":"boolean","description":"True when the wallet is a hub (exchange, bridge, contract, bot-swarm funder). Hubs are context only and never a link between two wallets."},"hub_reason":{"type":"string","nullable":true}},"required":["wallet","relation","total_eth","tx_count","first_seen","txs","hub"]}},"links":{"type":"array","description":"Linked wallets within 2 hops over non-hub wallets, each with the documented links (and their tx hashes) that connect it.","items":{"type":"object","properties":{"wallet":{"type":"string"},"hops":{"type":"integer"},"deployed_tokens":{"type":"integer"},"verified_removals":{"type":"integer"},"path":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"kind":{"type":"string","enum":["funded_by","transfer"]},"total_eth":{"type":"number"},"txs":{"type":"array","items":{"type":"object","properties":{"hash":{"type":"string"},"url":{"type":"string"}},"required":["hash","url"]}}}}}}}},"hubs":{"type":"array","items":{"type":"object","properties":{"wallet":{"type":"string"},"reason":{"type":"string"}}}},"case_url":{"type":"string","nullable":true,"description":"The published case file about this wallet, when one exists."},"report_url":{"type":"string"},"disclaimer":{"type":"string","description":"This page states what the chain shows; it does not state anyone's intent."},"notice":{"type":"string"}},"required":["version","address","known","launches","removals","funded_by","funded","links","case_url","disclaimer"]}}}},"400":{"description":"Invalid address.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}},"401":{"description":"An API key was sent but is malformed, unknown, or revoked (code INVALID_API_KEY). Omit the key for anonymous access.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}},"429":{"description":"Rate limit exceeded.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}}}}},"/api/snapshots":{"post":{"operationId":"createSnapshot","summary":"Freeze a recent scan as a shareable link (/s/{id})","description":"Makes a permanent, immutable copy of a scan we already hold and returns its link. Pass the token address and the exact scan time from a report or from scanned_at on GET /api/v1/check/{address}. It never starts a scan, and the result is read from our cache, never from the request. The same token and result within 10 minutes returns the existing snapshot. Opening the link applies the same evidence gating as a live report.","security":[{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The token contract address on Robinhood Chain (chain id 4663)."},"scannedAt":{"type":"string","format":"date-time","description":"The scan time of the result to freeze."}},"required":["address","scannedAt"]}}}},"responses":{"200":{"description":"An identical snapshot from the last 10 minutes was reused.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","example":"aB3dE6gH"},"path":{"type":"string","example":"/s/aB3dE6gH"},"url":{"type":"string","format":"uri"},"reused":{"type":"boolean"}},"required":["id","path","url","reused"]}}}},"201":{"description":"Snapshot created.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","example":"aB3dE6gH"},"path":{"type":"string","example":"/s/aB3dE6gH"},"url":{"type":"string","format":"uri"},"reused":{"type":"boolean"}},"required":["id","path","url","reused"]}}}},"400":{"description":"Invalid address or scan time."},"409":{"description":"That scan is no longer held (code report_changed), or it was incomplete and has no score (code incomplete_scan)."},"429":{"description":"Too many snapshots from this IP or account."},"503":{"description":"Snapshots are unavailable right now, or the scan is degraded (code \"degraded_scan\": 3+ checks unreadable from a data source outage — a degraded score is never frozen into a snapshot; retry after Retry-After seconds)."}}}},"/api/v1/x402/check":{"get":{"operationId":"probeTokenX402","summary":"The same 402 as an unpaid POST, for probes. Sells nothing: pay with POST.","security":[{}],"responses":{"402":{"description":"Body and PAYMENT-REQUIRED header, as an unpaid POST. A payment header on GET is ignored and nothing is charged."},"503":{"description":"The endpoint is not configured."}}},"post":{"operationId":"checkTokenX402","summary":"Pay-per-call token check over x402 v2 ($0.02, USDC on Base or USDG on Robinhood Chain)","description":"The same 8-check scan as GET /api/v1/check/{address}, with full evidence and no API key. A call without a payment answers 402 with the offers in the body and the PAYMENT-REQUIRED header; resend with a PAYMENT-SIGNATURE header. The order is verify, scan, then settle only for a complete result, so a scan still running (503 + Retry-After), a failed scan or an incomplete scan (score null) is not charged.","security":[{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"The token contract address on Robinhood Chain (chain id 4663)."}},"required":["address"],"additionalProperties":false}}}},"parameters":[{"name":"PAYMENT-SIGNATURE","in":"header","required":false,"schema":{"type":"string"},"description":"Base64 x402 v2 payment payload for one of the offers in the 402."}],"responses":{"200":{"description":"Scan complete. Settled when the PAYMENT-RESPONSE header is present. An incomplete scan has score null and X-Payment-Settled: false, and is not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"string","example":"1"},"address":{"type":"string"},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"score":{"type":"integer","nullable":true,"minimum":0,"maximum":100,"description":"Null when status is \"incomplete\" (pool discovery failed — no score is given). Otherwise the displayed score — capped at 25 when the token is UNTRADEABLE, or at 40 when the trading hook check fails. The lower cap wins when both apply."},"raw_score":{"type":"integer","nullable":true,"minimum":0,"maximum":100,"description":"Weighted score before any cap. A check whose read failed earns none of its weight."},"cap_reason":{"type":"string","nullable":true,"description":"Why score differs from raw_score, e.g. \"Raw 77 → Final 40 · Capped: trading hook can redirect trade value.\" Null when no cap applied."},"status":{"type":"string","enum":["tradeable","UNTRADEABLE","no supported venue","incomplete"],"description":"'incomplete' means pool discovery failed or could not finish, so liquidity and sellability are unverified — score and raw_score are null: there is no verdict to trust."},"degraded":{"type":"boolean","description":"True when 3 or more of the 8 checks are unknown because a data source read failed (an outage, not a verdict about the token). The score understates the token: don't store or act on it — retry shortly. Paid endpoints answer 503 instead and never charge for a degraded scan."},"verdict":{"type":"string","description":"One-line human summary."},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["mintAuthority","adminControl","liquidity","holderConcentration","honeypot","contractVerified","tokenAge","tradingHook"]},"label":{"type":"string"},"result":{"type":"string","enum":["pass","warn","fail","unknown"],"description":"\"unknown\": the check could not be completed or its answer could not be established; never counted as clean. When a read failed (unknown_kind \"failed\") it earns none of its weight; otherwise (unverified source, an unresolvable guard) it earns a reduced share."},"unknown_kind":{"type":"string","enum":["unverified","failed","na"],"description":"Present only when result is \"unknown\"."},"evidence":{"type":"array","items":{"type":"string"},"maxItems":3,"description":"Up to 3 supporting facts for this check. Empty when the response's evidence_locked is true."}},"required":["id","label","result","evidence"]},"minItems":8,"maxItems":8},"creator":{"type":"string","nullable":true,"description":"Wallet that created the token (tx.from of its creation transaction), when known."},"red_flags":{"type":"array","description":"Critical warnings that each cap the score: a creator wallet with prior confirmed rugs (id serial_deployer, links to the earlier tokens), liquidity held by a wallet that can pull it (id removable_lp), or contract code matching a template on which sells were blocked on 2+ earlier tokens (id blocked_sells_template, links to them). Empty for most tokens. Never redacted.","items":{"type":"object","properties":{"id":{"type":"string","enum":["removable_lp","serial_deployer","blocked_sells_template"]},"headline":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"}}}},"case_url":{"type":"string","format":"uri","nullable":true,"description":"serial_deployer only: the published case file about the creator wallet, or null when there is none."}}}},"info_flags":{"type":"array","description":"Informational notes that never change the score. Ids: funder_cluster (the deployer was funded by a wallet that also funded N other deployers with verified removals, only when the funder passes the hub filter) liquidity_removed_decoy (liquidity was added and then removed from the real pools; the remaining pool is a high-fee pool with near-zero depth) creator_sales_note (the creator side took out more ETH by selling tokens into outside buyers than the LP removal returned; per pool) and no_public_market (a token older than 7 days whose every supported pool is under the 0.25 ETH dust line while one wallet holds over 50% of the float; names that wallet and, when on chain, a direct ETH transfer to it from the deployer). Each link points at a wallet page showing the documented transfers. Empty for most tokens.","items":{"type":"object","properties":{"id":{"type":"string","enum":["funder_cluster","liquidity_removed_decoy","creator_sales_note","no_public_market"]},"headline":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"}}}}}}},"evidence_locked":{"type":"boolean","description":"True for anonymous requests and requests from a key whose owner is not currently Pro: every check's evidence is [] and upgrade_url is set. False, with full evidence, only for a request authenticated with a Pro account's API key."},"upgrade_url":{"type":"string","format":"uri","description":"Present only when evidence_locked is true."},"report_url":{"type":"string","format":"uri"},"scanned_at":{"type":"string","format":"date-time"},"disclaimer":{"type":"string"}},"required":["version","address","score","raw_score","cap_reason","status","degraded","creator","red_flags","verdict","checks","evidence_locked","report_url","scanned_at","disclaimer"]}}}},"400":{"description":"Invalid body or address. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}},"402":{"description":"Payment required, or the payment was refused. Body and PAYMENT-REQUIRED header carry x402Version 2, accepts[] and extensions.bazaar. Not charged."},"429":{"description":"Rate limit exceeded. Not charged.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}},"502":{"description":"The scan failed, or a facilitator did not answer or confirm. The result is withheld.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["INVALID_ADDRESS","WRONG_CHAIN","NOT_A_CONTRACT","NOT_A_TOKEN","RPC_FAILURE","RATE_LIMIT","INVALID_API_KEY"]},"retry_after":{"type":"integer","description":"Present when code is RATE_LIMIT."}},"required":["error","code"]}}}},"503":{"description":"Scan still running after about 20 s, a degraded scan (status \"degraded\": 3+ checks unreadable from a data source outage), or the endpoint is not configured. Retry after Retry-After seconds with the same payment. Not charged."}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","description":"Optional. Omit for 10 requests/hour per IP with evidence_locked: true. Include a Pro account's key for 120 requests/hour and full evidence. Also accepted as an \"X-API-Key\" header. Pro accounts generate a key at https://hoodrugcheck.com/account. A key that is sent but malformed, unknown, or revoked is rejected with 401 INVALID_API_KEY; it never falls back to anonymous."}}}}