Market scanner · discovery, not lookup

Scan the whole market. Get back the few real signals.

One POST /v1/scan call scans US stocks, ETFs and crypto for the tickers currently in a given regime or printing a chart/candlestick pattern — ranked by the honest backtested base rate and its 95% CI. Your agent stops analyzing one ticker at a time and starts discovering candidates across the market.

POST /v1/scan · $0.02 · REST + MCP · x402 + Stripe

Try free — no signup Read the scan docs

TL;DR

The screener is patternfetch's flagship discovery endpoint. Pass optional filters — assetClass, regime, pattern, tf, minBaseRate, limit — and POST /v1/scan returns a ranked shortlist of tickers, ordered by the honest backtested base rate + 95% CI. Same honesty moat as the brief: a coin-flip pattern is flagged as a coin flip. Also available as the patternfetch_scan MCP tool.

Lookup vs. discovery

Most market-data APIs — patternfetch's own /v1/brief included — are lookup: you already know the ticker, and you ask for its current state. That's the right tool once you have a candidate. But an agent screening the market has the opposite problem: it doesn't know which tickers to look at yet. Calling /v1/brief on hundreds of symbols to find the handful that matter is slow, token-heavy and expensive.

Lookup — one ticker at a time

"What's the state of AAPL on the 1d?" → one brief. To find candidates you'd loop /v1/brief over the whole universe yourself, then sort — many calls, many tokens, your own ranking logic.

Discovery — the screener

"Which US stocks and crypto are in an uptrend printing a double_bottom, best base rate first?" → one /v1/scan call returns the ranked shortlist. Then call /v1/brief only on the names that survived.

That's the whole pitch: the scanner turns lookup into discovery, so your model finds the few real signals instead of being handed one ticker at a time — and it ranks them by evidence, not by a confident-sounding label.

How it works

  1. A curated universe. An evidence-backed set of liquid US large-caps, core & sector ETFs, and major crypto pairs is scanned so every result is a name with enough history to measure honestly.
  2. Precomputed, not live. Scanning the whole universe live (a fetch + full analysis per ticker) would be slow and hammer upstream sources. Instead the universe is scanned offline on a schedule and each ticker's current-signal row is stored, so a scan is served from memory — fast and cheap.
  3. Filter. Your optional filters narrow the universe by asset class, regime, pattern, timeframe and a minimum base rate.
  4. Rank by the honest base rate. Survivors are ordered by the top pattern's backtested directional base rate (with its 95% CI and sample size) — the same evidence the brief attaches to a pattern — then by geometric confidence, then timeframe, then symbol.
  5. Act on the shortlist. Take the ranked rows and call /v1/brief on the top names for the full picture before your agent does anything.

The filters

Every field is optional; an absent field puts no constraint on that axis. A filter-less POST /v1/scan returns the top of the universe, ranked.

FilterTypeMeaning
assetClass"stock" | "crypto" | "all"Restrict to US stocks/ETFs, crypto pairs, or all. Default all.
regime"up" | "down" | "range"Only tickers whose current regime trend matches — uptrend, downtrend, or sideways/chop.
patternstringRequire the ticker's top pattern to be this one: double_bottom, double_top, head_and_shoulders, bullish_engulfing, bearish_engulfing, hammer.
tfstringOne of 1m 5m 15m 30m 1h 4h 1d 1w. The universe is currently precomputed at 1d.
minBaseRate0..1Drop tickers whose top-pattern backtested base rate is below this floor.
limitint 1..500Max rows returned. Default 50.

Example — request & response

Ask for US stocks and crypto in an uptrend with at least a 55% base rate, top 20:

Request
curl -X POST https://patternfetch.com/v1/scan \
  -H "Authorization: Bearer pf_…" \
  -H "Content-Type: application/json" \
  -d '{ "assetClass": "all",
        "regime": "up",
        "minBaseRate": 0.55,
        "limit": 20 }'
Response — ranked shortlist
{
  "asOf": "2026-07-05",
  "tfs": ["1d"],
  "universe": 137,
  "count": 2,
  "results": [
    { "sym":"AAPL","tf":"1d","assetClass":"stock",
      "regime":"up","pattern":"double_bottom",
      "baseRate":0.58,"ci95":0.03,"n":300,
      "scope":"US stocks & ETFs","confidence":0.72 },
    { "sym":"BTC/USDT","tf":"1d","assetClass":"crypto",
      "regime":"up","pattern":"bullish_engulfing",
      "baseRate":0.56,"ci95":0.04,"n":180,
      "scope":"major crypto pairs","confidence":0.69 }
  ],
  "note":"Precomputed current-state scan ranked by
          impersonal historical base rate. Discovery,
          not a prediction or a buy/sell signal.",
  "disclaimer":"… informational only, not advice …"
}

