PatternsRadar
Sign in

Language reference

Sift

A query language for candles. SQL’s structure and English’s readability, over 3,687 NSE instruments with daily history to 20 Aug 2026.

Try a scan115 worked examples139 fields, indicators and patterns

Overview#

The common case is one line with no ceremony. Everything else is optional.

close > ema(21)
Run

That is a complete query. It reads the latest bar of every stock in the universe and keeps the ones closing above their 21-day exponential moving average. There is no timeframe to declare, no latest to repeat, and no wrapper.

Compare the same three intents against Chartink, whose syntax makes you restate the timeframe on every single term:

IntentChartinkSift
Close above the 20 EMA( {cash} ( latest close > latest ema( latest close , 20 ) ) )close > ema(21)
Volume twice its 20-bar average( {cash} ( latest volume > 2 * latest sma( latest volume , 20 ) ) )volume > 2x avg(volume, 20)
RSI crossed 60 in the last 3 barsnot expressiblersi(14) crossed above 60 within 3 bars
Within 2% of the 52-week highmanual max plus arithmeticclose within 2% of high_52w

Sift is not Turing complete: no loops, no user-defined functions, no side effects. Every query is statically analysable, which is what lets the editor underline a mistake before you run anything and lets the engine bound the cost of a scan before it starts.

Query shape#

Five clauses, all optional, conventionally in this order.

on <timeframe>
from <universe>
where <condition>
sort by <expression> [asc | desc]
top <n>

A bare condition is a complete query — where is optional. Clauses may appear in any order. Newlines and indentation carry no meaning, and # or // starts a comment that runs to the end of the line.

on daily
from NSE
where close > ema(21) > ema(50)      # a trend in good order
  and volume > 2x avg(volume, 20)
  and delivery_pct > 55
sort by turnover desc
top 25
Run
ClausePurposeDefault
onCandle timeframe.daily — the only one this dataset carries
fromWhich universe to scan: `NSE` (all equities) or `fno` (stocks with listed futures & options).NSE
whereThe condition. Optional keyword.everything matches
sort byOrder the results by any expression.turnover, descending
topRow cap.300
sort by accepts any expression, not just a returned column — sort by (close - ema(50)) / ema(50) desc ranks by distance above the average.

Fields#

Written bare, with no parentheses. Each maps to one precomputed column.

Price

FieldMeaning
closeClosing price, adjusted for splits and bonuses.
openOpening price.
highSession high.
lowSession low.
hl2Midpoint of the session range.
hlc3Typical price.
ohlc4Average of all four session prices.
ha_openHeikin-Ashi open — the average of the previous HA open and close.
ha_highHeikin-Ashi high.
ha_lowHeikin-Ashi low.
ha_closeHeikin-Ashi close — the average of the bar's four prices.
high_52wHighest high of the last 252 sessions.
low_52wLowest low of the last 252 sessions.
pct_from_52w_highDistance below the 52-week high, as a negative percentage.
pct_from_52w_lowDistance above the 52-week low, as a percentage.
pivotClassic floor-trader pivot from the previous session.
pivot_r1First resistance above the pivot.
pivot_r2Second resistance above the pivot.
pivot_s1First support below the pivot.
pivot_s2Second support below the pivot.

Volume & delivery

FieldMeaning
volumeShares traded.
turnoverClose × volume, in rupees.
tradesNumber of trades executed.
delivery_pctShare of volume taken to demat rather than squared off intraday. High delivery on a rising day suggests genuine accumulation.
delivery_qtyShares taken to demat.
rel_volumeVolume divided by its own 20-day average. 2 means twice normal.
obvRunning total of volume signed by the day's direction.
acc_distRunning total weighted by where the close sits in the range.
cmfAccumulation/distribution normalised over 20 bars. Positive means buying pressure.
force_indexPrice change times volume, smoothed over 13 bars.

Momentum

