GeM Global Tender Scraper
Pricing
from $0.07 / 1,000 item extracteds
GeM Global Tender Scraper
🔎 Search public GeM Global Tender Enquiries and export bid numbers, buyer ministries and departments, quantities, deadlines, statuses, high-value flags, and official document links.
Pricing
from $0.07 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
11
Total users
4
Monthly active users
17 days ago
Last modified
Categories
Share
Search and export public Government e-Marketplace Global Tender Enquiries (GTE) as clean procurement records.
Use this Apify Actor to monitor active, evaluated, or awarded global tenders without copying rows from the GeM website by hand.
It returns bid numbers, titles, quantities, ministries, departments, deadlines, high-value flags, status metadata, and official bid-document links.
Scope note: this Actor covers the public Global Tender Enquiry surface at
bidplus-global.gem.gov.in. It does not claim the broader routine GeM inventory on other hosts.
What does GeM Global Tender Scraper do?
The Actor turns GeM's public GTE search into a repeatable dataset.
It can:
- 🔎 search tender titles, bid numbers, categories, ministries, and departments by keyword;
- 🎯 use contains or exact keyword matching;
- 📌 collect ongoing, technically evaluated, financially evaluated, or awarded bids;
- 💰 restrict results to records GeM marks as high value;
- 📅 filter and sort by bid deadlines;
- 🔗 create canonical links to official GeM bid or reverse-auction documents;
- ♻️ deduplicate records by bid number;
- 📦 export results through datasets, APIs, webhooks, and integrations.
Who is this tender scraper for?
Suppliers and manufacturers
Discover global procurement opportunities related to your products before deadlines pass.
B2G sales teams
Feed new GeM opportunities into a lead queue and assign them by ministry, department, category, or closing date.
Bid consultants
Monitor several client themes on a schedule and export a consistent shortlist instead of repeating manual searches.
Procurement-intelligence teams
Track which ministries publish or award global tenders and retain timestamped snapshots for analysis.
Market researchers
Study categories, buyer organizations, quantities, and tender timing from a structured public source.
Why use this GeM tender extractor?
The official search page is useful for browsing, but recurring procurement work needs stable data.
This Actor adds:
- normalized field names across every result;
- JSON, CSV, Excel, XML, RSS, and table exports through Apify;
- search settings that can be saved and scheduled;
- direct API access from existing applications;
- duplicate prevention inside each run;
- response validation so WAF/error HTML is not mistaken for tender data;
- bounded retries and conservative request pacing;
- honest GTE-only product boundaries.
What GeM tender data can I extract?
| Field | Type | Description |
|---|---|---|
bidId | string | Internal GeM bid identifier |
bidNumber | string | Public bid number, such as GEM/2026/B/7788510 |
title | string | Global Tender Enquiry title, or source category when title is absent |
category | string or null | Category exposed by the GTE source |
quantity | number or null | Total requested quantity |
status | string | Status view selected in the input |
statusCode | number or null | Raw GeM b_status, not the buyer evaluation stage |
buyerStatusCode | number or null | Source b_buyer_status: 0–3; null if absent |
buyerStatus | string or null | Not Evaluated, Technical Evaluation, Financial Evaluation, or Bid or RA Award; null for absent/unknown code |
evaluationTypeCode | number or null | Source evaluation type used for RA navigation |
parentBidId | string or null | Available parent bid identifier |
parentBidNumber | string or null | Available parent public bid number |
parentDetailUrl | URL or null | Type-2 RA parent document link only when all source components exist |
bidTypeCode | number or null | Raw source bid-type code |
bidType | string or null | Readable bid or reverse-auction type |
isHighValue | boolean | Whether GeM marks the tender high value |
startDate | ISO date or null | Bid start timestamp |
endDate | ISO date or null | Bid end timestamp |
ministry | string or null | Buyer ministry |
department | string or null | Buyer department |
detailUrl | URL | Official bid, direct RA, RA document, or evaluated RA schedule URL |
sourceUrl | URL | Public GTE listing surface |
quarterDirectory | string or null | Source document directory marker |
uploadVersion | number or null | Source upload version |
searchKeyword | string or null | Keyword used for this result |
pageNumber | number | Source results page |
scrapedAt | ISO date | Extraction timestamp |
The Actor does not fabricate tender values, EMD amounts, locations, or contacts when the public GTE listing does not expose them.
How to scrape GeM Global Tender Enquiries
- Open the Actor on Apify.
- Enter a keyword such as
Cyber, or leave it blank for all matching GTE records. - Choose ongoing, evaluated, or awarded status.
- Optionally enable the high-value or deadline filters.
- Set a small
maxItemsvalue for your first run. - Click Start.
- Open the Dataset tab when the run finishes.
- Export the records or connect them to another system.
The default input leaves the keyword blank so it finishes quickly with the current GTE inventory, even as individual tender topics change.
Input options
keyword
A search term of at least three characters.
Leave it empty to request the complete matching source view.
searchType
Choose contains for discovery or exact for a complete phrase or known bid number.
tenderStatus
Supported values are:
ongoingtechnical_evaluatedfinancial_evaluatedawarded
highValueOnly
When true, asks the source for tenders tagged as high value.
endDateFrom and endDateTo
Optional valid calendar-date bounds in YYYY-MM-DD format. Impossible dates and reversed ranges are rejected.
GeM states that GTE schedules and deadlines are governed by India Standard Time.
sort
Sort by earliest/latest end date or newest/oldest start date. The input editor defaults to earliest end date; raw API input omitting sort uses earliest end date for ongoing tenders and latest end date for historical statuses.
maxItems
The maximum number of unique tenders saved, from 1 to 5,000 (integer). The input editor defaults to 20; raw API input omitting this field retains the historical default of 50.
The live GTE inventory can naturally contain only a small number of records.
requestDelayMs
A polite delay between source pages, from 500 to 10,000 milliseconds.
Proxy options
Direct access is the default and lowest-cost route.
Enable useApifyProxy only when your run receives persistent source blocking.
Example input: active cyber tenders
{"keyword": "Cyber","searchType": "contains","tenderStatus": "ongoing","highValueOnly": false,"sort": "end_date_soonest","maxItems": 20,"requestDelayMs": 900}
Example input: high-value opportunities
{"tenderStatus": "ongoing","highValueOnly": true,"sort": "end_date_soonest","maxItems": 50}
Example input: awarded-tender monitoring
{"tenderStatus": "awarded","sort": "end_date_latest","maxItems": 100,"requestDelayMs": 1200}
Example output
{"bidId": "9608521","bidNumber": "GEM/2026/B/7788510","title": "Cyber Forensic Hardware and Software","category": "GlobalTenderCategory","quantity": 1,"status": "ongoing","statusCode": 1,"buyerStatusCode": 0,"buyerStatus": "Not Evaluated","evaluationTypeCode": null,"parentBidId": null,"parentBidNumber": null,"parentDetailUrl": null,"bidTypeCode": 1,"bidType": "Bid","isHighValue": true,"startDate": "2026-07-17T16:47:51Z","endDate": "2026-07-30T16:00:00Z","ministry": "Ministry of Electronics and Information Technology","department": "Department of Electronics and Information Technology","detailUrl": "https://bidplus-global.gem.gov.in/showbidDocument/9608521/JulQ326/3","sourceUrl": "https://bidplus-global.gem.gov.in/","quarterDirectory": "JulQ326","uploadVersion": 3,"searchKeyword": "Cyber","pageNumber": 1,"scrapedAt": "2026-07-22T00:00:00.000Z"}
How much does it cost to scrape GeM global tenders?
This Actor uses pay-per-event pricing.
You pay a small Actor-start charge and a per-tender charge for each normalized record saved.
Apify plan tiers receive volume discounts on the per-record event.
The Console shows the exact active price before a run starts.
A narrow monitor that finds only a few matching opportunities costs less than a broad historical or award-status collection.
Set maxItems to control the maximum possible result volume.
Scheduling a GeM tender monitor
Create separate scheduled tasks for product families or buyer organizations.
For example:
- run
Cyberevery morning; - run
medical equipmentevery four hours; - collect awarded tenders weekly;
- monitor high-value GTE records before bid-review meetings.
Use Apify schedules to run each saved task automatically.
Store the latest bid numbers in your downstream system to detect genuinely new opportunities between runs.
Export formats
From the Dataset tab, download results as:
- JSON
- JSONL
- CSV
- Excel
- XML
- RSS
- HTML table
You can also query the dataset API without downloading a file.
Integrations and procurement workflows
Google Sheets
Send new tender rows to a shared qualification sheet for sales and bid teams.
Slack or Microsoft Teams
Trigger a webhook when a scheduled run finds a tender closing within your review window.
CRM systems
Create one opportunity per bidNumber, assign ownership by ministry, and store detailUrl as the official source.
Data warehouses
Append timestamped snapshots to BigQuery, Snowflake, PostgreSQL, or another analytical store.
Make and Zapier
Build no-code flows that filter isHighValue, route by department, and notify account owners.
API usage
Call the Actor from JavaScript, Python, or cURL and read normalized records from the run's default dataset.
Use the GeM tender scraper with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/gem-global-tender-scraper').call({keyword: 'Cyber',tenderStatus: 'ongoing',maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Use the GeM tender scraper with Python
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/gem-global-tender-scraper').call(run_input={'keyword': 'Cyber','tenderStatus': 'ongoing','maxItems': 20,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use the GeM tender scraper with cURL
curl "https://api.apify.com/v2/acts/automation-lab~gem-global-tender-scraper/runs?token=$APIFY_TOKEN" \-X POST \-H "Content-Type: application/json" \-d '{"keyword":"Cyber","tenderStatus":"ongoing","maxItems":20}'
Use the returned run's defaultDatasetId to fetch the resulting records.
Connect through Apify MCP
The Actor can be exposed as a tool through the Apify MCP server.
Use this endpoint:
https://mcp.apify.com/?tools=automation-lab/gem-global-tender-scraper
Claude Code setup
$claude mcp add --transport http apify "https://mcp.apify.com/?tools=automation-lab/gem-global-tender-scraper" --header "Authorization: Bearer $APIFY_TOKEN"
Then ask:
Use the GeM Global Tender Scraper MCP tool to find current cyber security tenders and rank them by deadline.
Claude Desktop setup
Cursor setup
VS Code setup
Claude Desktop, Cursor, and VS Code can use the same MCP JSON configuration:
{"mcpServers": {"apify": {"command": "npx","args": ["mcp-remote","https://mcp.apify.com/?tools=automation-lab/gem-global-tender-scraper","--header","Authorization: Bearer ${APIFY_TOKEN}"]}}}
After setup, try:
Use MCP to extract high-value GeM global tenders and summarize which ministries are buying.
Hosted MCP: from one run to bounded results
- Discover the selected tools. The Actor-specific URL selects a stable subset, but not exactly one tool: it also automatically includes
get-actor-run,get-dataset-items,get-key-value-store-record, andabort-actor-run. Use scopedtools/listto discover actual tool names and argument schemas, then use only the needed Actor/run/data tools. Discovery does not authorize starting or aborting runs. - Start once and keep the run identity. For an authorized invocation, retain the returned run ID, status, and storage IDs; these are metadata, not tender rows.
call-actorwaits at mostwaitSecs(0–45 seconds, default 30), so the response may still be nonterminal. Follow that same run withget-actor-run, using bounded backoff such as 2, 4, 8 seconds capped at 10, and a total polling deadline such as 120 seconds. Set the client request timeout above the selected server wait plus transport margin, within that deadline. After a client timeout, recover/check the known run instead of restarting merely to poll. If the run ID is unknown, report uncertainty rather than blindly rerunning. At the deadline, report pending with the run ID and stop polling. Report terminal failures honestly; any available rows are partial, not a successful complete result. - Read the dataset, with an explicit consumer budget. After success, use
get-dataset-itemswith the returneddefaultDatasetId, explicitlimit,offset, and neededfields, according to the discovered argument schema. For example, request untransformed JSON pages of 20 source rows starting at offset 0, projectingbidNumber,title,buyerStatus,endDate,ministry,detailUrl. Admit at most 100 rows and 64 KiB of serialized UTF-8 result content across all pages to model context, whichever comes first. Track source offsets and pagination metadata, not transformed row counts: filtering or unwinding can change returned counts. Process pages host-side before model injection and enforce the byte ceiling even for an oversized row or page; omit or summarize with disclosure, never silently claim completeness. If your client cannot intercept oversized responses, this is not a hard byte guarantee—avoid unbounded requests. Stop at exhaustion or the budget and report rows returned, the continuation offset, and partial/truncated status when incomplete. Keep full exports in Apify storage or downstream processing outside model context. This consumer limit does not reduce the Actor's collection defaults, features, or output fields. - Treat context and caching as client-dependent.
tools/listtransport bytes are not necessarily model-visible context. Host-side discovery, caching, progressive loading, and prompt caching depend on the client and negotiated capabilities; they do not guarantee universal token savings. No numeric savings claim is made here. Such a claim would require measured client/version, capabilities and cache/discovery mode, model/tokenizer, visible tool/result subset, and baseline/method.
The backoff, deadline, row and byte budgets above are example consumer choices, not Apify defaults. See the Apify MCP tool documentation for current tool behavior.
Example prompts for MCP usage
- “Use the GeM scraper MCP tool to monitor awarded GTE records and compare departments week over week.”
- “Run the tender extractor through MCP and export current global tenders to a CSV-ready table.”
- “Use MCP to show GeM tenders closing in my selected date range.”
Data quality and reliability
The Actor initializes an anonymous source session before requesting data.
It reproduces the public search form's structured payload and pagination contract.
Every response is checked for valid JSON and the expected record shape.
If GeM returns an HTML block page with HTTP 200, the Actor treats it as a failure rather than emitting garbage.
Failed page requests use bounded retries, fresh session bootstrap, and backoff.
Records require a bid ID, bid number, and usable title or source category. Category-only records use that category as their title. Malformed records are skipped with a count warning; a nonempty scan with no usable records fails visibly. Repeating or non-advancing pages fail instead of continuing indefinitely.
Only GeM's verified HTTP 404/code 404/status 0 No data found response and well-formed successful empty pages are treated as empty results. HTTP errors, HTML, malformed JSON, and invalid pagination metadata are not empty-result success.
status describes the requested view, while buyerStatus reports the actual source buyer evaluation stage. Missing or unknown stage is null, never inferred from the requested view. Type-2 auctions link to RA documents or evaluated schedules; type-5 auctions use the direct RA document route. Parent document links are emitted only with sufficient source metadata.
Duplicate bid numbers are saved only once per run.
Tips for better tender searches
- Start with a broad three-character-or-longer keyword.
- Use
containsunless you know the exact phrase. - Leave the keyword empty when auditing the whole current GTE surface.
- Use the earliest deadline sort for bid-planning queues.
- Use the latest deadline sort for award-history exploration.
- Keep the default delay unless the source is responding slowly.
- Run separate schedules for unrelated categories.
- Deduplicate recurring exports downstream by
bidNumber.
Troubleshooting
Why did my run return zero tenders?
A valid zero-result response means the current source view has no records matching all selected filters.
Remove the date range, turn off highValueOnly, switch to contains, or leave keyword empty.
Why was my keyword rejected?
GeM requires at least three characters and rejects several punctuation characters.
The Actor validates the same constraints before requesting the source.
Why did the run fail with non-JSON content?
Government infrastructure or a WAF can temporarily return an HTML error page with a successful HTTP status.
Retry later, increase requestDelayMs, or enable Apify Proxy if direct access remains blocked.
Why are there only a few records?
The Global Tender Enquiry surface is a focused inventory, not the entire GeM marketplace.
A low count can be the complete current source result.
Responsible and legal use
This Actor collects tender metadata visible on a public government search surface without login.
Public availability does not remove your responsibilities.
Follow GeM terms, applicable procurement rules, robots guidance, the Indian Digital Personal Data Protection framework, and laws relevant to your jurisdiction.
Do not use extracted data for harassment, spam, unauthorized access, bid manipulation, or misrepresentation.
Always open the official detailUrl and verify the latest tender documents before making a procurement decision.
This Actor is a discovery and monitoring tool, not legal, financial, or bidding advice.
Limits and honest scope
The Actor covers bidplus-global.gem.gov.in Global Tender Enquiries only.
It does not bypass CAPTCHA, login, private buyer systems, or paid data products.
It does not guarantee that a tender remains open after the scrape timestamp.
It does not enrich listing rows with values or contacts absent from the public GTE response.
Source fields and availability can change; response validation is designed to fail visibly when the contract changes.
Related government procurement scrapers
Explore other procurement workflows from automation-lab:
- Singapore GeBIZ Tender Opportunities Scraper
- Contracts Finder UK Scraper
- SAM.gov Opportunities Scraper
Choose the source-specific Actor that matches the jurisdiction and procurement system you need.
FAQ
Can I search by bid number?
Yes. Put the complete bid number in keyword and use exact matching.
Can I monitor only high-value tenders?
Yes. Enable highValueOnly and optionally combine it with keyword and date filters.
Can I scrape awarded tenders?
Yes. Select awarded as the status and consider sorting by latest end date.
Does it scrape all GeM bids?
No. It intentionally covers only the proven Global Tender Enquiry surface.
Do I need an Indian proxy?
No for the currently proven anonymous route. Direct HTTP is the default; proxy use is an optional fallback.
Can I schedule it?
Yes. Save input as an Apify task and attach an hourly, daily, or weekly schedule.
Can I use the results commercially?
You are responsible for verifying source terms and applicable laws for your use case.
Are official documents included?
Each row includes the canonical public document URL constructed using fields exposed by GeM.
How should I identify changes between runs?
Use bidNumber as the stable key and compare buyerStatusCode, upload version, end date, and scrape timestamp. status alone is the requested query view, not an observed evaluation transition.
Is this affiliated with GeM?
No. This is an independent automation tool using publicly available tender information.
Diagnostics and privacy
No AI models or external AI providers are used. The Actor uses Apify hosting/storage, optional Apify Proxy, the public GeM endpoint, and our private diagnostics service. There is no off-platform payment or paid data API requirement. Optional proxy traffic is subject to your Apify account's platform/proxy usage terms.
Tender output contains public procurement metadata, not source creator accounts or contact details. Source session cookies exist only in run memory and are discarded at exit; there is no cross-run cache. Dataset, input, and run-log retention follows your Apify account/storage settings, and you can delete those records in Apify Console or via API. The Actor does not automatically delete your datasets.
Failed operations send sanitized diagnostic input, exceptions, and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed; reports are retained for 30 days.
Support
If a source change causes failures or a field is missing, open an issue from the Actor page.
Include the run URL, non-sensitive input, expected result, and observed result.
Do not post API tokens, private credentials, or confidential procurement documents.