# 🇿🇦 JSE South Africa Stock Screener — Top 40 Quotes (`nexgendata/jse-southafrica-stock-screener`) Actor

JSE Johannesburg Stock Exchange screener API — Top 40 / All Share live quotes, market cap (ZAR), P/E, P/B, dividend yield, ROE, sector. Naspers, Anglo American, Standard Bank, MTN universe. Bloomberg / FactSet / Refinitiv Eikon alternative for SA / Africa data. Pay-per-result.

- **URL**: https://apify.com/nexgendata/jse-southafrica-stock-screener.md
- **Developed by:** [NexGenData](https://apify.com/nexgendata) (community)
- **Categories:** Business, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $250.00 / 1,000 jse stock records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## JSE South Africa Stock Screener — Top 40 Quotes & Fundamentals

Bloomberg Terminal alternative for the **Johannesburg Stock Exchange (JSE)** — the largest stock market in Africa by market capitalization and the 19th-largest in the world. Pull every FTSE/JSE Top 40 constituent or the entire ~250-name JSE main-board universe in one structured dataset: price (both ZAR cents and rands), percent change, market cap (ZAR and USD), revenue, P/E ratio, EPS, dividend yield, sector, industry, 52-week range, beta, RSI, and more — at a fraction of the cost of a Bloomberg, FactSet, LSEG Workspace, or Refinitiv Eikon seat.

### 📊 Sample Output

[![🇿🇦 JSE South Africa Stock Screener — Top 40 Quotes sample output — 🇿🇦 JSE South Africa Stock Screener — Top 40 Quotes, premium API, JSON output, NexGenData premium dataset for analysts, hedge funds, c](https://api.apify.com/v2/key-value-stores/8gLgXMBveEI1tTz1z/records/jse-southafrica-stock-screener-output.png)](https://apify.com/nexgendata/jse-southafrica-stock-screener)

Built for **South African asset managers, EM-focused hedge funds, Africa-frontier-market PE shops, mining-and-resources analysts, sovereign wealth fund EM desks, quant researchers, ETF builders, Sub-Saharan thematic investors, and African equity-research teams** who need clean, structured, programmatic access to JSE-listed equities — without paying $24,000/year for a terminal license.

---


### Why NexGenData JSE South Africa Screener Beats Bloomberg Terminal, Refinitiv Eikon, and FactSet

| Feature | NexGenData JSE South Africa Screener | Bloomberg Terminal | Refinitiv Eikon / LSEG Workspace | FactSet | Yahoo Finance / Google Finance |
|---|---|---|---|---|---|
| Cost | $0.05/record pay-per-result | $$$$ ($24,000+/yr seat) | $$$$ ($22,000+/yr seat) | $$$$ ($12,000-$25,000/yr seat) | Free (rate-limited, no schema guarantees) |
| Coverage | Every FTSE/JSE Top 40 or full ~250-ticker main board — ZAR cents & rand prices, market cap (ZAR & USD), P/E, EPS, div yield, sector, industry, 52-week, beta, RSI, mining/financials tags | Global incl. JSE but $24K/yr | Global incl. JSE | Global incl. JSE | Global, but JSE Top 40 only, no sector tagging, schema unstable |
| Update frequency | Daily close + intraday refresh | Real-time tick | Real-time tick | Real-time tick | Delayed 15min, daily snapshot |
| API access | Apify Actor — JSON/CSV/Excel/Parquet | Bloomberg API / BBG Anywhere | Refinitiv RDP API | FactSet API | Yahoo Finance unofficial scrape (breaks often) |
| Auth required | Apify token (free tier available) | Bloomberg seat license | Refinitiv enterprise contract | FactSet enterprise contract | None, but throttled & no SLA |

### Why JSE matters

The Johannesburg Stock Exchange (JSE) is the dominant capital market for the African continent and one of the most institutionally developed exchanges in any emerging market. Founded in 1887 during the Witwatersrand gold rush, it has been continuously operating for over 135 years and remains the gateway into African mining, financials, and consumer themes. It is home to:

- **Naspers (NPN)** — one of the largest tech holding companies outside FAANG/BAT by virtue of its ~28% indirect stake in Tencent through subsidiary Prosus (PRX). At various points, Naspers has been so large it represented more than 20% of the JSE Top 40 by weight, prompting MSCI methodology adjustments.
- **Prosus (PRX)** — Naspers' Amsterdam-listed tech spin-off, dual-listed on JSE; holds the direct Tencent stake plus a portfolio of food-delivery, classifieds, and fintech investments globally.
- **BHP Group (BHG)** — the world's largest mining company by market cap, dual-listed on JSE and ASX/LSE; the single biggest weight on the JSE main board.
- **Anglo American (AGL)** — diversified mining super-major (copper, iron ore, diamonds via De Beers, platinum, nickel) with Anglo-South African heritage going back to 1917.
- **Standard Bank (SBK), FirstRand (FSR), Absa (ABG), Nedbank (NED), Capitec (CPI)** — the South African "Big-Five" banking franchises with extensive sub-Saharan footprints.
- **Sasol (SOL)** — synthetic fuels and chemicals giant, originally born from apartheid-era oil sanctions; turns coal and natural gas into liquid fuels at industrial scale.
- **Gold Fields (GFI), AngloGold Ashanti (ANG), Harmony Gold (HAR), Sibanye-Stillwater (SSW)** — gold-mining majors; South Africa was the world's largest gold producer for most of the 20th century.
- **Anglo American Platinum (AMS), Impala Platinum (IMP), Northam Platinum (NPH)** — platinum-group metals (PGM) majors; South Africa produces ~70% of the world's platinum.
- **MTN Group (MTN), Vodacom (VOD)** — pan-African mobile telecoms with over 300M subscribers across 20+ countries.
- **Discovery (DSY), Sanlam (SLM), Old Mutual (OMU)** — South African insurance, healthcare, and savings franchises pioneering programs like Vitality.
- **Shoprite (SHP), Woolworths (WHL), Mr Price (MRP), Pick n Pay (PIK)** — South African consumer retail giants serving the African continent.

The **FTSE/JSE Top 40 Index** is the headline South African blue-chip benchmark, comparable to the FTSE 100 in the UK, the Nikkei 225 in Japan, the S&P/ASX 200 in Australia, or the BOVESPA Top in Brazil. South Africa is an MSCI Emerging Markets constituent and a core EM bucket weight, attracting tens of billions of dollars of passive inflows from EM ETFs every year.

---

### What you get per stock

Every record returned is a complete JSE-equity snapshot pulled in real time from a server-rendered listing source. Listing pass (always included):

- `symbol` — 3-letter JSE ticker (e.g. `NPN` Naspers, `PRX` Prosus, `BHG` BHP, `AGL` Anglo American, `SBK` Standard Bank, `GFI` Gold Fields)
- `name` — full legal company name
- `ticker_yahoo` — Yahoo Finance ticker with `.JO` suffix (e.g. `NPN.JO`, `BHG.JO`, `GFI.JO`) for cross-referencing with Yahoo, Google Finance, Investing.com
- `price_zac` — last traded price in **ZAR cents** (ZAc — JSE native convention, same as LSE pence)
- `price_zar` — same price converted to **rands** (= `price_zac` / 100) for convenience
- `price_usd` — same price translated to USD using the recorded `fx_rate_zar_per_usd`
- `pct_change` — intraday % change
- `market_cap_zar` — absolute market capitalization in ZAR rands
- `market_cap_billion_zar` — same value in billions ZAR
- `market_cap_billion_usd` — derived USD market cap (B USD)
- `revenue_ttm_zar`, `revenue_ttm_billion_zar`, `revenue_ttm_billion_usd` — trailing-12-month revenue figures
- `is_top40` — boolean, true for FTSE/JSE Top 40 large-cap constituents
- `is_native_jse` — boolean, distinguishes 3-letter native JSE tickers
- `stockanalysis_url`, `yahoo_finance_url`, `jse_url` — direct deep-links to the three most-used data sources for South African equities
- `scraped_at`, `exchange`, `country`, `currency`, `price_unit`, `fx_rate_zar_per_usd` — provenance, units, and the FX rate applied

Fundamentals pass (when `enrich_fundamentals=true` — one extra HTTP request per stock):

- `pe_ratio`, `forward_pe`, `pb_ratio`, `eps_zar`
- `net_income_zar`, `shares_outstanding`
- `dividend_zar`, `dividend_yield_pct`, `ex_dividend_date`
- `volume`, `avg_volume`, `previous_close_zac`/`previous_close_zar`, `open_zac`/`open_zar`
- `week52_low_zac`/`week52_low_zar`, `week52_high_zac`/`week52_high_zar`, `day_low_zac`/`day_low_zar`, `day_high_zac`/`day_high_zar`
- `beta`, `rsi`, `earnings_date`
- `sector`, `industry` (required for sector keyword filtering)

---

### Inputs

| Input | Type | Default | What it does |
|---|---|---|---|
| `index` | enum | `Top40` | Market scope: `Top40` (FTSE/JSE Top 40 large-caps) or `JSE-all` (entire JSE main-board universe). |
| `limit` | integer | `40` | Max stocks to return, sorted by market cap desc. 1–2000. |
| `min_market_cap_zar_billion` | integer | `0` | Floor on market cap in billions of ZAR. `0` = no filter. |
| `sector` | string | `""` | Case-insensitive substring filter on sector / industry / company name. Requires `enrich_fundamentals=true` for the sector/industry match path. |
| `enrich_fundamentals` | boolean | `false` | Hit each stock's detail page to extract P/E, EPS, dividend yield, sector, etc. Roughly doubles runtime. |
| `proxyConfiguration` | object | `{useApifyProxy: true}` | Standard Apify proxy block. Default datacenter proxy is fine. |

#### Recipe examples

**FTSE/JSE Top 40 daily snapshot (lightweight, blue-chip basket):**
```json
{ "index": "Top40", "limit": 40 }
````

Returns the Top 40 JSE constituents with price, market cap, % change — no enrichment overhead. Perfect for a daily South Africa portfolio dashboard or a market-open digest.

**South African Big-5 banks (Standard Bank, FirstRand, Absa, Nedbank, Capitec):**

```json
{ "index": "Top40", "limit": 40, "sector": "bank", "enrich_fundamentals": true }
```

Returns all major South African banks with full fundamentals so you can compare P/E, P/B, dividend yields side-by-side. South African banks are famous for high ROEs and generous dividend payouts despite an EM risk premium.

**Full JSE universe sweep:**

```json
{ "index": "JSE-all", "limit": 300 }
```

**Mega-caps only (R100B+ ≈ $5.4B+):**

```json
{ "index": "JSE-all", "min_market_cap_zar_billion": 100, "limit": 20 }
```

**South African gold miners (Gold Fields, AngloGold, Harmony, Sibanye-Stillwater):**

```json
{ "index": "Top40", "sector": "gold", "enrich_fundamentals": true }
```

**Platinum-group metals (Anglo Platinum, Impala, Northam):**

```json
{ "index": "Top40", "sector": "platinum", "enrich_fundamentals": true }
```

**Mining super-majors (BHP, Anglo American, Glencore):**

```json
{ "index": "Top40", "sector": "mining", "enrich_fundamentals": true }
```

**Tech / media (Naspers, Prosus, MultiChoice):**

```json
{ "index": "Top40", "sector": "media", "enrich_fundamentals": true }
```

**Pan-African telecom (MTN, Vodacom):**

```json
{ "index": "Top40", "sector": "telecom", "enrich_fundamentals": true }
```

**South African consumer (Shoprite, Woolworths, Mr Price, Tiger Brands):**

```json
{ "index": "Top40", "sector": "retail", "enrich_fundamentals": true }
```

***

### How it works

The actor scrapes [stockanalysis.com/list/johannesburg-stock-exchange/](https://stockanalysis.com/list/johannesburg-stock-exchange/), a clean server-rendered universe page that aggregates every JSE-listed name sorted by market cap. The full ~250-stock universe fits on a single page, so no pagination is required — we get the entire JSE in one HTTP request. We then filter by index scope (Top 40 vs full JSE), market-cap floor, and (optionally) sector keyword.

When `enrich_fundamentals=true`, we additionally hit each stock's `/quote/jse/{symbol}/` detail page, parse the structured statistics tables, and add P/E, EPS, dividend, 52-week range, beta, sector, and industry to each record. Enrichment runs at concurrency 5 to be a polite scraper. Typical runtime: 10 stocks ≈ 5 seconds without enrichment, ~15 seconds with.

**Top 40 membership** — The actor ships with the FTSE/JSE Top 40 constituent list embedded for instant `is_top40` flagging and `index=Top40` filtering. We also apply a fallback large-cap rule (≥R50B market cap) so that any Top 40 member missing from the embedded list still gets included.

**ZAR cents (ZAc) vs ZAR rands** — JSE quotes share prices in **South African cents (ZAc)**, not rands. This is the same convention as the London Stock Exchange's pence (GBX). Example: BHP Group at "69,174" means ZAc 69,174 = R691.74. Market caps, revenues, dividends are quoted in **ZAR rands** (with T/B/M/K multipliers). We surface both `price_zac` (raw cents) and `price_zar` (rands) on every record so you can plug into either convention without manual conversion — and we annotate `price_unit: "ZAc (cents)"` for unambiguous documentation.

**FX rate** — The South African rand is **free-floating** (no peg). The rand historically trades in a 15-20 ZAR/USD band but can swing materially on EM risk-off, commodity cycles, and South African political news. We use a default `fx_rate_zar_per_usd` of 18.5 for derived USD figures and record it on every output row for transparency and auditability. Override locally if you need a tighter mark-to-market.

**Native ticker filter** — JSE tickers are uniformly 2-5 letter alphabetic codes (e.g. `NPN`, `PRX`, `BHG`, `ANG`, `GFI`). We filter to that pattern by default to keep the universe clean and skip any aberrant or non-equity rows.

***

### Pricing — Pay Per Event

This actor uses Apify's Pay-Per-Event pricing — you only pay for what you actually pull, no monthly fees, no commitments, no annual contracts. Compare that to Bloomberg Terminal at ~$2,000/month per seat, LSEG Workspace at ~$1,800/month, or FactSet at ~$1,500/month: even pulling the full JSE universe every trading day, you'd recover the cost in well under a week of analyst time saved.

| Event | Price | When charged |
|---|---|---|
| Actor start | $0.01 | Once when the run begins |
| JSE stock record | $0.25 | Per JSE-listed stock record returned with price, market cap, P/E, P/B, dividend yield, sector, fundamentals |

**Worked examples (USD):**

- 10-stock smoke test: $0.01 + 10 × $0.25 = **$2.51**
- FTSE/JSE Top 40 sweep: $0.01 + 40 × $0.25 = **$10.01**
- Top 100 with fundamentals: $0.01 + 100 × $0.25 = **$25.01**
- Full JSE universe (~250 names): $0.01 + 250 × $0.25 = **$62.51**

For comparison, a single Bloomberg Terminal seat is ~$24,000/year. This actor delivers equivalent South African equity coverage at well under 1% of that, with no contract, no minimum, and no negotiation.

***

### Use cases

- **EM-focused asset managers** — refresh JSE universes hourly, intraday, or daily; drop directly into your DuckDB / Snowflake / BigQuery warehouse for portfolio attribution and risk monitoring.
- **Africa-frontier hedge funds** — track JSE flow, dividend cycles, ex-dividend dates, and sub-Saharan sector themes (gold, platinum, copper, telecom, fintech).
- **Mining-and-resources analysts** — South Africa is the world's largest platinum producer, top-10 gold producer, and a major copper/iron ore exporter. Build mining theme baskets across BHP, Anglo, Glencore, Gold Fields, AngloGold, Anglo Platinum, Impala, Sibanye-Stillwater, and Exxaro in a single API call.
- **Quant signal research** — backtest JSE Top 40 signals (momentum, value, dividend, quality, low-vol, resources-vs-non-resources baskets) on consistent point-in-time snapshots.
- **EM ETF construction** — build a custom South Africa-tilt ETF basket weighted by your own factor model; check tracking vs. iShares MSCI South Africa ETF (EZA) or VanEck Africa Index ETF (AFK).
- **Equity research desks** — feed a South African sector dashboard (banks, mining, retail, telecom, healthcare, property) without paying for a market-data terminal.
- **Sovereign wealth fund EM desks** — South Africa is a core MSCI EM weight; refresh holdings programmatically every market close.
- **Fintech apps & robo-advisors** — power a South Africa or sub-Saharan stock-screener feature inside an investing app, neobank, or newsletter aimed at SA, Nigerian, Kenyan, or diaspora investors.
- **Africa-focused PE & VC firms** — track JSE-listed comps for valuation benchmarking when scoping deals on the continent.
- **Compliance, treasury & FX** — verify holdings, monitor index inclusion changes (MSCI EM, FTSE Russell), track corporate actions on JSE constituents.
- **News / media / family office** — generate "JSE winners and losers" tables programmatically every market close (Mon–Fri 09:00–17:00 SAST).

***

### Output schema (sample record)

```json
{
  "symbol": "NPN",
  "name": "Naspers Limited",
  "ticker_yahoo": "NPN.JO",
  "price_zac": 91850.0,
  "price_zar": 918.50,
  "price_usd": 49.6486,
  "pct_change": -0.42,
  "market_cap_zar": 676290000000,
  "market_cap_billion_zar": 676.29,
  "market_cap_billion_usd": 36.5562,
  "market_cap_display": "676.29B",
  "revenue_ttm_zar": 135680000000,
  "revenue_ttm_billion_zar": 135.68,
  "revenue_ttm_billion_usd": 7.3341,
  "is_top40": true,
  "is_native_jse": true,
  "stockanalysis_url": "https://stockanalysis.com/quote/jse/NPN/",
  "yahoo_finance_url": "https://finance.yahoo.com/quote/NPN.JO",
  "jse_url": "https://www.jse.co.za/listed-companies/equities/NPN",
  "pe_ratio": 7.57,
  "forward_pe": 10.49,
  "eps_zar": 117.31,
  "dividend_zar": 1.02,
  "dividend_yield_pct": 0.11,
  "ex_dividend_date": "Dec 3, 2025",
  "beta": 0.73,
  "rsi": 46.53,
  "week52_low_zac": 83751,
  "week52_high_zac": 131144,
  "week52_low_zar": 837.51,
  "week52_high_zar": 1311.44,
  "sector": "Communication Services",
  "industry": "Internet Content Information",
  "exchange": "JSE",
  "exchange_full": "Johannesburg Stock Exchange (JSE)",
  "country": "South Africa",
  "currency": "ZAR",
  "currency_full": "South African Rand",
  "price_unit": "ZAc (cents)",
  "fx_rate_zar_per_usd": 18.5,
  "scraped_at": "2026-05-10T12:00:00Z"
}
```

### FAQ

**What are JSE market hours?** Monday through Friday, 09:00 to 17:00 South African Standard Time (SAST = UTC+2). JSE is closed on South African public holidays — Family Day (Easter Monday), Freedom Day (27 April), Workers' Day (1 May), Youth Day (16 June), National Women's Day (9 August), Heritage Day (24 September), Day of Reconciliation (16 December), Christmas, Day of Goodwill (26 December), and New Year. Run this actor anytime; quotes are last-close outside market hours.

**Why ZAR cents (ZAc) and rands (R) both?** JSE quotes share prices in **South African cents** by convention — the same way the London Stock Exchange quotes in pence (GBX). A price of 91,850 means ZAc 91,850 = R918.50. We surface both `price_zac` (raw, matches what you see on jse.co.za / Yahoo Finance / Reuters tickers) and `price_zar` (rands, useful for spreadsheets and order-management systems that expect rands).

**Why is the rand so volatile?** The South African rand is free-floating and historically one of the most volatile EM currencies — it trades on commodity cycles (gold, platinum, iron ore), EM risk-on/risk-off flows, US dollar strength (DXY), South African political news (loadshedding, ANC factional politics, fiscal slippage), and rate differentials. We record `fx_rate_zar_per_usd` on every row so you know exactly what rate was applied at scrape time.

**What are dual-listed JSE stocks?** Many of the biggest JSE names are also listed in London (BHP — BHP/BHG, Anglo American — AAL/AGL, Glencore — GLEN/GLN, Anheuser-Busch — ABI/ANH, Richemont — CFR/CFR, Mondi — MNDI/MNP, BAT — BATS/BTI). They trade fungibly across exchanges, with the LSE leg priced in GBX. Use this actor for the JSE leg; pair with our **LSE UK Stock Screener** for the London leg.

**What's the FTSE/JSE Top 40?** The headline South African blue-chip index, the 40 largest JSE-listed stocks by free-float-adjusted market cap. Reconstituted quarterly. Heavily concentrated in resources, financials, and consumer staples. The Top 40 captures roughly 80% of JSE total market cap.

**ESG / Sin stocks?** JSE has tobacco (BAT — BTI), brewers (Anheuser-Busch — ANH), and gambling (Sun International — SUI). Use the sector filter to include/exclude these for ESG mandates.

**Rate limits / blocking?** We use Apify's datacenter proxy by default. Stockanalysis.com is generally cooperative. If you hit any limit, switch to RESIDENTIAL group in proxy config.

**Can I run this on a schedule?** Yes — every Apify actor supports cron scheduling. Run it at 17:30 SAST daily (15:30 UTC) for a JSE market-close snapshot.

***

### Affiliate signup

Building a fleet of regional stock screeners across JSE, Tadawul, LSE, TSE, KOSPI, HKEX, TWSE, Eastmoney, NSE, B3, and more? Sign up to Apify through this affiliate link to support our work: **[apify.com/nexgendata?fpr=2ayu9b](https://apify.com/nexgendata?fpr=2ayu9b)**

***

*Built by NexGenData. Questions, bugs, or feature requests — reach out via the Apify Store contact form.*

***

### Explore the NexGenData Equity Data Suite

This actor is part of NexGenData's global equity data fleet. Whether you cover a single region or a multi-asset macro book, we have a screener for every major market:

#### Regional sisters

- 🔗 **[Tadawul Saudi Stock Screener](https://apify.com/nexgendata/tadawul-saudi-stock-screener)** — Tadawul / TASI fundamentals, market cap (SAR), P/E, dividend yield, sector — Saudi & GCC equity data.
- 🔗 **[BIST Turkey Stock Screener](https://apify.com/nexgendata/bist-turkey-stock-screener)** — Borsa Istanbul (BIST 100 / 30) fundamentals, market cap (TRY), P/E, dividend yield, sector — Turkish equity data.
- 🔗 **[LSE UK Stock Screener](https://apify.com/nexgendata/lse-uk-stock-screener)** — London Stock Exchange (FTSE 100 / 250) fundamentals, market cap (GBP), P/E, dividend yield, sector — UK equity data.

#### Cross-region peers

- 🔗 **[ASX Australia Stock Screener](https://apify.com/nexgendata/asx-australia-stock-screener)** — ASX 200 / All Ordinaries fundamentals, market cap (AUD), P/E, dividend yield, sector — Australian equity data.
- 🔗 **[NSE India Stock Screener](https://apify.com/nexgendata/nse-india-stock-screener)** — Nifty 50 / NSE / BSE live quotes, market cap (INR crore), P/E, P/B, dividend yield, sector — full Indian equity universe.

#### Multi-asset / specialty

- 🔗 **[Finance MCP Server](https://apify.com/nexgendata/finance-mcp-server)** — Unified Model Context Protocol server exposing the full NexGenData equity fleet to Claude, Cursor & MCP-aware LLMs.

#### Browse the full NexGenData catalog

**[→ See all 220+ NexGenData actors at apify.com/nexgendata](https://apify.com/nexgendata?fpr=2ayu9b)** — equity screeners across 25+ markets, lead generation, SEC filings, B2B intelligence, MCP servers, and more.

***

### Why NexGenData vs. paid alternatives

| Tool | Annual cost | API access | Coverage |
|------|-------------|------------|----------|
| Bloomberg Terminal | ~$24,000/seat | Limited | Global |
| FactSet | ~$15,000/seat | Paid add-on | Global |
| Refinitiv Eikon | ~$22,000/seat | Paid add-on | Global |
| S\&P Capital IQ | ~$20,000/seat | Paid add-on | Global |
| **NexGenData South Africa Screener** | **Pay-per-result** | **Native** | **South Africa**          |

Run this actor once per day for a typical institutional-scale workflow (~200 records/day) and your annual cost is approximately **$1,800–2,000** — a 90-95% discount vs. the major paid alternatives, with no seat licensing, no minimum commitment, and full programmatic access.

### Related NexGenData Actors — EM Stock Intelligence

| Use case | Actor |
|---|---|
| Turkey BIST 100 fundamentals | [BIST Turkey Stock Screener](https://apify.com/nexgendata/bist-turkey-stock-screener) |
| Indonesia IDX (LQ45 + IDX30) | [IDX Indonesia Stock Screener](https://apify.com/nexgendata/idx-indonesia-stock-screener) |
| Malaysia Bursa (KLCI) | [Bursa Malaysia Stock Screener](https://apify.com/nexgendata/bursa-malaysia-stock-screener) |
| Thailand SET / SET50 | [SET Thailand Stock Screener](https://apify.com/nexgendata/set-thailand-stock-screener) |
| Philippines PSE / PSEi | [PSE Philippines Stock Screener](https://apify.com/nexgendata/pse-philippines-stock-screener) |
| Vietnam HOSE / VN-Index | [HOSE Vietnam Stock Screener](https://apify.com/nexgendata/hose-vietnam-stock-screener) |
| Singapore SGX (STI + S-REITs) | [SGX Singapore Stock Screener](https://apify.com/nexgendata/sgx-singapore-stock-screener) |
| Saudi Tadawul (TASI) | [Tadawul Saudi Stock Screener](https://apify.com/nexgendata/tadawul-saudi-stock-screener) |

# Actor input Schema

## `index` (type: `string`):

Which JSE market scope to screen: Top40 (FTSE/JSE Top 40 large-cap constituents — Naspers NPN, Prosus PRX, BHP BHG, Anglo American AGL, Standard Bank SBK, Sasol SOL, FirstRand FSR, Gold Fields GFI, AngloGold ANG, MTN MTN, Capitec CPI, Discovery DSY, Anheuser-Busch ANH, BAT BTI, Richemont CFR, etc.) or JSE-all (entire JSE main-board universe — ~250 listed companies). Top40 is the headline South African blue-chip benchmark; JSE-all gives you the full Johannesburg listed universe.

## `limit` (type: `integer`):

Maximum number of JSE-listed stocks to return. Stocks are returned in descending market-cap order. Use 10 for a quick smoke test, 40 for the FTSE/JSE Top 40 blue-chip basket, 100 for the broad large-and-mid-cap universe, 250+ to pull the entire JSE main-board universe. The Johannesburg Stock Exchange has roughly 250+ listed companies.

## `min_market_cap_zar_billion` (type: `integer`):

Filter to stocks with market cap above this threshold, in BILLIONS of South African Rand (ZAR). Examples: 10 = R10B (mid-cap floor), 100 = R100B (Top 40 heavy-weight), 500 = R500B (top 10 JSE mega-caps like Naspers, Prosus, BHP, Anglo American, Anheuser-Busch, Richemont, BAT), 1000 = R1T (top 5 JSE mega-caps). Leave at 0 for no filter. Note: 1 USD ≈ 18.5 ZAR (rand is free-floating, fluctuates).

## `sector` (type: `string`):

Optional case-insensitive substring filter applied to sector, industry, and company name. Examples: 'bank' (Standard Bank, FirstRand, Absa, Nedbank, Capitec), 'mining' or 'gold' (Gold Fields, AngloGold, Harmony, Sibanye-Stillwater), 'retail' (Shoprite, Woolworths, Pick n Pay, Mr Price), 'telecom' (MTN, Vodacom, Telkom), 'tobacco' (BAT, Richemont), 'tech' (Naspers, Prosus), 'insurance' (Discovery, Sanlam, Old Mutual), 'platinum' (Anglo Platinum, Impala, Northam). Leave blank for no filter. Note: sector matching requires enrich\_fundamentals=true.

## `enrich_fundamentals` (type: `boolean`):

If true, fetch each stock's detail page on stockanalysis.com to extract P/E ratio, forward P/E, EPS, dividend yield, shares outstanding, beta, RSI, 52-week range, sector and industry classification, and earnings dates. Adds ~1 HTTP request per stock and roughly doubles runtime. Required if you want to filter by sector.

## `proxyConfiguration` (type: `object`):

Apify proxy configuration. Defaults to Apify datacenter proxy for reliable global access to stockanalysis.com. Switch to RESIDENTIAL group only if you hit rate limits — the JSE listing page is lightweight and rarely throttles.

## Actor input object example

```json
{
  "index": "Top40",
  "limit": 40,
  "min_market_cap_zar_billion": 0,
  "enrich_fundamentals": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "index": "Top40",
    "limit": 40,
    "min_market_cap_zar_billion": 0,
    "sector": "",
    "enrich_fundamentals": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgendata/jse-southafrica-stock-screener").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "index": "Top40",
    "limit": 40,
    "min_market_cap_zar_billion": 0,
    "sector": "",
    "enrich_fundamentals": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nexgendata/jse-southafrica-stock-screener").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "index": "Top40",
  "limit": 40,
  "min_market_cap_zar_billion": 0,
  "sector": "",
  "enrich_fundamentals": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nexgendata/jse-southafrica-stock-screener --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nexgendata/jse-southafrica-stock-screener",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "🇿🇦 JSE South Africa Stock Screener — Top 40 Quotes",
        "description": "JSE Johannesburg Stock Exchange screener API — Top 40 / All Share live quotes, market cap (ZAR), P/E, P/B, dividend yield, ROE, sector. Naspers, Anglo American, Standard Bank, MTN universe. Bloomberg / FactSet / Refinitiv Eikon alternative for SA / Africa data. Pay-per-result.",
        "version": "0.0",
        "x-build-id": "K69UxSw4Xt1nowvPW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nexgendata~jse-southafrica-stock-screener/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nexgendata-jse-southafrica-stock-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/nexgendata~jse-southafrica-stock-screener/runs": {
            "post": {
                "operationId": "runs-sync-nexgendata-jse-southafrica-stock-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/nexgendata~jse-southafrica-stock-screener/run-sync": {
            "post": {
                "operationId": "run-sync-nexgendata-jse-southafrica-stock-screener",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "index": {
                        "title": "Index / Market",
                        "enum": [
                            "Top40",
                            "JSE-all"
                        ],
                        "type": "string",
                        "description": "Which JSE market scope to screen: Top40 (FTSE/JSE Top 40 large-cap constituents — Naspers NPN, Prosus PRX, BHP BHG, Anglo American AGL, Standard Bank SBK, Sasol SOL, FirstRand FSR, Gold Fields GFI, AngloGold ANG, MTN MTN, Capitec CPI, Discovery DSY, Anheuser-Busch ANH, BAT BTI, Richemont CFR, etc.) or JSE-all (entire JSE main-board universe — ~250 listed companies). Top40 is the headline South African blue-chip benchmark; JSE-all gives you the full Johannesburg listed universe.",
                        "default": "Top40"
                    },
                    "limit": {
                        "title": "Limit (stocks returned)",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum number of JSE-listed stocks to return. Stocks are returned in descending market-cap order. Use 10 for a quick smoke test, 40 for the FTSE/JSE Top 40 blue-chip basket, 100 for the broad large-and-mid-cap universe, 250+ to pull the entire JSE main-board universe. The Johannesburg Stock Exchange has roughly 250+ listed companies.",
                        "default": 40
                    },
                    "min_market_cap_zar_billion": {
                        "title": "Min market cap (billion ZAR)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Filter to stocks with market cap above this threshold, in BILLIONS of South African Rand (ZAR). Examples: 10 = R10B (mid-cap floor), 100 = R100B (Top 40 heavy-weight), 500 = R500B (top 10 JSE mega-caps like Naspers, Prosus, BHP, Anglo American, Anheuser-Busch, Richemont, BAT), 1000 = R1T (top 5 JSE mega-caps). Leave at 0 for no filter. Note: 1 USD ≈ 18.5 ZAR (rand is free-floating, fluctuates).",
                        "default": 0
                    },
                    "sector": {
                        "title": "Sector / industry / name keyword",
                        "type": "string",
                        "description": "Optional case-insensitive substring filter applied to sector, industry, and company name. Examples: 'bank' (Standard Bank, FirstRand, Absa, Nedbank, Capitec), 'mining' or 'gold' (Gold Fields, AngloGold, Harmony, Sibanye-Stillwater), 'retail' (Shoprite, Woolworths, Pick n Pay, Mr Price), 'telecom' (MTN, Vodacom, Telkom), 'tobacco' (BAT, Richemont), 'tech' (Naspers, Prosus), 'insurance' (Discovery, Sanlam, Old Mutual), 'platinum' (Anglo Platinum, Impala, Northam). Leave blank for no filter. Note: sector matching requires enrich_fundamentals=true."
                    },
                    "enrich_fundamentals": {
                        "title": "Enrich with fundamentals (slower)",
                        "type": "boolean",
                        "description": "If true, fetch each stock's detail page on stockanalysis.com to extract P/E ratio, forward P/E, EPS, dividend yield, shares outstanding, beta, RSI, 52-week range, sector and industry classification, and earnings dates. Adds ~1 HTTP request per stock and roughly doubles runtime. Required if you want to filter by sector.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Defaults to Apify datacenter proxy for reliable global access to stockanalysis.com. Switch to RESIDENTIAL group only if you hit rate limits — the JSE listing page is lightweight and rarely throttles.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
