If you've ever tried to track South African government tenders programmatically, you know the pain: data scattered across eTenders, municipal portals, and SOE websites, with no consistent format. Tenders-SA set out to fix that, and they've opened up a REST API that gives developers structured access to tenders, awards, companies, and government organizations — enriched with AI-generated summaries and B-BBEE analytics.
Here's a practical walkthrough of what the API offers and how to start using it.
Two tiers of access
Tenders-SA actually exposes API access in two different ways, and it's worth knowing the difference:
-
Public widget API (
https://www.tenders-sa.org/api/widgets/*) — no auth required, free, designed for embedding sector trends, leaderboards, and a live award feed into your own site. -
Full Developer API (
https://api.tenders-sa.org/v1) — requires a Bearer token from a Professional or Enterprise subscription, and gives you 19 endpoints across 6 resource groups: tenders, awards, companies, organizations, analysis/estimates, and meta.
This post focuses on the full Developer API, since that's where the interesting data lives.
Authentication
Every authenticated request needs a Bearer token in the header:
curl -H "Authorization: Bearer tsa_prod_YOUR_API_KEY" \
"https://api.tenders-sa.org/v1/tenders?category=ict-technology&limit=10"
Keys are generated from your dashboard once you're on a paid plan. Professional gives you 500 requests/day (15k/month) across up to 3 keys; Enterprise bumps that to 10,000/day (300k/month) across 25 keys. Every response includes rate limit headers so you can track consumption without guessing — or just hit /v1/meta/usage for a direct readout.
Core resources
Tenders
GET /v1/tenders is the main search endpoint, supporting filters like category, province, status, closingAfter/closingBefore, minValue/maxValue, and full-text q. Each tender comes enriched with an AI summary, key requirements extracted from the source documents, and a value estimate with a confidence score:
import requests
response = requests.get(
'https://api.tenders-sa.org/v1/tenders',
params={'category': 'ict-technology', 'province': 'gauteng', 'limit': 10},
headers={'Authorization': 'Bearer tsa_prod_YOUR_API_KEY'}
)
data = response.json()
There's also a dedicated /v1/tenders/search for full-text queries, plus sub-resources per tender: /documents, /awards, /timeline, /analysis, and /value-estimate. The /analysis endpoint is particularly useful — it returns structured evaluation criteria, submission guidelines, technical specs, and compliance requirements pulled straight from the tender document by an AI extraction pipeline.
Awards
GET /v1/awards lets you filter award data by supplier, enterprise type (EME/QSE/Large), B-BBEE level, amount range, and award date. Each award record includes subcontractor breakdowns with B-BBEE designations (black youth-owned, women-owned, etc.), which is handy if you're building procurement transparency or compliance tooling.
There's also /v1/awards/analytics, which returns pre-aggregated stats grouped by enterpriseType, beeLevel, province, category, or time period — cached for 6 hours, so it's cheap to poll for dashboards.
Companies
GET /v1/companies/{name} builds a full company profile from aggregated award history: B-BBEE level, CIDB grading, compliance score, a forensic risk score, director listings, and contact details. /v1/companies/search lets you query by partial name with the same filter set as awards.
Organizations
GET /v1/organizations/{id} returns enriched buyer profiles — government departments, municipalities, SOEs — pulling from OCDS, Wikidata, SALGA, and CSD data sources. You get organization type classification, contact info, and tender stats in one call. /tenders on the same resource lists everything that organization has published.
Meta endpoints
A few endpoints don't require auth at all: /v1/meta/status (system health and last sync times per data table) and /v1/meta/provinces (province-level tender counts). Good for health checks or populating filter UIs without burning your rate limit.
SDKs
If you'd rather not hand-roll HTTP calls, official SDKs are available:
npm install @tenders-sa-org/sdk-js # TypeScript
pip install tendersa-sdk # Python
npm install -g @tenders-sa-org/cli # CLI
There are also standalone npm packages for the public widgets (@tenders-sa-org/widget-heatmap, widget-sector-trends, widget-top-companies, widget-winners-feed) if you just want to drop a tender heatmap or leaderboard into a page without writing fetch logic yourself.
A quick example: tracking ICT tenders in Gauteng
import requests
API_KEY = "tsa_prod_YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
resp = requests.get(
"https://api.tenders-sa.org/v1/tenders",
params={
"category": "ict-technology",
"province": "gauteng",
"status": "active",
"sort": "-closing_date",
"limit": 20,
},
headers=HEADERS,
)
tenders = resp.json()["data"]
for t in tenders:
print(f"{t['title']} — closes {t['closingDate']}")
print(f" Est. value: R{t['estimatedValue']['median']:,}")
print(f" AI summary: {t['aiSummary']}")
Pair that with /v1/tenders/{id}/analysis and you can build something like an automated bid-readiness checker that flags missing compliance documents before a deadline.
Final thoughts
What stands out about this API compared to most government-data wrappers is the enrichment layer — AI summaries, extracted compliance requirements, value estimates with stated methodology, and forensic risk scoring on companies. That's a lot of the manual reading procurement teams normally do, already done for you.
If you're building anything in the SA GovTech or compliance space — tender alert tools, supplier risk dashboards, BEE analytics — it's worth a look at the developer docs directly, since endpoint details and rate limits may evolve.
Top comments (0)