Project Report

JSE Financial Data Collection

Comprehensive collection of JSE-listed company financial data assembled by reverse-engineering the JSE Client Portal's internal WCF APIs. Two major datasets cover 252 companies spanning 2012–2026.

Date: 22 March 2026
Status: Collection Complete — Harvester Active
7,575
Total PDFs
14.5 GB
Total Data
252
Companies (IRs)
390
Issuers (SENS)
14 yrs
Date Range (2012–2026)
1

Data Collected

Integrated Financial Reports (IRs) Complete

Downloaded via WebstirService API. Annual integrated reports from JSE-listed companies.

Total PDFs
1,645
Total Size
13.7 GB
Companies
252
Avg per Company
6.5
Mean PDF Size
8.6 MB
Median PDF Size
6.8 MB

IR Downloads by Year

2013
7
2014
63
2015
80
2016
91
2017
102
2018
103
2019
113
2020
83
2021
146
2022
183
2023
195
2024
202
2025
204
2026
11

Coverage increases over time — nearly complete from 2022+. The 2026 count is partial as the reporting season is still in progress.

SENS Announcements Active Harvester

Downloaded via SensService API. Stock Exchange News Service announcements with PDF attachments.

Announcements
5,933
PDFs Downloaded
5,930
Total Size
824 MB
Unique Issuers
390
Mean PDF Size
142 KB
Date Range
Jul 2012 – Mar 2026

SENS Announcements by Year

2012
7
2013
2
2014
4
2015
16
2016
5
2017
24
2018
26
2019
30
2020
20
2021
34
2022
28
2023
80
2024
274
2025
3,328
2026
2,055

The API caps per-issuer results at 15, so historical data is deeper for less active issuers. The daily harvester (Mon–Fri 22:00 SAST) captures new announcements going forward, building a complete archive over time.

Automated Daily Harvester Running

Cron job runs three passes each weeknight at 22:00 SAST:

Pass 1
7-day rolling feed
Pass 2
Today's SENS
Pass 3
502 issuers (15 each)

Results are deduplicated, new PDFs downloaded, and the master index is updated. First run on 20 Mar 2026 captured 32 new announcements.

2

JSE Client Portal APIs

All services are WCF/JSON endpoints at clientportal.jse.co.za. They require HTTP/2, specific headers (Origin, Referer, X-Requested-With), and use POST with JSON payloads.

SensService.svc 6 operations
GetSensAnnouncementForDates
Announcements in date range
~4-day rolling window; params: from, to, issuerMasterId
GetTodaySensAnnouncements
Today's SENS feed — real-time, no params
GetLastSevenDaysSensAnnouncements
7-day rolling feed — best for catch-up
GetSensAnnouncementsByIssuerMasterId
Per-issuer SENS announcements
Max 15 results per issuer
GetSensAnnouncementsByInstrumentMasterId
Per-instrument SENS announcements
Max 15 results per instrument
GetSensAnnouncements
Generic latest SENS — max 15 results
WebstirService.svc 2 operations
GetDocumentsByCompany
List all documents for a company — source of all IR downloads
GetDocumentTypes
Lists 15 available document types

Available Document Types

1. Integrated Report
2. Annual Report
3. Interim Results
4. Final Results
5. Provisional Report
6. Pre-listing Statement
7. Revised Listing Particulars
8. Circular
9. Pre-close Update
10. Analyst Presentation
11. Trading Statement
12. Quarterly Update
13. Production Reports
14. Corporate Action
15. Sustainability Report

Only Integrated Reports (highlighted) have been downloaded. All other types are available using the same API with minimal code changes.

CustomerRoleService.svc 8 operations
GetAllIssuersNoFilter
All 565 issuers (JSE + NSX) with Master IDs
GetAllIssuers
Filtered issuer list — supports role/status filters
GetIssuer
Single issuer details by MasterID
GetIssuerNatureOfBusiness
Business description / sector classification
GetIssuerAssociatedRoles
Issuer's roles and instruments
GetAllMembers / GetAllSponsors
JSE member firms and listing sponsors

Issuer Universe

Total Issuers
565
JSE-Listed
518
NSX-Listed
47
Current (Active)
547
Suspended
18
Equity Issuers
298
Interest Rate
186
Current JSE Equity
244
IndicesService.svc 9 ops — Not yet explored