FieldMeaning
stoch_kSlow stochastic %K over 14 bars, smoothed by 3.
stoch_d3-bar average of stochastic %K.
stoch_rsiThe stochastic oscillator applied to RSI itself.
cciCommodity Channel Index over the typical price.
williams_rLike the stochastic, scaled −100 to 0.
mfiA volume-weighted RSI over the typical price.
rocPercentage change over 10 bars.

Trend

FieldMeaning
adxTrend strength, direction-agnostic. Above 25 is usually read as trending.
di_plusPositive directional indicator.
di_minusNegative directional indicator.
supertrendATR-banded trailing stop (10, 3).
supertrend_dir+1 while Supertrend is bullish, −1 while bearish.
psarParabolic stop-and-reverse (0.02, 0.2).
aroon_upHow recently the 25-bar high occurred.
aroon_downHow recently the 25-bar low occurred.
aroon_oscAroon up minus Aroon down.
ichimoku_conversionTenkan-sen, the 9-bar midpoint.
ichimoku_baseKijun-sen, the 26-bar midpoint.
ichimoku_span_aCloud edge A, unshifted.
ichimoku_span_bCloud edge B, unshifted.

Volatility

FieldMeaning
atrWilder's average true range over 14 bars.
true_rangeThis bar's true range.
bb_upper20-period SMA plus two standard deviations.
bb_mid20-period simple moving average.
bb_lower20-period SMA minus two standard deviations.
bb_pct_bWhere the close sits within the bands: 0 at the lower, 1 at the upper.
bb_widthBand separation as a fraction of the middle band. Low means a squeeze.
donchian_upperHighest high of the last 20 bars.
donchian_midMidpoint of the Donchian channel.
donchian_lowerLowest low of the last 20 bars.
keltner_upper20-EMA plus two ATRs.
keltner_lower20-EMA minus two ATRs.

Performance

FieldMeaning
changePercentage change against the previous close.
return_1wPercentage change over 5 sessions.
return_1mPercentage change over 21 sessions.
return_3mPercentage change over 63 sessions.
return_6mPercentage change over 126 sessions.
return_1yPercentage change over 252 sessions.

Derivatives (F&O)

FieldMeaning
fut_oiTotal futures open interest across all expiries, in contracts.
fut_oi_change_pctDay-over-day change in total futures OI. Read it with price: price up with OI up is long buildup, price down with OI up is short buildup. The drop after an expiry day is genuine, not noise.
fut_volumeFutures contracts traded across all expiries.
fut_basis_pctFront-month futures premium (positive) or discount (negative) to the cash price, in percent. Compared on the raw price scale — corporate actions are bridged out. Reads near zero on expiry day by construction.
fut_rollover_pctShare of futures OI already sitting in later expiries. On expiry day this is the classic rollover number the derivatives desks quote.
pcr_oiPut OI divided by call OI across this stock's options, all expiries. Above 1 means more open puts than calls. NULL when no calls are open.
pcr_volPut contracts traded divided by call contracts traded, all expiries.

Fundamentals

