Simply Wall St Stock Analysis Scraper
Pricing
from $2.10 / 1,000 results
Simply Wall St Stock Analysis Scraper
Fundamental stock analysis from Simply Wall St: Snowflake score, valuation ratios (PE/PB/PEG/ROE/ROA), dividend data, ~30 fundamental checks and peer comparison. Look up exact stock URLs or screen ~177,700 companies by market cap and exchange.
Pricing
from $2.10 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Scrapes fundamental stock analysis from Simply Wall St: the Snowflake score (Value/Future/Past/Health/Income), valuation ratios (P/E, P/B, PEG, ROE, ROA), dividend data, ~30-170 individual fundamental checks with plain-English explanations, and peer comparisons — for any of the ~177,700 companies the site covers.
Two ways in: paste exact stock URLs, or screen the whole universe by market cap and exchange.
What you get
One STOCK row per company. A SEARCH_SUMMARY row per screener query
(none for stockUrls — those are direct single-company fetches, not
searches).
Identity (always)
id · company_id · name · slug · ticker_symbol · exchange_symbol ·
unique_symbol · canonical_url · primary_canonical_url · isin_symbol
Full analysis (stockUrls always; screener rows when includeFullAnalysis, on by default)
sector · country · currency · sharePrice · marketCap · peRatio ·
pbRatio · pegRatio · roe · roa · eps · debtToEquity ·
intrinsicDiscountPct · dividendCurrentYield · dividendFutureYield ·
snowflakeTotal and the five named sub-scores (snowflakeValue,
snowflakeFuture, snowflakePast, snowflakeHealth, snowflakeIncome) ·
snowflakeSummary (one-sentence verdict, e.g. "Outstanding track record
with excellent balance sheet.") · fundamentalChecks (the full list of
individual checks — name, area, pass/fail, plain-English description) ·
peerComparison (the peer set Simply Wall St itself compares this company
against) — plus the raw info / score / analysis blocks these are
flattened from.
Input
{"stockUrls": ["https://simplywall.st/stocks/us/tech/nasdaq-aapl/apple"],"screenerQueries": [{ "marketCapMinMillion": 1000000, "exchangeSymbol": "NasdaqGS" }],"includeFullAnalysis": true,"includeFundamentalChecks": true,"maxItemsPerQuery": 20}
stockUrls — the URL slug is NOT cosmetic
Copy exact URLs from simplywall.st or from a previous run's
canonical_url. Unlike several other paste-URL actors in this portfolio,
the trailing slug is validated: .../nasdaq-aapl/apple works,
.../nasdaq-aapl/wrong-slug answers a genuine 404 — it never silently
resolves to a different (wrong) company.
screenerQueries — market cap and exchange only
Each query supports two fields, and they're the only two confirmed to work:
marketCapMinMillion/marketCapMaxMillion— in millions of the listing currency (not always USD).exchangeSymbol— an exact, case-sensitive string as Simply Wall St spells it:NasdaqGS,NasdaqGM,NasdaqCM,NYSE,LSE,TSE,ASX,SEHK, and others not listed here. There's no lookup endpoint to validate against — but an unrecognised value is honest (0 rows), not a silent fallback to the whole universe, so it's safe to experiment.
Every other filter name we tried — market, country, sector,
industry, pe_ratio, dividend_yield, ticker_symbol, isin_symbol —
answered 400 Invalid Rule. This is a narrow discovery grid, not the full
screener behind the Simply Wall St app.
name looks like a filter but does nothing at all. Every operator we
tried (like, contains, match, ilike) returned the exact unfiltered
total. It is not offered as an input — sending it would look like a working
company-name search and silently return the whole catalogue instead.
Two toggles
includeFullAnalysis(default on) — for screener-discovered companies, whether to also fetch the full analysis page. Off gives a fast identity-only list.includeFundamentalChecks(default on) — the checks list is the single largest field per row (up to ~75 KB on a heavily-covered mega-cap). It costs no extra request either way (it's part of the same page fetch); this toggle only controls whether it's kept in the output.
Read this before trusting the numbers
The 10,000-row result window is shared across the WHOLE ~177,700-company
index, not per query. Bisected exactly: offset=9999 still returns a row,
offset=10000 returns zero — honest, not a clamp back to page 1. A scoped
query with its own total under that ceiling (e.g. exchangeSymbol: "NYSE",
~3,500 companies) can be paged to its real end. A broad, unfiltered query
never can — totalMatches can report 177,703 while only 10,000 rows are
ever reachable. resultWindowCapped and reachableWithCurrentWindow on the
summary row make the gap visible instead of silently truncating.
marketCap is in the listing currency, not always USD. Check the
currency field on the same row (only present with the full analysis pass)
before comparing market caps across markets.
Known limits
1. analysis.extended is deliberately dropped. It carries the
underlying line-item financial-statement/valuation-model data behind the
curated ratios — measured at ~900 KB on Apple alone, two to three
orders of magnitude larger than everything else on the row combined. Real
data, a different-shaped product; not half-parsed into this actor.
2. News/events, individual analyst names, and full price-history are not fetched at all. Simply Wall St's detail page carries these too (as separate cache entries in the same hydration blob), but they're editorial/time-series data rather than fundamentals — a different product from "this company's numbers at a glance."
3. Same-page id collisions can happen. One measured run: a 100-row
screener page yielded only 97 new ids (a handful were already seen, or
repeated within the page). The actor tops up rather than under-delivering —
maxItemsPerQuery: 150 returns exactly 150 unique companies, occasionally
costing one extra request.
4. Dual listings resolve to two different URLs. A company listed on more
than one exchange (e.g. SimCorp on both LSE and Copenhagen) has a
canonical_url (the listing you asked about) and a primary_canonical_url
(its home listing) that can differ. This actor fetches exactly the URL you
gave it or the one the screener returned — it does not silently swap one
for the other.
Anti-bot posture
Per-surface TLS allowlist, ladder-tested across 8 profiles on both surfaces this actor fetches:
- Search/listing pages: 6/8 profiles clean.
- Stock detail pages: 4/8 profiles clean (a narrower subset of the above).
- The
/api/grid/filterscreener: all profiles tried came back clean — behaves like an ungated API surface, unlike the two HTML surfaces.
The actor uses the 4-profile intersection (firefox133, safari17_0,
safari17_2_ios, safari184) everywhere, since it is proven safe on every
surface fetched.
Policy
robots.txt names no ClaudeBot / anthropic-ai / GPTBot group — only
generic User-agent: * and User-agent: Googlebot-News. It disallows
/api/* in general, /_next/static/chunks/ (bundle JS — this actor never
fetches it at runtime, only used during recon), /compare/*, /business,
/survey/, /playground/* and /narratives/new* — none of which overlap
what this actor fetches. Notably, it carries an explicit narrower
Allow: /api/grid/filter inside the broader /api/* disallow — the site
itself is inviting exactly the screener route this actor uses.