Loading…
Loading…
Tenderkart Client API
Use this page to connect to Tenderkart, view filters created by the Tenderkart Team, sync matching tenders, download documents, and fetch market stats.
Base URL:
https://tenderkart.in/api/v1/clientGETGETGETGETGETGETPOST| Method | Endpoint | Use |
|---|---|---|
GET | /openapi.yaml | Machine-readable OpenAPI specification. |
GET | /filters | List filters assigned to your API key, including exact filter criteria. |
GET | /filters/{filter_id}/tenders | Sync tenders changed in Tenderkart using updated_at cursor pagination. |
GET | /tenders/{tender_uuid} | Fetch full tender details and document IDs. |
GET | /documents/{id} | Download a tender document. |
GET | /tenders/lookup | Lookup one tender by portal tender ID or reference number. |
POST | /stats | Fetch aggregate tender market statistics for a date range. |
First backfillScheduled syncNext pageRestrict by stage| Need | Use | Why |
|---|---|---|
First backfill | GET /filters/{filter_id}/tenders?limit=100 | Omit updated_after the first time. The response freezes a safe updated_before for the run. |
Scheduled sync | GET /filters/{filter_id}/tenders?updated_after=ISO_TIMESTAMP | Use sync.next_updated_after from the previous completed run. |
Next page | GET /filters/{filter_id}/tenders?cursor=OPAQUE_CURSOR | Use pagination.next_cursor until has_more is false. |
Restrict by stage | GET /filters/{filter_id}/tenders?updated_after=ISO_TIMESTAMP&status=active,under_evaluation | Use simple status buckets when a client only wants certain tender stages. |
tenderkart_urlupdated_atpublished_atclosing_atcursornext_updated_afterunder_evaluationunknownboq| Term | Meaning |
|---|---|
tenderkart_url | Direct public Tenderkart page for the tender. Included in list, lookup, and detail responses. |
updated_at | Tenderkart system timestamp. Use it for integration sync. |
published_at | Source portal publication timestamp. Useful for tender-age reporting, not sync. |
closing_at | Tender bid submission deadline. Useful for reminders and open-tender workflows. |
cursor | Opaque pagination token. Send it exactly as returned for the next page. |
next_updated_after | Returned on the final page. Store it and pass it as updated_after next time. |
under_evaluation | Simple status bucket covering technical and financial evaluation stages. |
unknown | Response-only status for unmapped source statuses. It is not accepted as a query filter. |
boq | Bill of quantities document, usually an Excel or PDF pricing schedule. |
Send the API key in the X-API-Key header. Keep it private and never put it in frontend code, public repositories, logs, or shared screenshots.
curl -H "X-API-Key: YOUR_API_KEY" "https://tenderkart.in/api/v1/client/filters"Rate limits are applied per API key. The default limit is 30 requests per minute. Authenticated responses include X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. If the API returns 429, wait for the Retry-After response header before retrying.
Filters are created and maintained by the Tenderkart Team for each customer account. API clients can read them, audit the criteria, and sync tenders from them. The criteria object explains the subject matter the filter searches for.
curl -H "X-API-Key: YOUR_API_KEY" "https://tenderkart.in/api/v1/client/filters"{
"filters": [
{
"id": "d2b051b7-f42e-4962-a00c-66a5765ea36a",
"name": "Sound, Light & Immersive AV Shows",
"criteria": {
"keywords": ["sound and light show", "projection mapping"],
"exclude_keywords": ["CCTV", "surveillance"],
"states": []
}
}
]
}keywordsexclude_keywordsstatescitiesauthoritiescategoriesprocurement_typestender_typesportalspayment_modestender_amount_mintender_amount_max| Field | Meaning |
|---|---|
keywords | Tender keywords included in the filter. Multiple values are matched with OR logic. |
exclude_keywords | Negative keywords used to remove noisy or irrelevant tenders. |
states | State filters. Empty or missing means all India. |
cities | City filters. Empty or missing means all cities. |
authorities | Buyer or organisation filters. |
categories | Tender categories such as works, goods, or services when configured. |
procurement_types | Procurement modes such as services, goods, or works when configured. |
tender_types | Tender type groups such as open or limited. |
portals | Source portal filters. |
payment_modes | Payment mode filters when configured. |
tender_amount_min | Minimum tender amount in absolute INR. |
tender_amount_max | Maximum tender amount in absolute INR. |
Empty states or cities means the filter is not restricted to a specific location. For all-India filters, those fields are normally empty. Use the tender sync status query parameter to choose active, evaluation, awarded, or cancelled tenders.
Use the tenders endpoint to sync every Tenderkart record change from a configured filter. Sync on updated_at, not published_at, because source pipelines can lag by up to 24 hours for some sources: a tender published earlier can be added or refreshed in Tenderkart later.
The response also includes published_at and closing_at as business dates. Use them for tender-age reporting, deadline reminders, and open-tender workflows, but keep updated_at as the sync cursor.
curl -H "X-API-Key: YOUR_API_KEY" \
"https://tenderkart.in/api/v1/client/filters/d2b051b7-f42e-4962-a00c-66a5765ea36a/tenders?updated_after=2026-05-22T10:30:00Z&limit=100"For the first full backfill, omit updated_after. For regular runs, pass sync.next_updated_after from the previous completed run. Use ISO-8601 timestamps with timezone, normally UTC with Z. Date-only values are not accepted for sync. Process rows idempotently by id; a tender can appear again if it changes while you are paging.
When updated_before is omitted, Tenderkart chooses a safe upper bound slightly behind current server time. This prevents very recent writes from being skipped while they are still becoming searchable.
curl -H "X-API-Key: YOUR_API_KEY" \
"https://tenderkart.in/api/v1/client/filters/d2b051b7-f42e-4962-a00c-66a5765ea36a/tenders?cursor=eyJmaWx0ZXJfaWQiOiJkMmIwNTFiNy..."{
"tenders": [
{
"id": "6c4c27e1-4c8a-4d62-9a32-2b1c9c4f73e9",
"tenderkart_url": "https://tenderkart.in/tender/6c4c27e1-4c8a-4d62-9a32-2b1c9c4f73e9",
"portal_name": "gem",
"tender_id": "9355734",
"tender_reference_number": "GEM/2026/B/1234567",
"status": "under_evaluation",
"raw_status": "technical_evaluation",
"title": "Event Management Service",
"organisation": "Example Department",
"published_at": "2026-05-21T05:30:00Z",
"closing_at": "2026-06-10T12:00:00Z",
"added_at": "2026-05-21T05:45:00Z",
"updated_at": "2026-05-24T06:15:00Z"
}
],
"pagination": {
"next_cursor": "eyJmaWx0ZXJfaWQiOiJkMmIwNTFiNy...",
"has_more": true
},
"sync": {
"updated_after": "2026-05-22T10:30:00Z",
"updated_before": "2026-05-24T12:30:00Z"
}
}If pagination.has_more is true, request the next page using pagination.next_cursor. sync.next_updated_after appears only on the final page; store it and use it as updated_after on the next run. If a filter is edited while you are paging, the cursor can return 400; restart from your last stored sync.next_updated_after.
{
"pagination": {
"has_more": false
},
"sync": {
"updated_after": "2026-05-22T10:30:00Z",
"updated_before": "2026-05-24T12:30:00Z",
"next_updated_after": "2026-05-24T12:30:00Z"
}
}curl -H "X-API-Key: YOUR_API_KEY" \
"https://tenderkart.in/api/v1/client/filters/d2b051b7-f42e-4962-a00c-66a5765ea36a/tenders?updated_after=2026-05-22T10:30:00Z&status=active,under_evaluation"To open full details, call GET /tenders/{tender_uuid} with the Tenderkart tender UUID returned as id. This endpoint is global for authenticated API clients and does not require a filter ID.
curl -H "X-API-Key: YOUR_API_KEY" "https://tenderkart.in/api/v1/client/tenders/6c4c27e1-4c8a-4d62-9a32-2b1c9c4f73e9"If you already know a portal tender ID or reference number, use lookup:
curl -H "X-API-Key: YOUR_API_KEY" \
"https://tenderkart.in/api/v1/client/tenders/lookup?tender_id=GEM%2F2026%2FB%2F7406250"Lookup does not require a filter ID. It can return any tender available in Tenderkart when the portal tender ID or reference number is valid.
Tender detail responses include document IDs when documents are available, including NIT, BOQ, corrigendum, financial result, and award/AOC documents. Use GET /documents/{id} to download a file.
curl -L -H "X-API-Key: YOUR_API_KEY" \
"https://tenderkart.in/api/v1/client/documents/doc_xxxxxxxxxxxxxxxxx" \
-o "tender-document.pdf"Use stats for aggregate tender counts and value totals. Date ranges can cover at most 30 days, and amounts in the response are returned in INR crores. Stats uses date_from and date_to because the same range is applied to new tender publish dates and awarded tender activity dates.
curl -X POST \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
"https://tenderkart.in/api/v1/client/stats" \
-d '{
"date_from": "2026-05-01",
"date_to": "2026-05-20",
"keywords": ["event management", "projection mapping"],
"states": ["Delhi", "Maharashtra"],
"portals": ["gem"],
"tender_amount_min": 1000000,
"tender_amount_max": 50000000
}'{
"range": {
"from": "2026-05-01",
"to": "2026-05-20"
},
"filters": {
"keywords": ["event management", "projection mapping"],
"states": ["Delhi", "Maharashtra"],
"portals": ["gem"],
"tender_amount_min": 1000000,
"tender_amount_max": 50000000
},
"new_tenders_count": 128,
"awarded_tenders_count": 17,
"total_new_tender_amount_crores": 42.5,
"total_awarded_amount_crores": 7.8,
"new_tender_amount": {
"total_crores": 42.5,
"known_tender_value_crores": 39.8,
"estimated_from_emd_crores": 2.7,
"known_tender_value_count": 113,
"estimated_from_emd_count": 9,
"missing_tender_value_count": 6
},
"awarded_amount": {
"total_crores": 7.8,
"known_contract_value_count": 15,
"missing_contract_value_count": 2
},
"generated_at": "2026-05-20T08:15:30Z"
}400401404409429500| Status | Meaning |
|---|---|
400 | Bad request, invalid timestamp, cursor, status, or input. |
401 | Missing or invalid API key. |
404 | Filter, tender, or document not found. |
409 | Document is not available yet. Retry later. |
429 | Rate limit exceeded. Wait for Retry-After seconds. |
500 | Server error. Retry later or contact Tenderkart support. |