GeM India Tenders Scraper avatar

GeM India Tenders Scraper

Pricing

from $1.00 / 1,000 bids

Go to Apify Store
GeM India Tenders Scraper

GeM India Tenders Scraper

Search India's Government e-Marketplace (GeM) bids: bid number, items, quantity, ministry, department, start and end dates, status and the bid document link. Filter by keyword, ministry, organisation, state, type and end date; optional EMD, estimated value and organisation details.

Pricing

from $1.00 / 1,000 bids

Rating

0.0

(0)

Developer

Philip Kirkbride

Philip Kirkbride

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

14 hours ago

Last modified

Categories

Share

Search bids and reverse auctions on India's Government e-Marketplace (GeM, bidplus.gem.gov.in), the national procurement portal for central and state government buyers, and get one clean row per bid: bid number, items, quantity, ministry, department, start and end dates, status, evaluation stage and the link to the bid document. Turn on details to add the buying organisation and office, the bid opening time, offer validity, estimated bid value, EMD and performance-guarantee terms, turnover and experience criteria, type of bid and evaluation method.

Use it for tender monitoring and alerts: schedule a daily run with "started in the last 1 day" and a keyword, ministry or state, and send the new rows to email, Slack or a spreadsheet.

Quick Start

Open bids closing soonest:

{"maxResults": 10}

New laptop bids from the last two days:

{"keyword": "laptop", "startedWithinDays": 2}

Open Central Railway bids with details:

{"ministry": "railways", "organization": "central railway", "includeDetails": true}

Input

FieldTypeDefaultWhat it does
keywordstring""Text searched across the bid (items, bid number, buyer), 3 to 100 characters. GeM matches loosely, so results are broad.
keywordMatchstringcontainscontains or exact (exact phrase).
statusstringopenopen, cancelled, results (all result stages), technicalEvaluation, financialEvaluation or awarded.
bidTypestringallproduct, service, bidToRA, customProduct, boq, rateContract, globalTender, limitedTender or singleTender.
highValueOnlybooleanfalseOnly bids with a declared estimated value of Rs 2 crore or more.
bidEndFrom, bidEndTostring""Bid end date window, YYYY-MM-DD (India time).
startedWithinDaysintegernoneOnly bids that started (were published) in the last N days, today included.
startedFrom, startedTostring""Bid start date window, YYYY-MM-DD.
sortstringdefaultendingSoonest, endingLatest, newest or oldest.
ministrystring""Buyer ministry, full name or any unique part of it, e.g. railways.
buyerStatestring""State government buyer, e.g. Karnataka (instead of a ministry).
organization, departmentstring""Organisation under the ministry or state, then a department under it.
consigneeState, consigneeCitystring""Where the goods or services are delivered.
bidNumberstring""One bid or RA by number, e.g. GEM/2026/B/8123845, in any status.
maxResultsinteger100Maximum bids returned. Up to 10,000, or 750 with includeDetails on.
includeDetailsbooleanfalseAdd the detail fields listed below (slower).
proxyConfigurationobjectIndiaKeep the default: GeM only accepts visitors from India.

The ministry, state, organisation and consignee filters use GeM's advanced search. It covers open bids only, so those filters cannot be combined with keyword, bidType, highValueOnly, sort or another status. The bid end and start date filters work with everything. Names are matched without regard to case, and a fragment works when it matches one name only; otherwise the run stops and lists the matching names.

What it returns

Every row has bidKey, bidNumber, bidId, bidKind (bid, reverseAuction or directReverseAuction), parentBidNumber, parentBidId, items, boqTitle, quantity, ministry, department, startAt, endAt, status (open, closed or cancelled), isOpenForBids, evaluationStage, isHighValue, isRateContract, isGlobalTender, isLimitedTender, isSinglePacket, isBoq, categoryId, url (the bid document), parentBidUrl, sourceQuery, source and scrapedAt.

With includeDetails on, rows also fill organisation, office, bidOpeningAt, offerValidityDays, estimatedBidValue, emdRequired, emdAmount, epbgRequired, epbgPercent, minimumTurnover, pastExperienceYears, pastPerformancePercent, bidToRaEnabled, typeOfBid, evaluationMethod and primaryProductCategory. These keys are present but empty when details are off. If one bid's document cannot be read, the row is still delivered with detailsError set. detailsParsed: true means at least one detail field was extracted from the document; it does not promise complete financial terms. Those rows carry the details charge. A document parse error leaves all detail fields null and sets detailsError.

Dates and times are ISO 8601 with the India offset (+05:30). Amounts are numbers in Indian rupees (INR); turnover given in lakh or crore is converted to rupees. Buyer contact e-mails printed on bid documents are never returned.

Output example

