Market summary API · One call, one verdict

Every signal, already added up.

GET /v1/summary reads 26 indicator series for a symbol and timeframe, scores them against fixed thresholds, and returns a signed bias with a confidence value, per-category directions, the conditions that fired and the raw readings behind them — as one structured JSON object.

26 series per call 7 timeframes 5× request weight
tickatlas.com / v1 / summary 200 OK
GET /v1/summary?symbol=EURUSD&timeframe=H1
EUR/USD · H1 · bias
bullish
strong
confidence0.8
trend_score5.5
momentum_score0.5
volatility_score0.48
signals.trendbullish
signals.momentumneutral
bullish_signals7 entries
bearish_signals0 entries
{
  "success": true,
  "data": {
    "symbol": "EURUSD",
    "timeframe": "H1",
    "bias": "bullish",
    "bias_strength": "strong",
    "confidence": 0.8,
    "trend_score": 5.5,
    "momentum_score": 0.5,
    "volatility_score": 0.48,
    "signals": { "trend": "bullish", "momentum": "neutral",
                 "volatility": "normal", "volume": "neutral" },
    "key_levels": { "resistance": [1.0861], "support": [1.0819] },
    "bullish_signals": ["Price above 200 SMA (long-term uptrend)", …],
    "bearish_signals": [],
    "neutral_signals": ["ADX 21.4 (weak/ranging market)", …],
    "volatility_info": […], "volume_info": […],
    "summary": "EURUSD on H1: Overall bias is STRONG BULLISH
                (confidence: 80%). Bullish factors: …",
    "recommendations": […],
    "key_values": { "bid": 1.08432, "ask": 1.08445,
                   "rsi_14": 61.2, "macd_hist": 0.00021, … },
    "updated_at": 1774620183
  }
}
26Series per call
19Response fields
7Timeframes
5×Request weight
One call instead of twenty-six

The aggregation is the product.

Reading 26 series yourself is the easy half. The half that takes weeks is deciding what each reading means, agreeing a weighting, holding the two halves consistent as you add symbols, and keeping the verdict reproducible. This endpoint is that second half, pinned in one place.

ASSEMBLED CLIENT-SIDE

26 reads, then your own scoring layer

26 indicator reads at 1× each, plus classification rules per indicator, a weighting table, an aggregation step, a narrative generator and a test suite that proves all of it still agrees with itself after the next change.

  • 26 calls against your quota per symbol per timeframe
  • 26 round trips of latency, or your own fan-out
  • Thresholds live in your code, and drift from ours
SERVER-SIDE

One request, 19 fields

One GET with two parameters returns the bias, its strength, the confidence, three scores, four category directions, the key levels, four signal arrays, the narrative and all 13 raw readings that produced them.

  • 1 call of quota (5 weighted units), not 26
  • One round trip
  • key_values removes the follow-up call
What it reads

Four analysers. 26 series. Two of them decide the bias.

These are the exact series the endpoint pulls from the indicator cache, grouped by the analyser that consumes them. Trend and momentum are the only two whose scores are added together to produce the bias; volatility and volume contribute observations and the per-category directions.

12 series Scores the bias

Trend

Moving-average structure, MACD state, ADX directional dominance and Parabolic SAR position. The price-versus-200-SMA check is the only condition in the whole endpoint worth ±2.

  • SMA_20
  • SMA_50
  • SMA_200
  • EMA_20
  • EMA_50
  • MACD_main
  • MACD_signal
  • MACD_hist
  • ADX
  • ADX_plusDI
  • ADX_minusDI
  • SAR
6 series Scores the bias

Momentum

Oscillator bands. Each reading is classified against fixed numeric boundaries and contributes ±1 or ±0.5 — RSI above 70 and RSI below 30 are both scored, in opposite directions.

  • RSI_14
  • Stochastic_K
  • Stochastic_D
  • CCI_14
  • WilliamsR_14
  • Momentum_14
6 series Context only

Volatility