Provides index composition, instrument data, and historical views (1 month to 5 years). Could yield historical index membership and pricing data.

Unavailable Services

These services exist in the codebase but redirect to error pages:

SensArchiveService
Historical SENS
SensSearchService
Full-text search
IssuerService
Deeper issuer data
InstrumentService
Instrument detail
SearchService
General search

Additional Data Available for Collection

Data Type API Effort Value
Annual Reports WebstirService Low High — fills IR gaps
Interim / Final Results WebstirService Low High — quarterly data
Trading Statements WebstirService Low High — profit warnings
Circulars WebstirService Low Medium — M&A, rights
Sustainability Reports WebstirService Low Medium — ESG data
All other 10 doc types WebstirService Low Varies
Index compositions IndicesService Medium High — index membership
Issuer descriptions CustomerRoleService Low Medium — sectors
3

Company Data Matrix

IR Companies
252
Matched to Issuer DB
242
With SENS Data
233
Missing SENS
19
Code Company IRs SENS
4SI 4Sight Holdings 5 Yes
ABG Absa Group 11 Yes
ACL ArcelorMittal SA 8 Yes
ACS Acsion 8 Yes
ACT Afrocentric Investment 8 Yes
ADH Advtech 7 Yes
ADR Adcorp Holdings 7 Yes
ADW African Dawn Capital 3 No
AEG Aveng 6 Yes
AEL Altron 8 Yes
AFE AECI 9 Yes
AFH Alexander Forbes 12 Yes
AFT Afrimat 8 Yes
AGL Anglo American 5 No
AME African Media Entertainment 3 Yes
ANG AngloGold Ashanti 6 Yes
ANH Anheuser-Busch InBev 8 Yes
ANI Afine Investments 1 Yes
AOO African & Overseas Enterprises 7 Yes
APF Accelerate Property Fund 6 Yes
APH Alphamin Resources 0 Yes
APN Aspen Pharmacare 6 Yes
APO aReit Prop 0 No
ARIM African Rainbow Minerals 8 Yes
ARL Astral Foods 8 Yes
ART Argent Industrial 9 Yes
ASO ASP Isotopes 0 No
ATT Attacq 5 Yes
AVI AVI 9 Yes
AXX Araxi 7 Yes
BAC Africa Bitcoin Corporation 0 Yes
BATE Brait 8 No
BCF Bowler Metcalf 2 Yes
BEL Bell Equipment 8 Yes
BHG BHP Group 4 Yes
BID Bid Corporation 7 Yes
BIK Brikor 8 Yes
BLU Blu Label 8 Yes
BOX Boxer Retail 1 Yes
BRN Brimstone Investment 9 No
BTI British American Tobacco 8 Yes
BTN Burstone Group 10 Yes
BVT Bidvest Group 6 Yes
BWN Balwin Properties 6 Yes
BYI Bytes Technology 4 Yes
CAA CA Sales Holdings 3 Yes
CAC Cafca 5 Yes
CAT Caxton & CTP 5 Yes
CCC Cilo Cybin Holdings 1 Yes
CCD Cell C Holdings 0 Yes
CFR Richemont 8 Yes
CGR Calgro M3 11 Yes
CHP Choppies Enterprises 4 Yes
CKS Crookes Brothers 7 Yes
CLH City Lodge Hotels 5 Yes
CLI Clientele 5 Yes
CLS Clicks Group 11 Yes
CMH Combined Motor Holdings 10 Yes
CML Coronation Fund Managers 8 Yes
CPI Capitec Bank 9 Yes
CPP Collins Property Group 5 No
CPR Copper 360 2 Yes
CSB Cashbuild 8 Yes
CVW Castleview Property Fund 5 Yes
DCP Dis-Chem Pharmacies 8 Yes
DLT Delta Property Fund 6 Yes
DNB Deneb Investments 9 Yes
DPL Dipula Properties 7 Yes
DRD DRDGold 8 Yes
DSY Discovery 12 Yes
DTC Datatec 4 Yes
EEL Efora Energy 5 No
ELI Ellies Holdings 4 No
EMI Emira Property Fund 10 Yes
EMN eMedia Holdings 7 Yes
ENX enX Group 6 Yes
EPE EPE Capital Partners 8 Yes
EPS Eastern Platinum 1 Yes
EQU Equites Property Fund 5 Yes
EUZ Europa Metals 3 Yes
EXP Exemplar Reitail 7 Yes
EXX Exxaro Resources 7 Yes
FBR Famous Brands 8 Yes
FGL Finbond Group 7 Yes
FOR Fortress REIT 7 Yes
FSR FirstRand 11 Yes
FTH Frontier Transport 8 Yes
FVT Fairvest 9 No
GCT Greencoat Renewables 0 Yes
GFI Gold Fields 6 Yes
GLN Glencore 9 Yes
GML Gemfields Group 7 Yes
GND Grindrod 5 Yes
GPL Grand Parade Investments 8 Yes
GRT Growthpoint Properties 8 Yes
GTC Globe Trade Centre 6 Yes
HAR Harmony Gold 8 Yes
HCI Hosken Consolidated 10 Yes
HDC Hudaco Industries 6 Yes
HET Heriot REIT 7 Yes
HLM Hulamin 7 Yes
HMN Hammerson 7 Yes
HUG Huge Group 8 Yes
HYP Hyprop Investments 4 Yes
IMP Impala Platinum 7 Yes
INL Investec 6 Yes
INP Investec plc 5 Yes
IOC iOCO 9 Yes
ISA ISA Holdings 6 Yes
ISB Insimbi Industrial 5 Yes
ITE Italtile 9 Yes
IVT Invicta Holdings 8 Yes
JBL Jubilee Metals 3 Yes
JSE JSE Limited 8 Yes
KAL KAL Group 6 Yes
KAP KAP 11 Yes
KBO Kibo Energy 3 No
KIO Kumba Iron Ore 9 Yes
KP2 Kore Potash 4 Yes
KRO Karooooo 5 Yes
KST PSG Financial Services 7 Yes
LAB Labat Africa 6 Yes
LBR Libstar Holdings 5 Yes
LEW Lewis Group 4 Yes
LHC Life Healthcare 10 Yes
LSK Lesaka Technologies 5 Yes
LTE Lighthouse Properties 7 Yes
MCZ MC Mining 4 Yes
MDI Master Drilling 9 Yes
MHB Mahube Infrastructure 8 Yes
MKR Montauk Renewables 4 Yes
MMP Marshall Monteagle 4 Yes
MNP Mondi 5 Yes
MPT Mpact 8 Yes
MRF Merafe Resources 10 Yes
MRP Mr Price Group 6 Yes
MSP MAS plc 7 Yes
MST Mustek 7 Yes
MTA Metair Investments 9 Yes
MTH Motus Holdings 6 Yes
MTM Momentum Group 7 Yes
MTN MTN Group 10 Yes
MTU Mantengu 6 Yes
N91 Ninety One plc 4 Yes
NCS Nictus 6 Yes
NED Nedbank Group 9 Yes
NPH Northam Platinum 4 Yes
NPK Nampak 7 Yes
NPN Naspers 9 Yes
NRL Newpark REIT 6 Yes
NRP NEPI Rockcastle 5 Yes
NTC Netcare 6 Yes
NTU Nutun 8 Yes
NVS Novus Holdings 7 Yes
NWL Nu-World Holdings 9 Yes
NY1 Ninety One Limited 5 Yes
OAO Oando 1 No
OAS Oasis Crescent Property 6 Yes
OCE Oceana Group 5 Yes
OCT Octodec Investments 8 Yes
OML Old Mutual 6 Yes
OMN Omnia Holdings 9 Yes
ORN Orion Minerals 5 Yes
OUT OUTsurance Group 8 Yes
PAN Pan African Resources 11 Yes
PBT PBT Holdings 9 Yes
PHP Primary Health Properties 2 Yes
PIK Pick n Pay 5 Yes
PMR Premier Group 3 Yes
PMV Primeserv Group 7 Yes
PPC PPC 7 Yes
PPE Purple Group 6 Yes
PPH Pepkor Holdings 8 Yes
PPR Putprop 9 Yes
PRX Prosus 6 Yes
PWR Powerfleet 1 Yes
QFH Quantum Foods 5 Yes
QLT Quilter 5 Yes
RBO Rainbow Chicken 2 Yes
RBX Raubex Group 4 Yes
RCL RCL Foods 10 Yes
RDF Redefine Properties 3 Yes
REM Remgro 8 Yes
RES Resilient REIT 6 Yes
RFG RFG Holdings 11 Yes
RHB RH Bophelo 7 Yes
RLO Reunert 5 Yes
RMH RMB Holdings 5 Yes
RNG Randgold & Exploration 8 Yes
RNI Reinet Investments 7 Yes
RTO Rex Trueform Group 7 Yes
S32 South32 10 Yes
SAC SA Corporate Real Estate 7 Yes
SAP Sappi 7 No
SBK Standard Bank Group 10 Yes
SBP Sabvest Capital 4 Yes
SCD Schroder European REIT 5 Yes
SDL Southern Palladium 3 Yes
SDO Stadio Holdings 8 Yes
SEA Spear REIT 9 Yes
SEB Sebata Holdings 11 No
SEP Sephaku Holdings 11 Yes
SHG Sea Harvest Group 6 Yes
SHP Shoprite Holdings 6 Yes
SKA Shuka Minerals 0 Yes
SLG Salungano Group 8 Yes
SLM Sanlam 6 Yes
SNT Santam 8 Yes
SNV Santova 6 Yes
SOH South Ocean Holdings 2 Yes
SOL Sasol 10 Yes
SPG Super Group 10 Yes
SPP The Spar Group 4 Yes
SRE Sirius Real Estate 8 Yes
SRI Supermarket Income REIT 1 Yes
SSK Stefanutti Stocks 9 Yes
SSS Stor-Age Property REIT 8 Yes
SSU Southern Sun 6 Yes
SSW Sibanye Stillwater 6 Yes
SUI Sun International 7 Yes
SUR Spur Corporation 6 Yes
SXM Sable Exploration & Mining 5 No
SYG Sygnia 8 Yes
TBS Tiger Brands 10 No
TEX Texton Property Fund 9 Yes
TFG The Foschini Group 7 Yes
TGA Thungela Resources 4 Yes
THA Tharisa 10 Yes
TKG Telkom SA 7 Yes
TLM Telemasters Holdings 5 Yes
TMT Trematon Capital 7 Yes
TON Tongaat Hulett 4 No
TPC Transpaco 8 Yes
TRL Trellidor Holdings 10 Yes
TRU Truworths International 7 Yes
TSG Tsogo Sun 8 Yes
TTO Trustco Group 10 No
UPL Universal Partners 5 Yes
VAL Valterra Platinum 8 Yes
VIS Visual International 6 Yes
VKE Vukile Property Fund 8 Yes
VOD Vodacom Group 8 Yes
VUN Vunani 9 Yes
WBC We Buy Cars 1 Yes
WBO Wilson Bayly Holmes-Ovcon 5 Yes
WEZ Wesizwe Platinum 8 No
WHL Woolworths Holdings 9 Yes
WVR Weaver Fintech 11 Yes
XII Numeral 1 Yes
YRK York Timber 12 Yes
ZED Zeder Investments 10 Yes
ZZD Zeda 3 Yes