FieldMeaning
marketcapClose times shares outstanding, in rupees — write `marketcap > 5000cr`. The share count is restated onto the adjusted-price basis, so a split does not fake a jump.
pePrice to trailing-twelve-month earnings, from the last four filed quarters as known on that date. NULL when TTM earnings are negative or not yet filed — a loss-maker has no P/E rather than a misleading one.
eps_ttmTrailing-twelve-month earnings per share, split-adjusted to match the adjusted price series (filed EPS is not — it is never used directly). Negative for loss-makers, NULL until four consecutive quarters are on file.
revenue_growth_yoyLatest filed quarter's revenue against the same quarter last year.
profit_growth_yoyLatest filed quarter's net profit against the same quarter last year. NULL when the base quarter was a loss — growth from negative earnings is not a number.
revenue_growth_qoqLatest filed quarter's revenue against the previous quarter.
profit_growth_qoqLatest filed quarter's net profit against the previous quarter. NULL when the base quarter was a loss.
profit_cagr_2yAnnualized growth in trailing-twelve-month net profit over two years — the shortest window where compounding says anything a single YoY does not.
profit_cagr_3yAnnualized growth in trailing-twelve-month net profit over three years. Wider coverage than the five-year window, and long enough to outlast one soft base year.
profit_cagr_4yAnnualized growth in trailing-twelve-month net profit over four years.
profit_cagr_5yAnnualized growth in trailing-twelve-month net profit over five years — the usual test of whether earnings compound or merely cycle. A company needs five unbroken years of filings on one basis to get a number; about half of covered names do.
profit_cagr_6yAnnualized growth in trailing-twelve-month net profit over six years. Sparse — few names have this much filed history yet.
profit_cagr_7yAnnualized growth in trailing-twelve-month net profit over seven years — the longest window the results store reaches, and the sparsest.
revenue_cagr_2yAnnualized growth in trailing-twelve-month revenue over two years.
revenue_cagr_3yAnnualized growth in trailing-twelve-month revenue over three years.
revenue_cagr_4yAnnualized growth in trailing-twelve-month revenue over four years.
revenue_cagr_5yAnnualized growth in trailing-twelve-month revenue over five years. Pair it with `profit_cagr_5y` to separate operating leverage from growth that only arrived through the top line.
revenue_cagr_6yAnnualized growth in trailing-twelve-month revenue over six years.
revenue_cagr_7yAnnualized growth in trailing-twelve-month revenue over seven years.
interest_cost_growth_yoyTrailing-twelve-month finance costs against a year earlier. This is a proxy for the direction of borrowing, not a measure of it: quarterly filings carry a P&L and no balance sheet, so there is no debt figure here to read — flat interest beside growing profit is the shape of growth funded from earnings, and a jump is the shape of fresh debt. Read it against `pe` and a profit CAGR, exclude lenders (for a bank interest is the cost of goods, not leverage), and expect NULL when a quarter's finance-cost line is missing.
promoter_pctPromoter shareholding from the latest pattern filed by that date.
public_pctPublic shareholding from the latest pattern filed by that date.
fii_pctForeign institutional holding from the latest pattern filed by that date. Sparse until the shareholding XBRL backfill completes.
dii_pctDomestic institutional holding from the latest pattern filed by that date. Sparse until the shareholding XBRL backfill completes.
promoter_pledged_pctShare of the promoter stake pledged as collateral. Zero is the healthy reading; a rising number is the classic distress tell.
promoter_change_qoqPercentage-point change in promoter holding against the previous quarter's pattern. Positive means promoters bought.
price is accepted as an alias for close, so price between 50 and 5000 reads naturally.

Sectors & categories#

Closed sets of string values, tested with `is`, `is not` and `in`.

where sector is "Information Technology"
  and pe < 25 and pe > 0
Run
FormMeaning
sector is "Information Technology"Exactly this NSE sector.
sector is not "Financial Services"Everything but this sector.
industry in ("Banks", "Finance")Any of the listed industries.
macro_sector is "Consumer Discretionary"The broadest tier, above sector.

The values are NSE’s official classification — 22 sectors, 12 macro sectors, 58 industries — and the editor autocompletes them after is, so nobody has to remember that the exact spelling is “Oil Gas & Consumable Fuels”. Matching is case-insensitive; the compiler canonicalises onto the official name.

Classification is today’s snapshot — NSE publishes no history, so a historical scan or hit-rate replay applies the current sector retroactively. The compiler says so on every scan that filters on one.

Derivatives#

Per-stock daily aggregates from the NSE F&O bhavcopy, for the roughly 200 stocks with listed futures & options.

from fno where fut_oi_change_pct > 3 and change > 1
Run

Price and open interest rising together is a long buildup — fresh money agreeing with the move, rather than shorts giving up. Open interest is in contracts, summed across all expiries, because contracts are the unit NSE actually publishes.

