Simply Wall St Stock Analysis Scraper avatar

Simply Wall St Stock Analysis Scraper

Pricing

from $2.10 / 1,000 results

Go to Apify Store
Simply Wall St Stock Analysis Scraper

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

Ibnu Adzim

Maintained by Community

Actor 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/filter screener: 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.