Who won tenders on the Central Public Procurement Portal, by company registration number
The Central Public Procurement Portal publishes who won each tender, in a field called “Name of the selected bidder(s)”. It is free text. Larsen & Toubro alone turns up as LARSEN AND TOUBRO LIMITED, LARSEN & TOUBRO LTD., LARSEN & TOUBRO LTD-POWAI and LARSEN & TOUBRO LTD-AHMEDNAGAR, among others, and several winners are often squeezed into one line with commas.
That makes it hard to ask simple questions, like how many central contracts a company has won, or from which buyers. This release turns the winner names into company registration numbers (CIN) from the Ministry of Corporate Affairs register, so the awards can be counted per company and joined to anything else that uses a CIN.
It is built entirely on the archive of Sarthak Siddhant, who scraped the award-of-contract records from CPPP and released them openly. None of this would exist without that work, and I am grateful for it. If you want the tenders themselves, start with his archive; for the states, see Project Diaphanum.
Matching is careful by design. A name gets a company only if exactly one registered company fits it. Most winners on CPPP are proprietors, partnership firms and contractors that are not companies at all, so most names stay unmatched, and that is expected.
Plain CSV files, UTF-8, with a header row.
Hugging Face dataset →
| File | Holds | Rows | Size | SHA-256 |
|---|---|---|---|---|
| cppp_awards_resolved.csv | One row per award × winning bidder, where the winner matched a company: tender id, buyer, title, dates, value as printed, company | 348,950 | 161.1 MB | f43bf8e6af4843798fe0b8aaf901e234ba46663f5663e1eead4df930c8699930 |
| cppp_bidder_resolution.csv | Every winner name in the archive and what the matching did with it | 542,974 | 24.2 MB | 7704cf41e8daf4bc641eb0c4bae085ad718eff9ab599f991feb9dd28eb51ae4a |
| cppp_companies.csv | One row per matched company: awards, tenders, buyers, first and last award | 36,153 | 3.5 MB | f21a217e9696b7612d0119796112122649bdf2ba6af9a60723eaf4fc6f971f6a |
The full method, with every rule and every column, is in METHODOLOGY.md.
import duckdb
duckdb.sql("""
SELECT registered_name, awards, buyer_orgs
FROM read_csv('hf://datasets/shreyamm/cppp-contract-winners/data/cppp_companies.csv')
ORDER BY awards DESC LIMIT 10
""").show()
| Count | |
|---|---|
| Award rows in the archive that were read | 4,540,739 |
| Distinct winner names | 542,974 |
| Names matched to exactly one company or LLP | 66,785 |
| Names refused because more than one company fits | 1,325 |
| Award rows with a matched company | 348,950 |
| Distinct companies | 36,153 |
| Company | Awards | Tenders | Buyers |
|---|---|---|---|
| BHARAT HEAVY ELECTRICALS LIMITED | 3,272 | 2,900 | 151 |
| UTILITY POWERTECH LIMITED | 2,742 | 2,742 | 18 |
| BEML LIMITED | 1,530 | 1,513 | 207 |
| LARSEN AND TOUBRO LIMITED | 1,484 | 1,470 | 293 |
| SIEMENS LIMITED | 1,096 | 1,069 | 189 |
| ABB INDIA LIMITED | 990 | 964 | 170 |
| GMMCO LTD | 874 | 872 | 102 |
| INDIAN OIL CORPORATION LIMITED | 854 | 836 | 174 |
| KIRLOSKAR BROTHERS LIMITED | 770 | 768 | 96 |
| EAGLEBURGMANN INDIA PRIVATE LIMITED | 724 | 719 | 88 |
| SMPL LIFE SCIENCES PRIVATE LIMITED | 709 | 709 | 16 |
| STEEL AUTHORITY OF INDIA LIMITED | 695 | 661 | 56 |
| HONEYWELL AUTOMATION INDIA LIMITED | 635 | 634 | 138 |
| EIMCO ELECON (INDIA ) LIMITED | 596 | 596 | 65 |
| AIMIL LIMITED | 580 | 579 | 222 |
The winner field is split on commas, and each piece is cleaned up: upper case, punctuation dropped, PRIVATE and LIMITED shortened, a leading M/S removed, and any city or branch name after the last LTD cut off. Then the rules are tried in order, and the first one that finds exactly one registered entity wins:
A match is also thrown out if GLEIF shows that the name once belonged to a different company.
cppp_bidder_resolution.csv, matched or not, with the reason.value_scope says which case a row is. Do not add those values up per company.