South Africa eTenders Scraper: Tenders & Awards avatar

South Africa eTenders Scraper: Tenders & Awards

Pricing

Pay per usage

Go to Apify Store
South Africa eTenders Scraper: Tenders & Awards

South Africa eTenders Scraper: Tenders & Awards

Get South African government tenders and contract awards from National Treasury's official eTenders OCDS open-data API. Filter by keyword, buyer, category, status and dates. Clean rows with award values, suppliers and document links; no personal contact data.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

OpenProcure Data

OpenProcure Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Features

Limited permissions

Share

South Africa eTenders Scraper: Government Tenders & Contract Awards API

Extract South African government tenders and contract awards from the official eTenders OCDS open-data API published by National Treasury. Filter by keyword, buyer, procurement category, open/closed status and date range, and get clean JSON, CSV or Excel rows with closing dates, award values, awarded suppliers and tender document links. It uses only HTTP calls to the official API: no browser and no proxies. It does not collect personal contact data.

What does this Actor do?

  • Reads releases from https://ocds-api.etenders.gov.za (Open Contracting Data Standard format) for the date window you choose.
  • Flattens each release into one row per tender: buyer, title, category, procurement method, opening and closing dates, days left, value, awards and documents.
  • Parses contract awards: the number of awards, the total award value in ZAR, supplier names, and a per-award breakdown.
  • Works around the API's known server errors. The official list endpoint returns HTTP 500 for some records. In our tests these included every record that carried award data. The Actor isolates the failing records and re-fetches them one by one from the single-release endpoint.
  • Removes contact-person names, emails and phone numbers.

Use cases

  • Tender alerts: run it daily on a schedule with your keywords and send new open tenders to email, Slack, Google Sheets, n8n, Make or Zapier.
  • Bid research: see which departments and state-owned entities buy what you sell, and read the tender documents before you bid.
  • Procurement analytics and competitor research: use onlyAwarded to see who won contracts, for how much, and from which buyers.
  • Data journalism and transparency research on South African public spending.

Input

FieldTypeDescription
dateFrom / dateTostring (YYYY-MM-DD)Release-date window. Defaults: 7 days ago and today.
keywordsstring[]Keep tenders whose title or description contains any of these words (case-insensitive).
excludeKeywordsstring[]Drop tenders that contain any of these words.
buyerContainsstringBuyer name filter, e.g. Eskom, Transnet, City of Cape Town.
categoriesstring[]goods, services, works.
onlyOpenbooleanOnly tenders that close today or later.
onlyAwardedbooleanOnly releases that include contract awards.
includeDocumentsbooleanInclude tender document download links (default on).
includeRawbooleanAttach the full OCDS release, with contact persons removed.
recoverFailedRecordsbooleanRe-fetch records the list endpoint fails on (default on; needed for award data).
maxItemsintegerStop after N rows (0 = no limit).

Example: open ICT tenders from the last 7 days.

{"keywords": ["software", "ICT", "network", "cloud"], "onlyOpen": true, "maxItems": 50}

Output fields

ocid, tenderId, title, description, buyer, category, procurementMethod, status, releaseDate, openingDate, closingDate, daysToClose, isOpen, valueZar, awardCount, awardTotalZar, awardedSuppliers, awards[] (awardId, supplier, status, valueZar, currency, description), documentCount, documents[] (title, url, published), sourceUrl, apiReleaseId, and optionally raw.

A RUN_SUMMARY record in the default key-value store shows how many releases were scanned, delivered, skipped because of API errors, and recovered.

Sample output (a real record, shortened)

{
"ocid": "ocds-9t57fa-145714",
"tenderId": "145714",
"title": "IHLM/126/2025-26/COMM",
"description": "SUPPLY, DELIVERY AND INSTALLATION OF 80 STREET LITTER BINS",
"buyer": "Ingquza Hill Local Municipality",
"category": "goods",
"procurementMethod": "Request for Bid(Open-Tender)",
"status": null,
"releaseDate": "2026-01-30T00:00:00Z",
"openingDate": "2026-01-30T00:00:00Z",
"closingDate": "2026-02-17T12:00:00+00:00",
"daysToClose": -253,
"isOpen": false,
"valueZar": null,
"awardCount": 1,
"awardTotalZar": 8774000.0,
"awardedSuppliers": [
"WE ARE THE HYGIENE HUB"
],
"awards": [
{
"awardId": "68835",
"supplier": "WE ARE THE HYGIENE HUB",
"status": "active",
"valueZar": 8774000.0,
"currency": "ZAR",
"description": "EME"
}
],
"documentCount": 1,
"sourceUrl": "https://www.etenders.gov.za/Home/opportunities?id=145714",
"apiReleaseId": "ocds-9t57fa-145714-2026-01-30",
"documents": [
{
"title": "BID DOCUMENT FOR SUPPLY, DELIVERY AND INSTALLATION OF 80 STREET LITTER BINS.pdf",
"url": "https://www.etenders.gov.za/home/Download?blobName=c7db0eff-8caf-43e2-b5bb-a88b5f0a2207.pdf&downloadedFileName=BID%20DOCUMENT%20FOR%20SUPPLY%2C%20DELIVERY%20AND%20INSTALLATION%20OF%2080%20STREET%20LITTER%20BINS.pdf",
"published": "2026-01-30T08:37:22Z"
}
]
}

Pricing

This Actor uses pay-per-event pricing:

  • $0.002 per result (one tender row in the dataset), which is $2 per 1,000 tenders.
  • $0.005 per run start.

You pay only for rows you receive. Set a maximum cost per run in the run options, and the Actor stops when it reaches that limit.

FAQ

Is this legal? Where does the data come from?
All data comes from National Treasury's public eTenders OCDS API, which is published under the Open Data Commons PDDL licence. This Actor is independent and is not affiliated with National Treasury.

Why do some tenders have no award data?
Awards appear only after the buying entity publishes them on eTenders. Most recent releases are still open tenders.

Why is a run with awards slower?
The official list endpoint fails on many award records. The Actor has to fetch them one at a time, which takes longer.

Are some records still missing?
Yes, a few. Some records also fail on the single-release endpoint. Their count is in RUN_SUMMARY.recordsSkippedByApiErrors minus recordsRecoveredViaSingleLookup.

Can I get the data in Excel or CSV?
Yes. Download the dataset as JSON, CSV, Excel, XML or HTML, or use the Apify API and integrations.

Can I schedule daily tender alerts?
Yes. Create a Schedule in Apify Console with dateFrom left empty. To get only new items each day, set the window to 1–2 days.

Do you include personal contact details?
No. Contact names, emails, phone and fax numbers are removed.

Always confirm deadlines and requirements in the official tender documents before you bid.