FieldMeaning
fut_oiTotal futures open interest, in contracts.
fut_oi_change_pctDay-over-day change in futures OI. Rising OI with rising price is a long buildup.
fut_volumeFutures contracts traded.
fut_basis_pctFront-month futures premium (+) or discount (−) to cash.
fut_rollover_pctShare of OI already in later expiries.
pcr_oiPut-call ratio by open interest.
pcr_volPut-call ratio by contracts traded.
from fno where pcr_oi > 0.8 and close > sma(50)
Run
Stocks without listed derivatives carry NULL in every one of these fields and never match a condition on them. from fno makes that scope explicit — writing an F&O field without it earns a compiler warning rather than a silently thin result.

Fundamentals#

Valuation, growth and shareholding, as the market knew them on the scan date.

where marketcap > 20000cr and pe < 30 and pe > 0
Run

Fundamentals are point-in-time. A result filed after the 15:30 close becomes visible from the next session, and a restatement counts only from its own filing date — so a scan on any past date sees exactly what a trader could have known that day, never what the filings later became. That is what keeps the hit-rate replay honest for fundamental screens.

FieldMeaning
marketcapClose × shares outstanding, in rupees — `marketcap > 5000cr`.
pePrice to trailing-twelve-month earnings. NULL for loss-makers rather than a misleading number.
eps_ttmTrailing EPS, split-adjusted to match the adjusted price series.
revenue_growth_yoy / profit_growth_yoyLatest filed quarter against the same quarter last year.
revenue_growth_qoq / profit_growth_qoqLatest filed quarter against the previous quarter.
profit_cagr_2y … profit_cagr_7yAnnualized profit growth over N years, trailing twelve months against the TTM N years earlier. NULL when the history is short or either end was a loss.
revenue_cagr_2y … revenue_cagr_7yThe same window on revenue — pair with the profit CAGR to see whether margins widened or only sales did.
interest_cost_growth_yoyTTM finance costs against a year ago. A proxy for the direction of borrowing, not a debt figure — quarterly filings carry no balance sheet.
promoter_pct / public_pct / fii_pct / dii_pctShareholding from the latest pattern filed by the scan date.
promoter_pledged_pctShare of the promoter stake pledged as collateral.
promoter_change_qoqPercentage-point change in promoter holding vs the previous quarter.
where promoter_change_qoq > 0.5 and close > sma(200)
Run
The filings backfill is in progress: a stock without parsed results has NULL P/E and growth, and NULL never matches. The compiler warns when a scan filters on a partial-coverage field, so a thin result is announced rather than mistaken for a market fact.

Indicators#

Called with a period. The source series defaults to close.

where rsi(14) < 40 and close > sma(200)
Run
IndicatorPeriodsMeaning
sma(n)5, 10, 20, 50, 100, 200, anyUnweighted mean close over the period.
ema(n)9, 21, 50, 200, anyExponentially weighted mean close, seeded from the SMA.
wma(n)20, anyLinearly weighted mean — the newest bar counts most.
hma(n)21, anyHull's low-lag moving average.
tema(n)20, anyTriple-smoothed EMA, with much of the lag removed.
rma(n)14, anyWilder's smoothing, as used inside RSI and ATR.
vwma(n)20, anyMean close weighted by each bar's volume.
rsi(n)14, anyWilder's relative strength index.
atr(n)14, anyWilder's average true range.
adx(n)14, anyTrend strength, direction-agnostic.
cci(n)20, anyCommodity Channel Index.
mfi(n)14, anyVolume-weighted RSI.
cmf(n)20, anyAccumulation/distribution normalised over a window.
roc(n)10, anyPercentage change over the period.
williams_r(n)14, anyLike the stochastic, scaled −100 to 0.

Every indicator accepts any period: the listed ones read a precomputed column and anything else is computed at scan time, so ema(37), adx(7) and bb(50, 2.5) all work. Multi-output indicators take their full parameter list — macd(8, 21, 5), supertrend(14, 2) — and written bare, macd() keeps meaning the stored 12/26/9.

Multi-output indicators

Indicators producing more than one line take empty parentheses and a sub-field. Omitting the sub-field picks the one shown in bold.

