Skip to main content
HomeDevelopers

Developer Portal

Dashboard

API Reference

Base URL: https://api.tenders-sa.org/v1

Tenders

Search, retrieve, and analyze tender opportunities with AI-enriched data.

GET/v1/tendersAuth required

List/ Search Tenders

Returns a paginated list of tenders with enriched fields including AI summaries, publication types, classification confidence, province, category, and value estimates. Supports filtering by category, province, status, closing date range, search keywords, and value range.

Parameters (14)
NameTypeRequiredDescription
pagenumberNoPage number (default: 1, max depth: 1000)
limitnumberNoResults per page (default: 20, max: 100)
categorystringNoFilter by category slug (case-insensitive)
provincestringNoFilter by province slug (case-insensitive)
statusstringNoFilter by tender status (e.g., active, awarded, cancelled)
qstringNoFull-text search query (searches title and description)
closingAfterdateNoFilter by closing date >= (ISO 8601)
closingBeforedateNoFilter by closing date <= (ISO 8601)
minValuenumberNoMinimum estimated value filter
maxValuenumberNoMaximum estimated value filter
referenceNumberstringNoFilter by tender reference number
sourceOrganizationstringNoFilter by department/organization name
sortstringNoSort field with direction prefix (e.g., -closing_date, +value)
fieldsstringNoComma-separated field whitelist for sparse responses
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/tenders?category=ict-technology&province=gauteng&page=1&limit=10"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/tenders?category=ict-technology&page=1&limit=10', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const data = await response.json()console.log(data)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/tenders',    params={'category': 'ict-technology', 'page': 1, 'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})data = response.json()print(data)
Example Response
JSON
{  "success": true,  "data": [    {      "tenderId": "T012345",      "title": "Appointment of a Service Provider for ICT Infrastructure",      "description": "The Department of Health invites tenders for the provision of ICT infrastructure...",      "province": "Gauteng",      "category": [        {          "name": "ICT & Technology"        }      ],      "estimatedValue": {        "min": 5000000,        "max": 15000000,        "median": 10000000,        "confidence": 0.85,        "methodology": "historical"      },      "closingDate": "2026-07-15",      "status": "active",      "publicationDate": "2026-05-20",      "publicationType": "TENDER_NOTICE",      "aiSummary": "ICT infrastructure upgrade for Gauteng Health Department with 10-year maintenance term",      "aiKeyRequirements": [        "CIDB grade 8 or higher",        "Valid tax clearance",        "B-BBEE level 1 or 2"      ],      "aiConfidence": 0.92,      "classificationConfidence": 0.88,      "sourceOrganization": {        "name": "Department of Health"      },      "referenceNumber": "DOH/ICT/2026/001",      "siteUrl": "https://www.etenders.gov.za/home/Download/...",      "municipality": "City of Johannesburg",      "department": "Department of Health",      "institution": null,      "dataSource": "etenders"    }  ],  "meta": {    "requestId": "req_abc123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "page": 1,    "pageSize": 20,    "totalCount": 145,    "totalPages": 8,    "hasNext": true,    "hasPrev": false,    "rateLimit": {      "limit": 500,      "remaining": 498,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}
GET/v1/tenders/{id}Auth required

Get Tender Detail

Retrieves a single tender by its ID or tender reference number, including award information, enriched fields, and value estimates from the associated value-estimate table.

Parameters (1)
NameTypeRequiredDescription
idstringYesTender ID or tender reference number (e.g., T012345)
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/tenders/T012345"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/tenders/T012345', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const tender = await response.json()console.log(tender.data.awards)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/tenders/T012345',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})tender = response.json()print(tender['data']['title'])
Example Response
JSON
{  "success": true,  "data": {    "tenderId": "T012345",    "title": "Appointment of a Service Provider for ICT Infrastructure",    "description": "The Department of Health invites tenders for the provision of ICT infrastructure...",    "province": "Gauteng",    "category": [      {        "name": "ICT & Technology"      }    ],    "estimatedValue": {      "min": 5000000,      "max": 15000000,      "median": 10000000,      "confidence": 0.85,      "methodology": "historical"    },    "closingDate": "2026-07-15",    "status": "active",    "publicationDate": "2026-05-20",    "publicationType": "TENDER_NOTICE",    "aiSummary": "ICT infrastructure upgrade for Gauteng Health Department with 10-year maintenance term",    "aiKeyRequirements": [      "CIDB grade 8 or higher",      "Valid tax clearance"    ],    "aiConfidence": 0.92,    "classificationConfidence": 0.88,    "sourceOrganization": {      "name": "Department of Health"    },    "referenceNumber": "DOH/ICT/2026/001",    "municipality": "City of Johannesburg",    "department": "Department of Health",    "institution": null,    "dataSource": "etenders",    "awards": [      {        "awardId": "AW001",        "tenderId": "T012345",        "title": "ICT Infrastructure Award",        "status": "awarded",        "awardDate": "2026-08-01",        "amount": 9500000,        "currency": "ZAR",        "supplierName": "TechSol SA (Pty) Ltd",        "supplierId": "SUP001",        "enterpriseType": "QSE",        "beeLevel": "Level 2",        "beePoints": 92,        "points": 85,        "subcontractors": [          {            "name": "SubTel Pty Ltd",            "percentage": 25,            "beeLevel": "Level 1"          }        ]      }    ]  },  "meta": {    "requestId": "req_def456",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "rateLimit": {      "limit": 500,      "remaining": 497,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}
GET/v1/tenders/searchAuth required

Full-Text Search Tenders

Performs full-text search across tender titles and descriptions. Requires a minimum 2-character search query. Supports category filtering and pagination.

Parameters (5)
NameTypeRequiredDescription
qstringYesSearch query (minimum 2 characters)
categorystringNoFilter by category slug (case-insensitive)
pagenumberNoPage number (default: 1)
limitnumberNoResults per page (default: 20, max: 100)
fieldsstringNoComma-separated field whitelist
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/tenders/search?q=ict+infrastructure&category=ict-technology"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/tenders/search?q=ict+infrastructure&limit=5', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const data = await response.json()console.log(data)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/tenders/search',    params={'q': 'ict infrastructure', 'limit': 5},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())
Example Response
JSON
{  "success": true,  "data": [    {      "tenderId": "T012345",      "title": "ICT Infrastructure Tender",      "description": "ICT infrastructure services...",      "province": "Gauteng",      "closingDate": "2026-07-15",      "status": "active"    }  ],  "meta": {    "requestId": "req_789",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "page": 1,    "pageSize": 20,    "totalCount": 5,    "query": "ict infrastructure",    "rateLimit": {      "limit": 500,      "remaining": 496,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}
GET/v1/tenders/{id}/documentsAuth required

Get Tender Documents

Retrieves a list of documents associated with a tender, including file name, size, MIME type, R2 cache status, and download URL. Documents are served from Cloudflare R2 when cached.

Parameters (1)
NameTypeRequiredDescription
idstringYesTender ID
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/tenders/T012345/documents"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/tenders/T012345/documents', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const docs = await response.json()docs.data.forEach(doc => console.log(doc.fileName, doc.downloadUrl))
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/tenders/T012345/documents',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})for doc in response.json()['data']:    print(doc['fileName'], doc['downloadUrl'])
Example Response
JSON
{  "success": true,  "data": [    {      "documentId": "DOC001",      "fileName": "SBD1.pdf",      "fileSize": 245000,      "mimeType": "application/pdf",      "cacheStatus": "CACHED",      "processingStatus": "COMPLETED",      "downloadUrl": "https://docs.tenders-sa.org/docs/T012345/SBD1.pdf"    },    {      "documentId": "DOC002",      "fileName": "TermsOfReference.pdf",      "fileSize": 512000,      "mimeType": "application/pdf",      "cacheStatus": "CACHED",      "processingStatus": "COMPLETED",      "downloadUrl": "https://docs.tenders-sa.org/docs/T012345/TermsOfReference.pdf"    }  ],  "meta": {    "requestId": "req_doc123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1"  }}
GET/v1/tenders/{id}/awardsAuth required

Get Tender Awards

Retrieves all awards associated with a specific tender, including supplier details, B-BBEE information, subcontractors, and award amounts.

Parameters (1)
NameTypeRequiredDescription
idstringYesTender ID
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/tenders/T012345/awards"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/tenders/T012345/awards', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const awards = await response.json()console.log(awards.data.map(a => a.supplierName))
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/tenders/T012345/awards',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})for award in response.json()['data']:    print(award['supplierName'], award['amount'])
Example Response
JSON
{  "success": true,  "data": [    {      "awardId": "AW001",      "tenderId": "T012345",      "title": "ICT Infrastructure Award",      "status": "awarded",      "awardDate": "2026-08-01",      "amount": 9500000,      "currency": "ZAR",      "supplierName": "TechSol SA (Pty) Ltd",      "enterpriseType": "QSE",      "beeLevel": "Level 2",      "beePoints": 92,      "points": 85,      "subcontractors": [        {          "name": "SubTel Pty Ltd",          "percentage": 25,          "beeLevel": "Level 1",          "blackYouth": true,          "blackWomen": false,          "blackDisabled": false,          "blackMilitary": false,          "blackRural": false        }      ]    }  ],  "meta": {    "requestId": "req_aw123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1"  }}
GET/v1/tenders/{id}/timelineAuth required

Get Tender Timeline

Returns a chronological timeline of events for a tender, including publication, closing, award, and cancellation milestones with event types.

Parameters (1)
NameTypeRequiredDescription
idstringYesTender ID
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/tenders/T012345/timeline"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/tenders/T012345/timeline', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const timeline = await response.json()timeline.data.forEach(e => console.log(e.label, e.date))
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/tenders/T012345/timeline',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})for event in response.json()['data']:    print(event['label'], event['date'])
Example Response
JSON
{  "success": true,  "data": [    {      "event": "published",      "label": "Tender published",      "date": "2026-05-20",      "type": "milestone"    },    {      "event": "closing",      "label": "Tender closing",      "date": "2026-07-15",      "type": "deadline"    }  ],  "meta": {    "requestId": "req_tl123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1"  }}

Awards

Access government contract award data with supplier and B-BBEE details.

GET/v1/awardsAuth required

List/ Search Awards

Returns a paginated list of tender awards with enriched B-BBEE data, supplier information, subcontractors, and tender context. Supports filtering by supplier, category, province, amount range, enterprise type, BEE level, and award date range.

Parameters (16)
NameTypeRequiredDescription
pagenumberNoPage number (default: 1)
limitnumberNoResults per page (default: 20, max: 100)
supplierNamestringNoFilter by supplier name (partial match)
supplierIdstringNoFilter by supplier ID
tenderIdstringNoFilter by tender ID
categorystringNoFilter by tender category
provincestringNoFilter by province
enterpriseTypestringNoFilter by enterprise type (EME, QSE, Large)
beeLevelstringNoFilter by B-BBEE level (e.g., Level 1, Level 2)
minAmountnumberNoMinimum award amount
maxAmountnumberNoMaximum award amount
awardDateFromdateNoAward date >= (ISO 8601)
awardDateTodateNoAward date <= (ISO 8601)
statusstringNoFilter by award status
sortstringNoSort field: award_date, amount, supplier_name (prefix with - for DESC, + for ASC)
fieldsstringNoComma-separated field whitelist
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/awards?enterpriseType=QSE&beeLevel=Level+1&limit=10"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/awards?enterpriseType=QSE&limit=10', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const data = await response.json()console.log(data)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/awards',    params={'enterpriseType': 'QSE', 'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())
Example Response
JSON
{  "success": true,  "data": [    {      "awardId": "AW001",      "tenderId": "T012345",      "title": "ICT Infrastructure Award",      "status": "awarded",      "awardDate": "2026-08-01",      "amount": 9500000,      "currency": "ZAR",      "supplierName": "TechSol SA (Pty) Ltd",      "supplierId": "SUP001",      "enterpriseType": "QSE",      "beeLevel": "Level 2",      "beePoints": 92,      "points": 85,      "description": null,      "tenderTitle": "ICT Infrastructure Tender",      "tenderReference": "DOH/ICT/2026/001",      "tenderCategory": "ICT & Technology",      "tenderProvince": "Gauteng",      "subcontractors": null    }  ],  "meta": {    "requestId": "req_aw456",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "page": 1,    "pageSize": 20,    "totalCount": 42,    "totalPages": 3,    "hasNext": true,    "hasPrev": false,    "rateLimit": {      "limit": 500,      "remaining": 495,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}
GET/v1/awards/{id}Auth required

Get Award Detail

Retrieves a single award by its ID including supplier details, B-BBEE data, subcontractor information, and tender context.

Parameters (1)
NameTypeRequiredDescription
idstringYesAward ID (e.g., AW001)
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/awards/AW001"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/awards/AW001', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const award = await response.json()console.log(award.data.supplierName, award.data.amount)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/awards/AW001',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})award = response.json()['data']print(award['supplierName'], award['amount'])
Example Response
JSON
{  "success": true,  "data": {    "awardId": "AW001",    "tenderId": "T012345",    "title": "ICT Infrastructure Award",    "status": "awarded",    "awardDate": "2026-08-01",    "amount": 9500000,    "currency": "ZAR",    "supplierName": "TechSol SA (Pty) Ltd",    "enterpriseType": "QSE",    "beeLevel": "Level 2",    "beePoints": 92,    "points": 85,    "subcontractors": [      {        "name": "SubTel Pty Ltd",        "percentage": 25,        "beeLevel": "Level 1"      }    ]  },  "meta": {    "requestId": "req_aw789",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "rateLimit": {      "limit": 500,      "remaining": 494,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}
GET/v1/awards/analyticsAuth required

Award Analytics

Returns aggregated award analytics grouped by enterprise type, B-BBEE level, province, category, or time period. Results are cached for 6 hours.

Parameters (3)
NameTypeRequiredDescription
groupBystringNoGroup by: enterpriseType, beeLevel, province, category, month, quarter, year (default: enterpriseType)
fromdateNoStart date (ISO 8601, default: 1900-01-01)
todateNoEnd date (ISO 8601, default: today)
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/awards/analytics?groupBy=enterpriseType&from=2026-01-01&to=2026-05-25"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/awards/analytics?groupBy=province&from=2026-01-01', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const analytics = await response.json()console.log(analytics.data)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/awards/analytics',    params={'groupBy': 'beeLevel', 'from': '2026-01-01'},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())
Example Response
JSON
{  "success": true,  "data": [    {      "enterpriseType": "QSE",      "totalAwards": 145,      "totalValue": 450000000,      "avgValue": 3103448    },    {      "enterpriseType": "EME",      "totalAwards": 98,      "totalValue": 125000000,      "avgValue": 1275510    },    {      "enterpriseType": "Large",      "totalAwards": 67,      "totalValue": 890000000,      "avgValue": 13283582    },    {      "enterpriseType": "UNSPECIFIED",      "totalAwards": 12,      "totalValue": 5000000,      "avgValue": 416667    }  ],  "meta": {    "requestId": "req_an123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "groupBy": "enterpriseType",    "from": "2026-01-01",    "to": "2026-05-25",    "totalGroups": 4  }}

Companies

Company profiles with B-BBEE levels, CIDB grading, and award history.

GET/v1/companies/{name}Auth required

Get Company Profile

Retrieves a comprehensive company profile including B-BBEE level, enterprise type, CIDB grading, award history (paginated), categories, provinces, compliance score, forensic risk score, directors, and contact information. Company data is aggregated from award records.

Parameters (3)
NameTypeRequiredDescription
namestringYesCompany name (URL-encoded)
pagenumberNoAwards page number (default: 1)
limitnumberNoAwards per page (default: 20)
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/companies/TechSol%20SA%20(Pty)%20Ltd"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/companies/TechSol%20SA%20(Pty)%20Ltd', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const company = await response.json()console.log(company.data.beeLevel, company.data.totalAwards)
Python
Python
import requestsfrom urllib.parse import quote name = quote('TechSol SA (Pty) Ltd')response = requests.get(    f'https://api.tenders-sa.org/v1/companies/{name}',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})company = response.json()['data']print(company['beeLevel'], company['totalAwards'])
Example Response
JSON
{  "success": true,  "data": {    "name": "TechSol SA (Pty) Ltd",    "registrationNumber": "2020/123456/07",    "taxNumber": "9876543210",    "companyType": "PTY_LTD",    "enterpriseType": "QSE",    "beeLevel": "Level 2",    "cidbGrading": "8CE PE",    "totalAwards": 42,    "totalValue": 95000000,    "latestAwardDate": "2026-05-20",    "categories": [      "ICT & Technology",      "Infrastructure"    ],    "provinces": [      "Gauteng",      "Western Cape"    ],    "complianceScore": 85,    "forensicRiskScore": 12,    "directorCount": 3,    "directors": [      {        "name": "John Doe",        "idNumber": "800101****080"      },      {        "name": "Jane Smith",        "idNumber": "820505****082"      }    ],    "contactEmail": "[email protected]",    "contactEmailConfidence": 0.95,    "contactPhone": "+27 11 123 4567",    "website": "https://www.techsol.co.za",    "awards": [      {        "awardId": "AW001",        "amount": 9500000,        "awardDate": "2026-08-01",        "tenderTitle": "ICT Infrastructure",        "tenderCategory": "ICT & Technology",        "tenderProvince": "Gauteng"      }    ]  },  "meta": {    "requestId": "req_co123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "page": 1,    "pageSize": 20,    "totalAwards": 42,    "rateLimit": {      "limit": 500,      "remaining": 493,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}
GET/v1/companies/searchAuth required

Search Companies

Searches for companies by name with support for filtering by enterprise type, B-BBEE level, province, and category. Returns paginated results with basic company profiles.

Parameters (7)
NameTypeRequiredDescription
qstringYesSearch query (company name, partial match)
enterpriseTypestringNoFilter by enterprise type (EME, QSE, Large)
beeLevelstringNoFilter by B-BBEE level
provincestringNoFilter by province
categorystringNoFilter by category
pagenumberNoPage number (default: 1)
limitnumberNoResults per page (default: 20, max: 100)
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/companies/search?q=TechSol&enterpriseType=QSE"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/companies/search?q=TechSol&beeLevel=Level+1', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const results = await response.json()console.log(results.data)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/companies/search',    params={'q': 'TechSol', 'beeLevel': 'Level 1'},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())
Example Response
JSON
{  "success": true,  "data": [    {      "name": "TechSol SA (Pty) Ltd",      "registrationNumber": "2020/123456/07",      "enterpriseType": "QSE",      "beeLevel": "Level 2",      "totalAwards": 42,      "totalValue": 95000000,      "latestAwardDate": "2026-05-20",      "categories": [        "ICT & Technology",        "Infrastructure"      ],      "provinces": [        "Gauteng",        "Western Cape"      ]    },    {      "name": "TechBuild Pty Ltd",      "registrationNumber": "2019/789012/07",      "enterpriseType": "Large",      "beeLevel": "Level 4",      "totalAwards": 18,      "totalValue": 45000000,      "latestAwardDate": "2026-04-15",      "categories": [        "Construction"      ],      "provinces": [        "Gauteng"      ]    }  ],  "meta": {    "requestId": "req_cs123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "page": 1,    "pageSize": 20,    "totalCount": 2,    "rateLimit": {      "limit": 500,      "remaining": 492,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}

Organizations

Government organization profiles and their tender activity.

GET/v1/organizations/{id}Auth required

Get Organization Profile

Retrieves a buyer/department/SOE organization profile with enrichment data from Google, Wikidata, SALGA, and CSD. Includes organization type classification (government_department, municipality, state_enterprise), contact info, tender statistics, and recent awards.

Parameters (1)
NameTypeRequiredDescription
idstringYesOrganization ID or slug (e.g., national-treasury)
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/organizations/national-treasury"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/organizations/national-treasury', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const org = await response.json()console.log(org.data.name, org.data.organizationType)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/organizations/national-treasury',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})org = response.json()['data']print(org['name'], org['organizationType'])
Example Response
JSON
{  "success": true,  "data": {    "id": "org_national_treasury",    "name": "National Treasury",    "legalName": "National Treasury of the Republic of South Africa",    "organizationType": "government_department",    "registrationNumber": null,    "bbbeeLevel": null,    "industryCodes": [      "Public Finance"    ],    "provincesOperating": [      "National"    ],    "contactEmail": "[email protected]",    "contactPhone": "+27 12 315 5111",    "website": "https://www.treasury.gov.za",    "physicalAddress": "240 Vermeulen Street, Pretoria",    "google": {      "placeId": "ChIJ...",      "rating": 4.2,      "mapUrl": "https://maps.google.com/...",      "types": [        "government_office"      ]    },    "wikidata": {      "id": "Q1501199",      "label": "National Treasury",      "description": "South African government department"    },    "govDirectoryUrl": "https://www.gov.za/national-treasury",    "salgaMunicipalityCode": null,    "csdNumber": "CSD001",    "enrichmentSources": [      "OCDS",      "WIKIDATA",      "GOV_ZA",      "GOOGLE"    ],    "confidenceScore": 0.94,    "slug": "national-treasury",    "stats": {      "totalTenders": 234,      "totalAwardValue": 12500000000,      "tenderCategories": [        "Financial Services",        "Auditing",        "Consulting"      ]    }  },  "meta": {    "requestId": "req_org123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "rateLimit": {      "limit": 500,      "remaining": 491,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}
GET/v1/organizations/{id}/tendersAuth required

List Organization Tenders

Retrieves a paginated list of tenders published by a specific organization (department, municipality, or SOE).

Parameters (4)
NameTypeRequiredDescription
idstringYesOrganization ID or slug
pagenumberNoPage number (default: 1)
limitnumberNoResults per page (default: 20, max: 100)
statusstringNoFilter by tender status
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/organizations/national-treasury/tenders?status=active"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/organizations/national-treasury/tenders?status=active', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const tenders = await response.json()console.log(tenders.data)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/organizations/national-treasury/tenders',    params={'status': 'active'},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())
Example Response
JSON
{  "success": true,  "data": [    {      "tenderId": "T012345",      "title": "Financial Audit Services",      "closingDate": "2026-07-30",      "status": "active",      "estimatedValue": {        "min": 2000000,        "max": 5000000,        "median": 3500000      }    },    {      "tenderId": "T012346",      "title": "Consulting Services",      "closingDate": "2026-08-15",      "status": "active",      "estimatedValue": null    }  ],  "meta": {    "requestId": "req_ot123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "page": 1,    "pageSize": 20,    "totalCount": 15,    "rateLimit": {      "limit": 500,      "remaining": 490,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}

Analysis & Estimates

AI-powered tender document analysis and value estimation.

GET/v1/tenders/{id}/analysisAuth required

Get Tender Analysis (AI)

Retrieves AI-powered document analysis for a tender, including structured evaluation criteria, submission guidelines, important dates, contact information, technical specifications, financial requirements, and compliance requirements. Returns 404 if no analysis exists.

Parameters (1)
NameTypeRequiredDescription
idstringYesTender ID
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/tenders/T012345/analysis"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/tenders/T012345/analysis', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const analysis = await response.json()console.log(analysis.data.evaluationCriteria)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/tenders/T012345/analysis',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})analysis = response.json()['data']for criterion in analysis['evaluationCriteria']:    print(criterion['criterion'], criterion['weight'])
Example Response
JSON
{  "success": true,  "data": {    "id": "anl_001",    "tenderId": "T012345",    "documentId": "DOC001",    "submissionGuidelines": {      "format": "Hard copy and electronic",      "address": "123 Church Street, Pretoria",      "deadline": "2026-07-15 11:00"    },    "evaluationCriteria": [      {        "criterion": "B-BBEE Level",        "weight": 20      },      {        "criterion": "Price",        "weight": 50      },      {        "criterion": "Technical",        "weight": 30      }    ],    "importantDates": {      "briefingSession": "2026-06-20 10:00",      "closingDate": "2026-07-15 11:00"    },    "contactInformation": {      "name": "Mr S Mokoena",      "email": "[email protected]",      "phone": "012 315 1234"    },    "technicalSpecifications": [      "Must have ISO 27001 certification",      "Minimum 5 years experience"    ],    "financialRequirements": [      "Valid tax clearance certificate required",      "Bid guarantee of 2% of tender value"    ],    "complianceRequirements": [      "CIDB grading 8CE or higher",      "CSD registration required"    ],    "qualityScore": 92,    "confidence": 0.88,    "aiModel": "gemini-2.5-flash",    "aiExtractionMethod": "document-analysis-v2"  },  "meta": {    "requestId": "req_anl001",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1"  }}
GET/v1/tenders/{id}/value-estimateAuth required

Get Tender Value Estimate

Retrieves a computed value estimate for a tender with min/max/median values, confidence score, methodology (historical, document, benchmark, or hybrid), and data source descriptions.

Parameters (1)
NameTypeRequiredDescription
idstringYesTender ID
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/tenders/T012345/value-estimate"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/tenders/T012345/value-estimate', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const estimate = await response.json()console.log(estimate.data.estimatedMedian, estimate.data.confidenceScore)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/tenders/T012345/value-estimate',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})estimate = response.json()['data']print(estimate['estimatedMedian'], estimate['methodology'])
Example Response
JSON
{  "success": true,  "data": {    "id": "ve_001",    "tenderId": "T012345",    "estimatedMin": 5000000,    "estimatedMax": 15000000,    "estimatedMedian": 10000000,    "confidenceScore": 85,    "methodology": "hybrid",    "dataSources": [      "Historical similar awards in ICT category",      "Document-based analysis of scope"    ],    "factors": {      "complexity": "high",      "marketDemand": "medium",      "contractTerm": "60 months"    }  },  "meta": {    "requestId": "req_ve001",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1"  }}

Meta

API status, province listings, and other metadata endpoints.

GET/v1/categoriesAuth required

List Categories

Returns a list of all tender categories with their tender counts, ordered by popularity (most tenders first). Useful for building filter dropdowns.

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/categories"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/categories', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const categories = await response.json()console.log(categories.data)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/categories',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})for cat in response.json()['data']:    print(cat['name'], cat['count'])
Example Response
JSON
{  "success": true,  "data": [    {      "name": "Construction & Infrastructure",      "count": 1245    },    {      "name": "ICT & Technology",      "count": 892    },    {      "name": "Professional Services",      "count": 567    },    {      "name": "Health & Medical",      "count": 423    },    {      "name": "Education & Training",      "count": 345    }  ],  "meta": {    "requestId": "req_cat123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1"  }}
GET/v1/meta/status

API Status

Returns the current health status of the API, version info, and last sync timestamps for all data tables. This endpoint does not require authentication.

curl
curl "https://api.tenders-sa.org/v1/meta/status"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/meta/status')const status = await response.json()console.log(status.data.healthy, status.data.lastSync)
Python
Python
import requests response = requests.get('https://api.tenders-sa.org/v1/meta/status')status = response.json()print(status['data']['healthy'])
Example Response
JSON
{  "success": true,  "data": {    "healthy": true,    "version": "v1",    "lastSync": {      "tenders": "2026-05-25T09:45:00Z",      "awards": "2026-05-25T09:45:00Z",      "companies": "2026-05-25T09:45:00Z",      "organizations": "2026-05-25T08:00:00Z",      "analyses": "2026-05-25T09:45:00Z",      "estimates": "2026-05-25T09:45:00Z"    }  },  "meta": {    "requestId": "req_st123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1"  }}
GET/v1/meta/provinces

List Provinces

Returns a list of all provinces with their tender counts, ordered by popularity. This endpoint does not require authentication.

curl
curl "https://api.tenders-sa.org/v1/meta/provinces"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/meta/provinces')const provinces = await response.json()console.log(provinces.data)
Python
Python
import requests response = requests.get('https://api.tenders-sa.org/v1/meta/provinces')provinces = response.json()['data']for p in provinces:    print(p['name'], p['tenderCount'])
Example Response
JSON
{  "success": true,  "data": [    {      "name": "Gauteng",      "tenderCount": 3456    },    {      "name": "Western Cape",      "tenderCount": 2134    },    {      "name": "KwaZulu-Natal",      "tenderCount": 1876    },    {      "name": "Eastern Cape",      "tenderCount": 1234    },    {      "name": "Limpopo",      "tenderCount": 987    },    {      "name": "Mpumalanga",      "tenderCount": 876    },    {      "name": "North West",      "tenderCount": 765    },    {      "name": "Free State",      "tenderCount": 654    },    {      "name": "Northern Cape",      "tenderCount": 432    }  ],  "meta": {    "requestId": "req_pr123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1"  }}
GET/v1/meta/usageAuth required

Get Usage Stats

Returns daily and monthly API call counts for the authenticated API key, along with rate limit information. Useful for monitoring consumption.

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v1/meta/usage"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v1/meta/usage', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const usage = await response.json()console.log(usage.data.daily, '/', usage.data.limit.daily)
Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v1/meta/usage',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})usage = response.json()['data']print(f"Daily: {usage['daily']}/{usage['limit']['daily']}")
Example Response
JSON
{  "success": true,  "data": {    "daily": 7,    "monthly": 234,    "limit": {      "daily": 500,      "monthly": 15000    }  },  "meta": {    "requestId": "req_us123",    "timestamp": "2026-05-25T10:00:00Z",    "apiVersion": "v1",    "rateLimit": {      "limit": 500,      "remaining": 493,      "reset": "2026-05-26T00:00:00Z",      "policy": "daily"    }  }}