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

Live signal

Get the current technical-analysis signal for a stock, FX pair, crypto asset, or commodity: a decision-ready summary (strong_sell to strong_buy) with a score from -1 to +1, plus the oscillator and moving-average indicators that produced it, each with its value and vote. Indicators still in warmup are omitted rather than reported as neutral, so the vote counts always sum to the rows actually returned.

Format
JSON

Example

request · shell
curl -H "X-API-Key: $KEY" \
  "https://api.sifting.io/v1/last/signals/crypto/BTCUSD?interval=1h"
200OKapplication/json
{  "data": {    "summary": {      "signal": "buy",      "score": 0.36,      "counts": {        "buy": 11,        "neutral": 6,        "sell": 3      }    },    "oscillators": {      "signal": "neutral",      "score": 0.08,      "indicators": [        {          "name": "RSI(14)",          "value": 58.2,          "vote": "neutral"        },        {          "name": "MACD(12,26,9)",          "value": 42.10,          "signal_line": 30.44,          "vote": "buy"        },        {          "name": "Stoch(14,3,3)",          "k": 82.3,          "d": 78.1,          "vote": "sell"        }      ]    },    "moving_averages": {      "signal": "strong_buy",      "score": 0.83,      "indicators": [        {          "name": "SMA(10)",          "value": 61240.5,          "vote": "buy"        },        {          "name": "EMA(50)",          "value": 59870.2,          "vote": "buy"        }      ]    },    "price": {      "close": 61980.4,      "bar_status": "forming"    }  },  "meta": {    "as_of": "2026-08-13T14:32:07Z",    "symbol": "BTCUSD",    "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 the signal is computed on. One of: 1m, 5m, 15m, 30m, 1h, 1d, 1w, 1mo. Default 1h. Same enum as the /hist bars routes.

Response fields

Field
data.summary.signalenum
Overall label: strong_sell | sell | neutral | buy | strong_buy.
data.summary.scorefloat
Overall score from -1 to +1.
data.summary.countsobject
Vote tally across every indicator the response returns: { buy, neutral, sell }. The example below abbreviates the indicator rows.
data.oscillators.signalenum
Group label for the oscillator block.
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.
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).
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.
data.price.closefloat
Close used for the current bar.
data.price.bar_statusenum
forming | closed. See the freshness legend.
meta.symbolstring
Echoed symbol.
meta.intervalstring
Echoed bar size.
meta.as_ofstring
When the response was produced. RFC 3339, UTC.

Reference

Freshness (data.price.bar_status)
forming
A live tick is folded into the current bar. The vote reflects the in-progress bar.
closed
No fresh tick; the last closed bar is used. Repaint-free. The vote logic is identical either way.
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 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