intermediate15 minutes
Tenders API
Current application routes for tender listing, detail, document download links, and authenticated exports
Overview
The current tender routes are application API routes under the same Tenders-SA web app, not a separate public API-key service. Tender listing and tender detail routes are public read routes. Export routes require the user's logged-in JWT.
Base path
Use the app base URL plus the route path, for example
https://tenders-sa.org/api/tenders. The previous https://api.tenders-sa.org/v1/tenders examples are not the current implementation.List Tenders
GET /api/tenders returns active tender notices by default and supports pagination plus common search filters.| Parameter | Type | Description |
|-----------|------|-------------|
|
page | number | Page number, default 1 ||
limit | number | Items per page, default 20 ||
search | string | Searches title, description, organization, reference number, and parsed data ||
industry | string | Category search filter; use all to skip ||
province | string | Province filter; use all to skip ||
publicationType | string | Publication type filter such as TENDER_NOTICE, CLOSED, AWARD_NOTICE, CANCELLATION_NOTICE, CORRIGENDUM, or another valid publication type |Search tenders
bash
List response shape
json
Get Single Tender
GET /api/tenders/{id} returns a single active tender by internal tender ID. The route returns 404 if the tender is missing, inactive, or a placeholder/test reference.Tender detail request
bash
Tender Document Download Links
GET /api/v1/documents/{documentId}/download-url resolves a source tender document URL. It returns the R2 URL when available, otherwise a constructed worker URL, otherwise the original source URL. Add ?redirect=1 to receive a 307 redirect instead of JSON.Resolve source document URL
bash
Download URL response shape
json
Authenticated Tender Exports
POST /api/tenders/export creates an export for an authenticated user. GET /api/tenders/export/download?exportId={id} downloads the generated file if it belongs to the same user and has not expired. See Authentication for current JWT behavior.Create export
bash
Error Handling
| Status | Meaning |
|--------|---------|
| 200 | Request succeeded |
| 400 | Invalid request parameters or export request body |
| 401 | Authenticated export route was called without a valid JWT |
| 403 | Export access is not allowed for the current subscription or user |
| 404 | Tender, document URL, or export was not found |
| 410 | Export file has expired |
| 500 | Unexpected server error |
|--------|---------|
| 200 | Request succeeded |
| 400 | Invalid request parameters or export request body |
| 401 | Authenticated export route was called without a valid JWT |
| 403 | Export access is not allowed for the current subscription or user |
| 404 | Tender, document URL, or export was not found |
| 410 | Export file has expired |
| 500 | Unexpected server error |
Updates and Integrations
For user-facing tender updates, use Notification Management. For application preparation context, see the Tender Application Guide.