StockAnalysis.com Stock & ETF Screener
Pricing
from $0.84 / 1,000 results
StockAnalysis.com Stock & ETF Screener
Full US stock and ETF market screener from stockanalysis.com: ticker, name, market cap/AUM, price, day change %, industry/asset class, volume, PE ratio/holdings for the entire tracked universe in one run, with optional ticker or top-N filtering.
Pricing
from $0.84 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
The entire US stock and/or ETF market from stockanalysis.com's own screener pages, in one or two HTTP requests — no pagination, no per-symbol lookups, no authentication.
What you get
market: "stocks" — one SCREENER_SUMMARY + one STOCK row per
ticker: symbol, name, market cap, price, day change %, industry, volume,
PE ratio. 5,610 tickers as of 2026-08-16.
market: "etfs" — one SCREENER_SUMMARY + one ETF row per fund:
symbol, name, asset class, AUM, price, day change %, volume, holdings
count. 5,582 funds as of 2026-08-16.
market: "both" (default) — both of the above in one run.
Rows are pre-sorted by upstream in market-cap / AUM descending order.
Input
{"market": "both","symbols": [],"limit": null}
market—"both"(default),"stocks", or"etfs".symbols— optional ticker whitelist (e.g.["AAPL", "VOO"]), case-insensitive. Applied after the fetch — upstream doesn't support server-side filtering (verified: query strings don't change the response), so this controls rows returned, not requests made. A symbol not found in the fetched universe gets its ownERRORrow.limit— optional cap on rows returned per market, applied after anysymbolsfilter. Since upstream is pre-sorted by size, this is an honest "top N by market cap / AUM", not an arbitrary truncation.
Leave symbols empty and limit unset to get the full market (the
default).
Known limits
1. Column set is fixed. The site's marketing mentions "313 different metrics," but those are only reachable through the site's own client-side JS after the page loads — every query-string combination tested during recon returned an identical server-rendered payload. This actor exposes the 8 fields per market that the server-rendered page actually carries; it does not (and cannot, HTTP-only) request a custom column set.
2. No per-symbol detail pages (financials, dividends, history) yet.
This version is the bulk screener only. See CRAWLING_METHOD.md §7 for
why, and what a follow-up would look like.
3. change is upstream's raw percentage number (e.g. -0.06 means
-0.06%, not -6%), passed through as-is.
Errors are honest, no disguised-200 traps
A bad symbols entry doesn't get silently dropped — it produces an
ERROR row naming the missing ticker and the size of the universe that
was actually searched. SCREENER_SUMMARY rows carry honestCountMatch:
upstream's own claimed total compared against what this actor actually
extracted, checked fresh on every run (not just at build time), so a
future silent truncation on stockanalysis.com's side would show up as
false here rather than quietly under-counting.
Anti-bot posture
None encountered. 3/3 curl_cffi TLS profiles (chrome124/safari17_0/
firefox133) clean 200 on both screener paths, byte-identical response
sizes across profiles — no Cloudflare/Akamai/DataDome/PerimeterX marker
in the response body.
Policy
https://stockanalysis.com/robots.txt has a single User-agent: * group
— no ClaudeBot/anthropic-ai/CCBot/GPTBot-specific group at all. Only
/e/ (analytics beacon, unused here) and /p/ are disallowed, plus three
unrelated named scraper bots blocked outright.