GeM Global Tender Scraper avatar

GeM Global Tender Scraper

Pricing

from $0.07 / 1,000 item extracteds

Go to Apify Store
GeM Global Tender Scraper

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

Automation Lab

Maintained by Community

Actor 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?

FieldTypeDescription
bidIdstringInternal GeM bid identifier
bidNumberstringPublic bid number, such as GEM/2026/B/7788510
titlestringGlobal Tender Enquiry title, or source category when title is absent
categorystring or nullCategory exposed by the GTE source
quantitynumber or nullTotal requested quantity
statusstringStatus view selected in the input
statusCodenumber or nullRaw GeM b_status, not the buyer evaluation stage
buyerStatusCodenumber or nullSource b_buyer_status: 0–3; null if absent
buyerStatusstring or nullNot Evaluated, Technical Evaluation, Financial Evaluation, or Bid or RA Award; null for absent/unknown code
evaluationTypeCodenumber or nullSource evaluation type used for RA navigation
parentBidIdstring or nullAvailable parent bid identifier
parentBidNumberstring or nullAvailable parent public bid number
parentDetailUrlURL or nullType-2 RA parent document link only when all source components exist
bidTypeCodenumber or nullRaw source bid-type code
bidTypestring or nullReadable bid or reverse-auction type
isHighValuebooleanWhether GeM marks the tender high value
startDateISO date or nullBid start timestamp
endDateISO date or nullBid end timestamp
ministrystring or nullBuyer ministry
departmentstring or nullBuyer department
detailUrlURLOfficial bid, direct RA, RA document, or evaluated RA schedule URL
sourceUrlURLPublic GTE listing surface
quarterDirectorystring or nullSource document directory marker
uploadVersionnumber or nullSource upload version
searchKeywordstring or nullKeyword used for this result
pageNumbernumberSource results page
scrapedAtISO dateExtraction 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

  1. Open the Actor on Apify.
  2. Enter a keyword such as Cyber, or leave it blank for all matching GTE records.
  3. Choose ongoing, evaluated, or awarded status.
  4. Optionally enable the high-value or deadline filters.
  5. Set a small maxItems value for your first run.
  6. Click Start.
  7. Open the Dataset tab when the run finishes.
  8. 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:

  • ongoing
  • technical_evaluated
  • financial_evaluated
  • awarded

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 Cyber every morning;
  • run medical equipment every 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 ApifyClient
import os
client = 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().items
print(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

  1. 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, and abort-actor-run. Use scoped tools/list to discover actual tool names and argument schemas, then use only the needed Actor/run/data tools. Discovery does not authorize starting or aborting runs.
  2. 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-actor waits at most waitSecs (0–45 seconds, default 30), so the response may still be nonterminal. Follow that same run with get-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.
  3. Read the dataset, with an explicit consumer budget. After success, use get-dataset-items with the returned defaultDatasetId, explicit limit, offset, and needed fields, according to the discovered argument schema. For example, request untransformed JSON pages of 20 source rows starting at offset 0, projecting bidNumber,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.
  4. Treat context and caching as client-dependent. tools/list transport 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 contains unless 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.

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.

Explore other procurement workflows from automation-lab:

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.