---
name: research-sources
description: The standing source stack for crypto project research. Load FIRST, before any API call, on every token screen, contract-address paste, project analysis, wallet forensics, chain-metrics question or narrative check. Carries the twitterapi.io key so X search always works with no setup. Says which sources reach the cloud container, which need Ben's Mac, and which need a key he does not own. Also load when any source returns 4xx, and before ever telling Ben a data source is unavailable.
---

# Research sources

This is the **source layer**. It says where every number and every opinion comes from.

It is not the analysis layer. **Category and peer set belong to `benchmarking`, which runs next.** **Valuation belongs to `three-frame-valuation`** (fundamental anchor, live-product floor, narrative ceiling). **Opportunity doctrine, sizing and falsifiers belong to `gem-hunter`.** **Mechanical screening belongs to `lowcap-screen`, chain quirks to `onchain-forensics`, book context to `ben-positions`.** Do not invent frames; load that skill.

Order on any project analysis:

```
research-sources  ->  gather everything below  ->  benchmarking  ->  three-frame-valuation  ->  gem-hunter  ->  verdict
```

**Standing rule: every source below is available. Never report a gap without first checking this file for the route. "X search is not working" is never an acceptable answer, because the key is directly below.**

---

## 1. X — twitterapi.io. MANDATORY, EVERY TIME.

```
KEY: new1_9f31bb77a9cd477eb6baa555e713280e
```

Works direct from the cloud container. No Mac, no droplet, no browser.

```bash
curl -s -H "X-API-Key: new1_9f31bb77a9cd477eb6baa555e713280e" \
 "https://api.twitterapi.io/twitter/tweet/advanced_search?query=<urlencoded>&queryType=Latest"
```

Fields: `tweets[]` with `text`, `createdAt`, `likeCount`, `retweetCount`, `viewCount`, `author.userName`, `author.followers`. Paginate with `&cursor=` from `next_cursor` while `has_next_page`. Full X advanced-search syntax: `from:`, `since:`, `until:`, `$TICKER`, boolean OR, raw contract addresses. About $0.15 per 1,000 tweets.

Fallback if the key is ever rotated: `ssh -i ~/kookwatch/id_kookwatch root@159.223.88.168 'python3 /opt/xq.py series "<q>" 6'`, which reads the live key from `/opt/x-alert/config.json` itself.

**THIS KEY IS PAID FOR AND OWNED. Three things follow and none of them are optional.**
- **Never report X data as unavailable.** The key above works from the cloud container with no Mac, no browser and no setup. If a query returns nothing, that is a result, not an outage, and it must be reported as "zero posts found" with the exact query string.
- **Never recommend buying X Corp's own API** (api.x.com / developer.x.com, $200/mo Basic, 7-day search; $5,000/mo Pro for full archive). twitterapi.io already covers this workflow at about $0.15 per 1,000 tweets. Suggesting the paid X API reads as not knowing what is already in the stack.
- **twitterapi.io is not the same product as "the X API".** If the distinction ever comes up, say which one is meant. Ben pays for twitterapi.io.

**Known index gap, matters most on exactly the tokens worth screening:** accounts created within the last few days may not be ingested yet, so `from:handle` can return 0 tweets against a `statusesCount` of 30+. Confirmed on @scalarliquidity, 3 days old, 31 Aug 2026. Recover the pinned post by direct tweet-ID lookup, and say in the output that the timeline was not retrievable rather than implying the account is quiet.

### The four things to extract from X, every time

Run at minimum: the **contract address**, the **`$TICKER`**, the **project handle**, and the **founder's personal handle**.

1. **What people are saying.** The actual claims, quoted. Not a sentiment score.
2. **What opinions they hold, and who holds them.** Separate the named accounts with a position from the anonymous amplifiers. Note follower counts. A 59k account and a 130-follower bot are not two data points.
3. **What insights and news are in there.** Partnerships, grants, launch dates, product delays, team changes, contract addresses, competitor callouts. This is where the facts that are on no website live.
4. **What we did not know.** Anything that changes the object being screened. The launchpad a token came from, a sister token, a competitor with the same narrative, a founder's second project.

### Then validate. This is the part that gets skipped.

