# Changelog of India Government Tenders — CPPP, GeM & State Portals (`foxlabs/india-government-tenders`) Actor

- **URL**: https://apify.com/foxlabs/india-government-tenders/changelog.md
- **Full Actor documentation**: https://apify.com/foxlabs/india-government-tenders.md

## Changelog

### 0.1.3 — 2026-09-10 — category search: faster and cheaper

- The GePNIC portals (eprocure, etenders, tntenders) are read at the same time instead of one after the other. The row budget is still shared: each portal starts with an equal share, and one that finds fewer leaves the rest to the others.
- On each portal, organisation lists and tender pages share the `maxConcurrency` connections (default 2); before, organisation lists were read one at a time. Requests to one portal still start at least 1 s apart.
- A category search opens fewer tender pages that cannot match: only titles that look like the category are opened while organisation lists are left to read; for `IT`, titles where a computer word stands in electrical work, supplies or lab equipment ("computer wiring", "printer cartridges", "3D printer"), or that come from an electrical, civil or estate department, are opened only after the rest; "data processing" and "workstation" now count as strong IT signs.
- Measured on the IT example (eprocure + etenders, closing within 14 days, 10 rows, scan limit 20) through the Apify proxy: 10 rows in 102 s (10.2 s per row), where the previous version needed 184–195 s for 6 rows (30.7–32.5 s per row); the 6 tenders it found are among the 10.
- No change to the input fields, the output fields or billing.

### 0.1 — 2026-09-10 — initial release

- Award rows are sorted by rank (L1 first) and carry `sellersInBid`, so a run that stops at `maxResults` in the middle of a bid keeps its top-ranked sellers and shows how many there were.
- GeM placeholders (`NA`, `N/A`, `-`) in `ministry`, `department` and `mseStatus` are returned as `null`.
- Two tender events: `tender-record` for list-level rows and `tender-detail-record` for rows with the full GePNIC detail page; `award-record` for GeM results. Summary rows are never charged.
- The prefilled input asks for 10 rows: Indian portals answer Apify's servers several times slower than a local connection, and a 30-row default took 325 s on the platform.
- A run now stops scanning 90 s before its timeout and still saves the rows found and an explanatory summary row, instead of ending empty when the timeout hits.
- **Sources:** the CPPP "latest active tenders" feed (every central portal, list fields); the GePNIC portals eprocure.gov.in, etenders.gov.in and tntenders.gov.in through their captcha-free "Tenders by Organisation" pages, with the full tender page (EMD, tender value, category, location, PIN code, critical dates, inviting authority, document names); GeM open bids via the CPPP mirror; GeM live bids from bidplus.gem.gov.in (needs an Indian residential proxy).
- **Modes:** `list_detail` (default), `list`, and `awards` — GeM bid results with one row per seller: rank (L1, L2 …), total price as a 4-field money set, qualified flag, MSE status.
- **Filters:** keyword, organisations (one per line), category (the portals' own product categories; `IT` also covers their Information Technology, Info. Tech. Services and Computer categories), publish-date presets or a custom range, closing within N days, a row budget shared across sources and a scan limit per source.
- **Links that work:** `tenderUrl` opens the tender in a fresh session, no cookies needed. GePNIC links are delivered without the `session=T` flag that ties the portal's own links to one browser session; GeM rows link the bid document. CPPP and GeM-mirror rows get no per-tender link (the portal's own links expire within minutes and ask for a captcha) — they carry `portalUrl`, the page to look the tender up by its ID.
- **One row per tender:** a tender listed by two sources is delivered once (GePNIC tender IDs and GeM bid numbers are unique across portals); repeated rows from overlapping CPPP pages are dropped.
- **Run report:** every run stores `SOURCE_REPORT` (per source: status, rows, requests, wire bytes, pages scanned, duplicates, notes). An empty, failed or short run also gets a summary row that explains why, source by source; summary rows are never charged. Without an Indian proxy, GeM sources stop after one attempt with that explanation.
- **Pay-per-event:** `tender-record` for each tender row with a tender ID and a title; `award-record` for each award row with a bid ID and a seller name.
- **Not included:** award notices on CPPP and the GePNIC portals (captcha-protected) and mahatenders.gov.in (its robots.txt disallows crawling).
