Skip to main content
Platform Deep Dive

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:

  1. 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").
  2. Title + organization + value fingerprint — For sources that don't publish reference numbers, we compute a hash of normalized title, buying organization, and estimated value.
  3. 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

Data IngestionWeb ScrapingETLData PipelineCloudflare WorkersArchitectureDeduplication
Relevant Tender Opportunities

Based on this article's topics, here are some current tenders that might interest you

Information and Communication

Tenders are hereby invited from capable and experienced service providers for the SUPPLY, DELIVERY, INSTALLATION, CONFIGURATION AND SUPPORT FOR ENTERPRISE COMPUTER SERVERS 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 who are registered on the Central Supplier Database (CSD) will be considered and the copy of the full CSD report not older than three months should be submitted. 1.2 Form of offer must be firm, VAT and other tax-inclusive and valid at least ninety (90) days from the closing date. 1.3 Service providers are required to fully complete the attached MBD forms and be submitted together with their written tenders. 1.4 No tender shall be considered for the persons who are in the service of the state, 1.5 Valid SARS PIN certificate must be attached. 1.6 Attached original Certified copy of company registration documents issued by Companies and Intellectual Property Commission (CIPC). 1.7 Attached original Certified copies of Identity Documents (ID) of all company directors. 1.8 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.9 Joint Venture or Consortium Agreement if applicable. 1.10 All tender documents must be duly signed and submitted on the PDF document that has been issued and certified documents must not be older than three months. 1.11 Tenderers 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. 2. The tender will be evaluated by applying 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 specified 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 5,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 More than 30% military veteran’s shareholding or owned enterprise 2,00 ? Points will be allocated if it is stated on the CSD that the enterprise is owned by persons designated as military veterans POINTS FOR IMPLEMENTING OF RDP PROGRAMMES Enterprises regarded as *EMEs 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. B-BBEE level 1 contribution 5,00 ? Certified Valid 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 BE 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. Tender 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 Wednesday, 30 September 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 Wednesday, 7 October 2026 at 10h00, at Ehlanzeni District Municipality Office Complex, DMC, 8 Van Niekerk Street, Sonheuwel Central, Mbombela, 1201. Where tenders should be submitted - Completed tender 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 Friday, 16 October 2026 not later than 12h00. Tender Documents received by telegram, fax and post will not be considered. Late bids shall not be accepted. Enquiries: Contact Person - ADMINISTRATION: Mr. S P Khumalo at 013 759 8510 or [email protected] Contact Person – TECHNICAL: Mr. M Srini at 013 759 8500 or [email protected] Visit our website: www.ehlanzeni.gov.za Employer: Acting Municipal Manager: Ms S S Madlopha Ehlanzeni District Municipality P. Box 3333 MBOMBELA 1200

Ehlanzeni District Municipality
Mpumalanga
16 Oct 2026
5d left
Supplies: General

PROCUREMENT OF A DIGITAL PLATFORM FOR IDEA MANAGEMENT AND PUBLIC PARTICIPATION 2028/29, 2029/30, 2030/31

City of Cape Town
Western Cape
20 Nov 2026
40d left
Other Service Activities

Development of a Digital Induction Platform for uMngeni-uThukela Water

uMngeni-uThukela Water
KwaZulu-Natal
05 Nov 2026
25d left
Services: Professional

Training: PM-PL900T00 Microsoft Power Platform Fundamentals and PM-PL300T00 Microsoft Power BI Data Analyst

Science & Technology
Gauteng
16 Oct 2026
5d left
Other Personal Service Activities

Supply of a comprehensive global online platform that provides data and insights into countries, all sectors, industries and consumer trends and behaviours across all globally researched countries worldwide for a period of three (3) years.

Western Cape Tourism, Trade and Investment Promotion Agency
Western Cape
16 Oct 2026
5d left
Services: General

SUPPLY, INSTALLATION, AND COMMISSIONING OF A NEXT-GEN EMAIL SECURITY SOLUTION WITH ARCHIVING AND CYBERSECURITY USER AWARENESS TRAINING PLATFORM FOR A PERIOD OF 36 MONTHS

uMhlathuze Municipality
KwaZulu-Natal
20 Oct 2026
9d left

Want to see all available tenders?

Browse All Tenders →
AI-Powered Matching
Never Miss a Perfect Tender Again
Our AI analyzes thousands of tenders and finds the ones YOUR company can actually win
✓AI Match Scoring for every tender
✓Instant alerts for 85%+ matches
✓B-BBEE level optimization
✓Document readiness checks

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.

https://www.tenders-sa.org/blog/building-tender-ingestion-pipeline