# India eProcurement Tenders Scraper (CPPP + 30 State Portals) (`angadseth/india-eprocurement-tenders`) Actor

Live government tenders from India's central eProcure (CPPP), central PSU, defence and 30+ state NIC eProcurement portals in one run. Tender ID, title, organisation, dates, days left, and optional tender value, EMD, location and pincode.

- **URL**: https://apify.com/angadseth/india-eprocurement-tenders.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

$3.00 / 1,000 tenders

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 eProcurement Tenders Scraper (CPPP + 30 state portals)

Get **live government tenders from India's eProcurement portals in one run**: the central eProcure portal (CPPP), central PSUs, defence, Coal India and **30 state and union territory portals** (Maharashtra, Uttar Pradesh, Tamil Nadu, Kerala, Rajasthan, West Bengal, Madhya Pradesh, Delhi and more). Together they list tens of thousands of open tenders on any given day.

Search by keyword or organisation. You can also turn on **tender details** to get the **tender value in ₹, EMD, tender fee, category, location, pincode, period of work and inviting authority** for every tender.

Most tender scrapers cover only the central portal, or stop at a captcha. This Actor reads each portal's public **"Tenders by Organisation"** listing, which needs no login and no captcha.

### Who uses it

- **Contractors and suppliers** who want every new road, building, electrical, CCTV, solar, IT or manpower tender in their states.
- **Tender alert and bid-consulting services** covering many states for many clients.
- **Sales and business development teams** tracking which departments are spending, where and how much.
- **Analysts, journalists and researchers** studying public spending in India.
- **AI agents** that need fresh tender data, through the Apify MCP server.

### Portals covered

Central Government (CPPP eProcure), Central PSUs (etenders.gov.in), Defence (defproc), Coal India, Andaman and Nicobar, Arunachal Pradesh, Assam, Chandigarh, Delhi, Dadra and Nagar Haveli and Daman and Diu, Goa, Haryana, Himachal Pradesh, Jammu and Kashmir, Jharkhand, Kerala, Ladakh, Lakshadweep, Madhya Pradesh, Maharashtra, Manipur, Meghalaya, Mizoram, Nagaland, Odisha, Puducherry, Punjab, Rajasthan, Sikkim, Tamil Nadu, Tripura, Uttarakhand, Uttar Pradesh and West Bengal.

Pick **All portals** to search every one in a single run.

### Output

Every tender has:

| Field | Example |
|---|---|
| `tenderId` | 2026_CEPWD_605188_6 |
| `referenceNumber` | EE PWD DIV. LAKHERI NITNO-08/2026-27 |
| `title` | Construction of RCC culvert on link road Chharkwada to Khalunda Km 2/650 |
| `organisation`, `organisationChain` | PWD - CE AND AS → ACE - KOTA → SE-BUNDI → EE-LAKHERI |
| `publishedDate`, `closingDate`, `openingDate` | ISO dates in Indian time |
| `daysLeft` | 12.1 |
| `portal`, `portalName` | rajasthan, Rajasthan |

With **Include tender details** turned on, you also get:

| Field | Example |
|---|---|
| `tenderValueInr` | 8203000 |
| `emdAmountInr` | 164060 |
| `tenderFeeInr` | 1500 |
| `tenderType`, `tenderCategory`, `productCategory`, `formOfContract` | Open Tender, Works, Civil Works, Percentage |
| `location`, `pincode` | BUNDI, 323001 |
| `bidValidityDays`, `periodOfWorkDays` | 90, 120 |
| `preBidMeetingDate`, `documentSaleEndDate`, `clarificationEndDate` | ISO dates |
| `invitingAuthorityName`, `invitingAuthorityAddress`, `bidOpeningPlace` | EE PWD DIV. LAKHERI |

### Example inputs

New CCTV and solar tenders from six big states, published in the last 3 days:

```json
{
  "portals": ["maharashtra", "tamilnadu", "uttarpradesh", "kerala", "westbengal", "delhi"],
  "keywords": ["CCTV", "solar"],
  "publishedWithinDays": 3,
  "maxItems": 500
}
```

