Skip to main content
HomeDevelopers

Developer Portal

Dashboard

API Reference

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

Tenders

Search, browse, and access tender notices with AI enrichment, counts, and sub-resources.

GET/v2/tendersAuth required

List / Browse Tenders

Returns a cursor-based paginated list of active tenders with enriched fields including AI summaries, value estimates, categories, provinces, and source organization details. Use the `cursor` from `meta.nextCursor` for the next page.

▶Parameters (3)
NameTypeRequiredDescription
limitnumberNoResults per page (default: 20, max: 100)
cursorstringNoOpaque cursor from `meta.nextCursor` of the previous response
fieldsstringNoComma-separated field whitelist for sparse responses
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/tenders?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/tenders?limit=10', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const data = await response.json()// Use data.meta.nextCursor for the next pageconsole.log(data.data)
▶Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v2/tenders',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})data = response.json()# Paginate with data['meta']['nextCursor']print(data['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 services...",      "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,      "sourceOrganization": {        "name": "Department of Health"      },      "referenceNumber": "DOH/ICT/2026/001",      "municipality": "City of Johannesburg",      "department": "Department of Health",      "dataSource": "etenders"    }  ],  "meta": {    "requestId": "req_abc123",    "timestamp": "2026-06-15T10:00:00Z",    "apiVersion": "v2",    "rateLimit": {      "limit": 10000,      "remaining": 9847,      "reset": "2026-06-16T00:00:00Z",      "policy": "daily"    },    "totalCount": 5916,    "nextCursor": "eyJpZCI6ImNsdWh6eDZsOTAwMDF1YnN3cWYzMnRmcXQiLCJ2YWx1ZSI6eyJpZCI6ImNsdWh6eDZsOTAwMDF1YnN3cWYzMnRmcXQifX0",    "hasNext": true,    "hasPrev": false  }}
GET/v2/tenders/{id}Auth required

Get Tender Detail

Retrieves a single tender by its ID, including enriched fields, value estimates, and sub-resource relationships. Sub-resource endpoints are available at /v2/tenders/{id}/awards, /v2/tenders/{id}/documents, /v2/tenders/{id}/analysis, etc.

▶Parameters (1)
NameTypeRequiredDescription
idstringYesTender ID (e.g., T012345)
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/tenders/T012345"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/tenders/T012345', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const tender = await response.json()console.log(tender.data.title, tender.data.aiSummary)
▶Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v2/tenders/T012345',    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})tender = response.json()['data']print(tender['title'], tender['aiSummary'])
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,    "sourceOrganization": {      "name": "Department of Health"    },    "referenceNumber": "DOH/ICT/2026/001",    "municipality": "City of Johannesburg",    "department": "Department of Health",    "dataSource": "etenders"  },  "meta": {    "requestId": "req_abc123",    "timestamp": "2026-06-15T10:00:00Z",    "apiVersion": "v2",    "rateLimit": {      "limit": 10000,      "remaining": 9847,      "reset": "2026-06-16T00:00:00Z",      "policy": "daily"    }  }}
GET/v2/tenders/searchAuth required

Full-Text Search Tenders

Performs full-text search across tender titles and descriptions. Requires a search query (`q`). Returns cursor-paginated results.

▶Parameters (4)
NameTypeRequiredDescription
qstringYesSearch query (minimum 2 characters)
limitnumberNoResults per page (default: 20, max: 100)
cursorstringNoOpaque cursor for the next page
fieldsstringNoComma-separated field whitelist
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/tenders/search?q=ict+infrastructure&limit=5"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/tenders/search?q=ict+infrastructure&limit=5', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const data = await response.json()console.log(data.data)
▶Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v2/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_abc123",    "timestamp": "2026-06-15T10:00:00Z",    "apiVersion": "v2",    "rateLimit": {      "limit": 10000,      "remaining": 9847,      "reset": "2026-06-16T00:00:00Z",      "policy": "daily"    },    "totalCount": 5,    "nextCursor": "eyJpZCI6ImNsdWh6eDZsOTAwMDF1YnN3cWYzMnRmcXQiLCJ2YWx1ZSI6eyJpZCI6ImNsdWh6eDZsOTAwMDF1YnN3cWYzMnRmcXQifX0",    "hasNext": true,    "hasPrev": false,    "query": "ict infrastructure"  }}
GET/v2/tenders/...Auth required

