Skip to main content
Fincept Scanner is the screening engine behind every scan_* tool. scan_run screens a whole market live on any of its fields: price and volume on 1-minute to monthly bars, performance, technical indicators and ratings, candlestick patterns, valuation, profitability, growth, balance sheet, cash flow, dividends, earnings and dividend dates and analyst targets. It covers stocks in 68 countries with their ETFs and funds, crypto pairs and coins, forex, futures, CFDs, bonds, options and economic series, and narrows to index universes such as the S&P 500, Nasdaq 100, Nifty 50, FTSE 100 or Nikkei 225. scan_history screens instruments’ price history with a formula of your own, for rules no field expresses. scan_returns gives many instruments’ returns over any calendar month, quarter, year or date range. scan_ohlcv and the fundamentals tools return bars, statements, earnings, dividends and revenue segments per symbol. Every tool answers with a result envelope with tables and charts.
Fincept Scanner tools are free. They count toward the rate limit only. Requests to the market data source are also paced across the server: when that budget is in use the tool answers busy with details.retry_after_s, the number of seconds to wait.

Modules

Tools are grouped in three modules. Each module is a toolset named scan_<module>, so you can list it or search within it. The Fincept Scanner reference lists every tool. scan_run is listed by default. scan_catalog returns the live list of modules and tools from inside your agent.

Build a screen

A screen is a market, conditions on its fields, and a sort:

Where to screen

scan_markets lists every market by region with its exchanges, every index, the timeframes and the operators.

Fields

Field names are case-sensitive: RSI, close, SMA50, market_cap_basic, price_earnings_ttm, sector, earnings_release_next_date. scan_fields searches a market’s fields by words ("dividend yield", "free cash flow", "52 week"), category or type, and with include_values lists the exact values a text field takes, such as every sector or industry.
  • Timeframes. A bar field (price, volume or a technical) reads another timeframe with a suffix: RSI|60 is RSI on 1-hour bars. Suffixes are 1, 5, 15, 30, 60, 120, 240 (minutes), 1W and 1M; daily is the field without a suffix. The timeframe argument applies one to every bar field that names none.
  • Previous bars. [1] and [2] read a bar field one or two bars back: close[1], RSI[1]|60. On another timeframe the source keeps less: close[1]|1M is last month’s close, so close|1M against it is the month to date, but change has no earlier values on a timeframe and is refused. For any older month, quarter or year use scan_returns.
  • Units. Percent fields are in percent (5 is 5%). Date fields take ISO dates ("2026-01-31") and come back as ISO dates.
  • Checked first. A field the market does not have is refused before anything runs, with the nearest names in details.did_you_mean. A text value the field never takes ("Technology" for sector) adds a warning with the values it does take.

Conditions

Each condition is {"field", "op", "value"}, or {"field", "op", "to_field"} to compare with another field. filters must all hold.

OR logic

where holds an and/or tree three levels deep, and is combined with filters by AND. Each level is {"all": [...]} or {"any": [...]}, whose items are conditions or groups:

Sort, columns and pages

  • sort_by and sort_order (desc or asc) pick the order; the default is market cap for stocks and coins, traded volume for crypto pairs, forex, futures and options, and name for the rest.
  • columns picks the fields each row carries. Every field a condition or the sort reads is added, so a row shows why it matched.
  • limit returns up to 1,000 rows (default 50). offset skips rows; data.next_offset is the offset of the next page, null on the last.

Templates

template starts from a ready-made screen. Your filters are added to its conditions; your sort_by and columns replace its own. scan_templates lists all 44, each with its full arguments to copy and adapt.

Screen price history

scan_history evaluates a formula over each instrument’s bars, for rules no field expresses: streaks, breakouts over any window, distances from highs, custom indicators and their crosses. It takes up to 500 symbols; narrow a market with scan_run first, as each call fetches about 25 new instruments (see Big lists). A data reference passes a screen’s symbols in one call:
A formula is written like a Python expression over the series open, high, low, close, volume, hl2, hlc3 and ohlc4:
  • x[n] is x from n bars back; + - * / % **, comparisons, and and, or, not work bar by bar.
  • Window lengths and settings are numbers, such as sma(close, 50).
  • condition decides a match on the latest bar, or on any of the last within bars (the row says when it last held). values are named formulas reported at the latest bar, and sort_by can name one.
A formula is checked before anything is fetched: an unknown name, a missing window or anything that is not a formula is refused with the reason. Examples:

Returns over calendar periods

scan_returns measures each instrument’s return over up to 12 calendar periods at once: a month (2026-06), a quarter (2026-Q2), a year (2025) or a date range (2026-01-15..2026-03-31). A return is the last close inside the period over the last close before it began, in percent. Months are the exchange’s own calendar months. A period that has not ended is measured to the latest bar, and the answer says so.
Each row has the symbol and one value per period: null, with the reason in notes, when there is no close inside the period or none before it. A finished period’s return is kept for a day, so asking again costs nothing. For a whole market, market_get_returns is faster: it measures up to 100 symbols a call by the same rule, with basis price or total, and takes symbols as scan_run answers them. A symbol it has no listing for is under missing; scan_returns covers it.

Big lists

scan_history and scan_returns fetch each instrument’s bars, two at a time, paced across the server: about 25 new instruments a call. A call answers within about 45 seconds, so a client’s timeout never cuts it off. When it could not reach every instrument, it answers partial and lists the rest in data.remaining: call the tool again with symbols set to them to continue. Instruments already fetched are cached and cost nothing the next time. Instruments that could not be fetched are under data.failed, grouped by reason. When the server-wide pace pauses requests, the call stops early the same way, and its warning says how long to wait.

Bars and fundamentals

Amounts are in the reporting currency’s own units, not thousands or millions. A date range that would need more than 5,000 bars is refused; ask for the latest bars by count or use a longer interval.

Limits

The bar and fundamentals tools share two sessions with the source across the server; Big lists explains how the many-instrument tools continue. An identical screen within 30 seconds is answered from cache.

Outputs

Every screen row carries the instrument’s symbol as EXCHANGE:TICKER and one value per column. data.symbols lists the symbols in order, ready for scan_history, scan_returns, scan_ohlcv, the fundamentals tools or any market tool. data.total_count is the number of matches overall; data.fields gives each column’s meaning and type; data.conditions restates the screen as it ran. The results table block shows the first 50 rows; data.rows has every row. Values are as the market data source publishes them: real time for some venues, delayed by the exchange’s public delay (up to 15 minutes) for others.

Example

Prompt
The agent calls scan_run with index: "nasdaq100" and an RSI filter, passes its symbols to scan_history with a breakout formula, then calls scan_financials with period: "FQ" for each match. More prompts: