GET
/v1/last/signals/:venue/:symbolLive 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.
- Auth
X-API-Keyheader- Format
- JSON
- Rate limits
- Per-key, see limits
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 onlyParameters
ParameterDescription
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
FieldDescription
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)Description
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 returnedDescription
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
StatusCodeMeaning
- 422
insufficient_historyNot 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"} - 404
not_foundUnknown venue, or a symbol outside our coverage for that venue.
{ "error": "not_found" } - 400
invalid_parameterBad interval or malformed symbol.
{ "error": "invalid_parameter", "message": "interval must be one of: 1m, 5m, 15m, 30m, 1h, 1d, 1w, 1mo."} - 403
market_not_entitledUS 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" }