sifting/io
GET/v1/hist/:venue/:symbol/signals

Signal history

Get the technical-analysis signal as a time series, one point per bar: summary, score, close, vote counts, the full oscillator and moving-average breakdown with each indicator's value and vote, and any discrete events (golden_cross, death_cross, macd_cross_up, macd_cross_down) that fired on that bar. Same computation as the live signal, so a historical point is identical to the one that fired live: backtest what you saw. t is the bar-open time in Unix epoch milliseconds, the same as the bars routes.

Format
JSON

Example

request · shell
curl -H "X-API-Key: $KEY" \
  "https://api.sifting.io/v1/hist/forex/EURUSD/signals?interval=1h&limit=1"
200OKapplication/json
{  "data": [    {      "t": 1791148800000,      "close": 1.17342,      "summary": "buy",      "score": 0.28,      "events": ["macd_cross_up"],      "counts": { "buy": 9, "neutral": 5, "sell": 4 },      "oscillators": {        "signal": "neutral",        "score": 0.17,        "indicators": [          { "name": "RSI(14)", "value": 58.21, "vote": "neutral" },          { "name": "MACD(12,26,9)", "value": 0.00042, "signal_line": 0.00031, "vote": "buy" },          { "name": "Stoch(14,3,3)", "k": 71.4, "d": 66.8, "vote": "neutral" },          { "name": "CCI(20)", "value": 84.12, "vote": "neutral" },          { "name": "Williams %R(14)", "value": -31.5, "vote": "neutral" },          { "name": "Mom(10)", "value": 0.00215, "vote": "buy" }        ]      },      "moving_averages": {        "signal": "buy",        "score": 0.33,        "indicators": [          { "name": "SMA(10)", "value": 1.17211, "vote": "buy" },          { "name": "SMA(20)", "value": 1.17104, "vote": "buy" },          { "name": "SMA(30)", "value": 1.16988, "vote": "buy" },          { "name": "SMA(50)", "value": 1.16852, "vote": "buy" },          { "name": "SMA(100)", "value": 1.17301, "vote": "buy" },          { "name": "SMA(200)", "value": 1.17655, "vote": "sell" },          { "name": "EMA(10)", "value": 1.17238, "vote": "buy" },          { "name": "EMA(20)", "value": 1.17141, "vote": "buy" },          { "name": "EMA(30)", "value": 1.17047, "vote": "buy" },          { "name": "EMA(50)", "value": 1.16992, "vote": "buy" },          { "name": "EMA(100)", "value": 1.17188, "vote": "buy" },          { "name": "EMA(200)", "value": 1.17402, "vote": "sell" }        ]      }    }  ],  "meta": {    "as_of": "2026-10-04T14:32:10Z",    "symbol": "EURUSD",    "interval": "1h"  }}
Loading runner…
First load only

Parameters

Parameter
venuerequiredenum · path
stocks | crypto | forex | commodities.
symbolrequiredstring · path
Concatenated USD-quoted form, uppercase (e.g. BTCUSD, EURUSD, XAUUSD, AAPL). Case-insensitive.
intervalstring · query
Bar size each point is computed on. One of: 1m, 5m, 15m, 30m, 1h, 1d, 1w, 1mo. Default 1d. Same enum as the /hist bars routes.
limitinteger · query
Return the most recent N points, newest last. Default 100.

Response fields

Field
data[]array
Signal points, oldest first, one per interval bucket.
data[].tint64 (epoch ms)
Bar open time, Unix epoch milliseconds, UTC. Same as the /hist bars routes.
data[].closefloat
Close for the bar.
data[].summaryenum
Label for the bar: strong_sell | sell | neutral | buy | strong_buy.
data[].scorefloat
Score for the bar, -1 to +1.
data[].eventsarray
Discrete markers that fired on the bar (see the events legend). Empty array when none.
data[].countsobject
Vote tally across every indicator returned for the bar: { buy, neutral, sell }.
data[].oscillators.signalenum
Group label for the oscillator block on the bar.
data[].oscillators.scorefloat
Group score for the oscillator block, -1 to +1.
data[].oscillators.indicators[]array
One row per oscillator, only those out of warmup on that bar.
data[].oscillators.indicators[].namestring
Indicator name and parameters, e.g. RSI(14).
data[].oscillators.indicators[].valuefloat
Indicator reading. Some rows carry extra fields (MACD: signal_line; Stochastic: k, d instead of value).
data[].oscillators.indicators[].voteenum
buy | neutral | sell for this indicator.
data[].moving_averagesobject
Same shape as oscillators: signal, score, and an indicators array of SMA/EMA rows.
meta.symbolstring
Echoed symbol.
meta.intervalstring
Echoed bar size.
meta.as_ofstring
When the response was produced. RFC 3339, UTC.

Reference

Events (data[].events)
golden_cross
Fast moving average crossed above a slow one.
death_cross
Fast moving average crossed below a slow one.
macd_cross_up
MACD line crossed above its signal line.
macd_cross_down
MACD line crossed below its signal line.
Indicators returned
Oscillators
RSI, MACD, Stochastic, CCI, Williams %R, Momentum.
Moving averages
SMA and EMA at 10, 20, 30, 50, 100, and 200 periods.

Error responses

  • 422insufficient_history

    Not enough bars to compute the signal for this symbol and interval (short listings, illiquid pairs).

    {  "error": "insufficient_history",  "message": "not enough history to compute a signal for this symbol and interval"}
  • 404not_found

    Unknown venue, or a symbol outside our coverage for that venue.

    { "error": "not_found" }
  • 400invalid_parameter

    Bad interval, limit, or malformed symbol.

    {  "error": "invalid_parameter",  "message": "interval must be one of: 1m, 5m, 15m, 30m, 1h, 1d, 1w, 1mo."}
  • 403market_not_entitled

    US stock signals on the free tier. Stocks is a paid market, the same gate as stock bars.

    { "error": "your subscription doesn't include the stocks market" }

More in Technical signals

See all