All Tender Endpoints

**27 endpoints** in the Tenders group: | Endpoint | Description | |---|---| | GET /v2/tenders | List tenders (cursor pagination) | | GET /v2/tenders/search?q= | Full-text search | | GET /v2/tenders/closing-soon | Tenders closing soon | | GET /v2/tenders/new | Recently published tenders | | GET /v2/tenders/bbbee-required | Tenders requiring B-BBEE | | GET /v2/tenders/value-range?min=&max= | Filter by value range | | GET /v2/tenders/counts/province | Counts grouped by province | | GET /v2/tenders/counts/category | Counts grouped by category | | GET /v2/tenders/counts/organization | Counts grouped by organization | | GET /v2/tenders/counts/status | Counts grouped by status | | GET /v2/tenders/by-province/{province} | Tenders filtered by province | | GET /v2/tenders/by-organization/{orgId} | Tenders filtered by organization | | GET /v2/tenders/by-publication-type/{type} | Tenders by publication type | | GET /v2/tenders/by-category/{category} | Tenders filtered by category | | GET /v2/tenders/{id} | Single tender detail | | GET /v2/tenders/{id}/awards | Tender awards | | GET /v2/tenders/{id}/contracts | Tender contracts | | GET /v2/tenders/{id}/milestones | Tender milestones | | GET /v2/tenders/{id}/documents | Tender documents | | GET /v2/tenders/{id}/bidders | Tender bidders | | GET /v2/tenders/{id}/submission-requirements | Submission requirements | | GET /v2/tenders/{id}/timeline | Tender timeline | | GET /v2/tenders/{id}/analysis | AI document analysis | | GET /v2/tenders/{id}/value-estimate | Value estimate | | GET /v2/tenders/{id}/seo | SEO metadata | | GET /v2/tenders/{id}/slug | Slug mapping | | GET /v2/tenders/{id}/related | Related tenders |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/tenders?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/tenders?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/v2/tenders',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Awards

Contract award data with supplier details, B-BBEE analytics, and subcontractor intelligence.

GET/v2/awardsAuth required

List / Browse Awards

Returns a cursor-based paginated list of contract awards with supplier details, B-BBEE information, award amounts, and tender context. Analytics breakdowns are available at /v2/awards/analytics and its sub-paths.

▶Parameters (2)
NameTypeRequiredDescription
limitnumberNoResults per page (default: 20, max: 100)
cursorstringNoOpaque cursor from `meta.nextCursor` for the next page
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/awards?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/awards?limit=10', {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const data = await response.json()console.log(data.data.map(a => a.supplierName))
▶Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v2/awards',    params={'limit': 10},    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",      "supplierId": "SUP001",      "enterpriseType": "QSE",      "beeLevel": "Level 2",      "beePoints": 92,      "points": 85,      "tenderTitle": "ICT Infrastructure Tender",      "tenderCategory": "ICT & Technology",      "tenderProvince": "Gauteng"    }  ],  "meta": {    "requestId": "req_abc123",    "timestamp": "2026-06-15T10:00:00Z",    "apiVersion": "v2",    "rateLimit": {      "limit": 10000,      "remaining": 9847,      "reset": "2026-06-16T00:00:00Z",      "policy": "daily"    },    "totalCount": 42340,    "nextCursor": "eyJpZCI6ImNsdWh6eDZsOTAwMDF1YnN3cWYzMnRmcXQiLCJ2YWx1ZSI6eyJpZCI6ImNsdWh6eDZsOTAwMDF1YnN3cWYzMnRmcXQifX0",    "hasNext": true,    "hasPrev": false  }}
GET/v2/awards/...Auth required

All Award Endpoints

**12 endpoints** in the Awards group: | Endpoint | Description | |---|---| | GET /v2/awards | List awards (cursor pagination) | | GET /v2/awards/{id} | Single award detail | | GET /v2/awards/{id}/subcontractors | Award subcontractors | | GET /v2/awards/analytics | Market analytics | | GET /v2/awards/analytics/province | Analytics by province | | GET /v2/awards/analytics/category | Analytics by category | | GET /v2/awards/analytics/bee-level | Analytics by B-BBEE level | | GET /v2/awards/analytics/enterprise-type | Analytics by enterprise type | | GET /v2/awards/by-tender/{tenderId} | Awards by tender | | GET /v2/awards/by-supplier/{name} | Awards by supplier name | | GET /v2/awards/by-supplier-party/{partyId} | Awards by party ID | | GET /v2/awards/by-date-range | Awards by date range |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/awards?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/awards?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/v2/awards',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Companies / Suppliers

