Search the recorded market
A search engine for crypto and TradFi microstructure. Describe a condition, or point at a moment, and get every verified occurrence in the record with its denominator, forward outcome distribution, deterministic receipt, and a one-click replay of the exact market.
Occurrences describe only the recorded markets, dates and eligible buckets reported by the scan. They are observed examples, not a guarantee. Nothing here is trading advice.
9 occurrences across 20,161 eligible symbol-buckets scanned
v2 · nrm.v1 · ft.v1 · rev 9add59ad · q#cb3c91250 BUCKETS EXCLUDED - WARMUP-ABSENT FEATURES SHRINK THE DENOMINATOR, NEVER COERCED TO 0
FOR HUMANS AND THEIR AGENTS
The same deterministic engine over a REST API and MCP. Your agent grounds itself on the closed feature registry, can run occurrence scans, prevalence reads and cohort comparisons, and gets counts, coverage and a reproducibility key it can return with every answer.
> Search from your own AI agentnpx -y @edgedepth/research-mcp Run it yourself, call it from code, or give it to an agent
Ask in plain words, inspect the exact chips before anything runs, explore snapshots and commonality, compare a matched cohort with the eligible baseline, arm live alerts, and open any occurrence in replay.
> Open ResearchSend the same versioned documents over HTTPS. Registry, scans, cohorts, snapshots and published reports return the engine's canonical result contract, including denominators and reproducibility metadata.
> Read the API docsConnect an agent to the read-only MCP server at https://mcp.edgedepth.com/mcp, or run @edgedepth/research-mcp locally. The agent reads the registry first, then uses the same scans, cohorts, snapshots and receipts.
Why deterministic matters
Most market research can't be checked. A number gets posted, the data moves on, and recomputing it is impossible even for its author. EdgeDepth Research is deterministic: the same query over the same record returns byte-identical results, on any account, any day, any number of times.
That works because every result carries a reproducibility key with five parts: the query grammar version, the metadata normalization version, the feature library version, the dataset revision, and the query's canonical hash. In plain words: which language the question was asked in, which rules cleaned the labels, which frozen code computed every feature, which state of the record was scanned, and which exact question ran. Same key, same bytes. Change any part and the key changes with it.
What you can ask
Queries are built from a closed, versioned feature library. No free-form formulas, no model-written fields: every id computes the same way for everyone, forever, under its pinned version. Today's library covers 33 features:
| You ask about | Registry id | Example ask |
|---|---|---|
| Toxic flow (VPIN) | feature.vpin | "vpin above 0.85 on majors" |
| VPIN regime flips | feature.vpin_regime | "the vpin regime entered high or critical" |
| One-sided book | feature.book_imbalance | "the book averaged half bid-sided for 15 minutes" |
| One-sided book, vs its own history | feature.book_imbalance_pctrank | "book imbalance above its own 95th percentile" |
| Spread blowouts | feature.spread_norm | "the spread blew out toward its cap" |
| Funding extremes, signed | feature.funding_rate | "funding negative at settlement" |
| Funding extremes, normalized | feature.funding_norm | "funding pinned at the extreme end of its range" |
| Open-interest velocity, vs its own history | feature.oi_velocity_pctrank | "OI velocity above its own 95th percentile" |
| Liquidation bursts | feature.liq_intensity_norm | "liquidation intensity above 0.5" |
| Clustered liquidations | feature.cascade_clustering_index | "liquidations arriving in cascades rather than independently" |
| Liquidated notional, trailing hour | feature.liq_notional_usd_1h | "at least $5 million liquidated in one hour" |
| Top-trader long account share | feature.top_trader_long_ratio | "top traders at least 65% long" |
| Global long account share | feature.global_long_ratio | "the crowd at least 60% long" |
| Top-trader vs crowd divergence | feature.top_global_long_skew | "top traders 15 points more long than the crowd" |
| Short-horizon returns | feature.ret_15m | "down 2% in 15 minutes" |
| Hour-scale returns | feature.ret_1h | "down 5% on the hour" |
| Hour range | feature.range_pct_1h | "a 3% high-to-low hour" |
| Realized volatility | feature.realized_vol_1h | "1-minute vol elevated across the hour" |
| Volatility, vs its own history | feature.realized_vol_pctrank | "vol above its own 90th percentile" |
| Distance from day VWAP | feature.vwap_dist | "stretched 2% above the day's VWAP" |
| One-sided tape | feature.taker_buy_ratio_15m | "two-thirds of the tape hit the ask for 15 minutes" |
| Whale-sized prints | feature.large_trade_share_15m | "whale prints carrying a third of volume" |
| Time to funding | feature.mins_to_funding | "within 30 minutes of settlement" |
| Candle body, 15-minute | feature.candle_body_15m | "a full-body 15-minute candle" |
| Candle body, hourly | feature.candle_body_1h | "an hour that closed where it opened" |
| Upper wick | feature.candle_upper_wick_15m | "a long upper wick" |
| Lower wick | feature.candle_lower_wick_15m | "a hammer: two-thirds lower wick" |
| Range compression and expansion | feature.candle_compression_15m | "the tightest candle in three hours" |
| Engulfing candles | feature.candle_engulfing_15m | "a bullish engulfing candle" |
| Engulfing candles, hourly | feature.candle_engulfing_1h | "an hourly bearish engulfing" |
| Sweep and reclaim | feature.candle_sweep_reclaim_15m | "swept three-hour lows and closed back above them" |
| Sweep and reclaim, hourly | feature.candle_sweep_reclaim_1h | "an hour that swept twelve-hour lows and reclaimed" |
| Inside and outside bars | feature.candle_containment_15m | "an inside bar after a big move" |
Candle features read the last COMPLETED 15-minute or hourly candle as of each minute, never the one still forming, and boundary rules are strict: an equal low is not a sweep, an equal body edge is not an engulfing. When the record has no candle to reference (a market gap), the answer is absent, not improvised.
Outcomes, comparison, snapshots and live follow-through
Every scan summarizes what followed every match, across the full result set before paging. Compare that matched distribution with every other eligible bucket as a baseline, with counts and caveats attached. No win rates, causal claims or hidden significance score.
> Why outcomes never become filtersPoint at a market and a minute instead of describing it: the panel reads every versioned feature as-of that bucket and proposes editable chips, marked INFERRED until you own them. Compare up to eight moments for what they honestly share.
> From a momentDefine one population once, freeze its exact occurrence anchors, then classify those same anchors by a second setup-time condition as true, false or absent. Each closed group receives the same forward outcome summaries, so the split cannot move an anchor or quietly change the population.
> See the rollout statusArm any verified result as a standing definition. The same frozen features and edge rules run on live data: every fire carries its observed values and a replay link.
> How live alerts workSearch the market. Keep the receipt.
Occurrences describe only the recorded markets, dates and eligible buckets reported by the scan. They are observed examples, not a guarantee. Nothing here is trading advice.