Finviz Scraper – Stock Fundamentals, Analyst Ratings & News
Pricing
from $5.00 / 1,000 ticker scrapeds
Finviz Scraper – Stock Fundamentals, Analyst Ratings & News
Give it tickers like AAPL, SPY, EURUSD or BTCUSD and get one row each. Stocks and ETFs return Finviz’s full ~80-field snapshot (P/E, market cap, RSI, beta), analyst ratings, institutional holders, peers and headlines; forex, crypto and index futures return last, high, low and 300 daily closes.
Scrapes detailed stock, ETF, index, forex, crypto, and futures data from Finviz for any list of tickers you provide. Just give it tickers like AAPL, SPY, EURUSD, BTCUSD, or NQ — no need to tell it what asset class each one is, the Actor figures that out automatically. Try it now, or run it via the Apify API, schedule it to run daily, or plug it into your own pipeline with integrations for Zapier, Make, Google Sheets, and more.
What can I use it for?
Finviz packs an unusual amount of fundamental, technical, and sentiment data onto a single ticker page — valuation ratios, ownership, analyst ratings, and news — but there is no official API and copy-pasting does not scale. This Actor is built for:
- Portfolio and watchlist monitoring — pull fresh valuation and technical stats for a list of holdings on a schedule.
- Screening and research pipelines — feed structured fundamentals into your own models or spreadsheets instead of re-deriving them from scratch.
- Cross-asset dashboards — a single input list can mix stocks, ETFs, forex pairs, crypto pairs, and futures contracts across all seven of Finviz's groups.
- Institutional ownership tracking — the top managers and funds holding a stock come back as structured records with their ownership percentages, not as table text.
How do I run it?
- Open the Actor's Input tab.
- Add the tickers you want to scrape to the
tickersfield (e.g.AAPL,MSFT,SPY,EURUSD,BTCUSD,NQ), or paste Finviz URLs intostartUrlsinstead. - Optionally adjust
maxConcurrencyor the proxy settings. - Click Start and download the results from the Output tab once the run finishes.
What input does it take?
| Field | Type | Description |
|---|---|---|
tickers | array of strings | Required. Tickers to scrape. Any mix of stocks/ETFs/indices (AAPL, SPY), forex pairs (EURUSD), crypto pairs (BTCUSD), and any of the 59 futures contracts (NQ, GC, ZB, ZC, 6E). Case is normalised and duplicates are dropped. Prefix a ticker with FUT: to force the futures contract when the root is also a stock symbol (FUT:ES, FUT:CL). |
startUrls | array of URLs | Optional. Finviz URLs to scrape, instead of or on top of tickers. See Can I pass Finviz URLs instead of tickers? below. |
maxConcurrency | integer | Optional. Maximum number of ticker pages fetched in parallel. Default 10, maximum 50. |
proxyConfiguration | object | Optional. Finviz answers 403 to Apify's datacenter IPs, so Residential Apify Proxy is preselected. |
Example input:
{"tickers": ["AAPL", "SPY", "EURUSD", "BTCUSD", "NQ"],"maxConcurrency": 10,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Can I pass Finviz URLs instead of tickers?
Yes. Put them in startUrls — which is the Console's URL-list editor, so you can type them, paste a list, or point it at a file or Google Sheet — or simply paste one into the tickers field, which is also accepted. Either way the Actor reads the symbol out of the URL's t= parameter and then scrapes it exactly as if you had typed the symbol, so the row you get back is identical.
These shapes work:
| URL | Gives you |
|---|---|
https://finviz.com/stock?t=AAPL | AAPL — the current quote-page URL |
https://finviz.com/quote.ashx?t=AAPL | AAPL — the older spelling, which Finviz still redirects |
https://finviz.com/forex?p=d&t=EURUSD | EURUSD |
https://finviz.com/crypto?p=d&t=BTCUSD | BTCUSD |
https://finviz.com/futures?p=d&t=NQ | NQ |
https://finviz.com/screener?v=111&t=AAPL,MSFT,SPY | AAPL, MSFT, SPY — one row each |
Extra query parameters (&p=d&ty=c&ta=1) and #fragments are ignored, case does not matter, the www. and elite. hosts and the _charts.ashx chart URLs are fine, and a bare finviz.com/quote.ashx?t=MSFT without the scheme works too. A symbol that arrives twice — once as a ticker, once inside a URL — is scraped and charged once.
These are deliberately not supported, and come back as free error rows rather than failing the run:
- Filter-only screener URLs such as
https://finviz.com/screener?v=111&f=cap_large. They name a result set, not symbols, and this Actor does not crawl screener pages. List the symbols with&t=…, or pass them as tickers. - Listing pages with no
t=(https://finviz.com/futures) and any other Finviz page (/news,/map,/groups,/insidertrading) — there is no single ticker to read. - Non-Finviz URLs.
Which tickers are covered?
Each ticker is resolved in this order: stock/ETF/index (Finviz's quote page, tried first because it covers the overwhelming majority of symbols) → crypto → forex → futures. A ticker written with the FUT: prefix skips straight to the futures board instead. A ticker that resolves nowhere still gets a row, carrying an error field, so your output always lines up with your input.
A bare symbol that is both a stock and a futures contract resolves as the stock. ES returns Eversource Energy, not the S&P 500 future; CL returns Colgate-Palmolive, not crude oil. To ask for the contract instead, prefix the symbol with FUT: (or FUTURES:): FUT:ES is the S&P 500 future, FUT:CL is crude oil. The prefix only changes which namespace is searched — the row it returns is an ordinary futures row and its ticker field carries the bare symbol (ES), so a run can carry both ES and FUT:ES and tell them apart by assetType.
22 of the 59 contract roots need the prefix, because a live stock or ETF already owns the bare symbol:
| Root | Contract | Bare symbol returns instead |
|---|---|---|
ES | S&P 500 | Eversource Energy |
DY | DAX | Dycom Industries |
CL | Crude Oil WTI | Colgate-Palmolive |
NG | Natural Gas | Novagold Resources |
RB | Gasoline RBOB | ProShares Russell 2000 Dynamic Buffer ETF |
UX | Uranium | Roundhill Uranium ETF |
G | Gasoil | Genpact |
HG | Copper | Hamilton Insurance Group |
PL | Platinum | Planet Labs |
SI | Silver | Shoulder Innovations |
ZS | Soybeans | Zscaler |
ZM | Soybean Meal | Zoom Communications |
RS | Canola | Reliance |
CC | Cocoa | Chemours |
SB | Sugar | Safe Bulkers |
KC | Coffee | Kingsoft Cloud |
LB | Lumber | Landbridge |
LC | Live Cattle | Happen Inc |
LH | Lean Hogs | Labcorp Holdings |
FC | Feeder Cattle | Franklin Covey |
DX | USD | Dynex Capital |
BTC | Bitcoin | Grayscale Bitcoin Mini Trust ETF |
The other 37 roots — GC, NQ, YM, ZB, ZN, ZC, ZW, CT, 6E and so on — are not stock tickers, so they resolve to the contract with no prefix needed.
Stocks and ETFs are whatever Finviz covers: NYSE, NASDAQ and AMEX listings. A foreign company with a US primary listing is fine (BABA resolves), but OTC and pink-sheet symbols are not on Finviz at all (NSRGY, TCEHY return 404 there), so they come back as error rows here.
The non-stock asset classes are fixed lists that Finviz publishes, and both are read in full:
| Asset class | Symbols |
|---|---|
| Forex (10) | EURUSD, GBPUSD, USDJPY, USDCHF, USDCAD, AUDUSD, NZDUSD, EURGBP, GBPJPY (and BTCUSD, which resolves as crypto instead) |
| Crypto (40) | BTCUSD, ETHUSD, XRPUSD, SOLUSD, BNBUSD, DOGEUSD, ADAUSD, TRXUSD, LINKUSD, AVAXUSD, XLMUSD, SUIUSD, LTCUSD, BCHUSD, DOTUSD, HBARUSD, UNIUSD, AAVEUSD, NEARUSD, APTUSD, ATOMUSD, ICPUSD, OPUSD, POLUSD, RENDERUSD, TAOUSD, SHIBUSD, PEPEUSD, ENAUSD, ONDOUSD, JUPUSD, WLDUSD, ZECUSD, SKYUSD, SUSD, GRAMUSD, HYPEUSD, PUMPUSD, TRUMPUSD, WLFIUSD |
| Futures (59, all 7 groups) | Indices: ES*, NQ, YM, ER2, NKD, EX, DY*, VX · Rates: ZB, ZN, ZF, ZT, TN, UB, ZQ, SR3 · Energy: CL*, QA, RB*, HO, NG*, G*, ZK, UX*, NCF · Metals: GC, SI*, HG*, PL*, PA, ALI, HRC, TIO · Grains: ZC, ZW, ZS*, ZM*, ZL, ZO, ZR, RS* · Softs & Meats: KC*, CC*, CT, SB*, JO, LB*, LC*, LH*, FC* · Currencies: 6E, 6B, 6J, 6A, 6C, 6S, 6N, DX*, BTC* |
* needs the FUT: prefix — a stock or ETF owns the bare symbol (see the table above).
Crypto and forex coverage follows Finviz's own lists and can change without notice, and Finviz adjusts the futures board occasionally too.
What does each row contain?
One dataset row per requested ticker. The shape depends on the asset class. A stock/ETF row (trimmed, from a real run):
{"ticker": "AAPL","assetType": "stock","url": "https://finviz.com/quote.ashx?t=AAPL","companyName": "Apple Inc","logoUrl": "https://logo.finviz.com/AAPL.svg","exchange": "NASD","sector": "Technology","industry": "Consumer Electronics","country": "USA","marketCapGroup": "Mega","price": "341.07","priceChange": "+2.63","priceChangePercent": "0.77","lastCloseDate": "Sep 25 3:59 PM ET","description": "Apple, Inc. engages in the design, manufacture, and sale of smartphones...","stats": { "P/E": "41.46", "Market Cap": "5033.50B", "RSI (14)": "70.21", "...": "83 fields for AAPL" },"analystRatings": [{ "Date": "Sep-18-26", "Action": "Reiterated", "Analyst": "Evercore ISI", "Rating Change": "Outperform", "Price Target Change": "$365 → $380" }],"insiderTrading": [{ "date": 1757908800000, "buyAggregated": 0, "buyTransactionCount": 0, "saleAggregated": 0, "saleTransactionCount": 0 }],"institutionalOwnership": {"managers": [{ "investorId": "2012383", "name": "BlackRock, Inc.", "slug": "blackrock-inc-2012383", "percOwnership": 7.918330943529829 }],"funds": [{ "investorId": "S000002848", "name": "VANGUARD TOTAL STOCK MARKET INDEX FUND", "percOwnership": 3.1746411481950516 }]},"peers": ["MSFT", "GOOG", "META", "AMZN", "NVDA"],"heldBy": ["VTI", "VOO", "IVV", "SPY", "QQQ"],"news": [{ "date": "Sep-26-26", "time": "06:07AM", "title": "...", "url": "...", "source": "Investing.com" }],"financials": { "annual": { "gaapEps": [{ "name": "2017", "value": 2.303 }], "sales": [], "sharesOutstanding": [] }, "quarterly": { "...": "..." } },"scrapedAt": "2026-09-27T08:06:25.922763+00:00"}
A forex, crypto or futures row is lighter — Finviz only exposes quote and chart data for these, no fundamentals:
{"ticker": "EURUSD","assetType": "forex","url": "https://finviz.com/forex?p=d&t=EURUSD","label": "EUR/USD","last": 1.13905,"change": 0.09,"changeUsd": 0.001,"prevClose": 1.13801,"high": 1.14109,"low": 1.13682,"sparkline": [1.14123, 1.15845, "... ~300 daily closes"],"scrapedAt": "2026-09-27T08:06:26.306750+00:00"}
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the Output tab or via the API.
Main fields
| Field | Description |
|---|---|
ticker / assetType | The requested ticker and its detected class: stock, etf, forex, crypto, futures, or null when it could not be resolved |
error | Present only on rows that failed or were not found — otherwise absent |
scrapedAt | UTC timestamp of the fetch, on every row |
stats | Stocks/ETFs. The whole snapshot table as label → value, exactly as Finviz prints it: 83 entries for AAPL, 66 for SPY |
companyName / logoUrl / description | Stocks/ETFs. Name, logo SVG, and the profile blurb |
sector / industry / country / exchange / marketCapGroup | Stocks/ETFs. Finviz's own classification (industry: "Exchange Traded Fund" is what marks a row etf) |
price / priceChange / priceChangePercent / lastCloseDate | Stocks/ETFs. Quote strings as displayed |
analystRatings | Stocks. Date, action, analyst, rating change and price-target change per row (empty for ETFs) |
institutionalOwnership | Stocks/ETFs. managers and funds, each with name, investorId and percOwnership |
insiderTrading | Stocks/ETFs. Finviz's aggregated insider chart series — one entry per period with date (epoch ms), buyAggregated, buyTransactionCount, saleAggregated, saleTransactionCount. Not named transactions |
peers / heldBy | Stocks/ETFs. Correlated tickers, and the ETFs holding this stock |
news | Stocks/ETFs. Recent headlines with date, time, title, URL and source |
financials | Stocks. The free mini series only: gaapEps, sales, sharesOutstanding, annual and quarterly, as {name, value} points. null for ETFs |
label / last / change / changeUsd / prevClose / high / low | Forex/crypto/futures. The quote |
sparkline | Forex/crypto/futures. Roughly the last 300 daily closes |
group / cot | Futures only. Finviz's contract group (Indices, Rates, Energy, Metals, Grains, Softs & Meats, Currencies) and the CFTC commitment-of-traders codes it lists for the contract, e.g. 138741,13874A |
What is in stats?
stats is a passthrough of Finviz's snapshot table, so the keys are Finviz's own labels rather than normalised names — P/E, Forward P/E, PEG, P/S, P/B, Market Cap, Income, Sales, EPS (ttm), Insider Own, Inst Own, Short Float, Beta, ATR (14), RSI (14), SMA20, 52W High, Dividend Est., Current Ratio, Debt/Eq, Avg Volume, and so on. Values are strings in Finviz's display formatting (5033.50B, 70.21, -), including - where Finviz has no value. The exact set of keys depends on the asset: an ETF page has no earnings or margin rows.
Full income statement, balance sheet and cash flow tables are a Finviz Elite (paid) feature loaded dynamically and are not included — financials covers the free mini EPS / Sales / Shares Outstanding series only.
How much does a run cost?
Billing is pay-per-event: one charge per ticker that resolved (see the Pricing tab). A ticker that could not be found anywhere on Finviz is not charged — you still get its row with an error, for free. So the cost of a run is predictable from your ticker list, and a typo costs nothing.
Platform usage stays small: every page is a plain HTTP request with no browser, one request per stock/ETF ticker, while all forex, crypto and futures tickers in a run share nine listing requests in total (one each for forex and crypto, and one per futures contract group), fetched once per run no matter how many tickers you ask for. The Actor runs in 512 MB of RAM by default. Residential proxy traffic is billed per Apify's proxy pricing.
Tips
- Group tickers into one run rather than scheduling one ticker per run — the forex/crypto/futures listing lookups are fetched once per run, and the charge is per resolved ticker either way.
- If you want a commodity, rates or currency contract, write it with the
FUT:prefix (FUT:CL,FUT:NG) even when it is not strictly needed. It costs nothing, it documents your intent, and it keeps working if Finviz later lists a stock under that symbol. - Keep
maxConcurrencymoderate (the default of 10 is a good starting point) and leave Residential proxy enabled; Finviz returns403to datacenter IPs.
FAQ
Do I need a Finviz account, API key, or Elite subscription? No. There is no login and no API key: the Actor reads the same public ticker pages you can open in a browser. It also cannot reach Elite-only content — see the note on full financial statements above.
Why do I need a residential proxy? Finviz answers 403 to Apify's datacenter IP ranges. Residential Apify Proxy is preselected in the input; each ticker is fetched through a fresh proxy session, and a failed page is retried up to three times with a growing delay.
What happens to a ticker that fails or does not exist? It still gets a dataset row, with assetType: null and an error explaining whether it was not found or the request failed. One bad ticker never aborts the run and never costs you a charge, so a run of 500 tickers with 3 typos still returns 500 rows.
If a stock page cannot be read at all (a 403 that survived the retries) and the symbol is also a futures root, you get an error row rather than a guess — the Actor cannot tell whether you meant CL the stock or CL the contract, and silently returning the wrong instrument is worse than saying so. Writing the ticker as FUT:CL removes the ambiguity and is unaffected.
Does it cover international stocks, OTC, or penny stocks? Only what Finviz's free tier covers: NYSE, NASDAQ and AMEX. If you cannot find the symbol on finviz.com, this Actor cannot return it either.
Can I get gold, oil or grain futures? Yes. All 59 contracts Finviz lists are covered, across indices, rates, energy, metals, grains, softs & meats and currencies. Gold is GC; oil and grains need the namespace prefix because a stock owns the bare symbol, so ask for FUT:CL (crude) and ZC / ZW / FUT:ZS (corn, wheat, soybeans). Finviz embeds quotes only for the contract group it is rendering, so the Actor reads the listing once per group and merges the seven results.
Does insiderTrading give me the names of the insiders? No. Finviz embeds an aggregated buy/sell series on the ticker page, and that is what you get: per-period totals and transaction counts. Individual insider names and transaction prices are not in this output.
Can I schedule it or call it from my own code? Yes — schedules, webhooks and the usual integrations all work, and a run is a single API call.
Is this legal? This Actor only extracts already-public data from pages you can view in a regular browser. You are responsible for complying with Finviz's Terms of Service and applicable law in your jurisdiction.
Found a bug or missing field? Open an issue on the Actor's Issues tab.
Finance & markets toolkit
Part of the Finance & markets toolkit — market data and currency conversion for financial research and trading tools:
- Yahoo Finance API Scraper — Yahoo Finance market data via the mobile API: quotes, search, financials.
- Wise Currency Converter Helper — Currency conversion quotes from Wise's public gateway API.
Did you find this useful?
⭐ Rate this actor on Apify! Your feedback helps other users find it and helps us keep improving it.