# India Government Tenders Scraper - GeM Leads (`fascinating_lentil/india-government-tenders-scraper`) Actor

Scrape Indian government tender leads from GeM bid listings, with guarded CPPP handling when the public listing is CAPTCHA-gated.

- **URL**: https://apify.com/fascinating\_lentil/india-government-tenders-scraper.md
- **Developed by:** [Md Jakaria Mirza](https://apify.com/fascinating_lentil) (community)
- **Categories:** Other, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 tender scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## India Government Tenders Scraper - GeM & CPPP Portal

Scrape Indian government tender leads for B2B sales, procurement research, and public-sector opportunity tracking. The actor searches the live GeM bid listing endpoint by keyword, deduplicates tenders by ID, then enriches each GeM result from its public bid PDF when available. PDF enrichment fills practical lead fields such as publishing date, bid opening date, bid validity, organization, ministry, department, state/location hints, EMD amount, and eligibility summary. Export to JSON, CSV, Excel, or HTML, or pull via the Apify API — no login and no API key required.

The actor accepts multiple keywords in one run, supports up to 500 matching tenders per keyword, and saves clean records to the Apify Dataset. Filters are applied after enrichment where the public source exposes the field, so state and published-date filters use the recovered GeM detail data instead of rough listing text. Pay-per-event charging happens only after a real tender record is pushed to the dataset.

CPPP support is guarded. The current public CPPP listing is CAPTCHA-gated before tender results are exposed. When CPPP is selected, the actor detects the gate, skips CPPP without placeholder rows, and does not charge `tender-scraped` events for unavailable records. This keeps the dataset honest while preserving the schema for future CPPP access improvements.

### Use Cases

1. B2B lead generation for companies selling to government buyers
2. Procurement research by product or service keyword
3. Vendor opportunity tracking for active GeM bid deadlines
4. Government contract analytics by ministry and department
5. Supply chain planning around public-sector demand signals

### How to Scrape India Government Tenders (Step by Step)

1. Click **Try for free** / **Run**.
2. Keep `source` as `gem` (CPPP is CAPTCHA-gated and skipped) and enter your search `keywords` (e.g. `laptop`).
3. Set `maxResults` per keyword (start small to test).
4. Optionally filter by `state`, `department`, `status`, value range, or date range, then click **Run**.
5. When the run finishes, export results to JSON, CSV, Excel, or HTML, or pull them via the Apify API.

### Input

```json
{
    "source": "gem",
    "keywords": ["laptop"],
    "state": "Maharashtra",
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
````

| Field | Type | Description |
| --- | --- | --- |
| `source` | string | `gem`, `cppp`, or `both` |
| `keywords` | string\[] | Search keywords, processed sequentially |
| `department` | string | Optional ministry, department, or organization text filter |
| `state` | string | Optional state filter from enriched GeM detail PDFs |
| `minValue` / `maxValue` | number | Optional tender value range; unknown values are excluded when this filter is used |
| `dateFrom` / `dateTo` | string | Optional published-date range applied after GeM PDF enrichment |
| `status` | string | `active`, `closed`, or `all` |
| `maxResults` | number | Max matching records per keyword, up to 500 |
| `proxyConfiguration` | object | Apify Proxy settings; residential proxy is recommended on Apify |

### Sample GeM Output

```json
{
    "source": "gem",
    "keyword": "laptop",
    "tenderId": "GEM/2026/B/7605079",
    "tenderReferenceNumber": "GEM/2026/B/7605079",
    "tenderTitle": "Annual Maintenance Service - Desktops, Laptops and Peripherals",
    "organization": "Indian Coast Guard",
    "department": "Department Of Defence",
    "ministry": "Ministry Of Defence",
    "category": "Annual Maintenance Service - Desktops, Laptops and Peripherals",
    "tenderType": "bid",
    "tenderValue": null,
    "bidSubmissionStartDate": "2026-06-02T16:26:48.000Z",
    "bidSubmissionEndDate": "2026-06-12T10:00:00.000Z",
    "tenderOpenDate": "2026-06-12T10:30:00.000Z",
    "publishedDate": "2026-06-02T00:00:00.000Z",
    "closingDate": "2026-06-12T10:00:00.000Z",
    "bidValidity": "180 (Days)",
    "tenderStatus": "active",
    "city": null,
    "state": "Karnataka",
    "location": "Karnataka",
    "eligibilityCriteriaSummary": "Minimum average annual turnover: 5 Lakh (s); Past experience required: 4 Year (s); MSE relaxation: Yes | Complete",
    "emdAmount": 23000,
    "tenderDocumentFee": null,
    "tenderUrl": "https://bidplus.gem.gov.in/showbidDocument/9402098",
    "corrigendumCount": null,
    "scrapedAt": "2026-06-11T14:31:30.540Z"
}
```

### Sample CPPP Output

```json
{
    "source": "cppp",
    "keyword": "laptop",
    "tenderId": "CPPP2026_12345",
    "tenderReferenceNumber": "REF/IT/2026/01",
    "tenderTitle": "Procurement of IT Equipment",
    "organization": "Example Organisation",
    "category": "Goods",
    "tenderType": "open",
    "tenderValue": 12000000,
    "publishedDate": "2026-06-01T00:00:00.000Z",
    "closingDate": "2026-06-20T15:00:00.000Z",
    "bidValidity": "90 days",
    "emdAmount": 240000,
    "tenderDocumentFee": 5000,
    "tenderUrl": "https://eprocure.gov.in/eprocure/app",
    "corrigendumCount": 2,
    "scrapedAt": "2026-06-11T12:30:00.000Z"
}
```

The CPPP object above shows the intended schema. Current CPPP public pages are CAPTCHA-gated and are skipped unless a non-CAPTCHA source becomes available.

### Pricing

| Event | Price |
| --- | --- |
| `tender-scraped` | $0.003 per clean tender record |
| 1,000 tenders | $3.00 |
| 10,000 tenders | $30.00 |

### Notes

- GeM tender value, tender document fee, and corrigendum count are left `null` when they are not exposed by the public listing or bid PDF.
- The default Apify table view focuses on populated GeM lead fields and hides GeM-only unavailable value, fee, and corrigendum columns.
- GeM state/location is inferred from public bid PDF text when available. Records without a matched state are excluded only when a state filter is provided.
- No placeholder rows are pushed.
- No PPE event is charged unless `Actor.pushData()` succeeds for a real tender record.
- Data is for lead generation and research, not legal or procurement advice.

# Actor input Schema

## `source` (type: `string`):

Choose GeM, CPPP, or both. CPPP is skipped without charge when its public listing shows CAPTCHA.

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

Tender search keywords. Multiple keywords are searched sequentially.

## `department` (type: `string`):

Optional department or ministry text filter.

## `state` (type: `string`):

Optional state filter from enriched GeM detail PDFs when available.

## `minValue` (type: `number`):

Optional minimum tender value. Records with unknown value are excluded when this filter is used.

## `maxValue` (type: `number`):

Optional maximum tender value. Records with unknown value are excluded when this filter is used.

## `dateFrom` (type: `string`):

Optional published-date filter applied after GeM detail PDF enrichment.

## `dateTo` (type: `string`):

Optional published-date filter applied after GeM detail PDF enrichment.

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

Tender status filter.

## `maxResults` (type: `integer`):

Maximum tender records per keyword, up to 500.

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

Proxy settings for scraping.

## Actor input object example

```json
{
  "source": "gem",
  "keywords": [
    "laptop"
  ],
  "status": "active",
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("fascinating_lentil/india-government-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 = {}

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

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

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

```

## CLI example

```bash
echo '{}' |
apify call fascinating_lentil/india-government-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fascinating_lentil/india-government-tenders-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "India Government Tenders Scraper - GeM Leads",
        "description": "Scrape Indian government tender leads from GeM bid listings, with guarded CPPP handling when the public listing is CAPTCHA-gated.",
        "version": "1.0",
        "x-build-id": "d5JL4rAwRWGKH3eYo"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fascinating_lentil~india-government-tenders-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fascinating_lentil-india-government-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/fascinating_lentil~india-government-tenders-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fascinating_lentil-india-government-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/fascinating_lentil~india-government-tenders-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fascinating_lentil-india-government-tenders-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "source",
                    "keywords"
                ],
                "properties": {
                    "source": {
                        "title": "Tender Source",
                        "enum": [
                            "gem",
                            "cppp",
                            "both"
                        ],
                        "type": "string",
                        "description": "Choose GeM, CPPP, or both. CPPP is skipped without charge when its public listing shows CAPTCHA.",
                        "default": "gem"
                    },
                    "keywords": {
                        "title": "Search Keywords",
                        "type": "array",
                        "description": "Tender search keywords. Multiple keywords are searched sequentially.",
                        "default": [
                            "laptop"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "department": {
                        "title": "Department / Ministry",
                        "type": "string",
                        "description": "Optional department or ministry text filter."
                    },
                    "state": {
                        "title": "State",
                        "type": "string",
                        "description": "Optional state filter from enriched GeM detail PDFs when available."
                    },
                    "minValue": {
                        "title": "Minimum Tender Value (INR)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Optional minimum tender value. Records with unknown value are excluded when this filter is used."
                    },
                    "maxValue": {
                        "title": "Maximum Tender Value (INR)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Optional maximum tender value. Records with unknown value are excluded when this filter is used."
                    },
                    "dateFrom": {
                        "title": "Date From",
                        "type": "string",
                        "description": "Optional published-date filter applied after GeM detail PDF enrichment."
                    },
                    "dateTo": {
                        "title": "Date To",
                        "type": "string",
                        "description": "Optional published-date filter applied after GeM detail PDF enrichment."
                    },
                    "status": {
                        "title": "Tender Status",
                        "enum": [
                            "active",
                            "closed",
                            "all"
                        ],
                        "type": "string",
                        "description": "Tender status filter.",
                        "default": "active"
                    },
                    "maxResults": {
                        "title": "Max Results Per Keyword",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum tender records per keyword, up to 500.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings for scraping.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
