# GeM Tenders Scraper (India Government e-Marketplace Bids) (`angadseth/gem-tenders-scraper`) Actor

Get live GeM bids and reverse auctions from India's Government e-Marketplace: bid number, items, quantity, ministry, department, end date, days left and the bid document link. Filter by keyword, ministry, department, type and end date.

- **URL**: https://apify.com/angadseth/gem-tenders-scraper.md
- **Developed by:** [Angad Jangir](https://apify.com/angadseth) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 bids

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GeM Tenders Scraper: India Government e-Marketplace bids

Get **live tenders, bids and reverse auctions from GeM (Government e-Marketplace, India)** as clean JSON, CSV or Excel. Search by keyword, then filter by ministry, department, bid type, end date and quantity. Each bid comes with a direct link to its PDF document.

GeM is India's national public procurement portal, with tens of thousands of open bids at any time. This Actor reads the public bid list at [bidplus.gem.gov.in/all-bids](https://bidplus.gem.gov.in/all-bids). It needs no login and no browser, so runs are fast and cheap. GeM blocks foreign servers, so the Actor automatically connects through an Indian IP and you don't need to set up a proxy.

### Who uses it

- **Suppliers and MSMEs** who want every new bid for their product (CCTV, solar, laptops, furniture, manpower, housekeeping and so on) without checking the portal by hand.
- **Bid consultants and tender alert services** who track many categories for many clients.
- **Sales teams** looking for which ministries and departments are buying what, and when.
- **Analysts and researchers** studying public procurement in India.
- **AI agents** that need fresh Indian tender data. The Actor can be called as a tool through the Apify MCP server.

### What you get for each bid

| Field | Example |
|---|---|
| `bidNumber` | GEM/2026/B/8187882 |
| `type` | Bid, Reverse Auction or Direct RA |
| `items` | Off-Grid Solar Photovoltaic (PV) Power Plant (V2) |
| `quantity` | 1 |
| `ministry` | Ministry of Defence |
| `department` | Department of Military Affairs |
| `bidStartDate` / `bidEndDate` | ISO dates in Indian time, e.g. 2026-11-16T16:00:00+05:30 |
| `bidEndDateText` | 16-11-2026 04:00 PM IST |
| `daysLeft` | 10.8 |
| `isHighValue`, `isGlobalTender`, `isLimitedTender`, `isRateContract` | true / false |
| `documentUrl` | link to the bid PDF |
| `parentBidNumber`, `parentDocumentUrl` | the original bid behind a reverse auction |
| `matchedKeyword` | the keyword that found this bid |

### How to use it

1. Type one or more **keywords** (each is searched separately and duplicates are removed).
2. Pick the **status**: ongoing bids, results (evaluated or awarded) or cancelled bids.
3. Optionally narrow it down by **ministry**, **department**, **bid type**, **end date**, **minimum quantity** or **minimum days left**.
4. Set **Max bids** and run. Download the results as JSON, CSV, Excel or HTML, or read them from the API.

#### Example inputs

All open solar and CCTV bids that close in 3 days or more:

```json
{ "keywords": ["solar", "CCTV"], "minDaysLeft": 3, "maxItems": 500 }
```

Manpower service bids from the Ministry of Defence:

```json
{ "keywords": ["manpower"], "bidType": "service", "ministryContains": ["Defence"], "maxItems": 200 }
```

Recently awarded printer bids (to see who buys what):

```json
{ "keywords": ["printer"], "status": "results", "resultStage": "awarded", "maxItems": 100 }
```

High-value bids closing between two dates:

```json
{ "highValueOnly": true, "endDateFrom": "2026-11-20", "endDateTo": "2026-11-25" }
```

### Daily tender alerts

Save your input as a **Task**, add a **Schedule** (for example every morning at 8 AM IST), and connect an integration such as email, Slack, Google Sheets, Zapier, Make or a webhook. You then get each day's new matching bids without opening GeM. Use `"sortBy": "newest"` and a small `maxItems` to pick up only fresh bids.

### Pricing

You pay per bid saved to the dataset, and nothing for bids that are filtered out. **Max bids** is a hard cap, so you always know the most a run can cost.

### FAQ

**Is this legal?** The Actor reads only the public, no-login bid list that GeM shows to every visitor, at a polite pace. It does not log in, solve captchas or read anything behind an account. You are responsible for how you use the data.

**Does it download the bid PDFs?** It gives you the direct `documentUrl` for each bid, which opens the PDF.

**How fresh is the data?** It is live from GeM at run time. GeM itself notes that new or changed bids can take up to 15 minutes to appear in its search.

**Why are some ministries empty?** State government buyers on GeM often list only a department. The `department` field is always filled when GeM has it.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab and it will be fixed quickly.

### More Actors by angadseth

- [India eProcurement Tenders Scraper (CPPP + 30 State Portals)](https://apify.com/angadseth/india-eprocurement-tenders): Live government tenders from India's central eProcure (CPPP), central PSU, defence and 30+ state NIC eProcurement portals in one run.
- [Apple App Store Scraper: apps, ratings and reviews](https://apify.com/angadseth/app-store-scraper): Get Apple App Store apps, ratings and customer reviews from many countries in one run
- [ATS Jobs Feed: Greenhouse, Lever, Ashby, Workday + 5 more](https://apify.com/angadseth/ats-jobs-feed): Get every open job from a company's own careers board
- [Bluesky Scraper: Posts, Profiles, Followers and Feeds](https://apify.com/angadseth/bluesky-scraper): Scrape Bluesky without a login
- [Website Contact Enricher: Emails, Phones, Socials per Domain](https://apify.com/angadseth/website-contact-enricher): One clean lead row per company domain
- [Website Screenshot & PDF: full page, mobile, element, WebP](https://apify.com/angadseth/website-screenshot): Screenshots (PNG, JPEG, WebP) and PDFs of any list of URLs.
- [Remote Jobs Aggregator: RemoteOK, Jobicy, Arbeitnow + 2 more](https://apify.com/angadseth/remote-jobs-aggregator): Remote jobs from RemoteOK, Jobicy, Arbeitnow, Working Nomads and 4 Day Week in one clean feed.
- [PDF & Document Text Extractor: PDF, DOCX, PPTX, XLSX to Text](https://apify.com/angadseth/pdf-text-extractor): Turn public document URLs (PDF, DOCX, PPTX, XLSX, CSV, HTML, TXT) into clean text

# Actor input Schema

## `keywords` (type: `array`):

What to look for in bid items, e.g. "solar", "laptop", "CCTV", "manpower". Each keyword is a separate search and results are de-duplicated. Leave empty to get all bids.

## `exactMatch` (type: `boolean`):

Off = bids that contain the keyword (recommended). On = GeM's exact search.

## `status` (type: `string`):

Ongoing = bids open now. Results = bids that are evaluated or awarded. Cancelled = cancelled bids.

## `resultStage` (type: `string`):

Only used when Bid status is Results: which evaluation stage to return.

## `bidType` (type: `string`):

Product, service, reverse auction, BOQ, rate contract, global, limited or single tender.

## `highValueOnly` (type: `boolean`):

Only bids GeM marks as high value.

## `sortBy` (type: `string`):

Auto = ongoing bids closing soonest first, results and cancelled bids newest first.

## `endDateFrom` (type: `string`):

YYYY-MM-DD. Use together with "end date to".

## `endDateTo` (type: `string`):

YYYY-MM-DD.

## `ministryContains` (type: `array`):

Keep only bids whose ministry contains any of these words, e.g. "Defence", "Railways".

## `departmentContains` (type: `array`):

Keep only bids whose department contains any of these words, e.g. "Army", "ESIC", "Rajasthan".

## `excludeKeywords` (type: `array`):

Drop bids whose items contain any of these words.

## `minQuantity` (type: `integer`):

Skip bids with a smaller total quantity. 0 = no limit.

## `minDaysLeft` (type: `integer`):

Skip bids closing sooner than this, so you have time to prepare.

## `maxItems` (type: `integer`):

Stop after this many bids in total. You pay per bid saved.

## `maxPagesPerKeyword` (type: `integer`):

GeM returns 10 bids per page.

## `proxyConfiguration` (type: `object`):

Leave empty: on Apify the Actor automatically uses an Indian residential IP, because GeM blocks foreign servers. Set your own proxy only if you prefer.

## Actor input object example

```json
{
  "keywords": [
    "solar"
  ],
  "exactMatch": false,
  "status": "ongoing",
  "resultStage": "any",
  "bidType": "all",
  "highValueOnly": false,
  "sortBy": "auto",
  "minQuantity": 0,
  "minDaysLeft": 0,
  "maxItems": 20,
  "maxPagesPerKeyword": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All bids found in this run, as a dataset you can download in JSON, CSV or Excel.

## `summary` (type: `string`):

Counts per keyword or portal and any warnings from this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "solar"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("angadseth/gem-tenders-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["solar"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("angadseth/gem-tenders-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "solar"
  ],
  "maxItems": 20
}' |
apify call angadseth/gem-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,angadseth/gem-tenders-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Tdod8OFdyKvM44izS/builds/sQaAnVXw9XhLco8tk/openapi.json
