API Documentation
Everything you need to integrate the Tenders-SA API into your applications.
Quick Start
Get an API Key
Navigate to the API Keys page and create a new key. Professional and Enterprise plans include API access.
Set Your Authorization Header
Pass your key as a Bearer token in the Authorization header.
Make Your First Request
Try fetching the latest tenders. See code examples below.
SDKs & Libraries
Official SDKs are available for TypeScript, Python, and CLI β providing idiomatic access to all API endpoints with built-in error handling, retry logic, and pagination.
TypeScript / JavaScript
@tenders-sa-org/sdk-jsGitHub repo
Python
tendersa-sdkGitHub repo
CLI
@tenders-sa-org/cliGitHub repo
Visit the SDKs & Libraries page for installation guides, usage examples, and community-maintained clients.
Authentication
All API requests require authentication via a Bearer token in the Authorization header.
curl -X GET "https://api.tenders-sa.org/v1/tenders" \
-H "Authorization: Bearer tsa_prod_YOUR_API_KEY" \
-H "Content-Type: application/json"Rate Limits
Professional: 500/day, 15K/month
Enterprise: 10K/day, 300K/month
Base URL
https://api.tenders-sa.org/v1
Endpoints
Click on any endpoint to view its parameters and details.
Code Examples
curl -X GET "https://api.tenders-sa.org/v1/tenders" \
-H "Authorization: Bearer tsa_prod_YOUR_API_KEY" \
-H "Content-Type: application/json"Response Format
All API responses follow a consistent envelope structure:
{
"success": true,
"data": { ... },
"meta": {
"requestId": "uuid",
"timestamp": "2026-01-15T10:30:00Z",
"page": 1,
"limit": 20,
"totalCount": 142
}
}Success
success: true
Errors
success: false, error: "message"
Pagination
Included in meta when applicable
Error Codes
| Status | Code | Description |
|---|---|---|
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 403 | FORBIDDEN | Insufficient permissions for this resource |
| 429 | RATE_LIMITED | Rate limit exceeded. Check Retry-After header. |
| 409 | KEY_LIMIT_REACHED | Maximum number of active keys reached for your plan |
| 500 | INTERNAL_ERROR | Server error. Contact support if persistent. |