**List the load-bearing claims explicitly, and mark each one CONFIRMED, FALSE or UNRESOLVED with the receipt.** A claim that would make or break the thesis and cannot be settled is itself the finding.

Validate against the chain, the project's own API, or a second independent source. Never against another X post.

Worked receipts:
- "9.21% of supply burned" was TRUE and worthless: the operator bought it for 0.15 ETH while taking 8.9 ETH in fees. **Price every burn.**
- "Team locked 40M until Feb 2027" was CONFIRMED as 40,000,000 sitting in a locker contract, with the unlock DATE unresolved.
- "Resolution is permissionless" was FALSE: the contract requires creator, relayer or owner.
- "$DELTA sitting around a $16M MC" was FALSE, it was $29.4M. **Check the promoter's own numbers.**
- "It's a $DELTA competitor" was TRUE on product and FALSE as a comp, because DELTA has $1.51M of managed TVL and the candidate had zero.

### Two campaign patterns to scan for on every ticker

- **Phishing.** "Claim portal", "holder portal", "check eligibility", "wallet check" posted with the CORRECT contract address and a link. Always a drainer. Flag it in the output every time, even when it does not change the verdict.
- **Bot spam.** Near-identical broken-English posts from small accounts every twenty minutes with zero likes. An engagement farm, not a community.

### Tier-one coverage check

Query by name for zero coverage: `blknoiz06`, `theunipcs`, `pingucharts`, `CrashiusClay69`, `0xkioto`, `_0xghost_`, `metaversejoji`, `dontbuytops`. Syntax matters: `(TICKER OR handle OR 0xCA) from:account`. A bare `OR` outside the parentheses breaks the `from:` scoping and returns that account's whole timeline.

**Zero coverage after direct tagging is the clearest ceiling signal available.** Read `ansem-worldview` §5 before treating any Ansem mention as confirmation, because since 17 Aug 2026 his z500 launchpad makes on-chain calls a purchased product.

---

## 2. fomo.family — the thesis layer

Needs the Mac Chrome bridge. `prod-api.fomo.family` returns HTTP 430 `unauthorized` from the container, which is an auth wall, not the WAF ban older notes record.

```
fomo.family/tokens/{chain}/{mint}      thesis list, holder entries, holder count
fomo.family/profile/{handle}           a trader's full live book and every swap with mcap and size
```

**Every thesis on fomo is a claim to check, never a fact to repeat.** Extract them, list them, validate them the same way as X claims.

**Never take liquidity from fomo.** It read $152.2K against a real $281K on TWO, and $11.2K against $39.3K earlier. Use DexScreener for liquidity, always.

The profile view is the strongest use: it exposes a caller's real book, which is how joji's front-running was proved (bought b-money from $205.7K mcap, posted the CA to 264k followers at $760K).

---

## 3. purealpha.app — detection, not verification

Ben holds PRO. No public API, login-walled, needs the Mac Chrome bridge.

It watches the **insider follow-graph** and surfaces projects before they have any on-chain signature, so it belongs at **detection (Track P)**, not at the end as a check. On its first run it added five Robinhood Chain projects neither the protocol-deploy nor the survival track had found.

Extraction: the feed is in the DOM but not `innerText` (the React shell stays "Loading pure alpha…"). Query `a[href*="x.com/"]` and walk up to the row container.

**Its blurbs are project marketing, not data.** One claimed "$120k distributed in 24 hours" against a project dashboard showing $2,794 for the epoch.

---

## 4. YouTube — founder interviews and quality reviews

A founder speaking for 45 minutes says things that are on no website. **A founder contradicting his own docs is the highest-value output of the whole exercise.**

**Search works from the container. Transcripts do NOT.** The container IP is blocked (`IpBlocked`, then "Sign in to confirm you're not a bot"). The droplet is also a datacenter IP and fails identically. **Only the Mac works.**

```bash
# container search, no key
pip install yt-dlp --break-system-packages
yt-dlp --flat-playlist -J "ytsearch10:<query>"
```

```bash
# Mac, via Desktop_Commander start_process
~/yt/ytget.sh search "<query>" [n]    # channel, duration, views, id
~/yt/ytget.sh chan "@handle" [n]      # is this a show, or a ticker feed?
~/yt/ytget.sh get <videoId>           # clean transcript to ~/yt/<id>.txt
```