Rajasthan PWD works worth ₹50 lakh or more, with full details:

```json
{
  "portals": ["rajasthan"],
  "organisationContains": ["PWD"],
  "includeDetails": true,
  "minTenderValueInr": 5000000,
  "maxItems": 200
}
```

Every road tender in India that still has a week left:

```json
{ "portals": ["all"], "keywords": ["road"], "minDaysLeft": 7, "maxItems": 5000 }
```

### Tips

- **Organisation contains** is the fastest filter, because the Actor opens only those organisations. If nothing matches, the log lists the biggest organisations on that portal so you can copy the exact name (for example Rajasthan uses "PWD", not "Public Works").
- **Daily alerts:** save your input as a Task, schedule it every morning, set `publishedWithinDays` to 1, and connect email, Slack, Google Sheets, Make, Zapier or a webhook.
- Use **Max tenders per portal** so one large state does not use the whole limit.

### Pricing

You pay per tender saved, and nothing for tenders that are filtered out. **Max tenders** is a hard cap on what a run can cost.

### FAQ

**Is this legal?** The Actor reads only public pages that every visitor can see without logging in, at a polite pace. It never logs in, never solves or skips a captcha, and never downloads documents behind a login. You are responsible for how you use the data.

**Why is there no direct link to each tender?** Detail links on these portals only work inside a browsing session. Open the `portalUrl`, then use the portal's search with the `tenderId`.

**A portal was skipped.** Government portals sometimes go down. The run continues with the other portals and lists the unreachable ones in the `SUMMARY` record. Try again later.

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

### More Actors by angadseth

- [GeM Tenders Scraper (India Government e-Marketplace Bids)](https://apify.com/angadseth/gem-tenders-scraper): Get live GeM bids and reverse auctions from India's Government e-Marketplace
- [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

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

Which eProcurement portals to search. Pick "All portals" to cover every one.

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

Keep tenders whose title, reference, tender ID or organisation contains any of these words, e.g. "road", "CCTV", "solar". Leave empty for all tenders.

## `organisationContains` (type: `array`):

Only open organisations whose name contains any of these words, e.g. "Public Works", "Municipal", "Airports". Makes runs much faster.

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

Drop tenders that contain any of these words.

## `includeDetails` (type: `boolean`):

Open each matching tender for tender value, EMD, fee, category, location, pincode, contract form, pre-bid meeting and the inviting authority. Slower (one extra page per tender).

## `minTenderValueInr` (type: `integer`):

Needs "Include tender details". Tenders without a stated value are dropped.

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

Skip tenders closing sooner than this.

## `publishedWithinDays` (type: `integer`):

For daily alerts use 1 or 2. 0 = any date.

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

Stop after this many tenders in total. You pay per tender saved.

## `maxItemsPerPortal` (type: `integer`):

Optional cap per portal, so one big state does not use the whole limit.

## `maxConcurrentPortals` (type: `integer`):

How many portals to read at the same time. 4 is polite and fast.

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

Not needed normally. Unreachable portals are retried through an Indian proxy automatically.

## Actor input object example

```json
{
  "portals": [
    "central"
  ],
  "keywords": [
    "road"
  ],
  "includeDetails": false,
  "minDaysLeft": 0,
  "publishedWithinDays": 0,
  "maxItems": 20,
  "maxConcurrentPortals": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All tenders 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 = {
    "portals": [
        "central"
    ],
    "keywords": [
        "road"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("angadseth/india-eprocurement-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 = {
    "portals": ["central"],
    "keywords": ["road"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("angadseth/india-eprocurement-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 '{
  "portals": [
    "central"
  ],
  "keywords": [
    "road"
  ],
  "maxItems": 20
}' |
apify call angadseth/india-eprocurement-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,angadseth/india-eprocurement-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/I9l6clj3x823IBeVL/builds/QL3xqE8AIGMHEI7PC/openapi.json
