StockAnalysis.com Stock & ETF Screener avatar

StockAnalysis.com Stock & ETF Screener

Pricing

from $0.84 / 1,000 results

Go to Apify Store
StockAnalysis.com Stock & ETF Screener

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

Ibnu Adzim

Maintained by Community

Actor 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 own ERROR row.
  • limit — optional cap on rows returned per market, applied after any symbols filter. 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.