Company profiles, award history, directors, and compliance scoring.

GET/v2/companies/{name}Auth required

Get Company / Supplier Profile

Retrieves a comprehensive company profile including B-BBEE level, enterprise type, CIDB grading, total awards, total value, 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)
limitnumberNoAwards per page in the embedded awards list (default: 20)
cursorstringNoCursor for paginating embedded awards
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/companies/TechSol%20SA%20(Pty)%20Ltd"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/companies/' + encodeURIComponent('TechSol SA (Pty) Ltd'), {  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/v2/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_abc123",    "timestamp": "2026-06-15T10:00:00Z",    "apiVersion": "v2",    "rateLimit": {      "limit": 10000,      "remaining": 9847,      "reset": "2026-06-16T00:00:00Z",      "policy": "daily"    },    "totalAwards": 42  }}
GET/v2/companies/...Auth required

All Company / Supplier Endpoints

**9 endpoints** in the Companies group: | Endpoint | Description | |---|---| | GET /v2/companies | List companies (cursor pagination) | | GET /v2/companies/search?q= | Search companies | | GET /v2/companies/top | Top companies by award value | | GET /v2/companies/{name} | Company profile | | GET /v2/companies/{name}/awards | Company awards | | GET /v2/companies/{name}/contracts | Company contracts | | GET /v2/companies/{name}/tenders | Company tenders | | GET /v2/companies/{name}/directors | Company directors | | GET /v2/companies/by-registration/{reg} | Lookup by registration |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/companies?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/companies?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/v2/companies',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Organizations

Government buyer profiles, tender activity, and enrichment data.

GET/v2/organizations/{id}Auth required

Get Organization / Buyer Profile

Retrieves a buyer/department/SOE organization profile with enrichment data. Look up by ID, registration number (/v2/organizations/by-registration/{reg}), or slug (/v2/organizations/by-slug/{slug}).

▶Parameters (1)
NameTypeRequiredDescription
idstringYesOrganization ID, registration number, or slug (e.g., national-treasury)
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/organizations/national-treasury-tenders"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/organizations/national-treasury-tenders', {  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/v2/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,    "contactEmail": "[email protected]",    "contactPhone": "+27 12 315 5111",    "website": "https://www.treasury.gov.za",    "physicalAddress": "240 Vermeulen Street, Pretoria",    "enrichmentSources": [      "OCDS",      "WIKIDATA",      "GOV_ZA"    ],    "confidenceScore": 0.94,    "slug": "national-treasury-tenders",    "stats": {      "totalTenders": 234,      "totalAwardValue": 12500000000,      "tenderCategories": [        "Financial Services",        "Auditing",        "Consulting"      ]    }  },  "meta": {    "requestId": "req_abc123",    "timestamp": "2026-06-15T10:00:00Z",    "apiVersion": "v2",    "rateLimit": {      "limit": 10000,      "remaining": 9847,      "reset": "2026-06-16T00:00:00Z",      "policy": "daily"    }  }}
GET/v2/organizations/...Auth required

All Organization / Buyer Endpoints

**8 endpoints** in the Organizations group: | Endpoint | Description | |---|---| | GET /v2/organizations | List organizations (cursor pagination) | | GET /v2/organizations/search?q= | Search organizations | | GET /v2/organizations/counts-by-type | Counts by organization type | | GET /v2/organizations/{id} | Organization detail | | GET /v2/organizations/{id}/tenders | Organization tenders | | GET /v2/organizations/{id}/directors | Organization directors | | GET /v2/organizations/by-registration/{reg} | Lookup by registration | | GET /v2/organizations/by-slug/{slug} | Lookup by URL slug |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/organizations?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/organizations?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/v2/organizations',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Directors

Company director lookup and organization affiliation.

GET/v2/directors/...Auth required

All Director Endpoints

**4 endpoints** in the Directors group: | Endpoint | Description | |---|---| | GET /v2/directors | List directors (cursor pagination) | | GET /v2/directors/search?q= | Search directors by name | | GET /v2/directors/{id} | Director detail | | GET /v2/directors/by-organization/{orgId} | Directors by organization |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/directors?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/directors?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/v2/directors',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Categories