where macd().line crosses above macd().signal
  and close > bb().upper
Run
IndicatorSub-fieldsMeaning
macd().line .signal .hist12/26 EMA difference, with a 9-period signal line.
bb().upper .mid .lower .pctb .width20-period SMA with two-standard-deviation bands.
stoch().k .dSlow stochastic oscillator.
supertrend().value .dirATR-banded trailing stop.
donchian().upper .mid .lowerThe rolling 20-bar high/low envelope.
keltner().upper .lowerA 20-EMA with ATR-scaled bands.
ichimoku().conversion .base .span_a .span_bConversion, base and cloud edges.
aroon().up .down .oscHow recently the window's extremes occurred.

Window functions#

Rolling aggregates over any period, computed at scan time rather than read from a column.

where volume > 2x avg(volume, 20)
  and close > max(high, 20 bars)[-1]
Run
FunctionReturns
avg(x, n)Mean of x over the last n bars.
max(x, n)Highest value of x over the last n bars.
min(x, n)Lowest value of x over the last n bars.
sum(x, n)Total of x over the last n bars.
stdev(x, n)Population standard deviation of x.
median(x, n)Median of x over the last n bars.

The window takes a bar count or a duration — avg(volume, 20), max(high, 20 bars) and min(low, 52w) are all valid. The first argument is any expression, so avg(high - low, 10) gives the mean daily range.

A window returns nothing until it is full. A 50-day average over a stock with 12 days of history is not a 50-day average, so avg(close, 50) and sma(50) agree exactly rather than differing on new listings.

Time travel#

Past bars are negative. There is no future.

WrittenMeans
closeThis bar — the scan date.
close[-1]The previous bar.
prev closeThe previous bar, spelled out.
close[-5]Five bars ago.
avg(volume, 20)[-1]The 20-bar average as of yesterday.
where open > high[-1] and close > open
Run
A positive index is rejected rather than guessed at: close[1] would name a bar that has not happened, and silently treating it as the past is how look-ahead bias gets into a scan.

Operators#

The usual comparisons and arithmetic, plus chaining.

OperatorsNotes
> >= < <= = !=`=` is accepted as `==`.
+ - * /Division by zero yields no value rather than an error.
and or not`and` binds tighter than `or`. Parenthesise when mixing.
( )Grouping, for both conditions and arithmetic.

Chained comparisons

A chain means what it looks like — each neighbouring pair must hold.

where close > ema(21) > ema(50) > ema(200)
Run

That is exactly equivalent to writing the three comparisons out and joining them with and.

Sugar#

Shorthand for the arithmetic other screeners force you to write by hand.

WrittenEquivalent to
2x avg(volume, 20)2 * avg(volume, 20)
5% above ema(50)ema(50) * 1.05
3% below sma(200)sma(200) * 0.97
close within 2% of high_52wclose between high_52w*0.98 and high_52w*1.02
price between 50 and 5000price >= 50 and price <= 5000
close up 3% over 5 bars(close - close[-5]) / close[-5] >= 0.03
close down 2% over 5 bars(close[-5] - close) / close[-5] >= 0.02

These are not approximations. Each form is checked against its longhand equivalent in the test suite and must select exactly the same stocks.

Event operators#

Crossings, persistence, runs and extremes — the reason the language exists.

Every one of these compiles to a bounded window expression. In a screener without them you would hand-roll the same thing out of offset arithmetic, and get it subtly wrong.

Crossings

where sma(50) crosses above sma(200)
Run

A crossing is defined on two bars: strictly across now, and not across on the bar before. Add a recency window to catch one that happened a few sessions ago.

where rsi(14) crossed above 30 within 3 bars
  and close > sma(200)
Run

Persistence

Whether something has held for a stretch, rather than being true on one lucky day.

where close has been above ema(21) for 10 bars and adx > 25
Run

Monotonic runs

where volume rising for 3 bars and close > close[-3]
Run

Window extremes

