Gov APIeprocure.gov.in ↗
Access live central government tender notices from India's eProcurement portal. Filter by keyword, list type, and page. Returns tender IDs, orgs, dates, and more.
What is the Gov API?
The eprocure.gov.in API exposes central government tender notices from India's Central Public Procurement Portal through a single endpoint, search_tenders, returning up to 15 fields per notice including tender ID, title, inviting organisation, reference number, and bid-closing dates. It covers five distinct listing types — active, high-value, global, closing-today, and corrigendum — and supports keyword filtering and paginated traversal across the full live dataset.
curl -X GET 'https://api.parse.bot/scraper/29570b37-410d-4b85-a51b-07d0c266c6d9/search_tenders?list_type=active' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace eprocure-gov-in-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: browse active tenders on India's Central Public Procurement Portal."""
from parse_apis.eprocure_gov_in_api import Eprocure, ListType, InputFormatInvalid
client = Eprocure()
# List active tenders (newest first), capped at 5 items.
for tender in client.tenders.search(list_type=ListType.ACTIVE, limit=5):
print(tender.title, "|", tender.organisation, "|", tender.published_at)
# Keyword-filtered search across corrigendum tenders — grab the first match.
hit = client.tenders.search(
keyword="medical",
list_type=ListType.CORRIGENDUM,
limit=1,
).first()
if hit is not None:
print(hit.tender_id, hit.reference_no)
print("Bid closes:", hit.bid_submission_closing_at)
print("Has corrigendum:", hit.has_corrigendum)
# Browse high-value tenders, scanning at most 2 portal pages.
try:
for tender in client.tenders.search(
list_type=ListType.HIGH_VALUE,
max_pages=2,
limit=10,
):
print(tender.tender_id, tender.title[:80])
except InputFormatInvalid as e:
# Raised when the portal rejects the supplied list_type or page value.
print("Invalid input:", e.message)
print("exercised: tenders.search (active / corrigendum / high_value)")
Returns tender notices from one of the portal's central-government tender listings (newest first as the portal orders them), optionally filtered by a keyword. Each row is one tender notice with its tender_id, title, reference number, inviting organisation, publish / bid-closing / opening timestamps (India Standard Time, 'YYYY-MM-DD HH:MM') and whether a corrigendum is attached. The portal serves 10 rows per listing page; one call reads the listing pages starting at `page` and scans at most `max_pages` consecutive pages (each page is one round trip), so a call costs between 1 and max_pages requests. The keyword filter is applied by this API to the scanned rows only (case-insensitive substring match on title, reference number, tender id and organisation name), not by the portal, so a filtered call may legitimately return an empty `tenders` array while `next_page` still advances; continue with `page = next_page` to scan further. `next_page` is null once the listing has been exhausted. `total_tenders` is the portal's own live count for the whole listing, independent of any keyword. Important invariant: the portal's own paging is not stable for notices that share the same publish timestamp, so adjacent portal pages can repeat or skip such notices; rows are de-duplicated by tender_id within one call, but the same tender may still appear again in a later call and a small number of notices may be missed. Detailed tender views (documents, EMD, tender value) are not available through this API because the portal gates them behind an image verification.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based listing page to start scanning from (10 tenders per portal page). Pass the previous response's next_page to continue. |
| keyword | string | Case-insensitive substring matched locally against title, reference number, tender id and organisation name of the scanned rows (e.g. one shape: 'medical'). Omitted or blank = no filtering. |
| list_type | string | Which central-government listing to read. |
| max_pages | integer | Maximum number of consecutive listing pages scanned in this call; values above 20 are clamped to 20. |
{
"type": "object",
"fields": {
"page": "first listing page scanned",
"keyword": "keyword applied locally, or null when none",
"tenders": "array of distinct tender notices (de-duplicated by tender_id) matching the keyword, or all scanned rows when no keyword",
"list_type": "listing that was read",
"next_page": "listing page to pass as `page` to continue, or null when the listing is exhausted",
"pages_scanned": "number of listing pages read in this call",
"total_tenders": "portal's live count of tenders in the whole listing (unfiltered); may be null if the portal omits it",
"tenders[].title": "tender title",
"tenders[].tender_id": "portal tender identifier, e.g. shape 2026_ORG_123456_1",
"tenders[].organisation": "tender inviting organisation name",
"tenders[].published_at": "e-publish timestamp, IST, 'YYYY-MM-DD HH:MM'",
"tenders[].reference_no": "organisation's tender reference number",
"tenders[].has_corrigendum": "true when the portal shows a corrigendum attached to the notice",
"tenders[].tender_opening_at": "tender opening timestamp, IST",
"tenders[].bid_submission_closing_at": "bid submission closing timestamp, IST"
},
"sample": {
"data": {
"page": 1,
"keyword": "medical",
"tenders": [
{
"title": "Providing additional feeder for backup supply to NINE Auditorium, PGIMER, Chandigarh",
"tender_id": "2026_PGIME_926037_1",
"organisation": "Postgraduate Institute of Medical and Education and Research Chandigarh",
"published_at": "2026-09-14 18:00",
"reference_no": "PGI/Engg./Elect./2026-27/29",
"has_corrigendum": true,
"tender_opening_at": "2026-09-23 11:00",
"bid_submission_closing_at": "2026-09-22 11:00"
}
],
"list_type": "corrigendum",
"next_page": 6,
"pages_scanned": 5,
"total_tenders": 2602
},
"status": "success"
}
}About the Gov API
What the API Returns
The search_tenders endpoint reads tender listings from India's Central Public Procurement Portal (eprocure.gov.in) and returns structured records for each tender notice. Each item in the tenders array includes tender_id (in the canonical portal shape, e.g. 2026_ORG_123456_1), title, organisation (the inviting authority), reference number, and key dates such as publish date and bid-closing date. The response also surfaces total_tenders, which reflects the portal's live unfiltered count for the chosen listing — useful for estimating dataset size before paginating.
List Types and Filtering
The list_type parameter selects which central-government listing to read. Accepted values map to the portal's own groupings: active tenders, high-value tenders, global tenders, tenders closing today, and corrigendum notices. The keyword parameter applies a case-insensitive substring match across title, reference number, tender_id, and organisation — the filtering happens against the scanned pages, not a search index, so results reflect what is visible in the listing at call time. Setting max_pages (capped at 20) controls how many consecutive listing pages (10 tenders each) are read in a single call.
Pagination
The response includes page (the first listing page scanned), pages_scanned (how many were read in this call), and next_page — the value to pass as page in the next request to continue where the previous call left off. When next_page is null, the listing is exhausted. De-duplication by tender_id is applied within each response, so repeated entries from the portal are collapsed automatically.
Coverage Scope
This API covers central government listings only, as published on the portal's main tender board. State government portals, department-specific procurement systems, and tender detail pages (bid documents, corrigendum attachments, evaluation results) are outside the current scope.
The Gov API is a managed, monitored endpoint for eprocure.gov.in — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when eprocure.gov.in changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official eprocure.gov.in API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor tenders closing today by polling the
closing_todaylist type and filtering by organisation name - Build a procurement alert system that scans the
activelisting for new tenders matching a product or service keyword - Track high-value central government contracts using the
high_valuelist type and storingtender_idrecords over time - Aggregate corrigendum notices to flag amendments to previously published tenders your team is tracking
- Identify global tenders open to international bidders by querying the
globallist type - Export tender metadata (title, organisation, dates) to a spreadsheet for procurement research or vendor analysis
- Cross-reference
total_tenderscounts across list types to measure procurement activity trends over time
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does eprocure.gov.in have an official developer API?+
What does `list_type` control, and which listings are available?+
list_type parameter selects the specific central-government tender board to read. The available options correspond to the portal's own groupings: active tenders, high-value tenders, global tenders, tenders closing today, and corrigendum notices. Each call reads only one list type at a time. To cover multiple listings, make a separate request per list type.Does the keyword filter search the entire portal, or only the pages scanned?+
page and max_pages parameters. It is not a portal-wide full-text search. To scan more of the listing, increase max_pages (up to the 20-page cap per call) or paginate using next_page across multiple calls.Does the API return tender detail pages, bid documents, or evaluation results?+
tender_id, title, organisation, reference number, publish date, and bid-closing date. Bid documents, technical specifications, corrigendum attachments, and award/evaluation results are not included. You can fork this API on Parse and revise it to add an endpoint that fetches individual tender detail pages.