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=trueRequires 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,bearishorneutral. 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 below0.15. Forcomposite, 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
compositeit is the share of strategies agreeing, scaled by the strength of that agreement. - evidence
- Each weighted condition, in words, with its vote (
+1bullish,-1bearish,0abstain) 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
nullfor a single strategy. Forcompositeit 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
nullwhen the call is neutral, uses at most the most recent 200 matching sessions, and when the rule never produced this state earlier it returnsoccurrences: 0with anoteinstead 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.
| Key | Name | What it compares |
|---|---|---|
| trend | Trend following | 20-day SMA vs 50-day SMA, close vs the 50-day, and the 20-day slope |
| momentum | Momentum | RSI(14) regime, MACD histogram sign, MACD line vs its signal line |
| breakout | Breakout | Close vs 20-day Bollinger bands, confirmed by volume vs its 20-day average |
| composite | Composite (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.