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"
JavaScript
JavaScript
const response = await fetch('https://api.tenders-sa.org/v2/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/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",    "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())