Net = FII/FPI net + DII net.
Welcome back!
Log in to your dashboard
Free forever. No card, no ads — and your data stays yours.
By continuing you agree to our and .
Find ideas. Follow changes. Understand what you own.
Explore Q-Score, valuation and charts across US & NSE stocks.
Illustrative examples, not live market or account data. Open a feature for real data.
Example screener · illustrative scores
| Stock | Q-Score |
|---|
Compare the full metric set in the screener.
Example watchlist · illustrative chart
| Period | Price ₹ | Q-Score |
|---|
Illustrative alert · nothing sent
Example rule: a daily move of at least 5%.
Example funds · illustrative scores
| Fund | MF-Score | Avg Q-Score |
|---|
Compare funds and their underlying holdings.
Illustrative portfolio · not account data
Example gain ₹27,000 · 9.0%
Import CAS or add holdings after signing in.
Aurora Equity · illustrative holdings
Fund-by-fund quality, not a return forecast.
Examples are not recommendations. Playback resumes after five seconds without interaction.
Your watchlist, scored and colour-coded — then one click into valuation, charts, AI summaries and backtests.
Research, valuation, screening, simulation and alerts — no spreadsheets, and free to start.
The free plan is free forever — no card, no ads. Continue with Google, or use an email and password.
Research and analysis only. VroomStocks never places trades and is not investment advice.
The Basic plan is free of charge, forever, and it covers the whole product — watchlists, valuation, charts, screeners, AI summaries, mutual funds, backtesting and screener alerts. Only the size of the numbers is capped: how many stocks you can track, how far back the financial history goes, how many AI summaries you can generate each month and which alerts you can set. Advanced raises every one of those. There are no ads, and nothing is charged unless you choose a paid plan.
Yes — that is what Alerts are for. Set one on a buy/sell signal, a price move on your watchlist, a saved screen gaining or losing a name, a shareholding or insider transaction, a new earnings call or an AI summary, and it arrives by email hourly, daily, weekly or monthly. Everything due in the same window is combined into a single digest, and nothing is ever reported to you twice. The two screener alerts are included on the free plan.
Prices and fundamentals come from Yahoo Finance, with SEC EDGAR and other public sources as fallbacks for US names and NSE for India. Mutual fund data comes from AMFI's official direct-growth catalogue. Earnings-call transcripts come from the exchange filings themselves.
Every account gets its own isolated store. Your watchlist, holdings, screens and settings are scoped to your sign-in and are never shared with or visible to other users.
No. VroomStocks is a research and analysis tool — it never connects to a broker and never places an order. Backtesting and paper-trading are simulated on historical and live prices.
US stocks (NYSE and Nasdaq) and Indian stocks (NSE), plus 2,500+ Indian direct-growth mutual funds. You can switch markets at any time from the sidebar.
An illustrated walkthrough of every feature — from adding your first stock to screening the market, reading AI summaries, tracking your mutual funds, backtesting a trading strategy and setting the alerts that tell you when something changes.
Log in to your dashboard
Free forever. No card, no ads — and your data stays yours.
By continuing you agree to our and .
Loading questionnaire...
Everything described here is free — no card, no ads, and your data stays yours.
Setting up your profile…
We're shipping a quick improvement — you'll be back in a few seconds. No need to refresh.
Safari is the only iPhone browser that can install web apps.
M = millions. Cr = crores. Display scale only; each stock keeps its native currency.
Your next step
Sign in to save your research across devices.
Save your favourite screens
Build a watchlist of your own
Pick up where you left off
Browsing stays free. No account required.
Select multiple categories to include any of them.
Add it to the companies you're comparing on Visual, or open its full Analysis page.
Name this metric selection so you can pick it again from the Template list. Saving an existing name replaces that template.
Starts with your current metric selection.
| Ticker |
|---|
| Ticker |
|---|
| Ticker |
|---|
| Ticker |
|---|
| Ticker |
|---|
Which of the 10 backtest strategies wins most consistently — across your whole portfolio, and against the broad market.
No analysis yet for this region. Run it once to see which strategy performs best across your portfolio and vs the market. This fetches 5 years of history for every stock you track, so it may take a little while — after that, it loads instantly from your saved results until you hit Refresh again.
Fetching 5-year history and simulating 9 strategies…
Start from an index rather than from your own list: filter its members on 45 metrics, sort by anything, and save the searches you want to run again.
Pick a market and an index, set your filters, then add any of the 45 available metrics as columns. Q-Score plus every filtered metric stay locked in place; everything else is yours to arrange. Each column sorts, and blanks always sink to the bottom rather than crowding the top.
Any result opens straight into the full stock page — valuation, fundamentals, technicals, options and AI summaries — so a screen is a starting point rather than a dead end.
Screen the Indian mutual fund universe on returns, cost and risk — then open any fund to see exactly what it owns.
Filter and sort on returns over multiple horizons, expense ratio, category and fund house. As with the stock screener, the metrics you filter on are pinned into the table, and every column — including the fund name — sorts.
Holdings-level detail is what turns a shortlist into a decision: three well-rated funds that hold the same twenty companies give you far less diversification than their labels suggest.
Upload a Consolidated Account Statement (CAS) PDF from CAMS or KFintech. On the CAMS request page, use these settings:
Everything is parsed on the server — the file is never stored.
Previous charts
Choose a starting template, then choose a template for each ticker below.
Select a ticker above or choose a template to get started. Your watchlist stays unchanged.
Create a study or test a strategy against completed bars.
Rich editing loads locally. Your source stays in this browser until you choose an existing save, check or run action.
OpenScript 0.8.1. Lines, candles, fills, levels, markers, drawings, tables and dynamic colors. Use input() defaults in your source. Alerts are historical matches only; no live notifications. Other-symbol/timeframe requests are not supported.
Add a ticker to run a script.
Long-only cash equities, whole-share market entries and full-position closes. No shorts, leverage, pyramiding, partial exits or live trading. Signals on completed bars fill at the next open. Warm-up bars cannot trade. Orders on the final bar cannot fill.
Strategy capital must match the tester. Use fillOn="nextOpen", qtyType="units" and no declaration commissions or slippage. Tester costs apply to both strategy and buy and hold. One basis point is 0.01%.
Yahoo adjusted OHLCV, not executable quotes. Dividends are not added again. Current-day daily candles are excluded conservatively. Buy and hold buys whole shares at the first scoring open and retains residual cash. Open positions are marked at the final close, not forcibly sold.
New scoring dates default to the last five calendar years through the latest loaded completed bar. Daily runs fetch up to 366 calendar days before scoring for warm-up, independently of chart lookback. Check the reported warm-up count for long indicators and actual coverage for recent listings. Intraday history is limited to seven days for one-minute bars and 60 days for other intervals; shorten scoring dates or use daily bars. Missing backtest price bars are added to the chart without resetting its zoom or templates.
Maximum 10,000 bars and 64 plots, with 120 compiler checks per UTC day. Your plan limits combined active indicators and strategies per chart; see Pricing. Every account has a cap of 50 accepted strategy backtests per UTC day, regardless of plan. Removing a chart item frees a slot, not a daily backtest run. Complex studies may need shorter ranges to fit the bounded worker. Runs expire after seven days. No fees are assumed beyond the costs you enter. Results are research, not investment advice.
Write an indicator or a simulated strategy for the active ProCharts ticker. This guide covers the OpenScript 0.8.1 features supported here. Reading it does not change your draft or run a script.
No matching topics. Your current chapter stays open.
Begin with version 1 and a study() declaration. Use overlay=true for a price overlay or overlay=false for a separate pane. Values are calculated from the selected chart's adjusted OHLCV bars.
version 1
study("My EMA", overlay=true)
length = input(20, "Length")
plot(ema(close, length), "EMA", aqua)
input() defines a default in your source. Change that default to change the calculation. plot() draws a numeric series; this example draws the exponential moving average of close over 20 bars. An indicator does not place orders.
Use open, high, low, close and volume for the current bar. bar.index is the bar index, including warm-up. Functions such as sma(close, 20), ema(close, 20), rsi(close, 14) and atr(14) calculate series from server-fetched history.
crossUp(fast, slow) detects a crossing above and crossDown(fast, slow) a crossing below. Put conditional actions in an indented block after if. Daily runs request up to 366 calendar days before scoring for warm-up; inspect the reported count rather than assuming every indicator has enough history.
Use strategy() instead of study(). This example buys one share on an EMA crossover and closes the full position on the opposite crossover. It has no stop-loss and can lose money.
version 1
strategy("EMA crossover", capital=10000, qty=1, fillOn="nextOpen")
fast = ema(close, 10)
slow = ema(close, 30)
if crossUp(fast, slow)
buy()
if crossDown(fast, slow)
close()
plot(fast, "Fast average", aqua)
plot(slow, "Slow average", orange)
Match declaration capital to Run settings. Orders use whole-share units; use qtyType="units" if specifying the quantity type. Only long-only market entries and full-position closes are supported. No shorts, leverage, pyramiding, partial exits or live trading.
Completed-bar signals fill at the next scoring bar's open. Warm-up bars cannot trade and the final bar cannot fill an order without another scoring bar. Set fees and slippage in Run settings, not in the declaration. Open positions are marked at the final close, not forcibly sold.
Return to Source code and choose Check code to see compiler diagnostics. Review the ticker, timeframe, scoring dates, capital and costs before choosing Run backtest for a strategy or Run & apply for an indicator. Compiler checks and runs consume separate daily allowances.
Results and chart plots are frozen snapshots, not live signals. Each successful run adds its indicators without removing earlier ones. Failed or cancelled runs leave existing indicators unchanged. Editing your draft does not update an old result. Remove individual indicators from the chart, or use Remove all chart snapshots. Changing display type keeps snapshots and their original prices; changing ticker, interval or account clears them.
Custom chart templates save native indicators and applied script or strategy setups, including exact source, scoring dates, capital, costs and styles. Applying a script template checks chart capacity before asking to rerun it on the destination ticker. Each saved strategy consumes one daily backtest run; each script occupies one chart slot regardless of its plot count. Frozen results are not saved in templates, and merely opening a saved chart does not rerun scripts.
New indicator lines receive distinct chart colors without recoloring earlier indicators. Directional colors, candles and fills keep their study meaning. Chart display colors do not change the script source or frozen results.
Use an indicator's gear on the chart to change its settings. Native indicators offer inputs and styles; frozen script snapshots offer styles only. Use Cancel or Escape to discard display edits. To change a snapshot's calculation, edit its source and run it again.
Backtest results offer Chart + key stats and Trades with each position's PnL. Expand a trade for entry and exit details. Select an entry or exit to locate its simulated fill on the main chart, or compare the PnL chart with buy and hold using the same tester costs. All BUY and SELL markers are simulated fills, not real orders. Historical results on adjusted Yahoo prices are research, not executable quotes or investment advice.
Use Explanation to describe purpose, calculations, inputs, usage and limitations. Headings, lists, bold and inline code are supported; HTML remains text.
Save private revision keeps your script private. Publishing requires a saved revision, successful compilation, an explanation and explicit source-disclosure consent. Community can read and clone the published source and explanation; your runs and tester settings stay private. Clone a Built-in or Community script before editing it.
Use line, marker-line, step, area, histogram, column and candle plots, including dynamic colors. Fills, levels, drawing objects and tables are included in the frozen snapshot. Alert conditions are listed as historical matches, not live notifications. Other-symbol or other-timeframe requests remain unsupported. Native ProCharts source buttons show labeled OpenScript counterparts; the native renderer is not replaced.
Maximum 120,000 source characters, 64 plots and 10,000 bars, within a 128 MB, 30-second worker and 8 MB result limit. Complex studies may require shorter ranges. Up to 120 compiler checks and 50 accepted strategy backtests per UTC day on every plan. These daily caps reset at 00:00 UTC. Reports expire after seven days. Unsupported features produce diagnostics rather than silently running.
Native indicators, including Volume, and applied scripts share one active-item limit per chart. Hidden items still count. Removing an item frees a slot; repeated indicator runs do not consume a daily backtest allowance. Each script counts once, even with multiple plots or no trades. Use Remove all chart snapshots to clear scripts without visible layers. Over-limit saved charts and templates are kept but cannot be restored until they fit your plan. Existing selections are never silently pruned.
Run submissions have a separate 120-check daily validation safety cap, including invalid or quota-rejected submissions. Accepted strategy backtests count against their daily allowance even if later cancelled or failed.
Describe the purpose, calculation, inputs, use, assumptions and limitations. Publication makes this explanation and the saved source revision public. Runs and tester settings remain private.
Use # headings, - list items, **bold** and `inline code`. HTML is displayed as text.
Simulated trades. No real orders.
Run a script to see its results. Study plots do not imply simulated trades.
Everyone in Community can read and clone this saved source and explanation. Runs and tester settings stay private. Unpublishing cannot recall clones.
Choose a starting point. Saving does not publish.
No matching scripts in the loaded entries. Change the search or type filter.
Native indicators and strategies share a per-chart limit; Volume counts. Removing an item frees a slot. All plans allow 50 backtests per UTC day. Failed or cancelled accepted backtests still count.
Only loaded rows are exported. Blank bounds include all loaded times.
Choose what to follow. Manage every alert in one place.
Your details and how you sign in. Nothing here is shown to anyone else.
Explore index-basket valuations.
Loading valuations...
No saved observations yet.
NSE, BSE and MSEI in the Capital Market Segment. Amounts in INR crore.
Net = FII/FPI net + DII net.
All series are hidden. Select a legend to show it again.
| Date | FII buy | FII sell | FII net | DII buy | DII sell | DII net | Net |
|---|
Warm and refresh the shared screener and transcript caches, and schedule them to keep themselves up to date.
Daily incremental updates run automatically in SyncApp. Use the controls below for full historical P/E, P/B and P/S rebuilds, separately for each index. Saved results remain available until replacement. These jobs do not resync source filings or index membership.
Run duration is wall-clock time from start to finish, including retries. Queued runs show queue wait only. Active runs update while this page is visible.
On smaller screens, scroll the table sideways for queued times and queue wait.
Loading run history...
| Run | Type | Status | Run duration | Queued | Queue wait |
|---|
P/E = sum(price × shares) / sum(LTM EPS × shares). P/S divides the paired market-cap sum by LTM sales. Annual reports already represent twelve months. Only reports available before each chart date are used; an older available LTM need not match the newest quarter.
P/B uses the newest available complete book snapshot and its own shares. Missing inputs are excluded from both sums. Known zero and negative contributions remain; a zero denominator produces a gap. A negative denominator is shown with its sign, not as a meaningful positive multiple.
Prices are split-only adjusted, with report shares and per-share amounts normalized to that basis before LTM assembly. No dividend adjustment. Periods spanning a split between period end and filing are excluded because their reported share basis is ambiguous. Current stored filings may contain restatements: this is reconstructed history, not a vintage-preserving or official free-float index. Duplicate issuer listings and unqualified currencies are excluded. Coverage counts are not market-cap coverage.
| Market | Universe | Loaded | Last updated | Actions |
|---|
Warm fetches only the stocks that are missing or stale. Refresh force-re-fetches every stock in that universe (slow for “All”). Warm missing (under a market) warms every not-fully-loaded universe in that market at once. The job now retries throttled fetches and only gives up on genuinely un-fetchable symbols (shown below). One job runs at a time. The auto-refresh cadence below force-refreshes the whole universe server-side on a schedule, even when no one is on the page.
Active users and last activity use recognized browser interactions in the selected rolling window. Background jobs, automatic watchlist reads, install detection and system events do not count. Rows without browser metadata are excluded. Stock totals and app-install counts are separate. The activity log below includes all recorded events.
| User | Stocks added | Added in window | Human activity in window | Top actions | Last human activity |
|---|
Uses the time window above. Counts recorded visits including crawlers, not unique people or human actions. Locations are approximate. Crawler labels match recorded IPs to current official Google/Bing ranges, not historical ownership or verified requests. Possible crawler means User-Agent evidence only; unclassified does not mean human. Possible automation means at least 60 visits to 20 different pages in one UTC minute within this window. Shared networks and batched logging can also produce bursts. Visits without an IP are excluded.
| IP address | Location | Visits | Last visit |
|---|
Enterprise, Data API and Partnership enquiries from Contact Sales, newest first, across all time (not the window above). Expand an enquiry for its product, contact details and full project description. Earlier email-only enquiries are not included.
Crawler labels use the same current IP-range evidence as the anonymous table. Possible automation means the IP recorded at least 60 anonymous visits to 20 different pages in one UTC minute within this table's window. Shared networks and batched logging can also produce bursts; this is not proof of a bot. Raw device, browser and activity values are unchanged.
Every row recorded in activity_log, newest first. Filters and paging are applied on the server, so they search the whole table rather than the rows on screen.
| ID | Time (UTC) | User | Action | Detail | Region | Location | IP | Device | Browser |
|---|
How the APIs readers actually call are behaving, and how the background sync jobs are doing. A failure is a 5xx or an unhandled exception — a 4xx is counted separately as a client error, so an endpoint that validates its input does not look broken. Reliability is (calls − failures) / calls. API timings are recorded into hourly buckets and flushed every minute, so the last minute may be missing.
Azure Monitor for investwithai, last 30 days through the last completed hour. Times are UTC; weeks start Monday. This history is independent of the API/job window above.
Percentage of available capacity used on FlaskApp's hosting plan, including all apps and platform usage on that plan. CPU and memory show averages of available hourly percentages; memory also shows the highest reported peak. Azure combines plan instances. Missing samples stay blank, not zero. Results are cached for up to 5 minutes.
| Period (UTC) | Avg CPU (%) | Avg memory (%) | Peak memory (%) | Hours: CPU / avg / peak / expected |
|---|
Azure Monitor for investwithai-sync, last 30 days through the last completed hour. Times are UTC; weeks start Monday. This history is independent of the API/job window above.
Percentage of available capacity used on SyncApp's hosting plan, including all apps and platform usage on that plan. CPU and memory show averages of available hourly percentages; memory also shows the highest reported peak. Azure combines plan instances. Missing samples stay blank, not zero. Results are cached for up to 5 minutes.
| Period (UTC) | Avg CPU (%) | Avg memory (%) | Peak memory (%) | Hours: CPU / avg / peak / expected |
|---|
Ordered by number of failures. Select a row to see why it failed.
| API | Method | Calls | Failures | Client errors | Reliability | Why |
|---|
Ordered by average server time, not by the worst single call — one cold start is not a slow endpoint.
| API | Method | Calls | Avg | Slowest | Reliability |
|---|
Every endpoint called in this window, least reliable first.
| API | Method | Calls | Failures | Client errors | Avg | Reliability |
|---|
Failed and partial runs with their message. A run that merely had failing tasks carries its reasons on the tasks, so those are shown underneath.
| Job | Outcome | When | Took | Failed tasks | Message |
|---|
| Job | Runs | Avg | Longest | Tasks done | Tasks failed |
|---|
A partial run counts against reliability; a cancelled one does not — a deploy stops the worker mid-run by design, and counting that would track how often we ship rather than how well the jobs work.
| Job | Runs judged | Succeeded | Partial | Failed | Cancelled | Reliability |
|---|
Warm and refresh the shared mutual-fund universe (AMFI Direct-Growth schemes, NAV history via mfapi.in). Warm fetches only missing or stale funds; Refresh re-fetches every fund in that category (slow for “All”). The auto-refresh cadence below warms every category on a schedule, server-side, even when no one is on the page. One fund job runs at a time.
| Category | Loaded | Last updated | Actions |
|---|
A stock's Q-Score is recalculated every time that stock is refreshed, but a fund's Avg Q-Score is a stored holding-weighted average of its constituents' scores, so nothing recomputes it on its own — this job does. It sweeps the whole cached universe, oldest-scored scheme first, and also refreshes Avg Technical Upside% and Avg Analyst Upside% alongside it. It costs one fund-detail request per scheme, so it is scheduled separately from the warm above; weekly is the sensible cadence. It also snapshots each fund's holdings and descriptive info, which the Fund Detail page then serves from this cache instead of calling Groww itself. Recompute now runs the same sweep immediately.
Pre-fetch earnings-call transcripts for every stock in the covered indexes (membership read from the index_constituents table) into the shared earning_call store, so the Earnings Call page answers from the database instead of waiting on a provider. Sync due checks each ticker's next earnings date (cached, refreshed about once a quarter) and only fetches the ones that have reported since we last stored a report — the cheapest pass, and what the schedule runs; Sync new re-checks every ticker and stores only reports that became newly available since its last sync; Prefetch skips tickers fetched in the last 30 days; Refresh all re-fetches everything (slow). The auto-refresh cadence below runs Sync due on a schedule. One job runs at a time; each run's synced reports are listed under Recent syncs. Only the 4 most recent reports are kept per company — storing a newer one evicts the oldest.
| Market | Indexes | Stored | Actions |
|---|
Official source coverage for S&P 500, Nasdaq-100 and NIFTY 500 companies. Updated means a reviewed source is registered, not that a transcript is available. Pending sources need registration, access review or parser support. Missing means no reviewed source is on record.
Reads primary regulatory documents straight from the source — no model, no vendor, no API key. United States (SEC EDGAR): XBRL financials parse each 10-Q/10-K's tagged facts into sec_xbrl_financials (the source behind the Financials page, including the revenue/segment breakdowns); Form 4 records every insider trade into sec_form4, distinguishing an open-market purchase from a vest or a tax withholding; 13F-HR records what a curated set of active institutional managers holds, into sec_thirteenf. India (NSE/BSE): the exchange's XBRL result filings land in the same financials table, PIT insider disclosures are India's Form 4 analogue and share sec_form4, and the quarterly shareholding pattern — an issuer-side promoter / public / employee-trust split rather than a per-manager holdings list — lands in nse_shareholding. Only 13F is US-only: it has no Indian equivalent, and India's shareholding pattern has no US one.
Full sync seeds a market from scratch — a year of Form 4 / PIT history per ticker, two quarters per 13F manager, and as much XBRL history as that market's XBRL history selector asks for (1–10 years, or everything the source still serves) — and takes hours. Deeper history costs proportionally more time: each company files four periodic reports a year and every one is parsed individually, so ten years is roughly three times the work of the three-year default. Incremental sync is exactly what the schedule runs, and only asks for what can have changed: XBRL takes each company's newest filing (the history selector does not apply), Form 4 pulls the market-wide filing index for the last few days (one request for the whole universe, not one per ticker), and quarterly holdings do nothing at all outside their filing window, because a book is frozen between deadlines. Recommended cadence: daily. An insider must file within two business days of trading, so anything slower reports the news late; XBRL lands with the periodic report a median of one day after the earnings release; and the 13F window opens itself four times a year (14 Feb · 15 May · 14 Aug · 14 Nov) without costing anything on the other ~300 days.
| Dataset | Stored | Companies | Latest | Incremental strategy |
|---|
These checkboxes control the scheduled US run only — the ones beside the manual sync buttons below are separate. XBRL always runs and has no checkbox: this pass is the only thing that syncs structured financials — nothing else pulls a company's 10-Q/10-K — so switching it off would stop the Financials page updating entirely. Datasets run in order (XBRL → Form 4 → 13F) and each waits for the one before it.
These checkboxes control the scheduled India run only. XBRL always runs and has no checkbox, for the same reason as the US group. The two India boxes are separate documents: PIT insider disclosures are the Form 4 analogue (individual trades), while the shareholding pattern is the issuer's quarterly promoter / public / employee-trust split — it travels on the same dataset slot as 13F because it answers the same "who owns this" question, so switching it off leaves ownership stale even though insider trades keep flowing.
US and India XBRL issues awaiting manual retry. Partial means statement data was saved but balance-sheet coverage is incomplete; repeating the same parse is stopped. Paused means fetching or storing failed. Unlisted means SEC could not resolve the issuer, not confirmed exchange delisting. Filing issues affect only that period; discovery issues affect the ticker's XBRL. Other datasets continue.
Expand a ticker to see its filing or discovery issues. Counts reflect this page and the selected filters.
Keep the per-user stocks watchlist rows up to date server-side, even for tickers nobody has opened. A ticker is due when it has never been fetched, when it was last fetched on or before the company's latest earnings report (so the stored numbers predate results that already exist), or when it was last fetched more than 90 days ago. Report dates come from the earnings calendar the transcript sync already maintains. Refresh due fetches only those; Refresh all re-fetches every ticker (slow). Each ticker is fetched once and merged into every user's row that holds it. The auto-refresh cadence below runs Refresh due on a schedule. One job runs at a time.
How completely the structured filings store (sec_xbrl_financials) is populated, per metric and per region. The Financials page renders only what was stored, so a line item the extractor never populates is invisible — it simply does not appear, which reads as “the company does not report this” rather than as a gap. A metric at or near 0% filled is therefore a mapping bug, not a disclosure fact, and this is the only place it shows up. Percentages are of that region's own row count, so the two columns are comparable in share but not in absolute rows. Click any column heading to sort.
The section above asks whether a stored row is filled; this one asks whether the row exists at all. Every stored filing is folded onto the calendar quarter its period ends in — a 10-Q, an Indian quarterly result and a 10-K all land on a quarter boundary, and a 10-K's period end is its fiscal Q4 end, which is exactly the column the Financials page derives Q4 from — so this counts renderable quarters, not filings. The window ends at the newest quarter that market has actually reached, not at today, because a quarter that is simply not reported yet is not a gap. Each absence is then split by why it is absent: quarters before the stock's first filing, quarters still inside ordinary filing lag and quarters a delisted stock will never file are facts about the company, while a hole with filings on both sides — or a live index member that has fallen behind — is ours. Only the last two are worth chasing, and the Real gaps column counts only those.
Every third-party feed the app depends on, grouped by the functionality it serves, with whether its credential is actually set on this instance. Keyless is a deliberate design choice throughout — the exchange and regulator feeds need no account — so it is a healthy state, not a gap. Not configured means that source is currently unavailable and whatever depends on it is running on its fallback.
Every HTTP endpoint this app exposes, with what it is for and a worked request and response. The list is discovered from the running app's own routing table, not hand-maintained, so it cannot fall behind the code — a route added tomorrow appears here on the next load, marked undocumented until its entry is written in api_catalog.API_DOCS. Samples are illustrative literals: opening this page makes no upstream call and reads no user data.
Every background job now runs in a separate worker process, not inside the web app. A card's “Run now” only puts a run on the queue; the worker claims it, splits it into units of work and records each one. That is what makes a sync survive a deploy: whatever was mid-flight simply loses its lease and is picked up again, rather than vanishing with the process that was running it.
Each unit keeps its own attempt count, backoff and last error, so a failure is recorded rather than retried invisibly. A run that finished with some units still failing is marked partial — expand it to see exactly which ones and why, then retry just those. Only one run per job is ever in flight; that is enforced by the database, not by this page.
The four digest jobs are ordinary queue jobs, but they run as often as hourly, so the history above leaves them out by default — tick “Include alert digests” there to see the individual runs. This is the part the run rows cannot tell you anyway: what went out each day, by alert type, and what failed. A run that succeeded having found nothing is normal and common — only the sends table distinguishes it from one that mailed hundreds of findings.
Two questions about alerting, answered side by side: how many alerts we have actually sent, by type and by frequency, and how many readers have configured each type and frequency. Sends are counted from a ledger written at the moment an email goes out, so an alert someone has since edited or deleted is still counted — the configuration table alone could not tell you it ever fired.
A finding is one thing worth reporting; a digest is one email, which may carry several. Rules and readers are counted separately on purpose: one reader with twelve price alerts is a very different signal from twelve readers with one each.
Configure background job timing and throughput. Changes are stored in SQL; workers pick up most settings within a minute. Each field explains any delayed effect. Filings leases apply to newly claimed runs, not existing claims or running workers. Default shows the value restored by Reset. Values are range-checked.
The Azure AI Foundry wiring behind AI Insight and the earnings-call metrics, plus every prompt the models are given. An edit is stored in SQL and applied immediately — the other worker picks it up within a minute. Default is the App Service app setting (or the built-in value) the app started with, so Reset always restores it. The API key is write-only: once saved it is never sent back to this page.
These are sent verbatim to the model. The system prompt is what forbids outside knowledge, buy/sell calls and price targets, and what tells the model to treat stock data as untrusted input — weakening it weakens those guarantees. Existing summaries are cached and are not regenerated by an edit; use a card's ↻ Refresh to rewrite one. For the extraction prompts, bump the prompt version so stored metrics are re-extracted.
The Q-Score puts every input on the same 0–100 scale before comparing them. Each metric gets a straight line between a low anchor, which scores 0, and a high anchor, which scores 100; anything beyond either end is clamped. The quality metrics are averaged into the Q-Green-Score, the valuation multiples into the Q-Black-Score, and Q-Score = Q-Green-Score − Q-Black-Score, so it always lands between −100 and +100.
The anchors are absolute, not peer-relative, on purpose: a score has to mean the same thing in every watchlist, and a percentile against neighbours would move a stock's score when the neighbours change. Widening a range makes that metric less decisive; narrowing it makes it more. A multiple that is missing because the company loses money is scored at the maximum expensive end rather than skipped, which is what stops losses from flattering a score. Edits are stored in SQL and apply within a minute on every worker; they do not rewrite already-stored scores — those refresh as each stock does.
Configure each tier's watchlists, financial history, saved visuals, monthly AI allowances, combined active ProCharts items per chart, total alerts, prices and trial. Privately assigned Pro inherits Advanced benefits unless overridden here, with its own alert allowance and no purchase or trial. Otherwise, admins and entitled subscribers receive Advanced; other readers receive Basic. This card changes benefits, not membership.
Edits are stored in SQL and apply within a minute on every worker, including the out-of-process sync worker. The same numbers are served to the public pricing cards through /api/plans, so a change here moves the marketing copy as well — which is the point: hand-written copy drifts from the cap the server enforces. Stocks treats 0 as unlimited; Alerts is one total across all types, including paused alerts, where 0 prevents additions and stops delivery. ⚠ Watchlists is advertised but not yet enforced — there is no per-user watchlist cap. Prices are in INR. ⚠ Changing a price here does not change what an existing mandate debits — a provider plan’s amount is immutable, so mint a new one from the Billing card afterwards.
Manage API access for a registered email. These controls are separate from website plans and are not changed by Reset all to defaults.
Data readiness is advisory and does not block checkout. Review it before enabling purchases; API reads still enforce release and membership rules.
Hidden by default. Enabling this allows an active API account to purchase INR 3,000 / 3 months, INR 5,500 / 6 months or INR 10,000 / 1 year when payment configuration is ready; it does not grant paid access. Disabling it does not revoke existing paid access or cancel an existing payment.
Cashfree one-time purchases: select Cashfree to enter the PG sandbox App ID and Secret Key below. Set Accept one-time PG payments to 1 and leave PG production mode at 0 for sandbox. Production has separate credential fields. Prices include GST: 30 days ₹99, 90 days ₹249, 180 days ₹499, 365 days ₹999. Eligible new users can buy a 30-day trial for ₹1 or receive 30 additional trial days with a regular paid option. Both use the once-only trial allowance. Trial availability follows the trial policy; the one-time trial duration and price are fixed at 30 days and ₹1. Remaining trial days are preserved; existing orders keep their recorded terms. No automatic renewal. Sandbox payments never grant real access or consume the trial. All one-time options require enabled PG payments and verified payment.
Whitelist vroomstocks.com in Cashfree and enable UPI, cards and net banking. PG webhook URL: /api/billing/prepaid/webhook/sandbox. Subscribe to payment success, failed and user-dropped events. Use the PG API Secret Key for signatures; do not copy a legacy webhook secret into PG fields. Keep the legacy Accept payments switch off for new purchases.
⚠ A secret is never shown again once saved — only whether one is set. The webhook signature is the security boundary of the whole feature: entitlement is granted only by a callback whose HMAC verifies, never by the browser. Cashfree issues no separate webhook secret — it signs with the key secret above, so leave that field blank; Razorpay does issue one and needs it filled in. Point the provider at /api/billing/webhook/cashfree and subscribe it to its subscription events. Create plan appears only for Razorpay, whose plan amounts cannot be edited — mint a new plan after any price change or customers keep paying the old one. Cashfree sends the price inline with every subscription, so it needs no plan step and cannot drift.
⚠ Test legacy mandate checks the old recurring credentials, not the PG keys. It creates a subscription in the provider’s sandbox, resolves the authorisation link and cancels it again. It refuses while legacy Live mode is on. Verify the separate PG integration with a sandbox checkout before enabling production purchases.
Delegate the admin console to another address, and raise a single user's AI allowance above the plan default. Both lists are stored in SQL and picked up by every worker within a minute.
An address here gets the whole admin console — every sync job, every user's analytics and every setting on this page. Grant it sparingly. The owner is compiled into the app rather than stored as a row, so it can never be removed and no database edit can lock it out; for the same reason, only the owner can grant or revoke admin — a delegated admin that could delegate further would let one compromised account entrench itself. Delegated admins see this list but cannot change it.
Overrides for one address. Daily is the anti-burst ceiling on generations per UTC day; Summaries and Insights are the monthly plan caps for earnings-call summaries and the four insight kinds. Leave a box blank to keep that bucket on the default. Admins are already exempt from the monthly caps, so this is for normal users. Any admin can set these — it moves a spend cap, not access.
One-off checks that touch the real outside world. Use them to verify a template or a provider end-to-end without creating an account.
Sends the onboarding email — the same one a new user gets after verifying their address (email/password) or on their first page load (Google sign-in) — to any address you type here. This is a real send through Resend, and it deliberately does not touch the send-once ledger: testing against an address never uses up that person's actual welcome email, and you can repeat it as often as you like. Preview renders the same HTML in a new tab without sending anything.
Search for any listed company to open its analysis page.
Signals are not investment advice.
Trend direction & support/resistance. Price above rising MAs = uptrend; MA crossovers signal trend shifts.
Long while price is above its 200-bar SMA; in cash below it.
Long while the 12-bar EMA is above the 26-bar EMA; in cash below. Reacts sooner than the SMA cross.
Go long on a break above the prior 20-bar high; exit on a break below the prior 10-bar low.
Volatility envelope. Price tagging the upper/lower band signals stretched moves; band squeeze = low volatility before a breakout.
Momentum oscillator. Above 70 = overbought; below 30 = oversold.
Trend & momentum. MACD crossing above its signal line is bullish; the histogram shows momentum strength.
Momentum oscillator. Above 80 = overbought; below 20 = oversold. %K crossing %D is a signal.
Cumulative volume flow. Rising OBV confirms an uptrend; divergence from price can foreshadow a reversal.
Trend strength. ADX above 25 = strong trend; +DI over −DI = bullish, the reverse = bearish.
Higher ATR = wider candle ranges; used for stop placement & position sizing.
Momentum oscillator. Above −20 = overbought; below −80 = oversold.
Deviation from average price. Above +100 = strong upward move; below −100 = strong downward move.
Standing positions per strike. Large call-OI strikes act as resistance; large put-OI strikes as support.
Contracts traded today per strike. Volume far above open interest flags fresh positioning / unusual activity.
IV across strikes for this expiry. A steep put-side skew (higher IV on downside strikes) signals demand for crash protection.
Total in-the-money value owed to option holders at each price. The minimum (max pain) is where most options expire worthless — price often gravitates there into expiry.
Estimated dealer gamma. Positive = dealers dampen moves (pinning); negative = dealers amplify moves. The zero-cross is the gamma-flip level.
ATM implied volatility across expirations. Upward slope (contango) = calm; near-term spike (backwardation) = event/stress risk.
Above 1 leans bearish (often read contrarian-bullish at extremes); below ~0.7 = call-heavy / bullish.
| # | Side | Date | Price | Shares | P&L |
|---|
Summaries use the earnings-call transcript, or the company's SEC filing when no transcript is available. Each quarter is stored separately.