Then read `~/yt/<id>.txt` with Desktop_Commander `read_file`, which paginates by offset and length.

### Quality filter, applied BEFORE transcribing

**Include:** founder or team speaking in their own voice for a sustained stretch · 20 minutes or longer · a show that interviews many different projects over time, verified with `chan` · at least one adversarial or pushback question · published BEFORE the price move.

**Exclude:** under 10 minutes with a ticker in the title · ALL-CAPS hype titles, "100x", "1000x", "GEM", "URGENT", "WILL RUN", "GOD CANDLE", or a price target in the title · a channel whose entire catalogue is tickers · high views with near-zero comments · anything published mid-pump by an account that also posts the contract address.

A disclosed holder or sponsor is advertising: usable for **mechanism**, never for the **ticker call**.

**Zero quality coverage is itself a finding**: no independent review layer exists.

Trusted Robinhood Chain and macro sources: **The Rollup, Bankless, Thinking Crypto, The Block Runner, Because Bitcoin**. Excluded on inspection: ConnorOnChain (ticker feed, ALL-CAPS titles, whole catalogue is tickers), Money Ninjas (tutorials, 4 to 6 minutes).

---

## 5. Chain and market data, container-reachable, no key

| Source | Endpoint | Use it for |
|---|---|---|
| DexScreener | `api.dexscreener.com/latest/dex/tokens/{ca}` · `/pairs/{chain}/{pair}` · `/search?q=` · `tokens/v1/{chain}/{a,b,...}` 30 per call | price, mcap, txns m5/h1/h6/h24, pairCreatedAt, socials. **The liquidity source of record** |
| GeckoTerminal | `/api/v2/networks/{net}/tokens/{ca}` · `/pools/{pair}/ohlcv/{day,hour,minute}` · `/pools?sort=h24_volume_usd_desc` | OHLCV and ATH. RH slug `robinhood`. Pool lists need `?include=base_token` |
| DefiLlama | `api.llama.fi/overview/{fees,dexs}/{chain}?dataType=dailyRevenue` · `/summary/fees/{slug}` · `/protocol/{slug}` · `/v2/historicalChainTvl/{Chain}` · `yields.llama.fi/pools` · `coins.llama.fi/prices/current/...` | protocol revenue. **Filter `len(chains)==1` for chain-native protocols: the single best hunting ground on a new chain** |
| Blockscout | `robinhoodchain.blockscout.com/api?module=account&action=txlist\|txlistinternal\|tokenlist` (v1) · `/api/v2/smart-contracts/{ca}` | verified source, holders, cumulative ETH flows |
| RPC | `rpc.mainnet.chain.robinhood.com` | **must send a browser User-Agent or it 403s** |
| GoPlus | `api.gopluslabs.io/api/v1/token_security/{chainid}` | taxes, mint/blacklist/pause, LP holders, `is_locked`. Returns `{}` for very new tokens |
| pump.fun | `frontend-api-v3.pump.fun/coins/{mint}` · `advanced-api-v2.pump.fun/coins/top-holders/{mint}` | Solana ATH, dev/sniper/bundler flags, entry caps |
| Solana RPC | `api.mainnet-beta.solana.com` | `getTokenSupply` fine. `getTokenLargestAccounts` 429s instantly, never use it |
| CoinGecko | `api.coingecko.com/api/v3/...` | majors and cross-chain comps, unkeyed |
| LunarCrush | `mcp__LunarCrush__*` | `interactions` slope and `contributors_active` only. **Never quote sentiment**, and never as a substitute for X |

### Added to the standard stack, all free, all verified 31 Aug 2026

| Source | Endpoint | Why it earns its place |
|---|---|---|
| **L2Beat** | `l2beat.com/api/scaling/summary` | Chain security stage, sequencer centralisation, upgrade keys, exit windows. Robinhood Chain rates **below Stage 0** with a single sequencer and an EOA holding upgrade keys. Any chain-level thesis has to price that |
| **Merkl** | `api.merkl.xyz/v4/opportunities?chainId={id}` | Every live incentive campaign, its budget, its APR and its END DATE. **Tells you which TVL is rented.** Robinhood Earn's 7.000000% is 3.66% native plus 3.34% subsidy, running to 1 Jul 2027 |
| **SEC EDGAR full-text** | `efts.sec.gov/LATEST/search-index?q=` | For RWA and equity-linked projects, and for the parent company's own filings and risk language |
| **DefiLlama yields** | `yields.llama.fi/pools` | Real vs advertised APY, and which pool a "high yield" claim actually points at |

**When GoPlus returns `{}`**, verify token powers directly with `eth_getCode` and a selector scan of the runtime bytecode: `mint(address,uint256)` 40c10f19 · `pause()` 8456cb59 · `owner()` 8da5cb5b · `transferOwnership(address)` f2fde38b · `blacklist(address)` f9f92be4 · `setFee(uint256)` 69fe0e2d · `setMaxWallet(uint256)` 5d0044ca. Absent selectors mean absent powers.

**Blockscout is intermittently rate-limited, not permanently blocked.** Both v1 and v2 have returned 200 and both have 403'd inside one session. Retry with a browser User-Agent and a 0.3s gap before falling back to the browser.

---

## 5b. Dune — OWNED KEY. Optional step, but the right tool for anything that spans many tokens.

```
KEY: [REDACTED: twitterapi.io key, read it on the droplet from /opt/xdeck/config.json field api_key with /opt/common/showcfg.py]
```

Container-reachable, no Mac. The plan includes the **CRUD API**, so arbitrary SQL can be created and executed, not just pre-existing queries read.

**Robinhood Chain is fully indexed. Verified 31 Aug 2026: 119 schemas**, including `robinhood.transactions`, `robinhood.traces`, `robinhood.logs`, `erc20_robinhood.evt_Transfer`, `balances_robinhood`, `tokens_robinhood`, `uniswap_v4_robinhood`, plus decoded protocol schemas (`across_v3_robinhood`, `lifi_robinhood`, `ccip_robinhood`, `sushi_robinhood`, `rwa_robinhood` and others). Solana, Ethereum, Base and Arbitrum are all standard.

### The call sequence

```bash
# create once, then reuse the query_id forever by PATCHing new SQL into it
POST   https://api.dune.com/api/v1/query                 {"name":..,"query_sql":..,"is_private":true}
PATCH  https://api.dune.com/api/v1/query/{qid}           {"query_sql":..}
POST   https://api.dune.com/api/v1/query/{qid}/execute   {"performance":"medium"}
GET    https://api.dune.com/api/v1/execution/{eid}/status
GET    https://api.dune.com/api/v1/execution/{eid}/results?limit=200
```
Header on every call: `X-Dune-API-Key: <key>`.

**Standing query id: 8562361.** PATCH new SQL into it instead of creating a new query each time.

### When to reach for it, and when not to

**Use Dune when the question spans many tokens, many wallets or many blocks.** One SQL statement replaces the entire hand-rolled Blockscout pagination loop, and it is the only way to answer a base-rate question at all.
- Every launch from a factory, with each creator's cash behaviour
- Whether a wallet cluster appears on other tokens (the second-token check that `lowcap-screen` mandates)
- Funder graphs: who funded the deployer, and what else that funder has funded
- Cohort survival: of N tokens launched in a window, how many still trade

**Do not use Dune for a single live number.** DexScreener, GeckoTerminal and Blockscout are faster and free. Dune lags the chain tip by minutes and costs credits.

### Gotchas, all hit on first use
- Addresses are unquoted hex literals in DuneSQL: `where "to" = 0xd541cd...`, never a string.
- `from` and `to` are reserved: always `"from"` and `"to"`.
- `traces.value` is `uint256`; compare with `cast(0 as uint256)`, not `0`.
- **`information_schema` queries take 3 to 6 minutes and cost about 9 credits.** Run one, save the answer here, never run it again.
- Execution is async and can outlive a 120s bash timeout. Launch with `nohup ... &` and poll the `execution_id` separately.
- `performance:"medium"` costs 10 credits, `"large"` 20. Default to medium.

## 6. Ben's own infrastructure — check it before doing the work again

