Skip to main content
HomePublishersDeveloper Documentation

API Reference

Back to Hub

Getting Started

The Tenders-SA API is a public JSON-based REST API that provides the raw data driving our interactive widgets. It is designed for developers who want to build custom data visualisations, internal reporting tools, or integrated procurement feeds for their industry-specific communities.

Base URL

https://www.tenders-sa.orgProduction

Authentication

The widget APIs are currently **public** and do not require API keys or OAuth authentication. This is to encourage open data syndication across the SA procurement ecosystem.

GET

/api/widgets/top-companies

Returns a leaderboard of companies with the highest total award values.

Request Parameters

ParamTypeDescription
provincestringFilter by province slug.
categorystringFilter by category slug.
limitnumberNumber of companies (default: 5, max: 10).
yearnumberFilter by award year.

Code Example

fetch('https://www.tenders-sa.org/api/widgets/top-companies?province=gauteng&limit=5')
  .then(response => response.json())
  .then(data => console.log(data));

Sample Response

{
  "data": [
    {
      "rank": 1,
      "supplierName": "Build-IT Solutions",
      "totalValue": 500000000,
      "contractCount": 12,
      "province": "Gauteng"
    }
  ],
  "meta": {
    "province": "gauteng",
    "category": "all",
    "generatedAt": "2025-03-05T10:00:00Z"
  }
}
GET

/api/widgets/winners-feed

A live feed of the most recent tender awards across all sectors.

Request Parameters

No parameters available for this endpoint.

Code Example

fetch('https://www.tenders-sa.org/api/widgets/winners-feed')
  .then(response => response.json())
  .then(data => console.log(data));

Sample Response

{
  "data": [
    {
      "id": "award_123",
      "supplierName": "Siyaya Consulting",
      "amount": 1200000,
      "date": "2025-03-04T15:30:00Z",
      "orgName": "Dept of Health",
      "province": "Limpopo"
    }
  ],
  "generatedAt": "2025-03-05T10:00:00Z"
}

Rate Limiting

To ensure high availability and fair usage for all publishers, we enforce standard rate limits on public API endpoints. If you exceed these limits, our servers will return a 429 Too Many Requests response.

Default Limit

60

Requests / Minute

Response Headers

X-RateLimit-Limit

The maximum number of requests allowed per minute.

X-RateLimit-Remaining

The number of requests remaining in the current window.

Error Codes

CodeMessageDescription & Resolution
400Bad Request

The request contains invalid parameters or is missing required information.

Resolution: Check that all query parameters match the types and constraints listed in the documentation.

404Not Found

The requested resource or endpoint does not exist.

Resolution: Verify the endpoint path is correct.

429Too Many Requests

You have exceeded the rate limit for this endpoint.

Resolution: Wait for the cooling period or reduce the frequency of your requests.

500Internal Server Error

An unexpected error occurred on our servers.

Resolution: Wait a few minutes and try again. If the issue persists, contact developer support.

Changelog

v1.0.02025-03-05
  • Initial release of public widget APIs.
  • Support for Sector Trends, Top Companies, and Winners Feed.
  • Added province and category filtering to relevant endpoints.

Packages & SDKs

We are developing official wrappers for popular frameworks to make integration even faster. Follow our GitHub to be notified when they are released.

@tenderssa/widget-reactComing Soon
@tenderssa/widget-vueComing Soon

No-Code Hub

Want to connect tender data to your CRM, Google Sheets, or Slack without writing code? Our upcoming Zapier and Make apps will let you automate everything.

Register for Beta Access

Build Something Extraordinary

Have questions about the API? Need a custom endpoint or specific dataset? Our developer relations team is here to help you get the data you need.

    SA Tender Data API Documentation for Developers | Tenders-SA