An additional ~138 issuers have SENS data but no IRs (mostly non-equity issuers: bonds, preference shares, ETFs).

4

Processing Cost Estimation (RunPod)

Two-pass self-hosted pipeline on RunPod using vLLM for high-throughput inference. All processing stays on private GPU instances — no data leaves your infrastructure.

Processing Pipeline

Pass 1 — Extraction
Chandra 9B
vLLM on 4× A100 80GB
Full page-by-page extraction
Pass 2 — Integrity Check
Qwen2.5-VL 72B
vLLM (AWQ) on 2× A100 80GB
Targeted financial data verification

Pass 1 processes every page through Chandra 9B for full text and table extraction. Pass 2 runs the heavier Qwen 72B model on financial statement pages only (~15% of IR pages, ~50% of SENS pages) to cross-verify extracted numbers, flag discrepancies, and ensure data integrity on high-value content.

Assumptions

A100 80GB (Community)
$1.64/hr
A100 80GB (Secure)
$2.49/hr
Chandra 9B Throughput
~10 pages/min
Qwen 72B Throughput
~2 pages/min
Avg IR Length
~120 pages
Avg SENS Length
~3 pages

Integrated Reports (IRs)

1,645 PDFs × ~120 pages = ~197,400 pages

Pass Model Pages GPU-Hours Instances Wall-Clock Cost Range
Pass 1 Chandra 9B 197,400 329 hrs 4× A100 ~3.4 days $540 – $819
Pass 2 Qwen 72B (AWQ) 29,610 (15%) 247 hrs 2× A100 ~5.1 days $405 – $615
IR Total 576 hrs ~8.5 days $945 – $1,434