is highest in compares against a window that includes the current bar, so it is true exactly when this bar sets the extreme.

where close is highest in 52w and volume > 1.5x avg(volume, 20)
Run
FormTrue when
x crosses above yx is above y now and was at or below on the previous bar.
x crosses below yx is below y now and was at or above on the previous bar.
x crossed above y within n barsThat crossing happened on any of the last n bars.
x has been above y for n barsx was above y on every one of the last n bars.
x rising for n barsx increased on each of the last n bars.
x falling for n barsx decreased on each of the last n bars.
x is highest in nNo bar in the window has a higher x.
x is lowest in nNo bar in the window has a lower x.

Candlestick patterns#

Detected at build time and queried as a first-class value.

where pattern is bullish_engulfing
  and close within 3% of sma(50)
Run

Add within n bars for recency, or pattern is not … to exclude one. Definitions use proportional tolerances, so they behave the same on a ₹30 stock and a ₹30,000 one.

PatternShape
dojiOpen and close nearly equal — indecision.
hammerLong lower wick, small body at the top.
shooting_starLong upper wick, small body at the bottom.
marubozuAlmost no wicks — one side controlled the session.
bullish_engulfingAn up bar whose body swallows the previous down bar.
bearish_engulfingA down bar whose body swallows the previous up bar.
bullish_haramiA small up bar contained inside the previous down bar.
bearish_haramiA small down bar contained inside the previous up bar.
morning_starDown bar, pause, then a strong up bar through the midpoint.
evening_starUp bar, pause, then a strong down bar through the midpoint.
three_white_soldiersThree consecutive strong up bars.
three_black_crowsThree consecutive strong down bars.
inside_barRange contained entirely within the previous bar's.
outside_barRange containing the whole previous bar's.

Numbers & literals#

Indian and Western magnitudes, both native.

WrittenValue
1k1,000
5L5,00,000 — five lakh
2.5m25,00,000
10cr10,00,00,000 — ten crore
1b100,00,00,000
₹500 / $50500 / 50 — the symbol is read and discarded
20 bars / 52w / 3mo / 2yA duration, converted to trading sessions
where turnover > 10cr and volume > 5L
Run

Durations convert at roughly 5 sessions a week and 252 a year, so 52w is 260 bars and 1y is 252.

Universes#

Which stocks a scan considers, chosen in the toolbar rather than in the query.

TierContains
Top 100Most traded 100 stocks by 20-day turnover
Top 250Most traded 250 stocks by 20-day turnover
Top 500Most traded 500 stocks by 20-day turnover
Top 1000Most traded 1000 stocks by 20-day turnover
All equitiesEvery actively traded NSE equity
These tiers are ranked by 20-day average turnover, not by index membership — “Top 100” means the hundred most traded stocks, not the NIFTY 100. Market cap exists as the marketcap field for conditions, but the tiers stay turnover-ranked because turnover is dense from day one while fundamentals coverage is still filling in.

from fno narrows a scan to the roughly 200 stocks with listed futures & options — the set the derivatives fields cover.

from fno where fut_oi_change_pct > 10 and close up 2% over 1 bars
Run

Errors#

Every mistake is reported with the reason and the fix, before the scan runs.

The parser and analyser run in the browser as you type — they are pure and need no database — so the editor underlines a problem immediately, and the identical code validates again on the server.

WrittenReported as
clos > 100Unknown field `clos` — Did you mean `close`?
sma > 100`sma` needs a period — Try `sma(5)`, `sma(10)`, `sma(20)`.
rsi(1000) > 50`rsi` period must be between 2 and 400 — e.g. `rsi(14)`.
close[1] > 100`[1]` looks like a future bar — write `[-1]` for one bar ago.
rsi(14) crosses 30`crosses` must be followed by `above` or `below`.
on 15m where close > 100Timeframe `15m` is not available — this dataset is end-of-day only.
pattern is wibbleUnknown pattern `wibble`.
macd().wibble > 0`macd()` has no sub-field `wibble` — Available: line, signal, hist.

