Gov APIbidplus.gem.gov.in ↗
Search ongoing government bids and reverse auctions on India's GeM portal. Returns notice titles, org names, deadlines, and source URLs via one endpoint.
What is the Gov API?
The bidplus.gem.gov.in API exposes 1 endpoint — search_notices — that queries the Government e-Marketplace bid portal for active bids and reverse auctions. Each call returns up to 10 notice records per page, including reference numbers, organization names, submission deadlines, and direct source URLs. Results are paginated and ordered by bid end date, oldest first, matching the portal's default sort.
curl -X GET 'https://api.parse.bot/scraper/e6207810-c4da-45c4-b6ea-024de7f6b7de/search_notices?query=laptop' \ -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 bidplus-gem-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: GeM Bid Listings API — search public procurement notices."""
from parse_apis.bidplus_gem_gov_in_api import GemBids, InputFormatInvalid
client = GemBids()
# Search for laptop procurement notices, capped at 5 results.
for notice in client.notices.search(query="laptop", limit=5):
print(notice.reference_number, "-", notice.description_title)
print(" Org:", notice.organization_name)
print(" Deadline:", notice.submission_deadline)
# Drill into the first result's document links.
first = client.notices.search(query="computer", limit=1).first()
if first is not None:
print("\nNotice:", first.description_title)
print("Source:", first.source_url)
for doc in first.document_links:
print(f" [{doc.format}] {doc.url}")
# Demonstrate error handling for an invalid page value.
try:
client.notices.search(query="printer", page_size=0, limit=1).first()
except InputFormatInvalid as e:
print("Validation error:", e.message)
print("\nexercised: notices.search / DocumentLink fields / InputFormatInvalid")
Searches the portal's public list of ongoing bids and reverse auctions (RAs) by full-text keyword and returns one record per notice, ordered by bid end date (oldest first), the portal's default order. Results are paginated by the caller's page and limit as a true offset over the result stream: a call returns at most 10 notices and costs one or two upstream requests. total_count is the portal's reported number of matching notices (0 when the portal reports no match for the keyword; null only if the portal gives no count for a page past the end); has_more is true while more notices exist beyond this page. Every scalar in a notice is a string or null. reference_number is the official GeM bid/RA number; description_title is the item/category list of the notice; organization_name joins ministry and department with ' / ' when both are present; publication_date (bid start) and submission_deadline (bid end) are ISO-8601 UTC timestamps exactly as the portal stores and displays them. source_url is the official notice document URL on the portal (a PDF for bids and RAs; a schedule page for evaluated RAs), and document_links lists the PDF document URLs (the RA's own document plus its parent bid's document when the RA derives from a bid); it is an empty array when no PDF URL is known. A keyword that matches nothing is a successful empty result; invalid page or limit values are rejected with a validation error; a blocked or failed upstream request is reported as an error, never as empty data.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based result page over the matching notices; page N returns notices (N-1)*limit+1 .. N*limit. Must be a positive integer. |
| limit | integer | Number of notices per page, an integer from 1 to 10 (10 is the portal's maximum page size; larger values are rejected). |
| queryrequired | string | Full-text keyword searched against bid titles, item categories and bid numbers (e.g. laptop). |
{
"type": "object",
"fields": {
"page": "integer page echoed from the request",
"limit": "integer page size echoed from the request",
"query": "the keyword that was searched",
"notices": "array of notice objects: reference_number, description_title, organization_name, publication_date, submission_deadline, source_url (all string or null) and document_links (array of {format, url})",
"has_more": "boolean, true when further pages exist",
"total_count": "integer number of matching notices reported by the portal, or null when unknown"
},
"sample": {
"data": {
"page": 3,
"limit": 4,
"query": "laptop",
"notices": [
{
"source_url": "https://bidplus.gem.gov.in/showbidDocument/9770540",
"document_links": [
{
"url": "https://bidplus.gem.gov.in/showbidDocument/9770540",
"format": "pdf"
}
],
"publication_date": "2026-09-15T11:29:13+00:00",
"reference_number": "GEM/2026/B/7930056",
"description_title": "High End Laptop - Notebook",
"organization_name": "Ministry of Communications / Department of Posts",
"submission_deadline": "2026-10-01T16:00:00+00:00"
},
{
"source_url": "https://bidplus.gem.gov.in/showradocumentPdf/9963601",
"document_links": [
{
"url": "https://bidplus.gem.gov.in/showradocumentPdf/9963601",
"format": "pdf"
},
{
"url": "https://bidplus.gem.gov.in/showbidDocument/9727279",
"format": "pdf"
}
],
"publication_date": "2026-09-30T16:00:00+00:00",
"reference_number": "GEM/2026/R/743692",
"description_title": "Entry and Mid Level Laptop - Notebook,All in One PC (V2),Entry and Mid Level Desktop Computer,A4 and Legal Size Multifunction Printer (MFP)",
"organization_name": "Planning and Convergence Department Odisha",
"submission_deadline": "2026-10-01T16:00:00+00:00"
}
],
"has_more": true,
"total_count": 591
},
"status": "success"
}
}About the Gov API
What the API Returns
The search_notices endpoint accepts a required query string matched against bid titles, item categories, and bid numbers on the GeM portal. Each notice object in the notices array carries: reference_number (the portal's unique bid identifier), description_title (the bid or RA title), organization_name (the procuring government body), publication_date, submission_deadline, and source_url (a direct link to the official notice on bidplus.gem.gov.in). The response also echoes back page, limit, and query for easy request tracking.
Pagination Behavior
Results are paginated using page (1-based) and limit (1–10, capped at the portal's maximum page size of 10). Page N covers notices (N-1)*limit+1 through N*limit in the full result set. The has_more boolean indicates whether additional pages exist, and total_count reports the portal's own count of matching notices (or null when the portal does not expose it). Callers should check has_more to determine whether to fetch the next page rather than relying solely on total_count.
Coverage Scope
The API covers publicly listed, ongoing bids and reverse auctions on the GeM portal. Notices are ordered by bid end date ascending. Only active, open notices are indexed — closed, cancelled, or archived bids are not included in results. The query field performs full-text matching, so both broad category terms (e.g. "laptop") and specific bid numbers are valid inputs.
The Gov API is a managed, monitored endpoint for bidplus.gem.gov.in — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bidplus.gem.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 bidplus.gem.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 new government procurement tenders matching a product category keyword like "solar panel" or "laptop"
- Aggregate submission deadlines from
submission_deadlinefields to build a procurement calendar - Track which government organizations (
organization_name) are actively tendering in a given sector - Build alerting systems that poll for new notices matching a vendor's product keywords
- Cross-reference
reference_numbervalues against internal bid management systems - Compile lists of
source_urllinks for compliance teams to review official tender documents
| 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 bidplus.gem.gov.in have an official developer API?+
What does the `search_notices` endpoint return for each notice?+
notices array includes: reference_number, description_title, organization_name, publication_date, submission_deadline, and source_url. The response also includes top-level page, limit, query, has_more, and total_count fields for navigating paginated results.Does the API return closed, cancelled, or archived bids?+
Can I filter notices by organization name, state, or bid category independently of a keyword search?+
search_notices endpoint accepts only a free-text query string, page, and limit. Structured filters by geography, ministry, or category are not exposed as separate parameters. You can fork this API on Parse and revise it to add dedicated filter parameters if the portal supports them.How does pagination work when `total_count` is null?+
total_count is returned as null. In that case, use the has_more boolean to determine whether to request the next page. Incrementing page while has_more is true will continue returning results until the final page, at which point has_more becomes false.