Developer API
Bring open tenders, contract awards, and other procurement data into your own systems. One key, JSON responses, cursor pagination and daily change feeds.
Quickstart
API access is issued with your plan. Use the key we give you to call any endpoint as a Bearer token.
https://app.tenderhive.com/api/public/v1curl "https://app.tenderhive.com/api/public/v1/tenders?country=KE" \ -H "Authorization: Bearer YOUR_API_KEY"
Responses are JSON. Page with next_cursor. Each key allows 60 requests per minute within your monthly allowance; beyond either limit you receive 429.
Add this address in Claude, ChatGPT or any assistant that supports MCP, then sign in with your TenderHive Intelligence account.
https://app.tenderhive.com/api/public/mcpTry it
Use your key against the live API and inspect the response, headers and matching curl command.
Your key stays in this browser tab and is sent only to the API.
Equivalent curl
curl "https://app.tenderhive.com/api/public/v1/tenders?limit=5" \ -H "Authorization: Bearer YOUR_API_KEY"
Paste a key and send a request to see the live response.
Daily sync
Load your licensed data once, then fetch only new and changed records each day. Every change carries a content hash, so unchanged records can be skipped.
# 1. First run: page through everything in your licence curl "https://app.tenderhive.com/api/public/v1/tenders?limit=200" \ -H "Authorization: Bearer $TENDERHIVE_KEY" # repeat with &cursor=<next_cursor> until next_cursor is null # 2. Every day after: fetch only what changed since your last run curl "https://app.tenderhive.com/api/public/v1/tenders/changes?since=2026-10-07T00:00:00Z&limit=200" \ -H "Authorization: Bearer $TENDERHIVE_KEY"
Reference
| Limit | Value | Header |
|---|---|---|
| Per-minute limit | 60 requests per minute per key by default; raised by agreement | X-RateLimit-Limit / -Remaining / -Reset |
| Per-second limit | Enterprise agreements: up to 20 requests per second per key, with a 2-second burst | X-RateLimit-Limit-Second / -Remaining-Second, RateLimit, RateLimit-Policy |
| Conditional requests | Every response carries an ETag; send If-None-Match to get 304 when nothing changed | ETag / If-None-Match |
| Monthly allowance | Set by your plan or agreement, counted per organisation, resets on the 1st (UTC) | x-quota-limit / -remaining / -reset |
| Page size | Up to 200 records per request; cursor pagination | next_cursor |
| Key restrictions | Keys can be limited to licensed countries and sectors, and can carry an end date | — |
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | A filter or cursor is not valid. |
| 401 | unauthenticated | Key missing, unknown, revoked or expired. |
| 402 | plan_required | Your plan does not include API access. |
| 403 | scope_denied | The key is not licensed for this data or country. |
| 429 | rate_limited | Burst limit or monthly allowance reached. Wait for retry-after seconds. |
| 503 | service_unavailable | Temporary problem. Retry with backoff. |
Reference
Every response carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-reset, plus x-quota-* when a monthly allowance applies.
Questions? Contact Us