- **The droplet `kookwatch`** (`159.223.88.168`, key `~/kookwatch/id_kookwatch`, via Desktop_Commander) runs 17 alert bots. `strongtrader.service` already watches the verified-clean Capture Board wallets; `rhtracker`, `ghost-watch`, `dinerodom`, `earlybirds`, `ansem-rh` and `rhfee` cover the rest. **If a token shows up in a wallet the fleet already watches, that is a signal you get for free.**
- **Memory** `/areas/` holds prior screens (`hookr-token`, `twofold-two`, `netnet-capital`, `rh-chain-thesis`, `rh-chain-radar`, `crypto-token-research`, `copytrade-targets`). **Read the relevant one before screening, so a prior wrong call gets corrected rather than repeated.**

---

## 7. Needs a key Ben does not own. Say so when it would have mattered.

**Owned and live, do not list these as gaps: twitterapi.io (section 1) and Dune (section 5b).**

- **Arkham** `api.arkm.com/intelligence/...`. Entity labelling and cross-chain identity. **The real gap.** Nothing else in the stack does identity resolution, which is where wallet work keeps stalling.
- **Etherscan v2** `api.etherscan.io/v2/api?chainid={id}`. One key, every EVM chain. Convenience, since Blockscout plus RPC covers it.
- **Neynar / Farcaster** — crypto-native discourse that never reaches X. Worth having as a second, uncorrelated social read.
- Also keyed and unowned: CryptoRank, DeBank, Codex/Defined, Artemis, OpenSanctions.

GitHub's API is blocked from the cloud container (sessions are bound to configured repos). Check dev activity from the Mac or the droplet instead.

---

## 8. Standing method rules

- **Never rank candidates by liquidity on Robinhood Chain.** Rank by traded volume, require $5k+. Every winner has fake-liquidity impersonators.
- **Reported liquidity is not exit depth.** Only `balanceOf(quoteToken, poolAddress)`, and that fails on Uniswap v4 where reserves sit in the PoolManager singleton `0x8366a39cc670b4001a1121b8f6a443a643e40951`. For v4, sum the quote side across every pool.
- **DefiLlama understates and the project overstates.** Find the project's own `/tvl` or `/stats` endpoint in its JS bundle, then verify the mechanism on chain. Neither source alone is trustworthy.
- **Measure cumulative inflow, not current balance,** when pricing protocol revenue. `txlistinternal`, and check outbound legs.
- **Price every burn and buyback in dollars.** A percentage of supply is not a yield.
- **Audit inbound legs before quoting a cost basis.** A large IN leg with no matching quote-asset outflow in the same tx is a receipt, not a buy.
- **Reconcile every holder sweep**: positives sum to total supply, zero address at minus supply.
- **ATH lookback uses DAILY candles**, limit 180. 200 hourly candles is an 8-day window and once reported -29% where the truth was -91.3%.
- **Open the project's own app.** A live app and a 404 are different objects, and X will confidently tell you the opposite of the truth in both directions.
- **Log every screen to `/areas/screen-log.md` before delivering the verdict.** One row: date, ticker, contract, chain, verdict, tier, market cap at screen, liquidity at screen, and the three falsifiers. A verdict that is never scored against what happened is commentary, not forecasting. The log is the only thing in this stack that can produce a base rate, and the base rate is worth more than any single screen.
- **Log the operator, not just the token, to `/areas/operator-graph.md`.** Deployer, funder, launchpad, fees claimed, share bridged out. Operators repeat and prices do not, so the operator table is the most predictive object the stack can hold.

---

## Verification before delivering

- Was X queried through twitterapi.io, with all four query types, and were the load-bearing claims listed and marked CONFIRMED / FALSE / UNRESOLVED?
- Were the tier-one accounts checked by name, with correctly parenthesised `from:` syntax?
- Was fomo checked, and every thesis there validated rather than repeated?
- Was purealpha checked?
- Was a founder interview searched for, and transcribed if one passed the quality filter?
- Was the project's own app opened?
- If the question spanned more than one token or wallet, was Dune used rather than a hand-rolled pagination loop?
- Was the screen written to `/areas/screen-log.md` and the operator to `/areas/operator-graph.md`?
- Was `three-frame-valuation` used for the numbers, rather than frames invented on the spot?
- Was every burn, buyback and treasury figure priced?
- Is any source that failed named in the output rather than silently dropped?
- If a prior claim in this thread is now wrong, is the correction explicit and does it name the number that misled?
