Market-state brief · API + MCP · Stocks · ETFs · Crypto

Stocks, ETFs & crypto, read as market state — not a wall of candles.

Fewer tokens. Fewer illusions.

Point it at any ticker and timeframe; get ~500 tokens of regime, levels and interpreted indicators back — where the raw candles behind them would cost ~400,000. And every chart pattern carries the number nobody prints: how often the shape actually beats its own market's baseline. Measured across 105 cases, the answer is the uncomfortable part just below.

StocksETFsCrypto1m → 1wBinance + Yahoo
Brief AAPL · 1d · $308.63 ▲ 4.84%
Regime ↑ up · moderate 0.63
RSI 14 / ATR 60.28 neutral / 2.83%
Levels R 317.17 · S 272.60
bearish engulfing shape 1.00 41.3% vs base 42.0%
n = 12,842 · lift −0.7pp, 95% CI ±2.6pp (cluster-robust) · horizon 10 bars · no lookahead

A real /v1/demo response, rendered — the same JSON your model receives. The hit rate reads bearish. It is what an arbitrary 10-day window does anyway. Measured lift: none.

Signal vs. noise

Three textbook patterns. Three markets. Three times no lift.

Each shape scored a geometric 1.00 — picture-perfect. Here is how often each actually resolved in its own direction over the next 10 bars, and next to it the rate an arbitrary window in the same market hits without any pattern at all. The gap between the two is the only part the pattern is responsible for.

AAPL · 1d
bearish engulfing · shape 1.00
US stocks & ETFs
41.3%vs base 42.0%n=12,842
No lift
SPY · 1d
double bottom · shape 1.00
US stocks & ETFs
56.9%vs base 57.8%n=6,692
No lift
BTC/USDT · 4h
bullish engulfing · shape 1.00
major crypto pairs
49.2%vs base 49.7%n=5,276
No lift
Directional hit rate over the next 10 bars, measured with no lookahead — real /v1/demo output. The vertical rule in each row is that row's own pattern-free baseline: how often an arbitrary window in the same market, timeframe and horizon goes that way with no pattern present. The shaded band is the cluster-robust 95% interval on the difference. In all three rows the band covers the baseline, so the measured lift is −0.7pp, −0.9pp and −0.5pp — none of them distinguishable from zero. Read down the first column and the two stock rows look like opposite signals; read them against their baselines and they are the same finding twice.

The same measurement, read against the right reference — bullish_engulfing · 1d · 0.75–1.00.

If you'd rather read it bullish_engulfing · 1d · 0.75–1.00
Measured hit rate — unchanged throughout 58.20%
Reference it is usually scored against 50.00% → implies +8.20pp
Pattern-free baseline, same market & horizon 57.84% → leaves +0.36pp
Non-overlapping baseline windows n = 46,038
Nothing about the pattern changed between those two readings — only the number it was compared against. Scored against a coin flip it looks like an eight-point edge; scored against what US stocks and ETFs did anyway over the same 10 bars, +0.36pp is indistinguishable from baseline. The video animates that one reference line moving. The other patterns behave the same way: head_and_shoulders lands at 42.0% against a 42.0% baseline, and across all 105 categories only 3 clear their interval — fewer than the ≈5.3 chance alone predicts, and 0 of the 60 on US stocks. Crypto, where the drift disappears, is the control.
Request → Response

One POST in. One honest read out.

This is a live /v1/demo exchange — the same JSON your model receives. No charting to squint at, no number-wall to hallucinate over: the market state is already digested into regime, levels, indicator state, and one plain-language line.

codec: 44 of 120 candles shown — your model gets the compact rows + SAX shape "ddcdeecd", not the picture.

The moment that matters is the pattern block. A textbook bearish engulfing — geometric shape a perfect 1.00 — resolved bearish 41.3% of the time across 12,842 occurrences in US stocks & ETFs. That reads like a finding until you measure the other number: an arbitrary 10-day window on the same universe closes lower 42.0% of the time, with no pattern involved. The candle's contribution is −0.7pp ± 2.6pp — nothing. The payload carries both numbers, because only the pair can be read. Ask any other pattern API for the second one.

Raw OHLCV dump
~400K
tokens · ≈ $6 / call
  • numbers the model miscounts
  • invented indicator values
patternfetch brief
~500
tokens · $0.01 / call
  • a read the model acts on
  • state, not arithmetic
# request — free, no key
curl -X POST https://patternfetch.com/v1/demo \
  -H "content-type: application/json" \
  -d '{ "ticker": "AAPL", "timeframe": "1d" }'

↓ response (abridged — real field names)

