South Africa eTenders Opportunities Scraper
Pricing
from $0.05 / 1,000 tender opportunities
South Africa eTenders Opportunities Scraper
Search and export public South African National Treasury tender opportunities with buyer, province, deadlines, contacts, briefings, values, and documents.
Pricing
from $0.05 / 1,000 tender opportunities
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Search and export public procurement opportunities published by South Africa's National Treasury eTenders service. The Actor reads the official OCDS JSON API and returns one normalized dataset row per tender release—ready for alerts, spreadsheets, CRM enrichment, and BI.
Use it to answer questions such as:
- Which Western Cape tenders are open or being planned?
- Which opportunities mention construction, security, software, or consulting?
- What closes before the bid team's next review meeting?
- Which buyer, contact, briefing, and tender-document details are available?
The Actor uses anonymous HTTP requests to the official API. It does not need a browser, login, proxy, or eTenders account.
What this Actor does
- Fetches OCDS releases for a configurable release-date range.
- Follows the official API's pagination links.
- Deduplicates releases by OCID and release ID.
- Normalizes nested OCDS tender data into search-friendly fields.
- Applies keyword, province, category, status, buyer, and closing-date filters.
- Saves accepted tenders to the default Apify dataset.
V1 focuses on tender opportunities. It does not promise an awards-only dataset because many current source releases have empty award and contract arrays.
Who is it for?
Suppliers and bid teams
Build a repeatable shortlist of relevant public opportunities, including deadlines, compulsory briefings, contacts, and documents.
Procurement consultants
Monitor multiple provinces, categories, or procuring entities and export consistent records for clients.
Market-intelligence teams
Load normalized tender signals into a warehouse or dashboard for buyer, category, and geographic analysis.
Automation builders
Schedule daily or weekly runs, then connect the dataset to Slack, email, Google Sheets, a CRM, or a webhook-driven workflow.
Why use this Actor
- Official source: data comes from the South African National Treasury eTenders OCDS API.
- Useful normalization: important fields no longer require navigating deeply nested OCDS objects.
- Targeted monitoring: filter before records are saved and charged as results.
- Document-ready: include public tender document metadata and URLs when needed.
- Integration-friendly: every primary record is saved in the default dataset.
- Low infrastructure overhead: the Actor is HTTP-only and runs with 256 MB memory.
- Transparent failure: malformed input and exhausted upstream retries fail the run instead of returning misleading partial success.
Extracted data
| Field | Meaning |
|---|---|
ocid, releaseId, releaseDate, releaseTags | OCDS release identity and lifecycle metadata |
tenderId, title, description, status | Tender reference, summary, and current source status |
buyerId, buyerName | OCDS buyer identity |
procuringEntityId, procuringEntityName | Entity conducting the procurement |
province, deliveryLocation | Geographic fields published by eTenders |
category, mainProcurementCategory | Source category and OCDS procurement category |
additionalProcurementCategories | Additional OCDS category values |
procurementMethod, procurementMethodDetails | Procurement procedure |
valueAmount, valueCurrency | Published estimated value; may be zero or unavailable |
tenderStartDate, closingDate | Opportunity period |
briefingRequired, briefingCompulsory | Briefing-session flags |
briefingDate, briefingVenue | Briefing logistics when published |
contactName, contactEmail, contactTelephone | Public tender contact details |
documents, documentUrls | Document metadata and public downloads |
sourceUrl | Official single-release API URL |
scrapedAt | UTC extraction timestamp |
raw | Optional complete source release |
Nullable fields remain null when the publisher did not provide them. Arrays remain arrays, including when empty.
Getting started
- Open the Actor in Apify Console.
- Keep the default 30-day release window or set
dateFromanddateTo. - Set
maxItemsto the maximum number of matching tenders you need. - Add optional filters such as
provinces,statuses, orkeywords. - Leave Include documents enabled if your workflow needs download links.
- Click Start.
- Open the Tender opportunities dataset view.
- Export JSON, CSV, Excel, XML, or RSS, or consume the dataset through the API.
A useful first input is:
{"maxItems": 25,"includeDocuments": true,"includeRaw": false}
Input parameters
| Input | Type | Default | Description |
|---|---|---|---|
dateFrom | string | 30 days ago | Earliest release date, YYYY-MM-DD |
dateTo | string | run date | Latest release date, YYYY-MM-DD |
maxItems | integer | 100 | Maximum saved results, from 1 to 10,000 |
keywords | string[] | none | Every keyword must occur in searchable tender text |
provinces | string[] | none | Match any listed province exactly, case-insensitive |
categories | string[] | none | Match any listed source category exactly |
statuses | string[] | none | Match any listed OCDS tender status |
buyer | string | none | Text contained in buyer or procuring-entity name |
closingDateFrom | string | none | Keep tenders closing on or after this date |
closingDateTo | string | none | Keep tenders closing on or before this date |
includeDocuments | boolean | true | Include document objects and URL list |
includeRaw | boolean | false | Attach the complete source OCDS release |
Keyword matching is case-insensitive and uses tender reference, title, description, buyer, procuring entity, province, location, and category. If you provide multiple keywords, all must match. Province, category, and status arrays use “match any” behavior within each array. Filters from different fields are combined with AND logic.
Input examples
Active tenders in one province
{"dateFrom": "2026-07-01","dateTo": "2026-07-25","provinces": ["Western Cape"],"statuses": ["active"],"maxItems": 100,"includeDocuments": true}
Construction opportunities closing in a window
{"keywords": ["construction"],"closingDateFrom": "2026-08-01","closingDateTo": "2026-09-30","maxItems": 250}
Buyer-focused monitoring
{"buyer": "Stellenbosch Municipality","maxItems": 100,"includeDocuments": true,"includeRaw": false}
Output example
This abbreviated record reflects current source behavior observed during local validation:
{"ocid": "ocds-9t57fa-163384","releaseId": "ocds-9t57fa-163384-2026-07-25","tenderId": "163384","title": "BSM 126/26","description": "UPGRADING OF 32 UNITS IN LA COLLINE, STELLENBOSCH","status": "planning","buyerName": "Stellenbosch Municipality","province": "Western Cape","category": "Construction","procurementMethod": "open","valueAmount": 0,"valueCurrency": "ZAR","closingDate": "2026-08-24T11:00:00Z","briefingCompulsory": true,"contactName": "Thabisa Manyingiza","documentUrls": ["https://www.etenders.gov.za/home/Download?..."],"sourceUrl": "https://ocds-api.etenders.gov.za/api/OCDSReleases/release/ocds-9t57fa-163384"}
Source values can change after publication. Treat zero values and nulls as source data, not as estimates made by the Actor.
How much does it cost to scrape South Africa eTenders opportunities?
The Actor uses pay-per-event pricing:
- $0.005 per run start
- $0.00010447 per saved tender on the Free tier
- lower per-tender rates on higher Apify subscription tiers, down to $0.000025437
Only accepted, deduplicated tender rows are charged as item events. Rejected records and empty results are not charged as items.
Example Free-tier Actor charges:
| Results | Calculation | Actor charge |
|---|---|---|
| 10 | $0.005 + 10 × $0.00010447 | $0.0060 |
| 100 | $0.005 + 100 × $0.00010447 | $0.0154 |
| 1,000 | $0.005 + 1,000 × $0.00010447 | $0.1095 |
Apify platform usage and subscription terms may also apply. Check the live Pricing tab before a large scheduled workflow.
Scheduling and alerts
For a daily tender alert:
- Create an Apify schedule.
- Use a short rolling release window, such as the previous two days.
- Add your keyword, province, buyer, or category filters.
- Connect the run-finished webhook to your alerting service.
- Store
ocid + releaseIddownstream to suppress repeat notifications across runs.
A rolling overlap helps capture late publication without pretending that the source is real-time.
Integration patterns
CRM lead feed
Map buyer and procuring-entity fields to organizations, contact fields to public procurement contacts, and the OCID to an external stable key.
Bid calendar
Use closingDate, briefing fields, and document URLs to create review tasks and deadline reminders.
BI and market intelligence
Aggregate by province, buyer, category, method, or status. Preserve releaseDate and scrapedAt to distinguish source publication from extraction time.
Spreadsheet review
Export the overview view to CSV or Excel. Keep raw output disabled for a smaller file.
API usage with cURL
Start a synchronous run and return dataset items:
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~south-africa-etenders-opportunities-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"provinces":["Gauteng"],"maxItems":50,"includeDocuments":true}'
For larger jobs, use the asynchronous run endpoint and poll the run status instead of holding one HTTP connection open.
JavaScript API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/south-africa-etenders-opportunities-scraper').call({keywords: ['software'],statuses: ['active'],maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python API example
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/south-africa-etenders-opportunities-scraper').call(run_input={'buyer': 'municipality','maxItems': 100,'includeDocuments': True,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
MCP and AI agents
Add this Actor as an Apify MCP tool in Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/south-africa-etenders-opportunities-scraper"
Claude Desktop setup
Add this server object to Claude Desktop's MCP configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/south-africa-etenders-opportunities-scraper"}}}
Cursor setup
Add the same apify server URL under Cursor Settings → MCP, then enable the server for your workspace.
VS Code setup
Add the same HTTP MCP server URL to your VS Code MCP configuration and start it from the MCP servers panel.
Example prompts:
- “Find up to 50 active Gauteng tenders mentioning security and include document links.”
- “Export municipal construction opportunities closing next month.”
- “Create a table of buyer, tender reference, deadline, briefing date, contact, and source URL.”
Always review source documents before making a procurement decision.
Limits and source behavior
- Coverage is limited to releases returned by the official eTenders OCDS API for the requested dates.
- Current releases may use statuses such as
activeorplanning; values come from the publisher. - A published value of zero does not mean the opportunity has no economic value.
- Contacts, briefings, locations, and documents can be missing.
- The source may revise a tender under the same OCID with a different release ID.
maxItemslimits accepted results, not pages inspected before filters match.- A broad date range with selective filters can take longer because the Actor must inspect source pages.
- Temporary upstream failures are retried three times; persistent failure produces a failed Actor run.
- No proxy is used. If the government API is unavailable, changing proxy geography will not repair the source.
Troubleshooting
The dataset is empty
Remove filters one at a time, confirm the release-date range contains published records, and check exact province/category/status spelling. Remember that all keywords must match.
The run takes longer than expected
Reduce the release-date range, especially when combining it with a rare keyword or buyer filter. The Actor stops early when maxItems accepted records are reached.
A field is null or a value is zero
That is normally the value published in the OCDS release. Open sourceUrl and the tender documents to verify it.
I need awards or contracts
V1 is an opportunity scraper. Do not infer awards from empty source arrays. Use the optional raw object for source inspection, but an awards-only product is outside the current contract.
Responsible use and legality
The Actor accesses public procurement records exposed by the National Treasury's open-data service. Use the data in accordance with the source license, Apify's terms, and applicable law. Contact information is published for procurement communication; do not use it for spam, harassment, or unrelated bulk marketing. Verify deadlines, eligibility, compulsory briefings, and submission instructions in the official tender documents. The Actor is an extraction tool and does not provide legal, procurement, or bidding advice.
FAQ
Does it require an eTenders login?
No. The official OCDS API used by this Actor is public and anonymous.
Does it use a browser or proxy?
No. It uses direct HTTP JSON requests.
Can I filter by multiple provinces?
Yes. A tender may match any listed province. Other filter groups still combine with AND logic.
Can I save the original OCDS object?
Yes. Enable includeRaw. It increases dataset size, so normalized output is recommended for routine monitoring.
Are results real-time?
No real-time guarantee is made. Results reflect what the official API returns when the run executes.
How are duplicates handled?
Within a run, the Actor deduplicates by OCID plus release ID. A revised release can correctly appear as a distinct record.
Related automation-lab Actors
- Singapore GeBIZ Tender Opportunities Scraper — Singapore procurement opportunities.
- World Bank Procurement Notices Scraper — global World Bank notices.
- UK Find a Tender Scraper — UK procurement notices.
- Spain Public Tenders Scraper — Spanish public tender discovery.
Combine country-specific Actors only when your workflow genuinely needs each source; fields and procurement rules differ by publisher.
Support
For reproducible help, include the Actor run URL, sanitized input, expected behavior, and one relevant OCID or tender reference. Do not post private bid material or credentials in a public issue.