eProcurement APIeprocurement.gov ↗
Access active tenders, closing-today bids, global tenders, high-value contracts, and procurement stats from India's Central Public Procurement Portal via API.
What is the eProcurement API?
The eProcurement.gov API provides structured access to India's Central Public Procurement Portal across 8 endpoints, covering active tenders, tenders closing today, global and high-value contracts, cancelled tenders, organisation listings, and live dashboard statistics. The get_tender_detail endpoint fetches parsed key-value data from individual tender pages, and get_homepage_stats returns real-time counts split by central and state government categories.
curl -X GET 'https://api.parse.bot/scraper/0f97d39b-53f6-419f-8445-c782f9439d13/get_active_tenders?page=0' \ -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 eprocurement-gov-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.
from parse_apis.india_eprocurement_portal_cppp_api import CPPP, Tender, Organisation, PortalStats, TenderDetail
cppp = CPPP()
# Get portal dashboard statistics
stats = cppp.portalstatses.fetch()
print(stats.active_tenders_central, stats.active_tenders_state, stats.closing_today_central)
# List active tenders (auto-paginates)
for tender in cppp.tenders.list_active(limit=5):
print(tender.title, tender.organisation_name, tender.e_published_date, tender.detail_url)
# List high-value tenders
for tender in cppp.tenders.list_high_value(limit=3):
print(tender.title, tender.bid_submission_closing_date, tender.corrigendum)
# List organisations
for org in cppp.organisations.list(limit=10):
print(org.organisationname)
# Fetch a specific tender detail
detail = cppp.tenderdetails.get(url="https://eprocure.gov.in/cppp/tendersfullview/example")
print(detail.url)
Fetch paginated list of active tenders from the Central Public Procurement Portal. Returns up to 10 tenders per page sorted by most recently published. Each tender includes title, organisation, key dates, and a detail URL.
| Param | Type | Description |
|---|---|---|
| page | integer | Zero-based page number for pagination. |
{
"type": "object",
"fields": {
"page": "integer current page number",
"total": "integer total number of active tenders",
"tenders": "array of tender objects with slno, title, organisation_name, e_published_date, bid_submission_closing_date, tender_opening_date, detail_url, title_refno_tender_id, corrigendum",
"total_pages": "integer total number of pages available"
},
"sample": {
"data": {
"page": 0,
"total": 35048,
"tenders": [
{
"slno": "1.",
"title": "74/EE/Mumbai-IV/2026-27",
"detail_url": "https://eprocure.gov.in/cppp/tendersfullview/MTM4MzQ5NjM=A13h1...",
"corrigendum": "--",
"e_published_date": "10-Jun-2026 09:32 PM",
"organisation_name": "Central Public Works Department (CPWD)",
"tender_opening_date": "18-Jun-2026 03:30 PM",
"title_refno_tender_id": "74/EE/Mumbai-IV/2026-27/74/EE/Mumbai-IV/2026-27/157786",
"bid_submission_closing_date": "18-Jun-2026 03:00 PM"
}
],
"total_pages": 3505
},
"status": "success"
}
}About the eProcurement API
Tender Listings and Pagination
Five endpoints — get_active_tenders, get_tenders_closing_today, get_global_tenders, get_high_value_tenders, and get_cancelled_tenders — return paginated tender lists with up to 10 results per page. All accept an optional zero-based page integer. Each response includes a total count and a page field alongside the tenders array. Tender objects carry fields including slno, title, organisation_name or state_name (depending on the endpoint), e_published_date, bid_submission_closing_date, tender_opening_date, and a detail_url for linking to the full record. The get_cancelled_tenders endpoint may return an empty tenders array when no tenders are currently marked cancelled on the portal.
Tender Detail and CAPTCHA Behavior
get_tender_detail accepts a required url parameter — the full detail URL from the detail_url field returned by any listing endpoint. When the portal's detail page is not gated, the response contains parsed key-value pairs from the page's data tables. When a CAPTCHA is present, the response returns status: "CAPTCHA_GATED" and a message field explaining the gate. Callers should handle both response shapes in their code, as CAPTCHA gating is common on this portal.
Organisations and Dashboard Statistics
get_organisations returns a flat array of objects each containing an organisationname field, covering all procuring bodies registered on the portal. No pagination parameter is accepted. get_homepage_stats returns six integer fields — active_tenders_central, active_tenders_state, opening_today_central, opening_today_state, closing_today_central, and closing_today_state — reflecting the live counts shown on the portal dashboard at time of request.
The eProcurement API is a managed, monitored endpoint for eprocurement.gov — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when eprocurement.gov 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 eprocurement.gov 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 daily bid deadlines by polling
get_tenders_closing_todayand alerting procurement teams before cutoff. - Aggregate
active_tenders_centralandactive_tenders_statefromget_homepage_statsto track overall procurement volume over time. - Identify cross-border contracting opportunities by paginating through
get_global_tendersresults. - Screen large contracts by iterating
get_high_value_tendersand extractingorganisation_nameandbid_submission_closing_date. - Build a searchable organisation directory from the
get_organisationsresponse for vendor qualification workflows. - Detect cancelled opportunities by periodically calling
get_cancelled_tendersand reconciling against previously active tender records. - Fetch full tender specifications via
get_tender_detailusingdetail_urlvalues from any listing endpoint, with fallback logic for CAPTCHA-gated responses.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does eprocurement.gov have an official developer API?+
What does `get_tenders_closing_today` return, and how is it different from `get_active_tenders`?+
get_tenders_closing_today filters specifically to tenders whose bid_submission_closing_date falls on the current date, and returns state_name in the tender objects rather than organisation_name. get_active_tenders covers all currently open tenders regardless of closing date and includes organisation_name. Both are paginated with the same zero-based page parameter.How should I handle the CAPTCHA gate in `get_tender_detail`?+
status: "CAPTCHA_GATED" and a message field instead of parsed table data. Your integration should check for the presence of status in the response before attempting to read detail fields. CAPTCHA gating is common on this portal, so treating both response shapes as expected cases is necessary for reliable operation.Can I filter tenders by category, keyword, or state within the listing endpoints?+
page parameter — there are no built-in filters for keyword, tender category, issuing state, or ministry. You can fork this API on Parse and revise it to add filtered search endpoints.