How We Ingest Tenders from 50+ South African Government Sources
The architecture of the Tenders-SA tender ingestion pipeline: how we collect tender data from 50+ government sources including eTenders, provincial portals, and SOE bid pages, deduplicate across sources, normalize inconsistent formats, and enrich with AI-generated summaries and value estimates.
How We Ingest Tenders from 50+ South African Government Sources
The Tenders-SA platform tracks tender opportunities from across the South African public sector. Every day, thousands of new tender notices, awards, and cancellations are published across a fragmented landscape of government websites — each with its own format, data quality, and update schedule. Getting this data into a clean, structured, searchable database is the first and hardest problem the platform solves.
Why Ingestion Quality Matters for Bidders
It is tempting to think of ingestion as invisible plumbing that only engineers care about. In practice, the quality of the ingestion pipeline determines whether a South African SMME sees a relevant tender in time to bid on it. If a source is scraped a day late, or a PDF notice is mis-parsed and the closing date is wrong, a business owner could miss a genuine opportunity entirely. If duplicate records slip through, the same opportunity might appear three times in a search results page, drowning out other relevant tenders and wasting a bidder's limited research time. Every design decision described in this article — how often a source is polled, how duplicates are detected, how fields are normalized — ultimately affects whether a supplier finds the right opportunity, at the right time, with accurate details.
The Source Landscape
South African procurement data is published across more than 50 distinct sources: National Treasury eTenders portal (the primary source, OCDS-format JSON), nine provincial government procurement portals (Gauteng, Western Cape, KZN, etc.), municipal websites (City of Johannesburg, City of Cape Town, eThekwini, Tshwane, and 250+ other municipalities), State-Owned Company bid pages (Eskom, Transnet, SANRAL, PRASA, SABC, SAA, etc.), sector-specific systems (CIDB tenders, SAPS procurement, SANParks), and government gazettes (published by Government Printing Works).
Each source has different data models, update frequencies, authentication requirements, and data quality levels. National Treasury publishes OCDS-compliant JSON. Many municipalities publish PDF-only notices. Some SOEs require portal logins to view tender details.
This fragmentation is the reason no individual supplier can realistically monitor every relevant source themselves. A construction contractor bidding across Gauteng, the Western Cape, and a handful of municipalities would need to bookmark dozens of separate websites, check each one on a different schedule, and manually reconcile formats that range from clean structured JSON to scanned PDF notices with no consistent layout. Building a single ingestion pipeline that absorbs this variance is what makes it possible to offer one search interface, one set of alerts, and one consistent data model covering the entire country's public procurement activity.
The Ingestion Service Architecture
The ingestion pipeline is built around TenderIngestionService, an event-driven system that processes jobs through a priority queue:
1export class TenderIngestionService extends EventEmitter { 2 private async processJob(job: IngestionJob): Promise<IngestionResult> { 3 // Pipeline stages: 4 // 1. acquireTenders() — Fetch from source API with retry + circuit breaker 5 // 2. processTenders() — Enrich each tender, check duplicates, 6 // transform fields, classify, map industry 7 // 3. storeTenders() — Persist via tenderPersistenceService 8 // 4. triggerDocumentProcessing() — Queue PDFs/documents for OCR/AI 9 // 5. triggerAutomatedMatching() — Queue for matching engine 10 // 6. finalizeJob() 11 } 12 13 // Entry points: 14 async startScheduledIngestion(): Promise<void> { /* Cron-triggered */ } 15 async startManualIngestion(): Promise<void> { /* Admin-triggered */ } 16// ... (truncated)TYPESCRIPT
The priority queue supports four levels: CRITICAL (real-time webhooks from OCDS sources), HIGH (scheduled daily fetches from primary sources), MEDIUM (less frequent sources like weekly gazettes), and LOW (historical backfill and data repair jobs). Each job has configurable retry with exponential backoff and a circuit breaker that pauses a source after 3 consecutive failures.
The Priority Queue in Practice
Prioritization exists because not every source deserves the same attention. National Treasury's eTenders feed changes throughout the day and drives the highest volume of new opportunities, so it sits at the CRITICAL or HIGH tier and gets polled frequently. A provincial gazette that publishes once a week is a poor candidate for constant polling — fetching it every few minutes would waste resources without surfacing anything new, so it is scheduled at MEDIUM priority instead. Historical backfill jobs, used when a new source is onboarded or when a source publishes a batch of older notices retroactively, run at LOW priority so they never compete with time-sensitive jobs for processing capacity.
The circuit breaker matters just as much as the priority tiers. Government websites are frequently unreliable — certificates expire, servers go down for maintenance, or a portal changes its markup without notice. Without a circuit breaker, a single failing source could consume retry attempts indefinitely and starve healthy sources of processing time. By pausing a source after repeated consecutive failures and surfacing that failure to the operations team, the pipeline degrades gracefully: the rest of the platform keeps ingesting normally while the broken source is investigated and fixed.
Deduplication Strategy
The same tender is often published on multiple sources — eTenders and a municipal portal, for example. The deduplication engine uses a multi-key strategy:
- Tender reference number — When available, this is the most reliable dedup key. Most South African tenders have a unique reference (e.g., "GPQ/2026/001").
- Title + organization + value fingerprint — For sources that don't publish reference numbers, we compute a hash of normalized title, buying organization, and estimated value.
- Document hash — When tender documents are identical across sources, we detect the duplicate via content hash.
The dedup logic is in the processTenders step, which runs before any AI enrichment to avoid wasting AI credits on duplicate content.
Field Mapping and Normalization
Each source maps to the canonical tender model through a field mapping layer. For OCDS-format sources (like National Treasury), the mapping is straightforward: OCDS's tender.id → our referenceNumber, tender.value.amount → our estimatedValue. For PDF-only sources, we use OCR to extract structured fields.
The industry mapper converts source-specific category codes to our canonical category slugs. For example, eTenders' "Construction" category maps to our construction slug, which then maps to related categories like general-building, civil-engineering, and specialized-trades.
Handling Partial and Malformed Data
Real-world government data is rarely as clean as a schema definition would suggest. A tender notice might be missing a closing date, list an estimated value as a text string like "R2.5 million (approx.)" instead of a number, or reference a buying organization that has since changed its name. The normalization layer is built to tolerate this rather than reject the record outright. Where a field cannot be parsed with confidence, it is stored as null rather than guessed at, and the record is still ingested so that the rest of its data remains searchable. This matters for bidders because a tender with an unclear closing date is still worth knowing about — better to see it with a flagged missing field than to have it silently dropped from the pipeline.
Partial records are also revisited over time. If a source later publishes an addendum or correction, the ingestion pipeline treats it as an update to the existing record rather than a new duplicate, provided the deduplication keys match. This is particularly important for tenders that get their closing date extended, which happens frequently in South African procurement, or that receive corrigenda changing scope or requirements after initial publication.
AI Enrichment Pipeline
After ingestion and dedup, each tender passes through an AI enrichment pipeline: AI Summary generation via Gemini (a 2-3 sentence plain-English summary of what the tender is for); Key Requirements extraction (mandatory documents, eligibility criteria, briefing sessions extracted from the tender description and documents); Value Estimation (comparable award analysis to estimate the tender's budget range); Category Classification (AI-assisted category mapping for tenders with ambiguous descriptions); and Document Analysis (per-document classification into 15+ section types with source attribution).
The enrichment pipeline runs asynchronously. New tenders get AI summaries within 2 hours of ingestion. The matching engine starts scoring immediately with the raw data, then re-scores as enrichment data becomes available.
Cloudflare Worker Bridge
For sources that require frequent polling (like National Treasury's OCDS feed), we use Cloudflare Workers as a lightweight proxy layer. The Worker fetches from the source API, transforms the response to our format, and posts to our ingestion webhook. This offloads the polling overhead from the main application and provides edge-caching for frequently accessed source data.
Monitoring and Observability
The ingestion service emits events at every stage: job started, source fetched, batch processed, duplicates found, enrichment queued, errors encountered. These feed into admin dashboards and alerting. When a source starts failing consistently, the circuit breaker trips and the operations team gets notified. Per-source dashboards show fetch success rates, data volumes over time, and enrichment completion rates.
The result: a platform with 47,000+ tenders, 55,000+ awards, and 8,000+ tender documents, all processed from 50+ government sources and updated continuously throughout the day.
Why This Foundation Matters for Bidders and Integrators
None of the individual pieces described here — the priority queue, the deduplication keys, the field mapping layer, the AI enrichment stage — are interesting to a bidder in isolation. What matters is the outcome: a single search that reliably returns every relevant opportunity across the entire South African public sector, with a consistent set of fields, updated continuously, and free of duplicate noise. For a small business without the resources to monitor dozens of portals manually, this pipeline is effectively doing the work of a full-time research assistant. For developers building on top of Tenders-SA data through the export tools, widgets, or CRM integration described elsewhere on this site, it means the underlying dataset they are working with has already been through deduplication and normalization — they are not left to solve those problems themselves.
The ingestion pipeline will keep evolving as new sources are onboarded and as government portals change their formats. But the architecture described here — priority queues, multi-key deduplication, tolerant field mapping, and asynchronous enrichment — is designed to absorb that kind of change without requiring a rebuild each time a single source shifts its layout.
Tags
Based on this article's topics, here are some current tenders that might interest you
APPOINTMENT OF A PANEL OF FIVE SERVICE PROVIDERS TO RENDER VARIOUS TRAINING SERVICES FOR A PERIOD OF 36 MONTHS Tenders are hereby invited from capable and experienced service providers for the above tender. 1. Only tenderers who have provided the following mandatory information and documents to be used to evaluate the bidder's responsiveness will be considered for further evaluation on functionality: 1.1 Only service providers that are registered on the Central Supplier Database will be considered for the awarding of this request for quotations and a copy of CSD report not later than three months should be attached. 1.2 Price quoted must be firm, VAT and other taxes inclusive, valid and fixed for duration of the contract. 1.3 No tenders shall be considered from a person/s who are in the service of the state. 1.4 Service providers are required to fully complete the attached MBD forms and submit together with their written tenders. 1.5 Attach a bank account confirmation letter with bank stamp not older than three months accompanied with an affidavit confirming the business bank account details - if the banking details are not verified on the CSD report. 1.6 Attach certified copy of identity documents (ID) of company directors. 1.7 Attach certified copy of the company registration certificate issued by the Companies and Intellectual Property Commission (CIPC). 1.8 Valid SARS pin certificate must be attached. 1.9 Attach verifiable Municipal Account/s not older than three months for both the tenderer and entity owner/s or director/s. In areas where the municipalities are not issuing municipal accounts, attach valid lease agreements or confirmation of residence or address for both the tenderer and entity owner/s or director/s issued by a relevant authority not older than three months. 1.10 Attach a certified copy for valid proof of registration with relevant SETA’s or Quality Council for Trades and Occupations (QCTO) accreditation. 1.11 Attach set of reviewed and signed Annual Financial Statements for the past three years or since the company came into existence if not older than three years or if so, required by law to prepare the Annual Financial Statements for auditing, attach set of audited annual financial statements for the past three years. 1.12 Bidders are advised not to commit any fraudulent activities, including forgery of documents. All abuses of the Supply Chain Management (SCM) systems including but not limited to forgery of returnable documents, may be reported to the South African Police Service (SAPS) and restricted from doing business with any public institution or organ of the state for a period not exceeding 10 years in line with the Prevention of Fraud and Corrupt Activities Act 12 of 2004. 1.13 Joint Venture or Consortium Agreement if applicable. 1.14 All tender documents must be duly signed and submitted on the PDF document that has been issued. All the certified documents as stated must not be older than three months. 2. The tender will be evaluated on the 80/20 preference point system in terms of the Preferential Procurement Policy of the Ehlanzeni District Municipality. The policy preference point system will be applied as follows: 2.1 The 80 points will be for price; and 2.2 The 20 points will be allocated for the specific goals on a proportional or pro rata basis as follows:- POINTS FOR CONTRACTING AN ENTERPRISE OWNED BY HISTORICALLY DISADVANTAGED PERSONS OR INDIVIDUALS HISTORICALLY DISADVANTAGED PERSONS OR INDIVIDUALS POINTS ALLOCATION SOURCE DOCUMENTS REQUIRED TO CLAIM POINTS 100% black person or people owned Enterprise 3,00 A copy of a Full CSD report not older than 3 months More than 30% woman or women shareholding or owned enterprise 2,00 More than 30% youth shareholding or owned enterprise 2,00 More than 30% people living with disability shareholding or owned Enterprise 2,00 A copy of a Medical Certificate to confirm disability or stated on the CSD report More than 30% military veteran’s shareholding or owned Enterprise 2,00 A copy of a Full CSD report not older than 3 months POINTS FOR IMPLEMENTING OF RDP PROGRAMMES Enterprises regarded as *EME’s located within the Ehlanzeni District Municipality area of jurisdiction 2,00 ? A copy of a Full CSD report not older than 3 months NB: Points will only be awarded if the CSD physical address is the same as the address for the proof of residence required in 1.7 above. Sub-contract minimum of 30% of the contract value to EME’s in the ward or local communities where the services to be rendered or works to be undertaken 2,00 ? Commitment letter of works or services to be sub-contracted. Corporate Social Investment (CSI) or Social Labour Plan proposition 3,00 ? Attach a CSI plan or Social Labour Plan B-BBEE level 1 contribution 2,00 ? Certified Valid SANAS Accredited BBBEE certificate; or ? Certified Valid EME and SME a sworn affidavit; or ? Certified Valid CIPC issued certificate confirming annual turnover and level of Black Ownership. TOTAL PREFERENCE POINTS TO CLAIMED 20,00 *EME’s are Exempted Micro Enterprise with an annual turnover of R10 million or less. Received bids will be evaluated for responsiveness based on mandatory requirements, functionality and bidders who obtain a minimum of 70 points out of a possible 100 points for further evaluation on the preference point scoring system. Bid documents can be viewed and downloaded at no cost on the Document Sharing and Collaboration Platform or Portal (NEPTUNE): http://edmservices.ehlanzeni.gov.za and National Treasury Portal from Monday, 03 August 2026. Further information regarding the downloading and uploading of documents will be explained at the compulsory briefing session. A compulsory briefing session will be held on Tuesday, 11 August 2026, 10h00 at Ehlanzeni District Municipality Office Complex, DMC, 8 Van Niekerk Street, Sonheuwel Central, Mbombela, 1201. Where bids should be submitted - Completed bid and other returnable documents must be submitted only in PDF format on the Document Sharing and Collaboration Platform or Portal: http://edmservices.ehlanzeni.gov.za on or before Monday, 31 August 2026 not later than 12h00. Enquiries: Contact Person - ADMINISTRATION: Mr. P Khumalo at 013 759 8-573 or [email protected] Contact Person – TECHNICAL: Mrs. C de Lange at 013 759 8500 or [email protected] Visit our website: www.ehlanzeni.gov.za for tender information. Employer: Acting Municipal Manager: Ms. S S Madlopha Ehlanzeni District Municipality P O Box 333,M MBOMBELA 1200
PROCUREMENT OF AN E-RECRUITMENT DIGITAL SERVICES PLATFORM WITH INTERGRATED CR...
Digital Trade Corridor platform (as defined by WCO) and third-party pre-arriv...
REQUEST FOR PRICE QUOTATIONS FOR PROCUREMENT AND DELIVERY OF ANNUAL VEEAM DATA PLATFORM ADVANCED UNIVERSAL LICENSES FOR THE NATIONAL LOTTERIES COMMISSION.
Want to see all available tenders?
Browse All Tenders →Share this article
How We Ingest Tenders from 50+ South African Government Sources
The architecture of the Tenders-SA tender ingestion pipeline: how we collect tender data from 50+ government sources including eTenders, provincial portals, and SOE bid pages, deduplicate across sources, normalize inconsistent formats, and enrich with AI-generated summaries and value estimates.