Decision API

Indicator endpoints return series. The decision endpoint returns an answer: bullish, bearish or neutral, with a confidence score, the exact conditions that produced it, and provenance for the reading.

The call

GET /v1/decisions/AAPL?strategy=trend&include_history=true

Requires an API key, and is available on every plan including Free. Each call consumes one request from your plan's monthly quota and returns X-Monthly-RateLimit-Limit / -Used / -Remaining headers. Errors: 400 unknown strategy, 401 missing or invalid key, 404 unknown or inactive symbol, 422 too little history or an invalid parameter, 429 rate or quota limit, 503 indicators unavailable.

Parameters: strategy (default composite), lookback_days (120–1000, default 400), include_history (default true), and history_horizon (1–60 sessions, default 5).

What comes back

{
  "symbol": "AAPL",
  "as_of": "2026-10-16",
  "interval": "1d",
  "strategy": {
    "key": "trend",
    "name": "Trend following",
    "summary": "Is the medium-term trend above the long-term trend, with price and slope confirming it? Uses the 20- and 50-day SMAs."
  },
  "decision": {
    "state": "bullish",
    "score": 1.0,
    "confidence": 0.95,
    "summary": "AAPL reads bullish on the trend following rule: 3 of 3 conditions agree, 95% confidence."
  },
  "evidence": [
    {
      "key": "sma_relationship",
      "statement": "20-day SMA (241.19) is above the 50-day SMA (228.04).",
      "vote": 1,
      "weight": 1.0
    },
    {
      "key": "price_vs_long_average",
      "statement": "Close (244.60) is above the 50-day SMA (228.04).",
      "vote": 1,
      "weight": 0.75
    },
    {
      "key": "short_average_slope",
      "statement": "The 20-day SMA is rising over the last 5 sessions.",
      "vote": 1,
      "weight": 0.5
    }
  ],
  "components": null,
  "signals": [
    { "name": "SMA", "parameters": { "period": 20 }, "latest": 241.19 },
    { "name": "SMA", "parameters": { "period": 50 }, "latest": 228.04 }
  ],
  "history": {
    "window_bars": 263,
    "horizon_sessions": 5,
    "occurrences": 84,
    "hit_rate": 0.5714,
    "average_forward_return": 0.0061,
    "best_forward_return": 0.0412,
    "worst_forward_return": -0.0338,
    "method": "For each earlier session where the rule produced the same state, the forward 5-session return; hit rate counts moves in the direction the rule called."
  },
  "missing_signals": [],
  "provenance": {
    "source": "daily OHLCV bars from public market data",
    "bars_used": 263,
    "history_days": 400,
    "data_through": "2026-10-16",
    "computed_at": "2026-10-19T18:00:00+00:00",
    "rule_version": "1"
  },
  "disclaimer": "A mechanical reading of public price data, not investment advice. Conditions are fixed comparisons of documented indicators; past occurrences do not predict future returns."
}

What each field means

decision.state
bullish, bearish or neutral. Neutral is a real answer, not an error: it means the conditions do not point one way.
decision.score
The weighted vote, from -1 (fully bearish) to +1 (fully bullish). A single strategy is neutral when |score| is at or below 0.15. For composite, the score is net agreement across the three readings — (bullish − bearish) / 3 — so it always points the same way as the state. It is not a probability and is not the confidence.
decision.confidence
How much agreement backs the call, in 0–1 (capped at 0.95). For a single strategy it is the strength of the vote — or, for a neutral call, the confidence in inaction — reduced when some inputs could not be computed. For composite it is the share of strategies agreeing, scaled by the strength of that agreement.
evidence
Each weighted condition, in words, with its vote (+1 bullish, -1 bearish, 0 abstain) and weight. Conditions with weight 0 — context that cannot vote, such as volume before a band break — are not listed. You can disagree with a specific line rather than with a black box.
components
null for a single strategy. For composite it lists each underlying reading with its own state, score and confidence, so you can see which one disagreed.
signals
The latest indicator values the decision was made from. Single-output signals give a number in latest; multi-output signals (MACD, Bollinger bands) give an object of named values.
history
For earlier sessions where the same rule produced the same state, the forward return over the horizon — an occurrence-based hit rate, not a strategy backtest (no fills, fees or position sizing). It is null when the call is neutral, uses at most the most recent 200 matching sessions, and when the rule never produced this state earlier it returns occurrences: 0 with a note instead of a hit rate.
missing_signals
Indicators this strategy needed but the registry could not provide. They abstain and reduce confidence rather than being ignored.
provenance
Where the reading came from: data source, how many bars were used, the requested window in days (history_days), the date the data runs through, when the reading was computed, and the rule version — so a stored decision can be audited later.

Strategies

The same list is available from GET /v1/decisions/strategies, including each strategy's inputs, so a client does not have to hard-code this table.

KeyNameWhat it compares
trendTrend following20-day SMA vs 50-day SMA, close vs the 50-day, and the 20-day slope
momentumMomentumRSI(14) regime, MACD histogram sign, MACD line vs its signal line
breakoutBreakoutClose vs 20-day Bollinger bands, confirmed by volume vs its 20-day average
compositeComposite (default)A majority of the three readings above — two must agree, so no single family decides alone

What this is not

Every rule is a fixed comparison of documented indicators — no model, no fitting, no prediction. The same inputs always produce the same answer, which is what makes it auditable. It is a reading of public price data, not investment advice, and the response says so in a disclaimer field. For real fills, fees and position sizing, use the backtesting endpoints (POST /v1/backtests/run) or the API explorer.