# India e-Tenders Scraper - CPPP, Defence & 23 States (`tenderdata-india/gepnic-tenders`) Actor

Open government tenders from 26 Indian NIC e-procurement portals (CPPP, Central, Defence, Tamil Nadu, UP, Kerala, MP and more): Tender ID, title, closing date and time, value, EMD, fee, location, PIN code, category. Daily "only new" alerts.

- **URL**: https://apify.com/tenderdata-india/gepnic-tenders.md
- **Developed by:** [Hari Haran S](https://apify.com/tenderdata-india) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 results

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

## India e-Tenders Scraper (GePNIC / NIC eProcurement)

Get **open government tenders from 30 Indian e-procurement portals** as clean, ready-to-use data: the Central Public Procurement Portal (CPPP), Central and Defence portals, and 27 states and union territories. Each tender comes with its Tender ID, title, organisation, closing date and time, estimated value, EMD, fee, location, PIN code, category and more.

Turn on **Only new tenders** and schedule it daily to get a **tender alert feed**: each run returns only the tenders you have not seen before, so you only pay for fresh results.

### Who is it for?

- **Tender consultants** who track new tenders for their clients every day
- **Suppliers and contractors** looking for government work in their field or region
- **EPC and infrastructure firms** that need a pipeline of large works tenders across states
- **Analysts and researchers** studying public procurement in India

### Popular use cases

- **Daily tender alerts by email or Slack:** new road, building, electrical or IT tenders from your states every morning.
- **Tender leads in Google Sheets:** a live sheet of open tenders, filtered by value and closing date, for your sales team.
- **Bid pipeline for EPC and infrastructure firms:** all large works tenders above ₹1 crore across CPPP and the states.
- **Supplier lead generation:** find every open tender for CCTV, solar, furniture, medical equipment, IT hardware and more.
- **Tender data API:** feed CPPP, Defence and state e-procurement data into your own CRM, app or tender website.
- **Market research:** which departments are buying what, where, and at what value.

### What does it do?

1. Opens each selected portal's public **Tenders by Organisation** listing (no login, no CAPTCHA).
2. Goes through each organisation's open tenders and applies your filters.
3. Opens each matching tender and saves **one clean record** per tender, always in the same shape.

Several portals are collected **at the same time**, while each portal is visited gently, one page at a time.

Dates come in ISO format (`YYYY-MM-DD`) and money comes as plain numbers in rupees, so you can sort and filter in Excel, Google Sheets, or your own system straight away. Export as **Excel, CSV, JSON**, or connect via the Apify API, Zapier, Make or webhooks.

### How to use it

1. Click **Try for free**.
2. Pick one or more **portals** and how many tenders you want.
3. Optionally add a **keyword** (like `road`, `solar`, `CCTV`), an **organisation** (like `PWD`), a **value range**, or **closing within N days**.
4. Click **Start**. Results appear in the **Output** tab as they are collected.

**For daily alerts:** turn on **Only new tenders**, then click **Schedule** and choose "Daily". Connect an email, Slack or Google Sheets integration to receive the new tenders automatically.

### Input options

| Option | What it does | Default |
|---|---|---|
| **Portals** | One or more e-procurement portals to collect from | Kerala |
| **Maximum number of tenders** | Stop after this many tenders are saved, shared evenly between the selected portals | 25 |
| **Keywords** | Only tenders whose title, reference number or Tender ID contains one of these words. Separate several with commas (`road, bridge`). Whole words only, not case-sensitive | none |
| **Organisation filter** | Only tenders from organisations whose name contains this text, e.g. `PWD`, `Water`, `Railway` | none |
| **Minimum / maximum tender value (₹)** | Only tenders with an estimated value in this range. Tenders with no stated value are left out when this is set. | none |
| **Closing within (days)** | Only tenders whose bids close within this many days from today | none |
| **Only new tenders** | Skip tenders already delivered in earlier runs with the same portals and filters | off |

Example input:

```json
{
    "portals": ["tamil-nadu", "kerala", "cppp"],
    "maxResults": 300,
    "keyword": "road",
    "minValue": 1000000,
    "closingWithinDays": 14,
    "onlyNew": true
}
```

### Example output

```json
{
    "tender_id": "2026_AMU_930352_1",
    "reference_number": "81/Bldg/26",
    "title": "Construction of 12x12 Sq ft Room required including trench for HT Meeting HT Panel at Abdullah Hall",
    "organisation": "Aligarh Muslim University",
    "department": "Building Department > University Engineer",
    "portal": "eprocure.gov.in",
    "state": null,
    "published_date": "2026-10-14",
    "bid_submission_closing_date": "2026-10-20",
    "bid_submission_closing_datetime": "2026-10-20T11:00:00+05:30",
    "bid_opening_date": "2026-10-21",
    "bid_opening_datetime": "2026-10-21T11:00:00+05:30",
    "estimated_value_inr": 423729,
    "emd_inr": 8500,
    "tender_fee_inr": 708,
    "location": "Aligarh Muslim University Aligarh",
    "pincode": "202001",
    "category": "Works",
    "product_category": "Civil Works - Buildings",
    "sub_category": null,
    "tender_type": "Open Tender",
    "work_description": "Construction of 12x12 Sq ft Room required including trench for HT Meeting HT Panel at Abdullah Hall",
    "period_of_work_days": 45,
    "pre_bid_meeting_datetime": null,
    "tender_url": "https://eprocure.gov.in/eprocure/app?page=FrontEndAdvancedSearch&service=page",
    "scraped_at": "2026-10-18T15:00:07+00:00"
}
```

### Output fields

Every record has all of these fields. A field is `null` when the portal does not show that information.

| Field | Description |
|---|---|
| `tender_id` | The portal's unique Tender ID, e.g. `2026_PWD_881009_1` |
| `reference_number` | The department's own tender reference number |
| `title` | Tender title |
| `organisation` | Top-level organisation, e.g. `PWD` |
| `department` | Office / division under the organisation, e.g. `Chief Engineer (Roads and Bridges) > SE Roads (S)` |
| `portal` | Portal the tender came from |
| `state` | State or union territory of the portal (`null` for national portals: CPPP, Central, Defence) |
| `published_date` | Date the tender was published (`YYYY-MM-DD`) |
| `bid_submission_closing_date` | Last date to submit bids (`YYYY-MM-DD`) |
| `bid_submission_closing_datetime` | Last date **and time** to submit bids, Indian Standard Time |
| `bid_opening_date` | Date bids are opened (`YYYY-MM-DD`) |
| `bid_opening_datetime` | Date and time bids are opened, Indian Standard Time |
| `estimated_value_inr` | Estimated tender value in rupees |
| `emd_inr` | Earnest Money Deposit in rupees (0 = exempt) |
| `tender_fee_inr` | Tender document fee in rupees, excluding the portal's processing fee (0 = free) |
| `location` | Work location as written by the department |
| `pincode` | PIN code of the work location |
| `category` | Tender category: Works, Goods or Services |
| `product_category` | Product category, e.g. `Civil Works - Buildings`, `Electrical Works` |
| `sub_category` | Product sub-category |
| `tender_type` | e.g. `Open Tender`, `Limited` |
| `work_description` | Description of the work or supply |
| `period_of_work_days` | Period of work / contract duration in days |
| `pre_bid_meeting_datetime` | Pre-bid meeting date and time, Indian Standard Time |
| `tender_url` | The portal's search page (see "Limits" below) |
| `scraped_at` | When this record was collected (UTC) |

### Supported portals

Open tender counts are approximate (October 2026).

| Portal | Website | Open tenders |
|---|---|---|
| Central Public Procurement Portal (CPPP) | eprocure.gov.in | ~2,600 |
| Central (CPSE eProcurement) | etenders.gov.in | ~2,200 |
| Defence eProcurement | defproc.gov.in | ~5,000 |
| Arunachal Pradesh | arunachaltenders.gov.in | <50 |
| Assam | assamtenders.gov.in | ~500 |
| Chandigarh | etenders.chd.nic.in | ~330 |
| Delhi | govtprocurement.delhi.gov.in | ~660 |
| Goa | eprocure.goa.gov.in | ~280 |
| Dadra & Nagar Haveli | dnhtenders.gov.in | <50 |
| Daman & Diu | ddtenders.gov.in | <50 |
| Haryana | etenders.hry.nic.in | ~2,300 |
| Himachal Pradesh | hptenders.gov.in | ~1,200 |
| Jammu & Kashmir | jktenders.gov.in | ~4,300 |
| Jharkhand | jharkhandtenders.gov.in | ~460 |
| Kerala | etenders.kerala.gov.in | ~6,600 |
| Ladakh | tenders.ladakh.gov.in | ~100 |
| Lakshadweep | tendersutl.gov.in | <50 |
| Madhya Pradesh | mptenders.gov.in | ~5,500 |
| Meghalaya | meghalayatenders.gov.in | <50 |
| Nagaland | nagalandtenders.gov.in | <50 |
| Odisha | tendersodisha.gov.in | ~2,100 |
| Puducherry | pudutenders.gov.in | ~70 |
| Punjab | eproc.punjab.gov.in | ~3,600 |
| Rajasthan | eproc.rajasthan.gov.in | ~3,100 |
| Sikkim | sikkimtender.gov.in | <50 |
| Tamil Nadu | tntenders.gov.in | ~6,000 |
| Tripura | tripuratenders.gov.in | ~480 |
| Uttar Pradesh | etender.up.nic.in | ~10,400 |
| Uttarakhand | uktenders.gov.in | ~630 |
| West Bengal | wbtenders.gov.in | ~3,300 |

Need a portal that is not listed? Open an issue in the **Issues** tab.

### How fresh is the data?

The data is collected **live from the portals at the moment you run the Actor**. There is no cache. The portals themselves update their listings every few minutes. For a daily alert feed, schedule a run once a day with **Only new tenders** turned on.

### How much does it cost?

You pay **per tender saved**, plus a small fee per run. Filtered-out tenders are not charged. With **Only new tenders** on, repeat runs only charge for tenders you have not received before. See the **Pricing** tab for current prices.

To control cost, use **Maximum number of tenders**, or set a maximum cost per run when starting the Actor.

### Limits

- **Speed:** to be gentle on government servers, the Actor makes one request at a time per portal with pauses in between: roughly **25 tenders per minute per portal**, with up to 4 portals in parallel. Collecting a whole state can take hours, so use filters.
- **Shared limit:** the maximum number of tenders is split evenly between the selected portals. With 30 portals and a limit of 25, one portal gets nothing, so raise the limit when selecting many portals.
- **No direct link per tender:** the portals' tender links only work inside the browsing session that created them, so they would be broken for you. `tender_url` points to the portal's search page instead; search there by **Tender ID** to open the full tender and its documents.
- **Order:** tenders are collected organisation by organisation (alphabetically), newest first within each organisation.
- **Missing values:** some departments do not state a tender value (shown as "NA" or 0 on the portal); these come through as `null`. Values are copied exactly as published by the department.
- **Tender documents** (PDFs, BOQs) are not downloaded. Open them on the portal using the Tender ID.
- **Not covered:** Maharashtra (its website does not allow automated access), Mizoram (CAPTCHA), GeM, and portals that do not run the NIC GePNIC system.
- Only **public** listings are used. The Actor does not log in, does not solve CAPTCHAs, and does not collect personal data.

### FAQ

**Is there an API for CPPP or eprocure.gov.in tenders?**
The government portals do not offer a public API. This Actor gives you one: run it through the Apify API and get CPPP, Central, Defence and state tenders as JSON, or connect it to Zapier, Make, n8n or Google Sheets.

**How do I get daily alerts for new government tenders?**
Turn on **Only new tenders**, pick your portals and filters (for example keyword `road`, minimum value ₹50 lakh), and create a daily **Schedule**. Add an email, Slack or Google Sheets integration and you will receive only fresh tenders each day.

**Which portals are covered?**
The Central Public Procurement Portal (eprocure.gov.in), etenders.gov.in, Defence (defproc.gov.in) and 23 state and union territory portals running the NIC GePNIC system: Tamil Nadu, Uttar Pradesh, Kerala, Madhya Pradesh, Punjab, West Bengal, Rajasthan, Haryana, Odisha, Delhi, Jammu & Kashmir and more. See **Supported portals** above.

**Does it cover GeM (Government e-Marketplace)?**
No. GeM is a different system. This Actor covers the NIC e-procurement (eTender) portals.

**Can I search tenders by keyword, department or value?**
Yes. Use the keyword filter (searches title, reference number and Tender ID), the organisation filter (e.g. `PWD`, `Railway`, `Water`), the value range and **Closing within (days)**.

**Can I download tender documents (NIT, BOQ)?**
Not yet. The Actor gives you the Tender ID; open the tender on the portal's search page to download its documents.

**Is it legal?**
The Actor reads only public tender notices that anyone can view without logging in, follows each website's robots.txt, does not bypass CAPTCHAs, collects no personal data, and keeps request rates low. Credit the source portal when you republish tender details.

### Source and disclaimer

All tender information comes from the official NIC e-procurement portals and is owned by the respective government organisations and departments. This Actor is an independent tool and is **not affiliated with NIC or any government body**. Always verify details on the official portal before bidding.

### Feedback

Found a problem or need a field, filter or portal that is missing? Open an issue in the **Issues** tab. Requests are usually handled quickly.

# Actor input Schema

## `portals` (type: `array`):

Which NIC e-procurement (GePNIC) portals to collect open tenders from. Pick one or several; the maximum number of tenders is shared evenly between them.

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

The run stops after saving this many tenders. You pay per saved tender. Raise it to collect more.

## `keyword` (type: `string`):

Optional. Only keep tenders whose title, reference number or Tender ID contains one of these words (not case-sensitive). Separate several with commas, for example "road, bridge, culvert". Whole words only: "ERP" does not match "waterproofing".

## `organisation` (type: `string`):

Optional. Only keep tenders from organisations whose name contains this text (not case-sensitive), for example "PWD" or "Water Authority".

## `minValue` (type: `integer`):

Optional. Only keep tenders with an estimated value of at least this many rupees. Tenders whose value the department did not state are left out when a value filter is set.

## `maxValue` (type: `integer`):

Optional. Only keep tenders with an estimated value of at most this many rupees.

## `closingWithinDays` (type: `integer`):

Optional. Only keep tenders whose bid submission closes within this many days from today, for example 7.

## `onlyNew` (type: `boolean`):

Skip tenders this Actor already delivered to you in earlier runs with the same portal and filters. Turn this on and schedule the Actor daily to get only fresh tenders, and only pay for those.

## Actor input object example

```json
{
  "portals": [
    "kerala"
  ],
  "maxResults": 25,
  "onlyNew": false
}
```

# Actor output Schema

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

No description

# 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 = {
    "keyword": "",
    "organisation": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenderdata-india/gepnic-tenders").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 = {
    "keyword": "",
    "organisation": "",
}

# Run the Actor and wait for it to finish
run = client.actor("tenderdata-india/gepnic-tenders").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 '{
  "keyword": "",
  "organisation": ""
}' |
apify call tenderdata-india/gepnic-tenders --silent --output-dataset

```

## MCP server setup

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

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/YyPmtx6dl2Kke1mEJ/builds/xXnMNlY1QjqgeHKuB/openapi.json
