Pull live global tender notices and contract awards straight into your CRM, bid pipeline or data warehouse. Keys are managed in your workspace, and API access is included on plans that list it.
curl "https://app.tenderhive.com/api/public/v1/tenders?country=KE&limit=20" \ -H "Authorization: Bearer th_live_xxxxxxxxxxxx"
List responses are JSON with a data array and a pagination object holding next_cursor; change feeds return next_cursor at the top level. Pass it back as ?cursor= to continue; replaying a cursor returns the same window, so an interrupted sync resumes without gaps. Your key's hourly allowance and remaining requests are returned in the x-ratelimit-* headers. Errors return 401 (bad key), 402 (plan without API access), 403 (scope) or 429 (rate limit). The full machine description is at /api/public/v1/openapi.
/api/public/v1/tendersSearch live tender notices across every ingested source, de-duplicated. Scope: tenders:read.
| Parameter | Description |
|---|---|
| q | Full-text query across title, buyer and summary |
| country | ISO-2 country code, e.g. KE, ZA, DE |
| sector | Sector slug as used in the directory |
| source | Source code, e.g. ted_eu, sam_gov, afdb |
| status | open | closing_soon | closed | awarded | cancelled |
| published_since | ISO date — only notices published on or after |
| deadline_before | ISO date — only notices closing on or before |
| min_value | Minimum estimated value in USD |
| cursor | Opaque keyset cursor from pagination.next_cursor |
| limit / offset | Page size (max 200); offset is deprecated, use cursor |
/api/public/v1/awardsQuery historical contract awards, suppliers and award values. Scope: awards:read.
| Parameter | Description |
|---|---|
| country | ISO-2 country code |
| sector | Sector slug |
| supplier | Partial supplier name match |
| awarded_since | ISO date — only awards on or after |
| cursor | Opaque keyset cursor from pagination.next_cursor |
| limit / offset | Page size (max 200); offset is deprecated, use cursor |
/api/public/v1/tenders/changesNotices created, updated or withdrawn since your last cursor. Scope: tenders:changes.
| Parameter | Description |
|---|---|
| since | ISO date to start an initial synchronisation |
| cursor | Opaque cursor from the top-level next_cursor |
| limit | Page size (max 200) |
/api/public/v1/awards/changesAwards created, updated or retracted since your last cursor. Scope: awards:changes.
| Parameter | Description |
|---|---|
| since | ISO date to start an initial synchronisation |
| cursor | Opaque cursor from the top-level next_cursor |
| limit | Page size (max 200) |
/api/public/v1/documentsDocument metadata across the whole archive, or for one notice. Scope: documents:metadata.
| Parameter | Description |
|---|---|
| tender_id | Optional. Restricts the feed to one notice |
| since | ISO date — only documents first recorded on or after |
| cursor | Opaque keyset cursor from pagination.next_cursor |
| limit / offset | Page size (max 200); offset is deprecated, use cursor |
/api/public/v1/documents/changesDocuments added, updated or withdrawn since your last cursor, each with its tender_id. Scope: documents:metadata.
| Parameter | Description |
|---|---|
| since | ISO date to start an initial synchronisation |
| cursor | Opaque cursor from the top-level next_cursor |
| limit | Page size (max 200) |
/api/public/v1/documents/{documentId}/downloadDownloads the stored file for a document. Scope: documents:files.
| Parameter | Description |
|---|---|
| documentId | Document id from the documents feed |
/api/public/v1/sourcesDirectory of official sources available through the API. Scope: sources:read.
| Parameter | Description |
|---|---|
| country | ISO-2 country code |
| api_available | true | false — whether the source is available through the API |
| limit / offset | Page size (max 200) and offset |
Every procurement record TenderHive holds is available through the API. What a key receives depends only on its scopes. file_url (the official portal link) and download_url (an authenticated path to the file TenderHive stores) need documents:files; extracted_text needs documents:text. Extraction coverage is partial, so text is present only where extraction has run. TenderHive never returns internal storage paths or storage credentials.