SENS Announcements

5,930 PDFs × ~3 pages = ~17,790 pages

Pass Model Pages GPU-Hours Instances Wall-Clock Cost Range
Pass 1 Chandra 9B 17,790 30 hrs 4× A100 ~7.4 hrs $49 – $75
Pass 2 Qwen 72B (AWQ) 8,895 (50%) 74 hrs 2× A100 ~1.5 days $121 – $184
SENS Total 104 hrs ~2.2 days $170 – $259

Combined Total

IR Processing
$945 – $1,434
576 GPU-hrs · ~8.5 days
SENS Processing
$170 – $259
104 GPU-hrs · ~2.2 days
Grand Total
$1,115 – $1,693
680 GPU-hrs · ~10.7 days

Notes

  • Prices reflect RunPod A100 80GB SXM rates — Community Cloud ($1.64/hr) vs Secure Cloud ($2.49/hr)
  • Throughput estimates assume vLLM with continuous batching and page-as-image input
  • Pass 2 (Qwen 72B) uses AWQ 4-bit quantization to fit within 80GB VRAM
  • Pass 2 verification targets financial statement pages only — balance sheets, income statements, cash flows (~15% of IR pages, ~50% of SENS)
  • Wall-clock times assume passes run sequentially; SENS can be processed in parallel with later IR batches
  • Pilot recommendation: Run 50 IRs + 200 SENS first (~$50–$80) to validate throughput and quality before full run
