{"openapi":"3.1.0","info":{"title":"RUG DETECTOR API v1","version":"1.0.0","description":"Keyed access to the detector for bots, mirrors and screeners outside the site. The door is the Engineer: 50 machines on shift in the key's wallet (hopiummachines.xyz/staking.html). One key per request in the x-api-key header; 300 requests a minute per wallet, 30 of them may start a fresh token analysis. Standing is re-read every five minutes."},"servers":[{"url":"https://detector.hopiummachines.xyz"}],"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}}},"paths":{"/api/v1/token/{address}":{"get":{"summary":"The verdict on a token","description":"The detector's score (risk 0–100, band, every check with its detail), the ecosystem flag, and the holder census (holders, top-10 %, deployer %, supply float). A fresh cached verdict is free; a stale or missing one runs a fresh analysis inside the wallet's scan budget — past it you get the last verdict with `stale: true`, or 429 if there is none.","security":[{"ApiKey":[]}],"parameters":[{"name":"address","in":"path","required":true,"description":"0x-prefixed 40-hex address (any case)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"no key, or the key is unknown"},"403":{"description":"the wallet has fewer machines on shift than the Engineer door requires — body says `required` and `onShift`"},"429":{"description":"the wallet's per-minute budget is spent — body says `limit`"}}}},"/api/v1/screen":{"get":{"summary":"The screener","description":"The same rows and filters as the site's screener: age, market cap, liquidity, holders, top-10 and deployer shares, bands, sources, sort, paging. Payload: `rows`, `runners`, `busted`, `total`, `scanned`, `now`.","security":[{"ApiKey":[]}],"parameters":[{"name":"ageMaxMin","in":"query","required":false,"description":"max age in minutes","schema":{"type":"string"}},{"name":"mcMin","in":"query","required":false,"description":"min market cap, USD","schema":{"type":"string"}},{"name":"mcAthMin","in":"query","required":false,"description":"min all-time-high market cap, USD","schema":{"type":"string"}},{"name":"liqMinEth","in":"query","required":false,"description":"min liquidity, ETH","schema":{"type":"string"}},{"name":"holdersMin","in":"query","required":false,"description":"min holders","schema":{"type":"string"}},{"name":"top10Max","in":"query","required":false,"description":"max top-10 holders share, %","schema":{"type":"string"}},{"name":"devMax","in":"query","required":false,"description":"max deployer share, %","schema":{"type":"string"}},{"name":"bands","in":"query","required":false,"description":"comma list: fresh,low,medium,high,critical","schema":{"type":"string"}},{"name":"sources","in":"query","required":false,"description":"comma list: v2,v3,v4,pons","schema":{"type":"string"}},{"name":"hideBusted","in":"query","required":false,"description":"1 to drop rugged/dumped rows","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"age | mc | holders | run","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1–100","schema":{"type":"string"}},{"name":"offset","in":"query","required":false,"description":"0–500","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"no key, or the key is unknown"},"403":{"description":"the wallet has fewer machines on shift than the Engineer door requires — body says `required` and `onShift`"},"429":{"description":"the wallet's per-minute budget is spent — body says `limit`"}}}},"/api/v1/wallet/{address}":{"get":{"summary":"A wallet dossier","description":"Positions and swap history from the detector's own ledger, realized PnL, win rate, and the labels the tracker gave the wallet (smart, sniper, bundler, deployer, farm funder).","security":[{"ApiKey":[]}],"parameters":[{"name":"address","in":"path","required":true,"description":"0x-prefixed 40-hex address (any case)","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"no key, or the key is unknown"},"403":{"description":"the wallet has fewer machines on shift than the Engineer door requires — body says `required` and `onShift`"},"429":{"description":"the wallet's per-minute budget is spent — body says `limit`"}}}},"/api/v1/signals":{"get":{"summary":"The signals stream","description":"Every card the detector posts, as it posts it: the row carries the token, the kind, the time and the card itself (`payload.embed`, Discord embed shape) plus a dossier url. Poll with the `next` id you got back; without `after` you get the newest 50.","security":[{"ApiKey":[]}],"parameters":[{"name":"after","in":"query","required":false,"description":"the last id you have seen (from `next`); rows with a greater id follow, ascending","schema":{"type":"string"}},{"name":"kinds","in":"query","required":false,"description":"comma list of tracker, first_swap, surge, new_token, liquidity_pulled, score_drop, deployer_dump","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1–100, default 100 with `after`, 50 without","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"no key, or the key is unknown"},"403":{"description":"the wallet has fewer machines on shift than the Engineer door requires — body says `required` and `onShift`"},"429":{"description":"the wallet's per-minute budget is spent — body says `limit`"}}}}}}