{
  "header": { "sym": "AAPL", "tf": "1d", "src": "yahoo",
              "n": 120, "adjusted": true },
  "codec": { "rows": "251.01,256.08,249.34,254.94,55969200;…",
             "sax": "ddcdeecd", "precision": 2 },
  "analysis": {
    "regime": { "trend": "up", "strength": 0.63,
                "volPct": 2.83 },
    "indicators": {
      "rsi": { "v": 60.28, "state": "neutral" },
      "ema": { "v": 311.63, "state": "above_20_50" } },
    "levels": {
      "resistance": [{ "price": 317.17, "strength": 0.67 }],
      "support":    [{ "price": 272.60, "strength": 0.67 }] },
    "patterns": [{
      "name": "bearish_engulfing",
      "confidence": 1, "at": 10, "span": 2,
      "evidence": {
        "scope": "US stocks & ETFs",
        "horizon": 10, "n": 12842,
        "hitRate": 0.413,
        "lift": {
          "baseline": 0.420, "lift": -0.007,
          "ci95Clustered": 0.026,
          "informative": false,
          "reading": "indistinguishable-from-baseline"
        } } }],
    "nl": "AAPL: uptrend (moderate), +4.84% last 1d,
           RSI 60.28 (neutral), bearish_engulfing
           (conf 1, hist 41.3% vs baseline 42.0% —
           no measurable lift)." },
  "methodologyUrl": "https://patternfetch.com/methodology"
}

evidence.hitRate is the realizable gross directional base rate: the fraction of non-overlapping historical occurrences whose close-to-close return over the 10 bars after the pattern became knowable went its expected direction. lift.baseline is the same measurement with no pattern required; lift.lift is the difference between the two, ci95Clustered its cluster-robust interval, and informative / reading say whether that difference clears the interval — read those two rather than the hit rate on its own. No lookahead, no stop, fees or slippage. Not a prediction.

full schema in the docs · machine-readable OpenAPI

Capabilities

One schema. Every asset.

Everything below comes back from a single /v1/brief call — identical whether the ticker is a stock, an ETF or a crypto pair.

Patterns + baseline & lift

Chart and candlestick patterns with a geometric shape score, the backtested hit rate, and the pattern-free baseline it has to beat — plus the cluster-robust interval on the difference. The useful part: it reports a null result as a null result.

Support & resistance

Clustered swing levels with a 0–1 strength, so your model weights the wall it's actually near.

Trend & regime

Direction (up / down / range), a 0–1 strength, and volatility as ATR percent — the market's mood in one row.

Interpreted indicators

RSI, EMA and ATR returned as state — "neutral", "above 20 & 50" — not a wall of decimals to miscount.

Multi-timeframe alignment

One /v1/multi call reads 1m → 1w together and tells you where the timeframes agree — and where they don't.

Historical analogs

Similar past windows returned as a full outcome distribution — winners and losers, mean and median. Not a prediction.

Compact candles

A token-efficient OHLCV codec plus a SAX shape fingerprint — the whole series, a fraction of the tokens.

Delta & one-line summary

Poll only what changed since your last brief, and read the whole state as a single natural-language line.

Flagship · the screener POST /v1/scan · $0.02

Turn lookup into discovery.

Every other endpoint answers about a ticker you already named. The screener flips it: scan US stocks, ETFs and crypto for the tickers currently in a given regime or printing a chart/candlestick pattern, ranked by the backtested base rate, with each row's baseline and lift alongside — so your model sorts by regime and level structure rather than by a shape score that means nothing on its own. Same rule as everywhere else: a null result is labelled null. Explore the screener →

Interface

Endpoints & MCP.

A small, honest REST surface — and the same tools over MCP for agents. Pay per call; the demo is free.

EndpointReturnsPrice
POST /v1/briefFull market-state brief$0.01
POST /v1/multiMulti-timeframe alignment (1m → 1w)$0.025
POST /v1/deltaOnly what changed since your last brief$0.008
POST /v1/candlesCompact candle codec + SAX shape$0.005
POST /v1/analogsHistorical analogs + outcome distribution$0.05
POST /v1/scanScreener — tickers by regime/pattern, ranked by base rate$0.02
POST /v1/demoNo-signup brief (rate-limited)free

Assets: US stocks, ETFs (Yahoo, adjusted) + crypto (Binance, realtime). Machine-readable OpenAPI · llms.txt · methodology.

Six MCP tools, one-click connect

Streamable HTTP at /mcp. Discovery (tools/list) is free — no key; a tools/call is billed like the REST route.

patternfetch_brief patternfetch_multi patternfetch_delta patternfetch_analogs patternfetch_scan patternfetch_capabilities
# one line — OAuth mints a free key, nothing to paste
claude mcp add --transport http \
  patternfetch https://patternfetch.com/mcp
{ "mcpServers": {
    "patternfetch": {
      "url": "https://patternfetch.com/mcp"
    } } }

Or let the agent pay as it goes. x402 settles ~$0.01 per call in USDC on Base — no account, no card, no key — discoverable at /.well-known/x402.json.

See it · 19 seconds

Digest, not dump.

A raw OHLCV response is hundreds of thousands of tokens your model miscounts. The same market, read as state, is a few hundred. Watch the wall of candles collapse into one honest brief.

Real /v1/brief output — ~400K raw OHLCV tokens digested into a ~500-token read your agent can act on.

Pricing

Pay per call — or subscribe, if that's cheaper.

No seats, no minimums. Start on a free no-signup demo or a free key with $3.00 starter credit (300 briefs), no card. Then pay per call — above roughly 1,900 briefs a month, Studio at $19/month is the cheaper of the two. Credits never expire.

Full pricing
/v1/demo
Free
no signup, rate-limited
/v1/brief
$0.01
full market-state brief
/v1/multi
$0.025
multi-timeframe
/v1/delta
$0.008
only what changed
/v1/candles
$0.005
compact codec
/v1/analogs
$0.05
outcome distribution
/v1/scan
$0.02
screener · discovery
Free key, $3.00 starter credit Studio $19/mo · 2,500 briefs Credits never expire Pay with x402 (USDC) or Stripe
Access · humans | agents

Built for the desk and the agent.

One schema, two front doors. Read it yourself, or hand it to a model that pays for its own calls — over x402, MCP or one-click OAuth.

For traders

An honest market read on the tickers you actually watch.

Skip the chart-squinting and the indicator soup. Get the regime, the levels, and a plain-language line — plus a straight answer on whether a pattern means anything at all.

  • A one-line summary you can read in a glance — no number-walls.
  • Know when a "textbook" pattern is statistically just noise.
  • Stocks, ETFs and crypto — the same read across all of them.
  • No charting UI, no platform to learn. Just the state of the market.
Run it on your ticker
For AI agents

MCP-native. Six tools. Pays for its own calls.

Connect over MCP in one click — nothing to paste. Your agent gets a digested market state instead of a candle wall, and settles each call itself over x402.

  • Six MCP tools, one schema across every asset class.
  • x402 (USDC on Base) — ~$0.01 a call, no account, no card, no key.
  • ~800× fewer tokens than raw OHLCV — and no numeric hallucination.
  • One-click OAuth, or a Bearer key, or a local stdio bridge.
Connect over MCP
Method & questions

Honest by construction.

Patterns, levels, regime and indicators are computed server-side from adjusted OHLCV. Base rates are measured with no lookahead — a chart pattern is scored only from the bar it becomes knowable. It is not a prediction and not a strategy backtest, and we say so in every payload.

Read the methodology
How accurate are the patterns?
Every pattern ships with a backtested base rate — and, next to it, the pattern-free baseline for the same market, timeframe and horizon. The base rate on its own cannot be read: US equities drift up, so every bullish pattern lands above 50% and every bearish one below it with no information involved. The difference between the two numbers is the lift. Across the 105 buckets we measured — 60 on US stocks & ETFs, 45 on major crypto pairs — three clear an uncorrected cluster-robust 95% interval, and all three are crypto: bullish_engulfing 1h at −1.76pp (±1.36, n=8,897), double_bottom 1d at −12.25pp (±8.91, n=143), and double_top 1d at +9.78pp (±8.42, n=149) — the only bucket of the 105 that lands above its baseline. That is fewer than the ~5.3 you would expect from chance alone at this threshold, and none of the three survives a Bonferroni correction across 105 comparisons. On US stocks & ETFs it is 0 of 60. Your model gets both numbers and the interval, so it weights a shape as a shape. Where this measurement is weak →
Stocks and crypto in one API?
Yes — US stocks, ETFs and crypto return the same schema. Crypto comes from Binance in real time; stocks and ETFs from Yahoo, split- and dividend-adjusted. Timeframes: 1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w.
Do I need an account or API key?
No. There's a no-signup demo, and a free key with starter credit you mint in one call. Agents connect over MCP with one-click OAuth (a key is minted for you) or pay per call with x402 — no account at all.
What does a call cost?
Pay per call: brief $0.01, multi $0.025, delta $0.008, candles $0.005, analogs $0.05 — no minimum, no seats. If you run more than ~1,900 briefs a month, Studio at $19/month includes 2,500 briefs ($25 of usage) and works out cheaper. The demo is free and credits never expire.
Is this investment advice?
No. patternfetch is impersonal market data and algorithmic signals for informational purposes only — not investment, financial, legal or tax advice, not personalized, and not a recommendation to buy, sell or hold any asset.