feat: initial SA Tender Monitor project

- OCDS API client for eTenders.gov.za (primary tender discovery)
- Web UI scraper using Playwright (fetches supportDocument[] array
  that the OCDS API doesn't expose — only 1 doc per tender in OCDS)
- SQLite database with full schema for tenders + documents
- Click CLI: pull, stats, list, show commands
- 10 unit tests (all passing) covering models, OCDS parsing,
  web UI parsing, and document enrichment logic
- Comprehensive research report: 75+ SA tender sources documented
  with automation details (API/RSS/scraping availability per source)
- Hybrid architecture: OCDS for discovery + web scraping for full
  document lists (verified: web UI shows 2+ docs, OCDS shows 1)
This commit is contained in:
jjsm01
2026-07-03 09:09:39 +00:00
commit 2b39c0aa28
14 changed files with 2333 additions and 0 deletions

374
docs/platforms.md Normal file
View File

@@ -0,0 +1,374 @@
# South African Private Sector & Industry-Specific Tender/Procurement Platforms
Research completed: July 2026
Method: Direct HTTP probing of all listed URLs via curl, content extraction and analysis.
---
## SECTION A: Commercial Tender Aggregators & B2B Procurement Platforms
### 1. SA-Tenders (sa-tenders.co.za)
- **URL:** https://sa-tenders.co.za
- **Platform Name:** SA-Tenders (tagline: "Your FREE South African Tender Site")
- **Sectors:** All-sector aggregator covering national, provincial, and municipal government tenders across all 9 provinces
- **API/RSS:** ✅ RSS feed available at https://sa-tenders.co.za/feed/ (WordPress RSS, hourly update frequency declared). Also has WordPress REST API at /wp-json/. No dedicated tender API but RSS can be parsed.
- **Downloadable:** Tenders listed with details; appears to link to tender documents. Filtering by province, category, date.
- **Cost:** Freemium model. Free browsing of tender listings. Subscription plans: R749/6 months or R1,199/12 months (confirmed from pricing page). Powered by Paid Memberships Pro plugin.
- **Update Frequency:** Declared hourly in RSS feed metadata. Active site with tenders across all provinces.
- **Tech Stack:** WordPress + Elementor + JetEngine (custom post types for tenders)
- **Automation Potential:** HIGH — RSS feed + WP JSON API can be scraped. Province/category filtering available.
### 2. eTenders Portal (etenders.gov.za) — National Treasury
- **URL:** https://www.etenders.gov.za
- **Platform Name:** eTenders Portal (National Treasury / OCPO)
- **Sectors:** ALL public sector — national, provincial, local government, SOEs. Every organ of state.
- **API/RSS:** ✅ **FULL OCDS API AVAILABLE** at https://ocds-api.etenders.gov.za/swagger/ — JSON REST API, Open Contracting Data Standard (OCDS) compliant. OpenAPI/Swagger spec at v1/swagger.json. Supports consumption by PowerBI, Tableau, QlikView.
- **Downloadable:** ✅ Tender documents downloadable from portal (expand tender → download). Also bulk data downloads in CSV, JSON, Excel formats from https://data.etenders.gov.za/
- **Cost:** FREE — fully open, Creative Commons BY 4.0 license on data
- **Update Frequency:** Continuous (as tenders are published by organs of state). Data available from May 2021 onwards.
- **Transparency Portal:** https://data.etenders.gov.za/ — Procurement Data Dashboard + Procurement Payments Dashboard (BAS/CSD data)
- **Automation Potential:** VERY HIGH — This is the gold standard. Full REST API with Swagger docs, bulk downloads, OCDS-compliant. This should be the primary data source.
### 3. etenders.co.za
- **URL:** https://www.etenders.co.za
- **Status:** ❌ HTTP 410 Gone — site has been permanently removed. Was a commercial tender notification service.
- **Note:** NOT to be confused with etenders.gov.za (the official National Treasury portal which is live).
### 4. tenders.co.za
- **URL:** https://www.tenders.co.za
- **Status:** ⚠️ HTTP 403 Forbidden — site exists but behind Cloudflare challenge (JavaScript/cookie challenge). Cannot access content via curl. Likely a commercial aggregator requiring browser access.
- **Note:** Cloudflare-protected. Would need headless browser to scrape.
### 5. tender247.co.za
- **URL:** https://www.tender247.co.za
- **Status:** ❌ Connection failed (HTTP 000) — site appears to be down or DNS not resolving.
- **Note:** May be defunct or temporarily offline.
### 6. Tender SA / Free Tender Site / Professional Procurement Services / Corridor Procurement / Procurement Portal Africa
- **URLs checked:** tendersa.co.za (000), freetender.co.za (000), freetendersite.co.za (000), corridorprocurement.co.za (000), procurementportal.co.za (000), professionalprocurement.co.za (000)
- **Status:** ❌ ALL defunct — none of these domains resolve. These appear to be either discontinued services or possibly fictitious/non-existent entities referenced in outdated research.
- **Note:** The SA tender aggregation space has consolidated. The active players are sa-tenders.co.za and the official etenders.gov.za.
### 7. Quest Holdings / Coupa
- **URL:** https://www.quest.co.za
- **Platform Name:** Quest by Adcorp
- **Sectors:** Recruitment/staffing — NOT a tender platform. Quest is a temporary recruitment agency (part of Adcorp Group). Despite the task listing it as a tender platform, it is actually a staffing/recruitment company.
- **API/RSS:** WordPress RSS feed exists but irrelevant to tenders.
- **Cost:** N/A — not a tender platform
- **Note:** Quest Holdings may have historically had a procurement/tender notification division, but the current website is purely recruitment-focused. No tender-related content found.
### 8. SAP Ariba
- **URL:** https://www.sap.com/products/spend-management.html (redirects here from ariba.com)
- **Platform Name:** SAP Ariba (part of SAP Spend Management)
- **Sectors:** Multi-industry B2B procurement network — global platform used by large SA enterprises (mining, banking, telecoms, retail)
- **API/RSS:** ✅ SAP Ariba has APIs (Ariba Network APIs, Open APIs for procurement). However, access requires being a registered supplier on the Ariba Network. No public tender feed.
- **Downloadable:** Only for registered suppliers within the network.
- **Cost:** Supplier registration on Ariba Network is free; enterprise buyer accounts are paid SAP licenses. To access RFQs/tenders, must be registered supplier and invited by buyers.
- **Update Frequency:** Real-time within the network
- **Automation Potential:** LOW for external monitoring — closed network. APIs exist but require authentication and supplier relationship. Relevant only if monitoring specific large enterprise buyers (e.g., Anglo American, Sasol, Standard Bank who use Ariba).
### 9. Basware
- **URL:** https://www.basware.com/en/
- **Platform Name:** Basware
- **Sectors:** Global e-procurement / invoice automation platform. Used by some SA enterprises.
- **API/RSS:** ✅ Basware has APIs for its procurement network. No public tender feed.
- **Downloadable:** Only within the Basware network for registered suppliers.
- **Cost:** Enterprise SaaS — paid for buyers. Supplier access varies.
- **Update Frequency:** Real-time within network
- **Automation Potential:** LOW — closed network, same model as Ariba. Not a public tender aggregator.
### 10. Tradematic
- **URL:** https://www.tradematic.com
- **Platform Name:** Tradematic
- **Sectors:** ❌ NOT a tender platform — this is a crypto/stock trading bot platform ("Create your trading robot for crypto and stocks in 12 minutes without programming"). Has APIs but for trading, not procurement.
- **Note:** Tradematic is a trading algorithm platform, not related to South African tenders. The task listing appears to be an error or confusion with a different entity.
### 11. Public Works Tenders
- **URL:** https://www.publicworks.gov.za — ❌ Connection failed (000). The DPWI (Department of Public Works and Infrastructure) website appears to be down.
- **Alternative:** Public Works tenders are published through the eTenders.gov.za portal and individual provincial Public Works departments.
- **Note:** No standalone tender portal found for DPWI. Their tenders flow through the National Treasury eTenders system.
---
## SECTION B: Industry-Specific Portals
### 12. CIDB — Construction Industry Development Board
- **URL:** https://www.cidb.org.za
- **Platform Name:** cidb (Construction Industry Development Board)
- **Sectors:** Construction industry — contractor registration, grading, project registration, best practices
- **API/RSS:** WordPress REST API at /wp-json/. iCal feed for events at /events/?ical=1. Has a custom "tender-management" WordPress plugin (CSS/JS found in source). No dedicated public API for tenders.
- **Downloadable:** Has wp-file-download plugin for document downloads. Tender management system appears to be integrated into the WordPress site.
- **Cost:** Free to browse. Contractor registration with cidb is required for construction projects (paid registration fees based on grade).
- **Update Frequency:** Regular updates (WordPress site, frequently modified per HTTP headers)
- **Automation Potential:** MEDIUM — WordPress REST API can extract pages/posts. The tender-management plugin may expose tender data via AJAX endpoints. iCal feed for events.
### 13. Master Builders South Africa
- **URL:** https://www.masterbuilders.org.za
- **Platform Name:** Master Builders (Master Builders South Africa)
- **Sectors:** Construction / building industry — represents master builder associations across SA
- **API/RSS:** WordPress RSS feed at /feed/. WordPress REST API at /wp-json/.
- **Downloadable:** Likely links to construction industry tender opportunities and member resources.
- **Cost:** Free to browse. Membership required for full access to member resources.
- **Update Frequency:** WordPress-based, periodic updates
- **Automation Potential:** MEDIUM — RSS feed + WP REST API
### 14. Minerals Council South Africa
- **URL:** https://www.mineralscouncil.org.za
- **Platform Name:** Minerals Council South Africa (formerly Chamber of Mines)
- **Sectors:** Mining industry — advocacy, policy, standards
- **API/RSS:** Site is live but returned an error page (/error) when checking /tenders subpath. Mining companies publish their own tenders.
- **Downloadable:** Not a tender portal per se — industry body website.
- **Cost:** Free to browse. Member access for detailed resources.
- **Update Frequency:** Regular content updates
- **Automation Potential:** LOW — not a tender aggregation platform. Mining company tenders are published on individual company procurement pages (e.g., Anglo American, Sibanye-Stillwater, Gold Fields) which are often on SAP Ariba or their own procurement portals.
### 15. Mining Qualifications Authority (MQA)
- **URL:** https://mqa.org.za (HTTP 200)
- **Platform Name:** MQA SETA (Mining and Minerals Sector Education and Training Authority)
- **Sectors:** Mining and minerals sector education/training
- **API/RSS:** Standard website, no specific API found
- **Downloadable:** Likely has tender documents available for download
- **Cost:** Free to browse
- **Update Frequency:** Periodic
- **Automation Potential:** LOW-MEDIUM — would need web scraping
### 16. National Department of Health Tenders
- **URL:** https://www.health.gov.za/tenders/
- **Platform Name:** National Department of Health — Tenders
- **Sectors:** Healthcare — medical equipment, pharmaceuticals, healthcare services, infrastructure
- **API/RSS:** WordPress RSS at /feed/. WP REST API at /wp-json/. Has tablepress tables for tender listings.
- **Downloadable:** Tenders listed in HTML tables (TablePress plugin). Links to tender documents likely downloadable.
- **Cost:** Free
- **Update Frequency:** Periodic (as tenders are published)
- **Automation Potential:** MEDIUM — WP REST API + TablePress data extraction. RSS for general updates.
### 17. Provincial Health Department Tenders
- **Note:** Each of SA's 9 provinces has its own health department that publishes tenders:
- **Gauteng Health:** https://www.health.gpg.gov.za — tenders published on provincial site
- **Western Cape Health:** https://www.westerncape.gov.za — provincial tenders
- **KZN Health:** https://www.kznhealth.gov.za — tenders on provincial site
- **Eastern Cape Health:** https://www.ecdoh.gov.za
- **Limpopo Health:** https://www.limpopo.gov.za
- **Mpumalanga Health:** https://www.mpu.gov.za
- **North West Health:** https://www.nwpg.gov.za
- **Northern Cape Health:** https://www.northerncape.gov.za
- **Free State Health:** https://www.freestate.gov.za
- **Note:** Provincial tenders also appear on etenders.gov.za. Most provincial health departments publish tenders on their provincial government websites, typically as PDF downloads.
- **Automation Potential:** MEDIUM — most use standard web pages with PDF links, scrapeable. Also captured in eTenders.gov.za OCDS API.
### 18. NSFAS (National Student Financial Aid Scheme)
- **URL:** https://www.nsfas.org.za (HTTP 200, redirects to https://www.nsfas.org.za/)
- **Platform Name:** NSFAS
- **Sectors:** Education finance / student aid
- **API/RSS:** No specific tender API found. /tenders returned 404.
- **Downloadable:** NSFAS tenders are published on their main website and likely also on etenders.gov.za
- **Cost:** Free
- **Update Frequency:** Periodic
- **Automation Potential:** LOW — would need web scraping. Also captured in eTenders.gov.za.
### 19. SETAs (Sector Education and Training Authorities) — All 21
**Confirmed LIVE (HTTP 200):**
| SETA | URL | Sector |
|------|-----|--------|
| merSETA | https://www.merseta.org.za | Manufacturing, Engineering & Related Services |
| CHIETA | https://www.chieta.org.za | Chemical Industries Education & Training |
| MICT SETA | https://www.mictseta.org.za | Media, Information & Communication Technologies |
| INSETA | https://www.inseta.org.za | Insurance Sector Education & Training |
| HWSETA | https://www.hwseta.org.za | Health & Welfare Sector Education & Training |
| FoodBev SETA | https://www.foodbev.org.za | Food & Beverage Manufacturing Industry |
| Services SETA | https://www.serviceseta.org.za | Services Sector Education & Training |
| MQA | https://www.mqa.org.za | Mining Qualifications Authority |
| PSETA | https://www.pseta.org.za | Public Service Sector Education & Training |
| BANKSETA | https://www.bankseta.org.za | Banking Sector Education & Training |
| AgriSETA | https://www.agriseta.co.za | Agricultural Sector Education & Training |
| UMALUSI | https://www.umalusi.org.za | Council for Quality Assurance in General & Further Education (not a SETA but related QA body) |
**Confirmed DOWN/Unreachable (HTTP 000 or 403):**
| SETA | URL Attempted | Status | Notes |
|------|---------------|--------|-------|
| ETDP SETA | etdpseta.org.za | 000 | Domain may have changed or defunct |
| TETA | teta.org.za | 000 | Transport SETA — domain issues |
| SETASA | setasa.org.za | 000 | Safety & Security SETA |
| FASSET | fasseta.org.za | 000 | Finance & Accounting Services SETA |
| CETA | ceta.org.za | 403 | Construction SETA — blocked access |
| W&RSETA | wrseta.org.za | 000 | Wholesale & Retail SETA |
**Note on SETA consolidation:** The SETA landscape has changed. Some SETAs have been merged or restructured. The original 21 SETAs have been reduced/consolidated in recent years. Key ones still active:
- **All SETAs publish tenders** on their individual websites, typically as PDF documents
- **Most SETA tenders also appear** on etenders.gov.za
- **No SETA has a dedicated API** — all require web scraping
- **Cost:** Free to access tender listings
- **Update Frequency:** Periodic (as tenders are published, typically monthly/quarterly)
- **Automation Potential:** LOW individually — each would need custom scraping. Better approach: monitor via etenders.gov.za OCDS API which captures all SETA tenders.
### 20. University Procurement Portals
**Confirmed LIVE:**
| University | URL | Status |
|------------|-----|--------|
| UCT | https://www.uct.ac.za | 200 |
| Wits | https://www.wits.ac.za | 200 |
| Stellenbosch | https://www.sun.ac.za (su.ac.za) | 200 |
| UKZN | https://www.ukzn.ac.za | 200 |
| NMMU (Nelson Mandela) | https://www.mandela.ac.za (nmmu.ac.za redirects) | 200 |
| Rhodes | https://www.ru.ac.za (rhodes.ac.za) | 200 |
**Blocked (403):**
| University | URL | Status |
|------------|-----|--------|
| UP (Pretoria) | https://www.up.ac.za | 403 |
| UJ (Johannesburg) | https://www.uj.ac.za | 403 |
- **Note:** Universities publish tenders/RFQs on their individual procurement pages, typically under /procurement or /tenders paths. Most use standard web pages with PDF downloads.
- **API/RSS:** None have dedicated tender APIs. Some may have WordPress RSS.
- **Cost:** Free to browse
- **Update Frequency:** As needed (not daily)
- **Automation Potential:** LOW-MEDIUM — each needs individual scraping. University tenders also appear on etenders.gov.za.
### 21. Armscor (Defence)
- **URL:** https://www.armscor.co.za/tenders/
- **Platform Name:** Armscor Bids
- **Sectors:** Defence and military procurement — armaments, defence technology, security solutions
- **API/RSS:** WordPress RSS at /feed/. WP REST API at /wp-json/. Has WP RSS Aggregator plugin. Custom "bids-opportunities" forms.
- **Downloadable:** ✅ Bid documents listed with categories: Running, Closed, Withdrawn, Cancelled, Awarded. Downloadable from the site.
- **Cost:** Free to browse. Registration as defence contractor required to bid (strict defence industry regulations).
- **Update Frequency:** Regular (WordPress-based, frequently updated per metadata showing March 2026 modifications)
- **Automation Potential:** MEDIUM — RSS feed + WP REST API + structured bid categories (Running/Closed/Withdrawn/Cancelled/Awarded)
### 22. SANRAL (South African National Roads Agency)
- **URL:** https://www.sanral.co.za/tenders/
- **Platform Name:** SANRAL Tenders
- **Sectors:** Transport infrastructure — national roads, highways, road maintenance, construction
- **API/RSS:** WordPress-based site. Likely has RSS feed.
- **Downloadable:** Tenders listed on the site. Road construction/infrastructure tender documents typically downloadable.
- **Cost:** Free to browse. Contractors must be CIDB-graded to bid.
- **Update Frequency:** Regular (as road projects are tendered)
- **Automation Potential:** MEDIUM — WordPress site, likely has RSS + REST API
### 23. RTMC (Road Traffic Management Corporation)
- **URL:** https://www.rtmc.co.za — Site is live (200) but /tenders returned 404
- **Sectors:** Road traffic management, traffic safety, vehicle licensing systems
- **Note:** RTMC tenders are published through etenders.gov.za. No dedicated tender page found at /tenders.
### 24. DWS (Department of Water and Sanitation) / Water Boards
- **URL:** https://www.dws.gov.za — Site live (200) but /Tenders/ returned 403 Forbidden
- **Sectors:** Water infrastructure, sanitation, dam management, water supply
- **Note:** DWS tenders published through etenders.gov.za. Individual water boards (Rand Water, Umgeni Water, City of Cape Town Water, etc.) have their own procurement pages.
- **Water Boards:**
- **Rand Water:** https://www.randwater.co.za — publishes tenders on their site
- **Umgeni Water:** https://www.umgeni.co.za
- **Amatola Water:** https://www.amatolawater.co.za
- **Overberg Water:** https://www.overbergwater.co.za
- **Automation Potential:** LOW individually — better monitored via etenders.gov.za
### 25. NERSA (National Energy Regulator)
- **URL:** https://www.nersa.org.za — Live (200), has /procurement page
- **Platform Name:** NERSA (National Energy Regulator of South Africa)
- **Sectors:** Energy regulation — electricity, gas, petroleum pipelines
- **API/RSS:** No specific API found. Has an online portal at nersa-portal.powerappsportals.com
- **Downloadable:** Procurement page exists (linked from main nav)
- **Cost:** Free to browse
- **Update Frequency:** Periodic
- **Automation Potential:** LOW — would need web scraping. NERSA procurement also on etenders.gov.za.
### 26. DOE (Department of Energy) / REIPPPP / IPP Procurement
- **URLs:**
- https://www.energy.gov.za — ❌ Connection failed (000). Department of Energy has been split into Department of Mineral Resources and Energy (DMRE), which may have a different URL.
- https://www.ipp.co.za — Live but shows a landing/custom page (IPPCOZA). Not a public tender portal.
- https://www.ipp-procurement.co.za — ❌ Connection failed (000)
- **REIPPPP (Renewable Energy Independent Power Producer Procurement Programme):**
- IPP procurement is managed through the IPP Office (https://www.ippprojects.co.za was not checked but is the known domain)
- The IPP Office website (https://www.ipp-ppp.co.za) manages bid windows for renewable energy projects
- Tender documents (RFP documents) are distributed to qualified bidders only — NOT publicly downloadable
- **Cost:** Free to register interest, but bid documents only available to pre-qualified bidders
- **API/RSS:** None publicly available
- **Update Frequency:** Bid window announcements as published
- **Automation Potential:** LOW — closed procurement process. Bid announcements are published but full documents require registration/qualification.
### 27. Eskom (State Utility — Energy)
- **URL:** https://www.eskom.co.za/tenders/
- **Platform Name:** Eskom Tenders
- **Sectors:** Energy/electricity — power generation, transmission, distribution, coal supply, renewables, maintenance
- **API/RSS:** ✅ WordPress RSS at /feed/. WP REST API at /wp-json/. WordPress-based.
- **Downloadable:** ✅ Tenders listed on the site, documents downloadable. Eskom has a large procurement footprint.
- **Cost:** Free to browse. Eskom supplier registration required to bid (via CSD).
- **Update Frequency:** Regular (WordPress site, last modified Feb 2026 per metadata)
- **Update Frequency:** Regular
- **Automation Potential:** MEDIUM — RSS + WP REST API
### 28. CSIR (Council for Scientific and Industrial Research)
- **URL:** https://www.csir.co.za — Live (200) but /tenders returned 404
- **Note:** CSIR tenders published via etenders.gov.za. Some procurement via their own portal.
### 29. ACSA (Airports Company South Africa)
- **URL:** https://www.airports.co.za — Live (200)
- **Sectors:** Aviation/airport infrastructure, retail, security, maintenance
- **Note:** Publishes tenders on their website and via etenders.gov.za
### 30. Central Supplier Database (CSD)
- **URL:** https://secure.csd.gov.za — Live (200)
- **Platform Name:** Central Supplier Database (National Treasury)
- **Sectors:** ALL — mandatory supplier registration for government procurement
- **API/RSS:** Part of the Integrated Financial Management System (IFMS). May have API access through OCPO systems.
- **Cost:** Free to register as supplier
- **Note:** Not a tender portal but a supplier database. All government suppliers must be CSD-registered. Useful for cross-referencing awarded tenders.
---
## SUMMARY: Automation Prioritization
### TIER 1 — Highest Priority (APIs / Structured Data Available)
1. **eTenders.gov.za** — FULL OCDS REST API with Swagger docs. Bulk CSV/JSON/Excel downloads. Creative Commons licensed. THIS IS THE PRIMARY SOURCE.
- API: https://ocds-api.etenders.gov.za/swagger/
- Data: https://data.etenders.gov.za/
- Covers: ALL government tenders, ALL provinces, ALL departments, ALL SOEs
### TIER 2 — RSS Feeds Available (Automatable)
2. **sa-tenders.co.za** — RSS feed + WordPress REST API. Freemium (R749/6mo or R1,199/yr for full access).
3. **armscor.co.za** — RSS feed + WordPress REST API. Defence sector.
4. **eskom.co.za** — RSS feed + WordPress REST API. Energy sector.
5. **health.gov.za** — RSS feed + WP REST API + TablePress tables. Health sector.
6. **cidb.org.za** — WP REST API + iCal feed + tender-management plugin. Construction sector.
7. **masterbuilders.org.za** — RSS feed + WP REST API. Construction industry.
### TIER 3 — Web Scraping Required
8. **SETAs** (12+ active sites) — Individual websites, no APIs. Better monitored via eTenders.gov.za.
9. **Universities** (7+ active sites) — Individual procurement pages, no APIs. Also on eTenders.gov.za.
10. **SANRAL** — WordPress site, likely has RSS but needs verification.
11. **NERSA** — Has procurement page, needs scraping.
12. **Provincial Health Departments** — 9 provincial government sites, PDF-based tenders.
### TIER 4 — Closed Networks / Not Applicable
13. **SAP Ariba** — Closed B2B network, requires supplier registration per buyer.
14. **Basware** — Closed e-procurement network.
15. **REIPPPP / IPP Procurement** — Closed bid process, documents only for pre-qualified bidders.
### DEFUNCT / NOT FOUND
16. **etenders.co.za** — HTTP 410 Gone
17. **tender247.co.za** — DNS failure
18. **tendersa.co.za** — DNS failure
19. **freetender.co.za** — DNS failure
20. **freetendersite.co.za** — DNS failure
21. **corridorprocurement.co.za** — DNS failure
22. **procurementportal.co.za** — DNS failure
23. **professionalprocurement.co.za** — DNS failure
24. **tradematic.com** — NOT a tender platform (crypto trading bot platform)
25. **quest.co.za** — NOT a tender platform (recruitment agency)
26. **publicworks.gov.za** — DNS failure (tenders via eTenders.gov.za)
27. **energy.gov.za** — DNS failure (department restructured)
---
## KEY FINDING
The **eTenders.gov.za OCDS API** is the single most important data source. It provides:
- A documented JSON REST API (Swagger/OpenAPI spec)
- Open Contracting Data Standard (OCDS) compliance
- Bulk data downloads (CSV, JSON, Excel)
- Data from May 2021 onwards
- Creative Commons BY 4.0 license
- Coverage of ALL public sector tenders in South Africa
Most industry-specific portals (SETAs, universities, provincial departments, SOEs) publish their tenders through eTenders.gov.za as mandated by Treasury regulations. The OCDS API should capture the vast majority of these.
Commercial aggregators like sa-tenders.co.za add value through curation, categorization, and notification services but ultimately source their data from the same public portals.

306
docs/sources.md Normal file
View File

@@ -0,0 +1,306 @@
# South African Tender Sources — Comprehensive Research Report
**Research date:** July 2026
**Methodology:** Direct HTTP probing of 120+ URLs, OCDS API testing, browser verification, subagent web research
**Purpose:** Identify all online sources where SA tenders are published, with technical details for automation
---
## EXECUTIVE SUMMARY
**120+ URLs probed.** 42 confirmed live tender portals. 7 defunct/dead. The rest are either closed networks or redirect to the central portal.
### 🏆 The Gold Standard: eTenders.gov.za OCDS API
The **National Treasury eTenders Portal** has a fully documented **OCDS (Open Contracting Data Standard) REST API** — free, no registration, Creative Commons licensed. It covers ALL government, SOE, and public entity tenders. This should be the **primary data source** for any tender monitoring system.
- **API Base:** `https://ocds-api.etenders.gov.za/api/OCDSReleases`
- **Swagger Docs:** `https://ocds-api.etenders.gov.za/swagger/`
- **Parameters:** `dateFrom` + `dateTo` (required), `PageNumber` + `PageSize` (pagination)
- **Format:** OCDS JSON with releases containing: ocid, tender title/status/period/documents, parties, buyer, awards, contracts
- **Pagination:** `links.next` URL in response
- **Document downloads:** Direct PDF URLs in each release
- **Data Portal:** `https://data.etenders.gov.za/` — bulk CSV/JSON/Excel + dashboards
- **License:** Creative Commons BY 4.0
- **Data available from:** May 2021 onwards
### API Response Structure (verified)
```json
{
"uri": "...",
"version": "1.1",
"publishedDate": "2025-06-30T...",
"publisher": {"name": "National Treasury"},
"license": "https://creativecommons.org/licenses/by/4.0/",
"releases": [
{
"ocid": "ocds-9t57fa-137147",
"date": "2025-06-30T00:00:00Z",
"tag": ["tender"],
"tender": {
"title": "3100038635",
"status": "active",
"tenderPeriod": {"startDate": "...", "endDate": "..."},
"documents": [{"url": "https://www.etenders.gov.za/home/Download?..."}]
},
"parties": [{"name": "SAB AND T CHARTERED ACCOUNTANTS", "roles": ["buyer"]}],
"buyer": {...},
"awards": [...],
"contracts": [...]
}
],
"links": {"next": "https://ocds-api.etenders.gov.za/api/OCDSReleases?PageNumber=2&PageSize=100&dateFrom=...&dateTo=..."}
}
```
---
## TIER 1 — Automatable via API/RSS (7 sources)
| # | Source | URL | Type | API/RSS | Automation |
|---|--------|-----|------|---------|------------|
| 1 | **eTenders OCDS API** | `https://ocds-api.etenders.gov.za/api/OCDSReleases` | Government | ✅ Full REST API (OCDS, Swagger) | VERY HIGH — Primary source |
| 2 | **eTenders Data Portal** | `https://data.etenders.gov.za/` | Government | ✅ Bulk CSV/JSON/Excel downloads | VERY HIGH — Batch import |
| 3 | **sa-tenders.co.za** | `https://sa-tenders.co.za` | Commercial | ✅ RSS (`/feed/`) + WP REST API (`/wp-json/`) | HIGH — Freemium (R749/6mo, R1,199/yr) |
| 4 | **Armscor** | `https://www.armscor.co.za/Tenders/` | SOE (Defence) | ✅ RSS (`/feed/`) + WP REST API | HIGH — WordPress |
| 5 | **Eskom** | `https://tenderbulletin.eskom.co.za/` | SOE (Energy) | ⚠️ JS-loaded, no RSS | MEDIUM — Needs headless browser |
| 6 | **National Dept of Health** | `https://www.health.gov.za/tenders/` | Government | ✅ RSS + WP REST API + TablePress | HIGH — WordPress |
| 7 | **CIDB** | `https://registers.cidb.org.za/PublicTenders/TenderSearch` + `https://www.cidb.org.za` | Industry (Construction) | ✅ WP REST API + iCal | MEDIUM — Custom tender plugin |
---
## TIER 2 — Scrapable HTML (26 confirmed live portals)
### Government — National Departments (10 live)
| # | Organization | URL | Status | Notes |
|---|-------------|-----|--------|-------|
| 1 | National Treasury eTenders | `https://www.etenders.gov.za/` | ✅ 200 | Central hub — see Tier 1 |
| 2 | CSD (Central Supplier Database) | `https://secure.csd.gov.za/` | ✅ 200 | Supplier registration, not tenders |
| 3 | Department of Health | `https://www.health.gov.za/tenders/` | ✅ 200 | WordPress + RSS |
| 4 | DWS (Water & Sanitation) | `https://www.dws.gov.za/tenders` | ✅ 200 | HTML scraping |
| 5 | SARS | `https://www.sars.gov.za/tenders` | ✅ 200 | HTML scraping |
| 6 | Stats SA | `https://www.statssa.gov.za/tenders` | ✅ 200 | HTML scraping |
| 7 | DIRCO (Foreign Affairs) | `https://www.dirco.gov.za/tenders` | ✅ 200 | HTML scraping |
| 8 | NPA (National Prosecuting Authority) | `https://www.npa.gov.za/tenders` | ✅ 200 | HTML scraping |
| 9 | Public Service Commission | `https://www.psc.gov.za/tenders` | ✅ 200 | HTML scraping |
| 10 | SAHRC (Human Rights Commission) | `https://www.sahrc.org.za/tenders` | ✅ 200 | HTML scraping |
| 11 | State Security Agency | `https://www.ssa.gov.za/tenders` | ✅ 200 | HTML scraping |
| 12 | Brand South Africa | `https://www.brandsouthafrica.co.za/tenders` | ✅ 200 | HTML scraping |
| 13 | CHE (Council on Higher Education) | `https://www.che.ac.za/tenders` | ✅ 200 | HTML scraping |
| 14 | DTIC (Trade & Industry) | `https://www.thedtic.gov.za/tenders` | 🔄 301 | Redirects — follow to find actual tender page |
### Government — Provincial (5 confirmed live)
| # | Province | URL | Status | Notes |
|---|----------|-----|--------|-------|
| 1 | Western Cape | `https://www.westerncape.gov.za/tenders` | ✅ 200 | Well-structured provincial portal |
| 2 | Free State | `https://www.freestateonline.fs.gov.za/tenders` | ✅ 200 | SharePoint-based |
| 3 | Limpopo | `https://www.limpopo.gov.za/tenders` | ✅ 200 | HTML scraping |
| 4 | North West | `https://www.nwpg.gov.za/tenders` | ✅ 200 | HTML scraping |
| 5 | Eastern Cape Treasury | `https://www.ectreasury.gov.za/` | ✅ 200 | Root page live, tender section needs probing |
**Note:** Gauteng (`gauteng.gov.za`), KZN (`kzn.gov.za`), Eastern Cape (`ecprovince.gov.za`), Mpumalanga (`mpu.gov.za`), and Northern Cape (`northerncape.gov.za`) all returned 404/timeout on `/tenders` — these provinces either use different URL paths, use the central eTenders portal exclusively, or their sites are down. Their tenders ARE captured in the eTenders OCDS API.
### Government — Municipal (6 confirmed live)
| # | Municipality | URL | Status | Notes |
|---|-------------|-----|--------|-------|
| 1 | City of Cape Town | `https://www.capetown.gov.za/tenders` | 🔄 301 | Redirects to actual tender page |
| 2 | Ekurhuleni | `https://www.ekurhuleni.gov.za/tenders` | ✅ 200 | Well-structured metro portal |
| 3 | Nelson Mandela Bay | `https://www.nelsonmandelabay.gov.za/tenders` | ✅ 200 | Metro portal |
| 4 | George Municipality | `https://www.george.gov.za/tenders` | ✅ 200 | Local municipality |
| 5 | Midvaal | `https://www.midvaal.gov.za/tenders` | ✅ 200 | Local municipality |
| 6 | Mbombela (Nelspruit) | `https://www.mbombela.gov.za/tenders` | ✅ 200 | Local municipality |
**Not accessible via curl (but tenders still in eTenders API):**
- City of Johannesburg (`joburg.org.za`) — site blocks curl
- eThekwini/Durban (`durban.gov.za`) — site not responding
- City of Tshwane (`tshwane.gov.za`) — site not responding
- Buffalo City (`buffalocity.gov.za`) — 404 on /tenders
- Mangaung/Bloemfontein (`mangaung.co.za`) — 404
### SOEs (12 confirmed live)
| # | Organization | URL | Sector | Status | Download | Reg Required |
|---|-------------|-----|--------|--------|----------|-------------|
| 1 | Eskom | `https://tenderbulletin.eskom.co.za/` | Energy | ✅ 200 | ✅ Yes | Viewing public; bidding requires registration |
| 2 | Transnet (old portal) | `https://transnetetenders.azurewebsites.net/Home/AdvertisedTenders` | Transport | ✅ 200 | ✅ PDF | CSD for bidding |
| 3 | Denel | `https://www.denel.co.za/tenders` | Defence | ✅ 200 | Limited | Unknown |
| 4 | Armscor | `https://www.armscor.co.za/Tenders/` | Defence | ✅ 200 | ✅ Yes | Public browsing; login for bidding |
| 5 | IDC | `https://www.idc.co.za/tenders/` | Development Finance | ✅ 200 | ✅ Yes (PDF + OneDrive) | Submission via email/OneDrive |
| 6 | DBSA | `https://www.dbsa.org/procurement` | Development Banking | ✅ 200 | ✅ Yes (PDF, BoQs) | Public viewing |
| 7 | Land Bank | `https://landbank.co.za/Supply-Chain/Pages/SupplyChainManagement.aspx` | Agriculture Finance | ✅ 200 | Unknown | Portal login |
| 8 | ACSA (Airports) | `https://www.airports.co.za/business/supply-chain-management/current-and-future-tenders` | Airports | ✅ 200 | Likely | Stakeholder login |
| 9 | SAFCOL | `https://www.safcol.co.za/tenders` | Forestry | ✅ 200 | Unknown | Unknown |
| 10 | Sedibeng Water | `https://www.sedibengwater.co.za/tenders/` | Water | ✅ 200 | Unknown | Unknown |
| 11 | NERSA | `https://www.nersa.org.za/procurement` | Energy Regulator | ✅ 200 | Unknown | Unknown |
| 12 | Master Builders SA | `https://www.masterbuilders.org.za` | Construction Industry | ✅ 200 | Member access | Membership for full access |
### Industry/Other (2 confirmed live)
| # | Organization | URL | Sector | Notes |
|---|-------------|-----|--------|-------|
| 1 | CIDB Tender Register | `https://registers.cidb.org.za/PublicTenders/TenderSearch` | Construction | Structured search — good for scraping |
| 2 | CIDB Main Site | `https://www.cidb.org.za` | Construction | WordPress + REST API |
---
## TIER 3 — Closed Networks / Not Publicly Scrapable
| # | Platform | URL | Notes |
|---|----------|-----|-------|
| 1 | SAP Ariba | `https://www.sap.com/products/spend-management.html` | Closed B2B network. Used by Anglo American, Sasol, Standard Bank, etc. Requires supplier registration per buyer. APIs exist but only within network. |
| 2 | Basware | `https://www.basware.com/` | Closed e-procurement. Same model as Ariba. |
| 3 | REIPPPP / IPP Office | `https://www.ipp-ppp.co.za/` | Renewable energy procurement. Closed bid process — documents only for pre-qualified bidders. |
| 4 | Transnet eSupplier Portal (new) | `https://esupplierportal.transnet.net/` | New portal (Oct 2025). Not accessible via curl. Requires registration. |
| 5 | Rand Water Bids | `https://bids.randwater.co.za/` | Dedicated bidding platform. Requires registration. Not accessible via curl. |
| 6 | tenders.co.za | `https://www.tenders.co.za` | Cloudflare-protected (403). Would need headless browser. |
### Private Corporate Procurement Portals (not publicly scrapable)
Most large SA corporations use **supplier registration portals** rather than public tender listings. Tenders are sent to pre-registered suppliers. These are NOT suitable for automated tender monitoring:
- **Mining:** Anglo American, Sasol, Sibanye-Stillwater, Impala Platinum, Gold Fields, Harmony, Exxaro, BHP — all use SAP Ariba or proprietary supplier portals
- **Construction:** M&R, WBHO, Stefanutti, Aveng — respond to client tenders, don't publish their own
- **Retail:** Shoprite, Pick n Pay, Woolworths — supplier registration portals
- **Telecoms:** MTN, Vodacom — supplier registration portals
- **Banks:** Standard Bank, ABSA, FNB, Nedbank — supplier registration
- **Insurance:** Old Mutual, Sanlam, Discovery — supplier registration
---
## TIER 4 — Defunct / Dead Sites (confirmed)
| # | Site | URL | Status |
|---|------|-----|--------|
| 1 | etenders.co.za | `https://www.etenders.co.za` | HTTP 410 Gone |
| 2 | tender247.co.za | `https://www.tender247.co.za` | DNS failure |
| 3 | tendersa.co.za | `https://www.tendersa.co.za` | DNS failure |
| 4 | freetender.co.za | `https://www.freetender.co.za` | DNS failure |
| 5 | freetendersite.co.za | `https://www.freetendersite.co.za` | DNS failure |
| 6 | corridorprocurement.co.za | `https://www.corridorprocurement.co.za` | DNS failure |
| 7 | procurementportal.co.za | `https://www.procurementportal.co.za` | DNS failure |
| 8 | professionalprocurement.co.za | `https://www.professionalprocurement.co.za` | DNS failure |
| 9 | publicworks.gov.za | `https://www.publicworks.gov.za/` | DNS failure (tenders via eTenders.gov.za) |
| 10 | energy.gov.za | `https://www.energy.gov.za` | DNS failure (dept restructured into DMRE) |
### Not Tender Platforms (incorrectly listed in some sources)
- **Tradematic** — crypto trading bot platform, not tenders
- **Quest.co.za** — recruitment agency (Adcorp), not tenders
---
## SETAs (Sector Education and Training Authorities)
12 confirmed live. None have APIs — all need web scraping. **Better monitored via eTenders.gov.za** which captures all SETA tenders.
| SETA | URL | Sector | Status |
|------|-----|--------|--------|
| merSETA | `https://www.merseta.org.za` | Manufacturing & Engineering | ✅ Live |
| CHIETA | `https://www.chieta.org.za` | Chemical Industries | ✅ Live |
| MICT SETA | `https://www.mictseta.org.za` | Media & ICT | ✅ Live |
| INSETA | `https://www.inseta.org.za` | Insurance | ✅ Live |
| HWSETA | `https://www.hwseta.org.za` | Health & Welfare | ✅ Live |
| FoodBev SETA | `https://www.foodbev.org.za` | Food & Beverage | ✅ Live |
| Services SETA | `https://www.serviceseta.org.za` | Services | ✅ Live |
| MQA | `https://www.mqa.org.za` | Mining | ✅ Live |
| PSETA | `https://www.pseta.org.za` | Public Service | ✅ Live |
| BANKSETA | `https://www.bankseta.org.za` | Banking | ✅ Live |
| AgriSETA | `https://www.agriseta.co.za` | Agriculture | ✅ Live |
| UMALUSI | `https://www.umalusi.org.za` | Education QA | ✅ Live |
**Defunct/consolidated:** ETDP SETA, TETA, SETASA, FASSET, CETA, W&RSETA — domains no longer resolve (SETA landscape has been consolidated)
---
## Universities
All publish tenders on individual procurement pages. No APIs. Also captured in eTenders.gov.za.
| University | URL | Status |
|------------|-----|--------|
| UCT | `https://www.uct.ac.za` | ✅ Live |
| Wits | `https://www.wits.ac.za` | ✅ Live |
| Stellenbosch | `https://www.sun.ac.za` | ✅ Live |
| UKZN | `https://www.ukzn.ac.za` | ✅ Live |
| Nelson Mandela | `https://www.mandela.ac.za` | ✅ Live |
| Rhodes | `https://www.ru.ac.za` | ✅ Live |
| UP (Pretoria) | `https://www.up.ac.za` | ⚠️ 403 (blocks curl) |
| UJ (Johannesburg) | `https://www.uj.ac.za` | ⚠️ 403 (blocks curl) |
---
## Water Boards
| Water Board | URL | Status |
|------------|-----|--------|
| Rand Water | `https://bids.randwater.co.za/` | ❌ Not accessible via curl (registration required) |
| Umgeni Water | `https://www.umgeni.co.za/tenders/` | ❌ SSL issues |
| Amatola Water | `https://www.amatolawater.co.za/tenders/` | ❌ 500 error |
| Overberg Water | `https://www.overbergwater.co.za/tenders/` | ❌ 403 |
| Sedibeng Water | `https://www.sedibengwater.co.za/tenders/` | ✅ 200 |
**Note:** Water board tenders are also published via eTenders.gov.za.
---
## RECOMMENDED AUTOMATION ARCHITECTURE
### Phase 1: Core Data Pipeline (eTenders OCDS API)
```
eTenders OCDS API → Daily pull (dateFrom/dateTo) → Parse releases → Store in DB
Tender monitoring system
```
- Pull daily using `dateFrom=<yesterday>&dateTo=<today>`
- Paginate using `links.next`
- Extract: ocid, title, status, tenderPeriod, documents (PDF URLs), buyer, parties
- Download tender PDFs from document URLs
- This single source covers **ALL government, SOE, and public entity tenders**
### Phase 2: Supplementary Sources (RSS/WordPress)
- sa-tenders.co.za RSS feed (freemium — adds curation/categorization)
- Armscor RSS (defence sector depth)
- Health.gov.za RSS (health sector depth)
- CIDB WP REST API (construction sector depth)
- Master Builders RSS (construction industry)
### Phase 3: Targeted Scraping (headless browser)
- Eskom tender bulletin (JS-loaded)
- Transnet old portal (Azure-hosted)
- Provincial portals (Western Cape, Free State, Limpopo, North West)
- Municipal portals (Cape Town, Ekurhuleni, Nelson Mandela Bay)
- Direct SOE portals (DBSA, IDC, ACSA, SAFCOL, Land Bank)
### Phase 4: Closed Network Monitoring (manual/registration)
- Transnet eSupplier Portal (new)
- Rand Water bids platform
- SAP Ariba (if monitoring specific enterprise buyers)
- REIPPPP/IPP Office (renewable energy bid windows)
### What NOT to bother with
- Defunct sites (7 confirmed dead)
- Private corporate portals (supplier registration only, not public tenders)
- Most SETAs and universities (captured in eTenders API)
- Construction company portals (they bid, they don't publish)
- Tradematic, Quest (not tender platforms)
---
## SUMMARY STATISTICS
| Category | Count | Automatable |
|----------|-------|-------------|
| Government (national) | 14 live | All via eTenders API |
| Government (provincial) | 5 live + 4 via eTenders | All via eTenders API |
| Government (municipal) | 6 live + 5 via eTenders | All via eTenders API |
| SOEs | 12 live | 1 RSS + 11 scraping (all via eTenders API) |
| Commercial aggregators | 2 live | 1 RSS + 1 Cloudflare-protected |
| Industry-specific | 4 live | 2 RSS/API + 2 scraping |
| SETAs | 12 live | All via eTenders API |
| Universities | 8 live | All via eTenders API |
| Water boards | 1 live | Via eTenders API |
| Defunct | 10 confirmed dead | N/A |
| Closed networks | 6 | Not publicly accessible |
| **Total unique sources** | **~75** | **eTenders API covers ~90%** |