Band position and range. Produces the `volatility_info` strings and feeds `volatility_score`, but its score is not added to the bias total.

  • ATR_7
  • ATR_14
  • BB_upper
  • BB_middle
  • BB_lower
  • BB_width
2 series Context only

Volume

Flow confirmation. Produces `volume_info` and the per-category `signals.volume` direction; like volatility it does not move the bias total.

  • OBV
  • MFI_14

Why 26 and not 42. 42 is the number of individually addressable series on the platform. This endpoint reads the 26 listed above — the ones its four analysers have rules for. The two numbers are different measurements and are never presented as the same one.

How the verdict is reached

A fixed ladder, not a black box.

Every condition adds a constant to its analyser's score. The trend and momentum totals are summed, and that one number selects the bias and its strength from the table below. The confidence value is a direct function of the same total — it is not a probability and it is not learned.

Thresholds and confidence formulas as implemented. Confidence is rounded to two decimals, so it is bounded to 0.3–0.9 across the whole range.
trend_score + momentum_score bias bias_strength confidence
total ≥ 4 bullish strong min(0.9, 0.5 + |total| × 0.05)
2 ≤ total < 4 bullish normal min(0.75, 0.4 + |total| × 0.05)
−2 < total < 2 neutral normal 0.3 + (1 − |total| ÷ 4) × 0.2
−4 < total ≤ −2 bearish normal min(0.75, 0.4 + |total| × 0.05)
total ≤ −4 bearish strong min(0.9, 0.5 + |total| × 0.05)

One condition is worth double. Price against the 200 SMA adds or subtracts 2. The golden/death-cross check, the short-term moving-average check, the aligned-EMA check, a MACD crossover and a directional ADX above 25 are each worth 1; a MACD histogram with no crossover and a mid-band RSI are worth 0.5. Parabolic SAR and a sub-25 ADX produce a signal sentence and no score at all.

Two parameters

A request you can memorise.

One required parameter, one optional, one header. That is the whole contract — which is what makes it straightforward to wrap in an SDK, a scheduled job, an agent tool definition or a spreadsheet function.

  • Required: symbol, the canonical name.
  • Optional: timeframe, defaulting to H1.
  • Authenticate with the X-API-Key header.
  • The key needs the indicators permission scope.
# the whole request
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://tickatlas.com/v1/summary?symbol=EURUSD&timeframe=H1"
# read the structured fields, not the prose
d = requests.get(
    "https://tickatlas.com/v1/summary",
    headers={"X-API-Key": KEY},
    params={"symbol": "XAUUSD", "timeframe": "H4"},
).json()["data"]

print(d["bias"], d["bias_strength"], d["confidence"])
print(d["signals"])          # four category directions
print(d["key_values"]["rsi_14"])
// bias transitions, not raw polling output
const url = "https://tickatlas.com/v1/summary?symbol=EURUSD&timeframe=H1";
const headers = { "X-API-Key": KEY };

const { data } = await (await fetch(url, { headers })).json();
if (data.bias !== last.bias || data.bias_strength !== last.bias_strength) {
  notify(`${data.symbol} ${data.timeframe} → ${data.bias}`);
}
bias · bias_strength
bullish confidence 0.8 · EUR/USD · H1
strong
Three scorestrend 5.5 · momentum 0.5 · volatility 0.48
Four directionssignals.trend / .momentum / .volatility / .volume
Key levelsresistance [BB_upper] · support [BB_lower]
Raw readingskey_values — 13 fields
Machine-readable first

The verdict and its evidence travel together.

The narrative is one field out of 19. Everything a program needs to act — the classification, the strength, the numeric scores, the per-category directions, the levels and the raw readings — is a typed field beside it, so nothing has to be parsed back out of the sentence.

Field reference

All 19 fields of data.

In the order the endpoint emits them. The envelope is { "success": true, "data": { … } }.

