One call reads every timeframe — and tells you when they disagree.
POST /v1/multi returns a token-compact market-state brief for each timeframe you ask for, plus a cross-timeframe alignment read: do the trends agree, or split? The divergence is spelled out — 1h up / 4h up / 1d down — so your model sees a lower-timeframe bounce inside a higher-timeframe downtrend for exactly what it is. Stocks, ETFs and crypto, one schema, one round trip.
StocksETFsCryptoup to 4 TFsone call · $0.025
"NVDA: uptrend (moderate), +0.38% last 1h, RSI 61.40 (neutral)."
"NVDA: uptrend (strong), +1.22% last 4h, RSI 64.10 (neutral)."
"NVDA: downtrend (weak), -0.86% last 1d, RSI 46.70 (neutral)."
One /v1/multi call. The lower timeframes are climbing while the daily still points down — a counter-trend bounce, made explicit as data (aligned:false, direction:"range"). Descriptive market state, never a directive.
TL;DR — One POST /v1/multi (or the MCP tool patternfetch_multi) with { ticker, timeframes[] } returns a compact views array — trend, strength and a one-line nl per timeframe — the full briefs alongside, and an alignment object: the trend per timeframe, an aligned boolean, the shared direction, and a divergence string like "1h up / 4h up / 1d down" when they conflict. Default timeframes 1h, 4h, 1d (up to four). One schema for stocks, ETFs and crypto. $0.025 a call — less than three separate briefs.
The signal isn't any one timeframe — it's whether they agree.
A trend that shows up on the 1h, the 4h and the 1d is a different animal from a 1h pop against a falling daily. Reading them one at a time hides the relationship. The alignment read surfaces it in a single call.
All timeframes point the same way
When 1h, 4h and 1d agree, a setup on the lower timeframe is running with the higher-timeframe tide, not against it. aligned:true, and direction is the shared trend. Fewer surprises from a bigger-picture move you weren't looking at.
1h up · 4h up · 1d up → aligned up
A lower timeframe fights the higher one
A 1h up-move while the daily is down is often a counter-trend bounce inside a larger decline — the classic trap for a model that only looked at the short timeframe. aligned:false, direction:"range", and the split is named.
1h up · 4h up · 1d down → diverge
This is exposed as descriptive data: patternfetch surfaces the agreement or the split and stops there. What to do with it is your model's call, not ours — the alignment read is impersonal market state, not a signal to act on.
Request in, three briefs + an alignment read out.
A real /v1/multi shape for NVDA across 1h, 4h, 1d. The full per-timeframe briefs travel in briefs; the compact views and alignment are the cross-timeframe summary.
POST https://patternfetch.com/v1/multi
Authorization: Bearer pf_…
Content-Type: application/json
{ "ticker": "NVDA",
"timeframes": ["1h", "4h", "1d"] }
{ "sym": "NVDA",
"views": [
{ "tf": "1h", "trend": "up", "strength": 0.34 },
{ "tf": "4h", "trend": "up", "strength": 0.52 },
{ "tf": "1d", "trend": "down", "strength": 0.28 }
],
"alignment": {
"trends": { "1h": "up", "4h": "up", "1d": "down" },
"aligned": false,
"direction": "range",
"divergence": "1h up / 4h up / 1d down"
},
"nl": "NVDA: timeframes diverge — 1h up / 4h up / 1d down." }
Each views[i] also carries the per-timeframe one-line nl, and the full brief for every timeframe (candles, patterns with base rates, levels, regime, indicators) rides along in briefs — so one round trip gives your model both the detail and the cross-timeframe read. See it live →
The timeframes are aligned unless at least one is up while another is down. Ranging timeframes never create a conflict on their own. When aligned, direction is the shared trend (up, down or range) and divergence is null; when conflicting, direction is range and divergence lists each timeframe and its trend, shortest to longest. Deterministic and impersonal — no new data source, just the per-timeframe regimes stacked.
Same call for a stock, an ETF or a coin.
Swap the ticker and the alignment logic is identical. Here the higher and lower timeframes agree — an aligned-up read on BTC/USDT.
Aligned example — crypto
# POST /v1/multi { "ticker": "BTC/USDT", "timeframes": ["1h","4h","1d"] }
{ "sym": "BTC/USDT",
"alignment": {
"trends": { "1h": "up", "4h": "up", "1d": "up" },
"aligned": true, "direction": "up", "divergence": null },
"nl": "BTC/USDT: trend aligned up across 1h, 4h, 1d." }
- Stocks & ETFs come from Yahoo, split & dividend adjusted (delayed / EOD); crypto from Binance in real time. Examples: AAPL, SPY, NVDA, QQQ, BTC/USDT, ETH/USDT.
- Timeframes span 1m → 1w; pick up to four per call. A common trio is 1h, 4h, 1d; a swing view might use 4h, 1d, 1w.
- The per-timeframe briefs carry the same pattern evidence as /v1/brief — every base rate next to the pattern-free baseline for that market, timeframe and horizon, plus a cluster-robust 95% CI. Across the 105 buckets measured so far, three clear an uncorrected interval — fewer than the ~5.3 that chance alone would produce — and the single one that lands above its baseline (double_top 1d, +9.78pp, n=149) does not survive correcting for 105 comparisons; on US stocks it is 0 of 60. So the pattern block is context for your model, not a second vote on top of the alignment read.
One call, cheaper than three.
The multi view bundles a brief per timeframe and the alignment read into a single metered call — fewer round trips and fewer tokens than firing three briefs and diffing them yourself.
| Endpoint | Returns | Price |
|---|---|---|
| POST /v1/multi | Brief per timeframe + cross-timeframe alignment | $0.025 |
| POST /v1/brief | Single-timeframe market-state brief | $0.01 |
| POST /v1/demo | No-signup brief (rate-limited) | free |
Try the cross-timeframe view on the free demo — no signup. Then a free key with $3.00 starter credit from one call, no card. Pay with x402 (USDC on Base, no account) or Stripe. Credits never expire. Full pricing →
patternfetch_multi over MCP.
Streamable HTTP at /mcp. Discovery (tools/list) is free — no key; a tools/call is billed like the REST route.
# one line — OAuth mints a free key
claude mcp add --transport http \
patternfetch https://patternfetch.com/mcp
# then call the tool
patternfetch_multi({
ticker: "AAPL",
timeframes: ["4h", "1d", "1w"] })
x402 settles each call in USDC on Base — no account, no card, no key — discoverable at /.well-known/x402.json. The agent pays for its own multi-timeframe reads autonomously. A tools/call is billed exactly like POST /v1/multi.