Tender category reference data with counts.

GET/v2/categories/...Auth required

All Category Endpoints

**3 endpoints** in the Categories group: | Endpoint | Description | |---|---| | GET /v2/categories | List tender categories with counts | | GET /v2/categories/{id} | Category detail | | GET /v2/categories/by-slug/{slug} | Category by URL slug |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/categories?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/categories?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/v2/categories',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Provinces

Province listings, tender counts, and health scores.

GET/v2/provinces/...Auth required

All Province Endpoints

**3 endpoints** in the Provinces group: | Endpoint | Description | |---|---| | GET /v2/provinces | List provinces with tender counts | | GET /v2/provinces/{id} | Province detail | | GET /v2/provinces/{id}/health-scores | Province health scores |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/provinces?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/provinces?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/v2/provinces',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Meta

API health, sync status, usage stats, and reference data.

GET/v2/meta/status

API Health & Sync Status

Returns API health, D1 entity counts across all synced tables, last cron run status, and worker version. No authentication required.

curl
curl "https://api.tenders-sa.org/v2/meta/status"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/meta/status')const status = await response.json()console.log(status.data.healthy, status.data.entityCounts)
▶Python
Python
import requests response = requests.get('https://api.tenders-sa.org/v2/meta/status')status = response.json()print(status['data']['healthy'])
Example Response
JSON
{  "success": true,  "data": {    "healthy": true,    "version": "v2",    "lastSync": {      "tenders": "2026-06-15T09:30:00Z",      "awards": "2026-06-15T09:30:00Z",      "companies": "2026-06-15T09:30:00Z",      "organizations": "2026-06-15T09:30:00Z"    },    "entityCounts": {      "tenders": 5916,      "awards": 42340,      "companies": 18200,      "organizations": 1350    }  },  "meta": {    "requestId": "req_st123",    "timestamp": "2026-06-15T09:30:05Z",    "apiVersion": "v2"  }}
GET/v2/meta/...Auth required

All Meta / Metadata Endpoints

**5 endpoints** in the Meta group (3 public, 2 authenticated): | Endpoint | Auth | Description | |---|---|---| | GET /v2/meta/status | No | API health + entity counts + cron status | | GET /v2/meta/provinces | No | Provinces with tender counts | | GET /v2/meta/categories | No | Categories with tender counts | | GET /v2/meta/usage | Yes | API key usage stats (daily/monthly/limits) | | GET /v2/meta/industries | Yes | Industry value benchmarks summary |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/meta?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/meta?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/v2/meta',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

SEO & Content

Articles, authors, and category/province SEO metadata.

GET/v2/seo/...Auth required

All SEO & Content Endpoints

**5 endpoints** in the SEO & Content group: | Endpoint | Description | |---|---| | GET /v2/seo/category/{slug} | Category SEO metadata | | GET /v2/seo/province/{slug} | Province SEO metadata | | GET /v2/articles | List articles (cursor pagination) | | GET /v2/articles/{id} | Article detail | | GET /v2/authors/{id} | Author detail |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/seo?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/seo?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/v2/seo',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Industry

Industry value benchmarks with sample sizes and median values.

GET/v2/industry/...Auth required

All Industry Benchmark Endpoints

**2 endpoints** in the Industry group: | Endpoint | Description | |---|---| | GET /v2/industry/benchmarks | List industry value benchmarks | | GET /v2/industry/benchmarks/{id} | Benchmark detail |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/industry/benchmarks?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/industry/benchmarks?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/v2/industry/benchmarks',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Services

Service type classifications for tender scope analysis.

GET/v2/services/...Auth required

All Service Type Endpoints

**2 endpoints** in the Services group: | Endpoint | Description | |---|---| | GET /v2/services | List service type classifications | | GET /v2/services/{id} | Service type detail |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/services?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/services?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/v2/services',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

OCDS

Open Contracting Data Standard party lookup.

GET/v2/ocds/...Auth required

All OCDS Party Endpoints

**2 endpoints** in the OCDS group: | Endpoint | Description | |---|---| | GET /v2/ocds/parties | List OCDS parties (cursor pagination) | | GET /v2/ocds/parties/{id} | OCDS party detail |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/ocds/parties?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/ocds/parties?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/v2/ocds/parties',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Intelligence