Each row carries sym, tf, assetClass, regime, pattern, baseRate (the ranking key), ci95, n (sample size), scope (the corpus the rate was measured over) and geometric confidence. The envelope's universe and asOf tell you how many tickers were scanned and when. See it live →

How results are ranked

The whole feature is "ranked by the honest backtested base rate", so ordering is deterministic and evidence-first:

KeyDirectionWhy
baseRatedescHow often that exact pattern + timeframe + confidence band historically resolved in its own direction, with no lookahead. The strongest evidence rises first.
confidencedescGeometric fit score (0..1) — breaks ties between equal base rates.
tf then symascStable, attributable ordering for same-strength rows.

Tickers whose top pattern has no sufficiently-powered evidence bucket carry baseRate: null and rank last — the scanner never invents a number it can't back with history.

The honesty moat

A confident-looking chart pattern is not the same as a pattern that works. Every other screener ranks by how cleanly a shape matches; patternfetch ranks by how often that shape has actually resolved its way, and shows you the sample size and confidence interval so you can see when a "signal" is really a coin flip. Because equities drift up over time, a bearish formation's directional base rate can sit below 50% — the scanner reports that honestly instead of hiding it. That's the moat: discovery you can trust, ranked by evidence.

Over MCP

The screener is also the patternfetch_scan tool on the patternfetch MCP server — same optional filters, same ranked output. Point any MCP client (Claude, Cursor, Smithery, an OpenAI agent over a bridge) at https://patternfetch.com/mcp; tool discovery is free and a call is billed like the REST route.

# one line — OAuth mints a free-tier key, nothing to paste
claude mcp add --transport http patternfetch https://patternfetch.com/mcp

Then your agent can call patternfetch_scan with, e.g., {"assetClass":"crypto","pattern":"double_top","limit":10} and reason over the ranked shortlist. See the MCP docs.

Pricing & free tier

① A scan is $0.02 per call — the same pay-per-call model as every endpoint. ② No-signup demo & free key: the wider API has a keyless demo and a free key with a $0.05 starter credit, no card. ③ Pay as you go: settle with Stripe or with x402 (USDC on Base, no account) so an agent can fund itself. ④ Credits never expire. Full pricing →

FAQ

What is the patternfetch screener?

A market scanner: one POST /v1/scan call scans a universe of US stocks, ETFs and crypto pairs and returns the tickers currently in a given regime or printing a chart/candlestick pattern, ranked by the honest backtested base rate + 95% CI. It turns lookup into discovery — ask which tickers match your criteria right now, get a ranked shortlist back.

How are scan results ranked?

By the top pattern's backtested base rate (descending), then geometric confidence, then timeframe, then symbol. Tickers with no sufficiently-powered evidence bucket carry a null base rate and rank last, so the strongest evidence rises to the top.

What filters can I pass?

All optional: assetClass (stock/crypto/all), regime (up/down/range), pattern (e.g. double_bottom), tf (a timeframe; universe precomputed at 1d), minBaseRate (0..1), and limit (1..500, default 50). A filter-less scan returns the top of the universe, ranked.

How much does a scan cost?

$0.02 per call. Pay with x402 (USDC on Base, no account) so an agent can pay autonomously, or by card via Stripe. The wider API also has a free no-signup demo and a free key with a $0.05 starter credit.

Is the scanner available over MCP?

Yes — as the patternfetch_scan tool on the MCP server (https://patternfetch.com/mcp), with the same filters and ranked output. tools/list is free; a tools/call is billed like the REST endpoint.

Is a scan result investment advice?

No. It's impersonal, algorithmic market data for informational purposes only. Base rates are gross historical directional frequencies, not predictions or buy/sell signals; past results do not guarantee future results. Not advice, not personalized, non-executing. See the disclaimer.

Try free — no signup Read the scan docs

Keep reading

Stock chart pattern detection → Crypto chart patterns → Market-regime API → Multi-timeframe brief → How base rates are computed → Full scan docs →