Field Type What it carries
symbol string Canonical symbol.
timeframe string The timeframe analysed. H1 when the parameter is omitted.
bias string One of bullish, bearish, neutral. Lowercase — the uppercase form only appears inside the generated summary sentence.
bias_strength string strong or normal. strong is reached at a score of ±4; it is a separate field, not a prefix on bias.
confidence number Derived from the absolute score, rounded to 2 decimals. Capped at 0.9, and never below 0.3.
trend_score number Signed trend total, 1 decimal. One of the two inputs to the bias.
momentum_score number Signed momentum total, 1 decimal. The other input to the bias.
volatility_score number ATR_14 ÷ bid × 1000, clamped to 0–10 and rounded to 2 decimals. 0 when either value is missing.
signals object Per-category direction: trend, momentum, volatility, volume. Each is bullish / bearish / neutral at a ±0.5 boundary; volatility is always reported as normal.
key_levels object resistance and support, each an array. Populated from BB_upper and BB_lower — one value each, or an empty array when the band is unavailable.
bullish_signals string[] Every bullish condition that fired, across all four analysers, as readable sentences with the triggering number inlined.
bearish_signals string[] The same for bearish conditions.
neutral_signals string[] Conditions that fired but scored nothing, e.g. an ADX under 25.
volatility_info string[] Volatility observations. Informational only — these never move the bias.
volume_info string[] Volume observations, on the same informational footing.
summary string One generated paragraph: bias and confidence, then up to three bullish and three bearish factors, the leading volatility note and the leading entry of recommendations. Elided in the sample above.
recommendations string[] Generated strings. TickAtlas does not reproduce their wording in its own documentation — see the note below this table.
key_values object The 13 raw readings behind the verdict, so a caller never needs a follow-up indicator request.
updated_at number Epoch timestamp of the last indicator-cache refresh that fed this response.

On recommendations and summary. The live endpoint builds both, and summary appends the first entry of recommendations to its closing sentence. TickAtlas supplies market data and computed analytics for software use and does not give personalised investment advice, so this page documents the two fields by name, type and origin and does not reprint their wording. Every sample value shown elsewhere on this page is a descriptive reading or a classification.

key_values, in emission order. Every entry can be null when the underlying series is not in the cache for that symbol and timeframe.
key_values Source series
bid, asklive quote cache
rsi_14, stochastic_k, mfi_14RSI_14, Stochastic_K, MFI_14
macd_hist, adx, atr_14MACD_hist, ADX, ATR_14
sma_20, sma_50, sma_200SMA_20, SMA_50, SMA_200
bb_upper, bb_lowerBB_upper, BB_lower
Timeframes

One integration across 7 market intervals.

The same two-parameter request on M1, M5, M15, M30, H1, H4, D1. H1 is the default. A value outside this set is rejected with a 400 rather than quietly coerced, so a typo surfaces at the call site instead of in your output.

  • M1 — 1 Minute
  • M5 — 5 Minutes
  • M15 — 15 Minutes
  • M30 — 30 Minutes
  • H1 — 1 Hour (default)
  • H4 — 4 Hours
  • D1 — Daily
Developer-first behavior

Predictable enough to build a product on.

The same authentication, the same envelope and the same error shape as every other endpoint on the platform. Nothing about the aggregation changes how you call it.

CACHE

Per-timeframe Redis cache

Indicator values are served from Redis, so repeated reads inside one window return the same numbers without recomputing. Each timeframe is held just past the interval at which our data updates it.

  • cache_ttl: M1 180s → D1 2700s
AUTH

Header auth, scoped keys

One request header. The key must carry the indicators scope — the same scope the single-indicator endpoints require.

  • X-API-Key: tk_…
SYMBOLS

Canonical symbols

Pass EURUSD; the canonical name is what comes back in symbol.

  • one name per instrument
WEIGHT

5× weight, stated up front

Each call counts once against your daily quota and costs five weighted units of pay-as-you-go credit. The weight is fixed and visible in your usage breakdown, so cost is predictable before you ship.

  • premium tier · multiplier 5.0
Developer API pricing

Start small. Keep the same endpoint as usage grows.

