Central contract winners, matched to companies

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.

Download

Plain CSV files, UTF-8, with a header row.
Hugging Face dataset →

FileHoldsRowsSizeSHA-256
cppp_awards_resolved.csvOne row per award × winning bidder, where the winner matched a company: tender id, buyer, title, dates, value as printed, company348,950161.1 MBf43bf8e6af4843798fe0b8aaf901e234ba46663f5663e1eead4df930c8699930
cppp_bidder_resolution.csvEvery winner name in the archive and what the matching did with it542,97424.2 MB7704cf41e8daf4bc641eb0c4bae085ad718eff9ab599f991feb9dd28eb51ae4a
cppp_companies.csvOne row per matched company: awards, tenders, buyers, first and last award36,1533.5 MBf21a217e9696b7612d0119796112122649bdf2ba6af9a60723eaf4fc6f971f6a

The full method, with every rule and every column, is in METHODOLOGY.md.

Quick start

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()

What is in it

Count
Award rows in the archive that were read4,540,739
Distinct winner names542,974
Names matched to exactly one company or LLP66,785
Names refused because more than one company fits1,325
Award rows with a matched company348,950
Distinct companies36,153

Companies with the most awards

CompanyAwardsTendersBuyers
BHARAT HEAVY ELECTRICALS LIMITED3,2722,900151
UTILITY POWERTECH LIMITED2,7422,74218
BEML LIMITED1,5301,513207
LARSEN AND TOUBRO LIMITED1,4841,470293
SIEMENS LIMITED1,0961,069189
ABB INDIA LIMITED990964170
GMMCO LTD874872102
INDIAN OIL CORPORATION LIMITED854836174
KIRLOSKAR BROTHERS LIMITED77076896
EAGLEBURGMANN INDIA PRIVATE LIMITED72471988
SMPL LIFE SCIENCES PRIVATE LIMITED70970916
STEEL AUTHORITY OF INDIA LIMITED69566156
HONEYWELL AUTOMATION INDIA LIMITED635634138
EIMCO ELECON (INDIA ) LIMITED59659665
AIMIL LIMITED580579222

How names were matched

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:

  1. Same name as one company.
  2. Same name once spacing, punctuation and abbreviations are ignored. More than one company here and the name is refused.
  3. A former name of one company, as recorded by GLEIF.
  4. Same name as one LLP.
  5. Same name with a different legal form, only when the name has at least two words that are not generic.

A match is also thrown out if GLEIF shows that the name once belonged to a different company.

How it was checked

Limitations of this release