5

Architecture & Data Flow

JSE Client Portal (clientportal.jse.co.za) | |-- WebstirService.svc ----> IR PDFs (1,645 files, 13.7 GB) | \-- /jse_reports/{ALPHA}/{file}.pdf | |-- SensService.svc ------> SENS PDFs (5,930 files, 824 MB) | |-- /sens_data/pdfs/SENS_*.pdf | \-- /sens_data/all_announcements.json | |-- CustomerRoleService --> Issuer Master Data (565 issuers) | \-- /sens_issuers.json | \-- IndicesService ----------> [Not yet collected] Daily Harvester (cron Mon-Fri 22:00 SAST) \-- sens_daily_harvest.py --> new SENS PDFs + updated index
6

Known Limitations & Gaps

Issue Impact Mitigation
SENS 15-per-issuer cap Historical SENS for active issuers is incomplete Daily harvester builds forward; no archive API exists
SENS date window (~4 days) Can't backfill old SENS by date range Per-issuer endpoint partially compensates
10 unmatched IR companies Can't link AGL, TBS, SAP etc. to SENS MasterIDs Manual MasterID lookup or fuzzy name matching
19 IR companies without SENS Missing SENS for Tiger Brands, Sappi, Anglo American Likely delisted/suspended or alpha code mismatch
Dead archive services SensArchiveService, SensSearchService unavailable No known workaround
Webstir limited to 15 doc types Limited to what JSE portal offers Supplement with company IR pages
No historical index composition IndicesService not yet explored Needs further API investigation
7

Decision Points & Next Steps

Questions to Resolve

Decided Processing approach: Two-pass pipeline — Chandra 9B extraction + Qwen 72B integrity verification on RunPod A100 80GB instances.

  1. Output format: Raw text, structured financial JSON/CSV, table extraction, or full document conversion?
  2. Scope: All 7,575 PDFs, or prioritize by type/company/year?
  3. Additional collection: Download remaining 14 Webstir document types (Annual Reports, Interim Results, Trading Statements, etc.)?
  4. Index data: Explore IndicesService for historical index composition and pricing?