The summary endpoint sits inside the developer API plans. Each call counts once against a daily quota; the 5× weight only sets its pay-as-you-go cost ($0.025 at the entry rate).

There is no free tier and no trial. Every account starts on pay-as-you-go with $2.50 of prepaid credit, no card and no overage — monthly plans lift the starting quota.
Pay as you go
$0 to start 200 requests/day · 30/min until you top up
  • $2.50 of credit included
  • Every REST endpoint except raw ticks
  • No card required, no overage
  • 10 API keys
Start free
Starter
$29/mo 10,000 requests · 120/min
  • Every REST endpoint except raw ticks
  • WebSocket streaming, 5 symbols
  • Released calendar actuals
  • Email support
  • 3 API keys
View plan
Enterprise
$349/mo 1,000,000 requests · 6000/min
  • Everything in Pro
  • Dedicated support
  • 100 API keys
  • Custom indicators
  • SLA guarantee
  • On-premise option
Contact sales
Common software patterns

Consume the verdict without owning the scoring.

The response is shaped for programs: typed scalars for logic, arrays of readable sentences for display, and one prose field for the cases where a human is the consumer.

LLM tool calls

The whole data object is already a flat JSON record with typed fields and readable signal sentences, so it drops into a tool-call result with no reshaping step.

agentsMCP toolsfunction calling

Dashboards and status panels

bias, bias_strength, confidence and the four signals directions map onto a badge, a meter and four category lights without any client-side maths.

badgesmeterswidgets

Change detection

Store bias plus bias_strength per symbol and timeframe, compare on the next poll, and act on the transition rather than on every response.

alertswebhooksschedulers
Frequently asked questions

The summary, clarified.

How the score is built, what the weights actually are, what the endpoint costs, and where the line sits between analytics and advice.

How is the bias actually calculated?

Four analysers run over 26 indicator series. Each condition that fires appends a sentence to a bullish, bearish or neutral list and adds a fixed amount to its analyser's score — ±2 for price against the 200 SMA, ±1 or ±0.5 for everything else. The trend and momentum scores are then added together, and that single total selects the bias and strength from a fixed ladder at ±2 and ±4. Volatility and volume conditions produce text and the per-category directions, but are not part of the total.

Do the weights change with market conditions?

No. Every weight is a constant in the endpoint. There is no regime detector, and no indicator is promoted or demoted depending on whether the market is trending or ranging. The one asymmetry is that the price-versus-200-SMA condition is worth twice any other.

Why is one call weighted 5×?

The summary endpoint is weighted 5× in the usage tier map, alongside the historical indicator endpoint. One call reads 26 series for the symbol and timeframe, runs all four analysers, derives the scores, the per-category directions, the key levels and the volatility score, and writes the narrative — server-side, in one round trip.

Which timeframes can I request?

M1, M5, M15, M30, H1, H4, D1 — the same set every other indicator endpoint accepts. H1 is the default when the parameter is omitted, and anything outside the set is rejected rather than silently coerced.

Is there a plan gate on this endpoint?

Not for developer API keys. The summary entitlement check only applies to monitor/tool sessions, so an api-key request reaches the endpoint on any plan — including a pay-as-you-go account running on its $2.50 of starting credit. The key itself must carry the indicators permission scope.

What does the recommendations field contain?

A list of generated strings, derived from the trend and momentum scores, the volatility notes and the bias. TickAtlas publishes market data and computed analytics for software use; it does not provide personalised investment advice, and it does not reproduce the wording of that field in its own product documentation. The field is documented by name and type so your integration can handle it, and every other field on this page is descriptive.

How often is it worth polling?

Indicator values are served from a per-timeframe Redis cache, so two calls inside the same cache window return the same numbers and both cost 5× quota. Polling on the cadence of the timeframe you requested — once per new candle — is what changes the answer.

26 series, one structured verdict

Ask once. Get the whole picture back.

Start with one summary request on your $2.50 of starting credit, then reuse the same two-parameter call across every symbol and timeframe your product covers.