TenderHive Intelligence data API

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.

Authentication

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.

GET/api/public/v1/tenders

Search live tender notices across every ingested source, de-duplicated. Scope: tenders:read.

ParameterDescription
qFull-text query across title, buyer and summary
countryISO-2 country code, e.g. KE, ZA, DE
sectorSector slug as used in the directory
sourceSource code, e.g. ted_eu, sam_gov, afdb
statusopen | closing_soon | closed | awarded | cancelled
published_sinceISO date — only notices published on or after
deadline_beforeISO date — only notices closing on or before
min_valueMinimum estimated value in USD
cursorOpaque keyset cursor from pagination.next_cursor
limit / offsetPage size (max 200); offset is deprecated, use cursor
GET/api/public/v1/awards

Query historical contract awards, suppliers and award values. Scope: awards:read.

ParameterDescription
countryISO-2 country code
sectorSector slug
supplierPartial supplier name match
awarded_sinceISO date — only awards on or after
cursorOpaque keyset cursor from pagination.next_cursor
limit / offsetPage size (max 200); offset is deprecated, use cursor
GET/api/public/v1/tenders/changes

Notices created, updated or withdrawn since your last cursor. Scope: tenders:changes.

ParameterDescription
sinceISO date to start an initial synchronisation
cursorOpaque cursor from the top-level next_cursor
limitPage size (max 200)
GET/api/public/v1/awards/changes

Awards created, updated or retracted since your last cursor. Scope: awards:changes.

ParameterDescription
sinceISO date to start an initial synchronisation
cursorOpaque cursor from the top-level next_cursor
limitPage size (max 200)
GET/api/public/v1/documents

Document metadata across the whole archive, or for one notice. Scope: documents:metadata.

ParameterDescription
tender_idOptional. Restricts the feed to one notice
sinceISO date — only documents first recorded on or after
cursorOpaque keyset cursor from pagination.next_cursor
limit / offsetPage size (max 200); offset is deprecated, use cursor
GET/api/public/v1/documents/changes

Documents added, updated or withdrawn since your last cursor, each with its tender_id. Scope: documents:metadata.

ParameterDescription
sinceISO date to start an initial synchronisation
cursorOpaque cursor from the top-level next_cursor
limitPage size (max 200)
GET/api/public/v1/documents/{documentId}/download

Downloads the stored file for a document. Scope: documents:files.

ParameterDescription
documentIdDocument id from the documents feed
GET/api/public/v1/sources

Directory of official sources available through the API. Scope: sources:read.

ParameterDescription
countryISO-2 country code
api_availabletrue | false — whether the source is available through the API
limit / offsetPage size (max 200) and offset

Document files and text

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.