South Africa Government Tender Awards
Pricing
from $3.00 / 1,000 results
South Africa Government Tender Awards
Who won South African government tenders, for how much and from which buyer: award rows from the official eTenders API, linked to source.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Mastazee Data Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
Security
Limited permissionsShare
Find out who won South African government tenders, for how much, and from which buyer. This Actor reads National Treasury's official eTenders open-data API and gives you one clean row per award: the winning supplier, the buyer, the contract value, the dates and a link back to the official record.
eTenders publishes open tenders well, but its award data is hard to use as it comes: a quarter to almost half of records make the API return a server error, award values are published with the decimal point missing, and supplier names come wrapped in stray spaces and brackets. This Actor skips and counts the broken records, reports the reliable signed-contract value instead, and cleans the names.
What you can use it for
- Track your competitors. See which tenders a rival supplier has won, from which departments, and for how much. Filter by supplier name.
- Size a market. Pull every awarded security, cleaning or IT contract for a province or a department and add up what was spent.
- Plan for re-tenders. See who is buying what you sell, and when the contract ends (
contract_end_date), so you are ready when it comes up again.
Tested on 26 October 2026 against the live eTenders API: the newest 800 tenders gave 141 award rows in about 1.5 minutes (215 tenders skipped by the eTenders server error described below), and the default input returns award rows from May 2026. On the Apify platform the default input returned 39 award rows in about 1.7 minutes.
This is a data tool, not a lead guarantee. Coverage is what buyers publish on eTenders (see Coverage and limits).
What you get
One row per award per supplier. A sample row from a real run:
| Field | Example |
|---|---|
supplier_name | REAL SEC |
supplier_id | eTenders' own supplier number, the same across all of that supplier's awards |
supplier_enterprise_size | EME (exempted micro enterprise), QSE (qualifying small enterprise) or GEN, as eTenders records it |
buyer_name | Kwazulu Natal - Education |
buyer_province | KwaZulu-Natal |
tender_title | APPOINTMENT OF A SERVICE PROVIDER/S TO RENDER SECURITY SERVICES … |
tender_reference | the buyer's bid number |
category | goods, services or works |
procurement_method | e.g. Request for Quotation, Request for Bid (Open-Tender), Single source bidding |
contract_value_zar | 8365627 |
contract_signed_date | 2026-06-10 |
contract_start_date, contract_end_date | contract period, when published |
tender_published_date, tender_closing_date | when the tender opened and closed |
award_value_as_published | the award amount exactly as eTenders shows it (see below) |
ocid, source_url, licence | the official record and its open-data licence |
Read this before you add up values
contract_value_zaris the value to use. It comes from the signed contract, in whole rand, with any cents dropped.award_value_as_publishedis usually wrong by a factor of 10 or 100. eTenders drops the decimal point from award amounts: a contract worth R8,365,627 is listed as an award of 836562779. We checked all 11 awards in our sample that also have a contract, and every one was exactly 10× or 100× too high. We keep the published figure for completeness but never "fix" it, because the number of missing decimal places can't be known without the contract.- Not every award has a contract yet. In our samples about a third did. Without one,
contract_value_zarand the contract dates are empty. buyer_provincecomes from the buyer's name, because eTenders has no province field. It is filled for provincial departments ("Gauteng Health", "Kwazulu Natal - Education") and the big metros (Johannesburg, Tshwane, Ekurhuleni, Cape Town, eThekwini, Nelson Mandela Bay, Buffalo City, Mangaung). National departments and most local municipalities have no province.- Personal contact details are removed. eTenders attaches an official's name, phone number and email to each award. This Actor never outputs them.
How to run it
eTenders numbers every tender in order (ocds-9t57fa-1, -2, … about 175,000 so far, roughly 110 more each day). The Actor checks a run of those numbers, counting back from a starting point, and saves the awards it finds.
| Input | What it does |
|---|---|
| Start from tender number | Where to start counting back. 0 means the newest tender. The default, 157000, is late May 2026 and returns awards straight away. |
| Tenders to scan | How many tender numbers to check. About one readable tender in seven has an award. 500 takes under a minute; 15,000 covers four to five months. |
| Maximum awards | Stop after this many rows. |
| Maximum scan time | Stop scanning after this many seconds (default 3,300) and keep what was found. |
| Buyer / supplier name contains | Keep only matching names. Not case-sensitive. |
| Categories, Buyer province, Minimum contract value | Narrow the results further. |
Tip: awards appear weeks or months after a tender is published. If you start from the newest tender (0), scan at least 15,000 tenders, or you will mostly see tenders that haven't been awarded yet.
Each run also saves a RUN_SUMMARY record in its key-value store, showing how many tenders were read, skipped or missing.
Coverage and limits
- Source: eTenders OCDS API, published by National Treasury under the Open Data Commons PDDL (public domain). Every row links to its source record, as the eTenders publication policy asks.
- eTenders covers national and provincial departments plus the municipalities and state-owned entities that choose to publish there. It is not every public contract in South Africa.
- About 25–45% of eTenders records cannot be read at all: the official API returns a server error for them (215 of the newest 800 on 26 October 2026). The Actor skips them and counts them in
RUN_SUMMARY. When Treasury fixes those records, re-running the same range picks them up. - The Actor sends at most 8 requests at a time (4 by default), to be polite to a government server.
- Up to 50,000 tenders per run (over a year of tenders). A run that reaches its maximum scan time keeps what it found; its
RUN_SUMMARYsaysstatus: partialand gives the lowest tender number reached. - No "new since last run" mode: each run returns every award in the range it scans.
Running time
About 8–10 tenders a second at the default 4 parallel requests. Measured on 26 October 2026:
| Scan | Time | Award rows |
|---|---|---|
| 500 tenders (default, May 2026) | ~1 min | ~39 |
| Newest 800 tenders (about a week) | ~1.5 min | 141 |
| 15,000 tenders (~4–5 months) | ~25–30 min (estimated) | roughly 1,200–2,600 (estimated) |
Pricing
Pay per event: $3.00 per 1,000 award rows ($0.003 per row), plus Apify's standard tiny start fee. You are charged only for rows written to your dataset.
| How you use it | Award rows | You pay (approx.) |
|---|---|---|
| Default run (500 tenders) | ~39 | ~$0.12 |
| Weekly run over the newest ~800 tenders, for a month | ~600 | ~$1.80 a month |
| One 15,000-tender export (4–5 months) | ~1,200–2,600 | ~$3.60–7.80 |
- Spending limits: if you set a maximum cost per run, the Actor stops scanning as soon as it's reached, so you don't pay for work it can't deliver. The run summary says where it stopped.
- Failed runs: a run that can't reach eTenders outputs nothing and costs only the start fee.
Feedback
Found a wrong value or need another field? Open an issue on the Actor's Issues tab.