Live Indian government tenders from CPPP, GePNIC state portals and GeM: tender ID, title, organisation, category, EMD, tender value, location, deadlines, documents and a link that opens the tender. Plus GeM bid results with every seller's rank (L1, L2 …) and price.
0.1.11 — 2026-11-03 — Resume after a platform restart (no duplicate rows, no double charge)
A run the platform migrates, reboots or resurrects now continues instead of re-running every query from scratch: records already delivered are remembered and skipped, so a restart never writes a duplicate row and never charges you twice for the same record.
No change to output, input or pricing. A run that is never restarted behaves exactly as before.
0.1.8 — 2026-10-25 — the Indian portals now answer Indian exits only: the run arranges that itself
Found by measuring the live actor, not by a customer report. A 30-row run (GXgWbfYDDEBl3hPjj)
delivered 0 rows: both selected sources failed on their first request with
590 UPSTREAM502 after 128 s each. Nothing was charged — but nothing was delivered either.
Measured cause (probe _probe/probe-routes-2026-10-25.mjs): eprocure.gov.in and the CPPP
host cannot be opened from the automatic Apify proxy or from a datacenter exit at all, while
Residential with country IN returns the real pages (GePNIC organisation index: HTTP 200,
333 KB, 248 organisations; all three GePNIC portals answer). Our own run of 2026-10-08 still
worked on the automatic proxy, so the restriction appeared between 10-08 and 10-25. GeM has
always been Indian-only; now the rest of the portals are too.
The run routes itself through India. A run that leaves proxyConfiguration at the default
is now sent through Residential, country IN — the exit is ours to arrange, never something the
customer has to know or supply. A proxy the customer chose is used exactly as given. An account
without Residential access falls back to the automatic proxy with a warning that says the run
may return nothing, instead of dying on startup.
The portals' own maintenance page is recognised. CPPP currently answers HTTP 403 with
"Site Is Under Maintenance … access … limited to users connecting through NICNET IP addresses
only" — NICNET is the Indian government's internal network, so no proxy can reach it. That
answer is now reported as what it is, per source, with nothing charged and the other sources
carrying on, instead of a bare HTTP 403 inside a proxy error.
Every run says up front what it can cost. 15 of the 157 runs in the 30 days to 2026-10-25
were stopped by their own user (and none failed), so the log now states, before the scan, how
many rows the run can charge for and that maxResults is the cap. The summary row stays free.
README and the proxy field were promising the opposite ("the default proxy is enough for CPPP,
the GeM mirror and the GePNIC portals") — corrected, with the measurement and its date.
Tests: 14/14 in test/adapter.test.js (2 new, with the captured 403 page as a fixture: the
NICNET notice is recognised while an ordinary page mentioning "maintenance" is not; the proxy
default is routed to India while an explicit choice, including "no proxy", is left alone) and
13/13 in test/schedule.test.js.
No change to the output fields, the charged events or the prices.
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).