Market alerts, sector insights, and intel sources.

GET/v2/intelligence/...Auth required

All Intelligence Endpoints

**4 endpoints** in the Intelligence group: | Endpoint | Description | |---|---| | GET /v2/intel/sources | List intel sources | | GET /v2/intel/sources/{id} | Intel source detail | | GET /v2/intel/items | List intel items (cursor pagination) | | GET /v2/intel/items/{id} | Intel item detail |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/intel?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/intel?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/v2/intel',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Forensic / Risk

Restricted supplier screening, matching, and compliance checks.

GET/v2/forensic/restricted-suppliers/checkAuth required

Check Supplier Against Restricted List

Checks whether a company name appears on the restricted suppliers list. Returns match results with risk scores, restriction reasons, and regulatory references. For broader fuzzy matching, use /v2/forensic/restricted-suppliers/match.

▶Parameters (1)
NameTypeRequiredDescription
qstringYesCompany name to check against the restricted suppliers database
curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/forensic/restricted-suppliers/check?q=Acme+Construction"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/forensic/restricted-suppliers/check?q=' + encodeURIComponent('Acme Construction'), {  headers: { 'Authorization': 'Bearer tsa_prod_abc123def456' }})const result = await response.json()console.log(result.data.matchFound)
▶Python
Python
import requests response = requests.get(    'https://api.tenders-sa.org/v2/forensic/restricted-suppliers/check',    params={'q': 'Acme Construction'},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})result = response.json()print(result['data']['matchFound'])
Example Response
JSON
{  "success": true,  "data": {    "query": "Acme Construction",    "matchFound": false,    "matches": []  },  "meta": {    "requestId": "req_abc123",    "timestamp": "2026-06-15T10:00:00Z",    "apiVersion": "v2",    "rateLimit": {      "limit": 10000,      "remaining": 9847,      "reset": "2026-06-16T00:00:00Z",      "policy": "daily"    }  }}
GET/v2/forensic/...Auth required

All Forensic / Restricted Supplier Endpoints

**4 endpoints** in the Forensic group: | Endpoint | Description | |---|---| | GET /v2/forensic/restricted-suppliers | List restricted suppliers (cursor pagination) | | GET /v2/forensic/restricted-suppliers/{id} | Restricted supplier detail | | GET /v2/forensic/restricted-suppliers/match?q= | Fuzzy match against restricted list | | GET /v2/forensic/restricted-suppliers/check?q= | Check supplier against restricted list |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/forensic/restricted-suppliers?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/forensic/restricted-suppliers?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/v2/forensic/restricted-suppliers',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

CIPC

Companies and Intellectual Property Commission registrations and directors.

GET/v2/cipc/...Auth required

All CIPC Endpoints

**4 endpoints** in the CIPC group: | Endpoint | Description | |---|---| | GET /v2/cipc/enrichments | List CIPC enrichments (cursor pagination) | | GET /v2/cipc/enrichments/{id} | CIPC enrichment detail | | GET /v2/cipc/directors | List CIPC directors (cursor pagination) | | GET /v2/cipc/directors/{id} | CIPC director detail |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/cipc?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/cipc?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/v2/cipc',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Newsletters

Newsletter edition listings and archives.

GET/v2/newsletters/...Auth required

All Newsletter Endpoints

**2 endpoints** in the Newsletters group: | Endpoint | Description | |---|---| | GET /v2/newsletters | List newsletter editions (cursor pagination) | | GET /v2/newsletters/{id} | Newsletter edition detail |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/newsletters?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/newsletters?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/v2/newsletters',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())

Documents

Tender document metadata and R2-backed download URLs.

GET/v2/documents/...Auth required

All Document Endpoints

**2 endpoints** in the Documents group: | Endpoint | Description | |---|---| | GET /v2/documents/{id} | Document metadata | | GET /v2/documents/{id}/download-url | Document download URL (R2-backed) |

curl
curl -H "Authorization: Bearer tsa_prod_abc123def456" \  "https://api.tenders-sa.org/v2/documents?limit=10"
▶JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/documents?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/v2/documents',    params={'limit': 10},    headers={'Authorization': 'Bearer tsa_prod_abc123def456'})print(response.json())