Recipes#

Complete scans worth stealing. Each one runs.

52-week high breakout

Closing at a fresh 52-week high on above-average volume — the classic Darvas-style entry.

where close is highest in 52w and rel_volume > 1.5
Run

Within 3% of the 52-week high

Coiling just under the highs. Often a better entry than the breakout candle itself.

where close within 3% of high_52w and close > ema(50)
Run

Volume breakout

Twice normal volume with price up more than 3% — something changed today.

where volume > 2x avg(volume, 20)
  and change > 3
  and close > sma(20)
Run

Volume shockers

Twice the ten-day average volume with a move of more than 5% — the day something happened.

where volume > 2x avg(volume, 10) and change > 5
Run

20-day channel breakout

Pushing through the top of the 20-day range with volume behind it.

where close > donchian_upper[-1]
  and volume > 1.5x avg(volume, 20)
Run

Bollinger band breakout

Close pushing above the upper band, with volume confirming.

where close > bb().upper and rel_volume > 1.5
Run

Keltner channel breakout

Clearing the ATR-based upper channel — a steadier breakout signal than Bollinger's.

where close > keltner_upper and rel_volume > 1.5
Run

Crossing above pivot R1

Price clearing the first pivot resistance on strong volume — a classic floor-trader level.

where close crosses above pivot_r1 and rel_volume > 1.5
Run

The scan library has 115 of these, each testable against a year of history.

Data caveats#

What the newer data can and cannot honestly answer.

CaveatThe honest version
F&O coverageRoughly 200 NSE stocks have listed derivatives. Everywhere else the F&O fields are NULL and never match — `from fno` makes the scope explicit.
Fundamentals coverageThe filings backfill is in progress; a stock without parsed results has NULL P/E and growth, and never matches those conditions. Coverage rises weekly.
Institutional holdingsPromoter and public shares of equity are filed every quarter and are the two the shareholding view is built on. FII, DII, employee-trust and pledge percentages come from a separate filing stage whose backfill has reached about 1% of instruments — they are NULL almost everywhere, including for the largest companies on the exchange, and never match.
Quarterly resultsThe per-quarter profit and loss starts in 2017 and the shareholding pattern in 2015. NSE's quarterly filings carry a P&L only, so there is no balance sheet, cash flow, debt or return-on-capital figure anywhere in this dataset.
Sector historyClassification is today's snapshot — NSE publishes no history. A historical scan or hit-rate replay applies the current sector retroactively.
OI unitsOpen interest is in contracts, summed across expiries, both before and after a lot-size revision — the unit NSE actually publishes.

Fundamentals are point-in-time: a scan sees the numbers as the market knew them on the scan date. A result filed after the 15:30 close becomes visible from the next session, and a restatement counts only from its own filing date — which is what keeps the hit-rate replay honest for fundamental screens.

Not supported#

Parts of the language spec this dataset cannot honour, and why.

FeatureWhy not
on 15m / 1h / weeklyThe dataset is end-of-day only. `on daily` is the only timeframe.
from BSE / US / NIFTY500NSE only, and there is no index-constituent list to filter by. `from fno` is the one list-like universe.
vwapNeeds intraday data, which end-of-day bars cannot provide.
per-strike option screeningF&O fields are per-stock daily aggregates. Strike-level OI is a chain view, not a screener column.
pattern is … formingGeometric pattern detection with a confidence score is not built. Only completed candlestick patterns are available.
backtest { } / alert { }Not implemented. The hit-rate panel on each scan is the nearest thing.
top 10% by …Percentile limits are rejected; use a plain count.
A query using any of these fails with a specific message naming the limitation, rather than silently returning something plausible.

API & MCP#

Everything on this page works without the browser.

A scan is one POST with the Sift source in the body, and the MCP endpoint gives a coding agent this whole reference as a tool — so Claude Code or Codex can write and run scans against your account unaided. Keys are free on every plan.

Read the API & MCP docs