South Africa Government Tender Awards avatar

South Africa Government Tender Awards

Pricing

from $3.00 / 1,000 results

Go to Apify Store
South Africa Government Tender Awards

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

Mastazee Data Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Categories

Security

Limited permissions

Share

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:

FieldExample
supplier_nameREAL SEC
supplier_ideTenders' own supplier number, the same across all of that supplier's awards
supplier_enterprise_sizeEME (exempted micro enterprise), QSE (qualifying small enterprise) or GEN, as eTenders records it
buyer_nameKwazulu Natal - Education
buyer_provinceKwaZulu-Natal
tender_titleAPPOINTMENT OF A SERVICE PROVIDER/S TO RENDER SECURITY SERVICES …
tender_referencethe buyer's bid number
categorygoods, services or works
procurement_methode.g. Request for Quotation, Request for Bid (Open-Tender), Single source bidding
contract_value_zar8365627
contract_signed_date2026-06-10
contract_start_date, contract_end_datecontract period, when published
tender_published_date, tender_closing_datewhen the tender opened and closed
award_value_as_publishedthe award amount exactly as eTenders shows it (see below)
ocid, source_url, licencethe official record and its open-data licence

Read this before you add up values

  • contract_value_zar is the value to use. It comes from the signed contract, in whole rand, with any cents dropped.
  • award_value_as_published is 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_zar and the contract dates are empty.
  • buyer_province comes 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.

InputWhat it does
Start from tender numberWhere to start counting back. 0 means the newest tender. The default, 157000, is late May 2026 and returns awards straight away.
Tenders to scanHow 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 awardsStop after this many rows.
Maximum scan timeStop scanning after this many seconds (default 3,300) and keep what was found.
Buyer / supplier name containsKeep only matching names. Not case-sensitive.
Categories, Buyer province, Minimum contract valueNarrow 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_SUMMARY says status: partial and 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:

ScanTimeAward rows
500 tenders (default, May 2026)~1 min~39
Newest 800 tenders (about a week)~1.5 min141
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 itAward rowsYou 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.