{"bidKey":"bidplus.gem.gov.in:bid:GEM/2026/B/8159047","bidNumber":"GEM/2026/B/8159047","bidId":10033114,"bidKind":"bid","parentBidNumber":null,"parentBidId":null,"items":"Milk Testing Equipment,Milk Collection Accessories,Furniture & Fixture","boqTitle":null,"quantity":33,"ministry":null,"department":"Animal Husbandry and Fisheries Department Karnataka","startAt":"2026-10-15T12:12:32+05:30","endAt":"2026-10-30T13:00:00+05:30","status":"open","isOpenForBids":true,"evaluationStage":"Not evaluated","isHighValue":false,"isRateContract":false,"isGlobalTender":false,"isLimitedTender":false,"isSinglePacket":false,"isBoq":false,"categoryId":"home_univ_univ_univ_univ","url":"https://bidplus.gem.gov.in/showbidDocument/10033114","parentBidUrl":null,"sourceQuery":"buyerState=KARNATAKA status=open","source":"bidplus.gem.gov.in","bidOpeningAt":"2026-10-31T13:00:00+05:30","offerValidityDays":90,"organisation":"Karnataka Milk Federation Ltd","office":"Dkmul","estimatedBidValue":null,"emdRequired":true,"emdAmount":50000.0,"epbgRequired":true,"epbgPercent":5.0,"minimumTurnover":null,"pastExperienceYears":3,"pastPerformancePercent":80.0,"bidToRaEnabled":true,"typeOfBid":"Two Packet Bid","evaluationMethod":"Total value wise evaluation","primaryProductCategory":"Milk Testing Equipment","detailsError":null,"detailsParsed":true,"scrapedAt":"2026-10-27T01:27:22.899046+00:00"}

Delivery and schedules

Schedules are stateless: each run searches independently and does not remember earlier deliveries. Overlapping date windows deliver duplicate rows across runs, and those delivered rows are charged again. Deduplicate downstream using bidKey.

Rows are saved page by page, so earlier pages remain available if a later listing request fails. Runs reserve 30 seconds before the platform timeout for final writes and status; without a run timeout setting, the budget defaults to 60 minutes minus that reserve. The scan limit across all status tabs is the greater of 500 pages or twice the pages needed for maxResults (10 rows per page), so sparse filters remain bounded. A budget expiry during document enrichment saves the current batch as base rows with a detailsError and no details charge.

The final status includes a stop reason and counts of invalid rows and skipped rows (duplicates or rows outside the date windows):

Stop reasonMeaning
completeThe available search pages or date window were exhausted.
maxResultsThe requested row limit was reached.
timeBudgetThe remaining run time was exhausted; results can be partial.
scanCapThe request-sized scan limit was reached; narrow the search window.
chargeLimitThe maximum charge cannot cover another row with the requested details allowance.
sourceTruncationThree consecutive pages contained no new usable identities, or an empty or short page arrived while the source total said more rows existed; the source stopped making progress. Results can be partial.

A row needs a numeric bid id or a non-empty bid number. Rows missing both are counted as invalid. If GeM reports results but none has a usable identity, the run fails with SOURCE_CHANGED; a genuine zero-result search succeeds. Rows without a usable start time are skipped when a start-date filter is active. When only a numeric id is available, bidNumber is null and bidKey uses bidplus.gem.gov.in:id:<id>. When only a bid number is available, url links to the search page and detail lookup is skipped with a row-level error.

Limits and caveats

  • GeM lists 10 bids per page; listing runs deliver several hundred bids a minute (100 bids took about 10 seconds in our tests). Detail runs read one bid document per bid and are much slower (about 4 seconds per bid on the default 1 GB memory, so about 50 minutes for 750 bids); with includeDetails on a run returns at most 750 bids and fits the default 1-hour timeout. For more, split the search by end date, ministry or state.
  • ministry is empty for state-government buyers, and their bid documents often give the organisation as "N/a" (returned as null); department and office then name the buyer.
  • GeM publishes an estimated value only when the buyer declared one, so estimatedBidValue is often empty. Award values and bidder lists are not part of the output.
  • Scheduled reverse auctions link to a list of schedules instead of one document; their detail fields stay empty and detailsError says why.

FAQ

How fresh is the data? Every run reads GeM live.

How do I get only new bids each day? Schedule a daily run with startedWithinDays: 1 (or 2, to be safe around midnight India time) and your filters. Use bidKey to deduplicate downstream; overlapping schedules deliver and charge for the same bids again.

Why can't I combine a ministry with a keyword? GeM's own search offers the two separately. Run the ministry search and filter the items column, or run a keyword search and filter the ministry column.

What happens when nothing matches? The run succeeds with an empty dataset.

Price

You pay per event. Platform usage is included in the price.

  • Run start: $0.005. The run-start event is charged per GB of memory; the default 1024 MB run is one start event. The start is charged even if the run saves no results.
  • Bid: $0.001 for each delivered bid row.
  • Bid details: $0.003 extra for each delivered bid whose document (PDF) was read and its details filled (detailsParsed is true).

A listing run costs about $1 per 1,000 bids; with includeDetails on, about $4 per 1,000 bids. You are never charged for details when includeDetails is off, or for a bid whose document failed to download, could not be read, or does not exist (scheduled reverse auctions); those rows cost $0.001 like any other bid.

Capping a run: set a maximum cost per run (maxTotalChargeUsd) in the run options. The run stops cleanly when the next bid, with its details charge if any, would go over the cap: you are never charged more than the cap, and the dataset holds only bids the cap covered. The status message says when the cap stopped the run.

Support

For questions or issues, contact us from the Actor page.