Bengaluru Road Contracts
Key findings
Bengaluru BBMP road contracts. City-wide patterns across the awarded road, drain, and asphalting contracts we could trace. Per-ward detail lives on each ward card. Every number comes from the public tender record — where the record is silent or wrong, we say so rather than fill the gap.
Covers BBMP road-works tenders published 21 Aug 2023 – 1 Apr 2026 · data pulled from KPPP on 30 June 2026.
Every finding below drills into one of those numbers.
Top-line counts
- 1,734 awarded contracts total
- 1,603 tagged to a ward
- 131 BBMP left untagged
All 1,734 carry status “Awarded.” Counts are unique tenders, deduplicated by tender ID (a contract naming several wards is counted once).
Finding 01 — ₹721.5 crore in public money awarded
Total winning bids across the 1,054 ward-tagged contracts that publish a value. The other 549 ward-tagged contracts publish no amount at all.
These are awarded values, not audited expenditure — final bills are not public in this dataset, so this is what BBMP committed to pay, not what it has been billed or has paid.
A further ₹316.6 cr sits in the 131 works BBMP filed without a ward — see Finding 04.
⚠️ One filing lists an implausible ₹842 crore bid for tractor-and-labour maintenance against a ₹25 lakh estimate — flagged as a likely data-entry error. It would be 54% of the raw total, so we exclude it from the headline and show it here rather than delete it. Confirming it would need an RTI — see How can you help.
Tender ID 206291 · BBMP/2025-26/OW/WORK_INDENT7978
Source: sum of winning_bid_value over ward-tagged
contracts, deduplicated by tender ID, tid 206291 excluded. Raw sum
₹1,563.84 cr; headline ₹721.53 cr.
Finding 01a — The record contains at least one impossible number
Tender 206291 records a ₹842.31 crore winning bid for providing a tractor and labour to maintain roads and drains in ward 95 — against a government estimate of ₹25.4 lakh. That is the bid running 3,315 times the estimate.
We don’t delete it and we don’t quietly absorb it into a total. We exclude it from the ₹721.5 cr headline, show it in full, and flag it for verification. A transparency record is only worth publishing if it refuses to launder its own errors — so this one stays visible.
Source: tid 206291, winning_bid_value ₹842.31 cr
vs ecv_estimated_value ₹25.41 lakh.
Finding 02 — 1 in 3 contracts names no contractor
35.2% — 610 of 1,734 contracts across the whole dataset publish no winning contractor. Broken out: 549 of the ward-tagged 1,603, plus 61 of the 131 untagged.
winner_name and winning_bid_value are perfectly
coupled — every contract that names a winner publishes a bid, and every
contract that names no winner publishes no bid. There are zero contracts with
one but not the other. So this same gap is also the gap in Finding 01: the
549 tagged contracts with no contractor are the 549 with no amount.
This is a gap in the public record itself, not in our scrape: for these contracts KPPP’s winner endpoint and its bid-details endpoint both return empty.
It is not a recency artifact. By publish year, the no-winner rate among tagged contracts holds steady across the two bulk years — 2024: 35.5% (n=940), 2025: 33.9% (n=620) — so “recent awards just haven’t been uploaded yet” does not explain it. (2023 is cleaner at 11.9%, but on only 42 contracts.)
An award that names no winner defeats the point of publishing it. We treat the gap itself as a finding.
Source: contracts with an empty winner_name.
Whole-dataset 610/1,734; tagged 549/1,603; per-year rates over tagged
contracts by published_date.
Finding 03 — Bids vs estimates: the record is too thin to judge
Only 425 of 1,603 ward-tagged contracts (27%) publish both a winning bid and a government estimate, so any bid-to-estimate comparison runs on that quarter alone — and several of those estimates are themselves clearly wrong (15 imply gaps above 1,000%). What the public record cannot show is whether spending was held to account, because most of it never publishes both numbers.
To be clear about what this is not: actual execution overruns — final bills against the awarded amount — cannot be seen in this data at all. That comparison lives in billing records not published here.
These awards are made to the lowest evaluated responsive tender (L1), the norm set by the Karnataka Transparency in Public Procurements Rules 2000 (Rule 25). Under an L1 rule, winning below the estimate is the expected outcome. So the notable figure is not the 67% under estimate — it’s the 33% above:
- 67% at or under estimate — 285
- 33% over estimate — 140
Among the comparable subset with extreme outliers removed (|deviation| ≤ 100%, n=356), the median winning bid sits 50.2% below the government estimate. Underbidding at that scale is itself worth noting — it points either to inflated estimates or to bids too low to deliver on — but with estimates published for only a quarter of contracts, we report the direction and this one robust magnitude, and withhold the rest as unreliable.
Source: contracts carrying both winning_bid_value
and ecv_estimated_value (estimate > 0). L1 rule: KTPP Rules
2000, Rule 25, hosted on BBMP’s own site. Median computed on the
|deviation| ≤ 100% subset (n=356).
Finding 04 — 131 works couldn’t be placed in a ward
BBMP filed 131 contracts with no ward number. 11 could be placed: 7 state the ward in their own title (one names five wards at once), and 4 name a locality that maps to exactly one ward — those are shown against the ward, clearly labelled as inferred. 120 remain in the untagged list, shown with a disclaimer rather than guessed into a ward.
These 131 works carry ₹316.6 cr in published winning bids as filed. The 11 placed contracts account for ₹3.3 cr of that (5 of the 11 publish a value), leaving ₹313.3 cr against the 120 still-untagged works — the figure the ward map shows.
That ₹316.6 cr is itself concentrated: more than half — ₹171.6 cr, 54% — is a single flood-protection / storm-water-drain contract (tender ID 211668, no estimate published), which sits among the 120 still untagged.
The 120 are excluded from the per-ward city figures in Finding 01.
Source: _unassigned bucket (131) minus the 11 unique
tender IDs placed by the rescue (rescue_proposals.json,
regenerated this session: 7 title-stated + 4 locality-inferred). Untagged
money summed over all 131 as filed, and over the 120 residual.
Finding 05 — No single contractor dominates
- 932 distinct winners
- 96 won more than one
- 5 most by any one firm
Among the 1,054 ward-tagged contracts that name a winner, work is spread widely by count. By exact spelling, two firms tie for the most at five contracts each — Shivalingaiah Satish and Manjunath S; a third, Shivalila Spoorthi Enterprises, also reaches five once its spelling variants are merged (see note below).
By value the spread is tighter but still not dominated: the largest single recipient, ACR Projects (Amaravaram Channa Reddy), took ₹70.75 cr — 9.8% of the ₹721.5 cr headline — and did it on one contract, the second-largest ward-tagged bid in the dataset. The top 10 firms hold 32.6% of all traced money. So “no dominant player” holds by contract count and survives by value, but the by-value picture is the honest one to show alongside it.
The 932 figure counts winner names exactly as filed. Near-duplicate spellings exist; merging the 7 human-verified variants (list published in Data & Sources) changes no ranking except adding the third five-contract firm, Shivalila (Spoorthi Enterprises). We publish the exact count and the merge list rather than a single normalized number.
Source: frequency of winner_name across
named-winner ward-tagged contracts, deduplicated by tender ID. By-value
figures exclude tid 206291. Distinct-winner count is exact-string (932);
7 verified merges give 925, list published.
Sources and method
Contract data scraped from the Karnataka Public Procurement Portal (KPPP),
BBMP awarded road works. Scope is defined by a road-keyword title
filter over BBMP’s 2,906 awarded-works tenders — KPPP’s own
work_category field is too coarse to define scope (73% of tagged
contracts are just “Other Works”) — which yields the 1,734
road/drain/asphalting contracts here. About 1,170 non-road BBMP works are out
of scope; a handful of non-road items slip through the keyword filter and are
harmless to the totals.
Ward boundaries from OpenCity’s 2023 final delimitation dataset. Wards are the 2023 BBMP 225-ward delimitation — the scheme these tenders were filed under. BBMP was dissolved and replaced by the Greater Bengaluru Authority in 2025, which has since redrawn the wards; our data predates that. See the FAQ for the BBMP→GBA transition.
Each finding is computed directly from the source records. Where a specific contract is named, its tender ID and number are given. There is no public human-viewable per-tender page on KPPP and no direct link to cite — but any contract here can be looked up by its tender number (free, captcha, no account), so we cite tender ID and number as the traceable key. The underlying data is served by KPPP’s public, machine-readable API, which is how we obtained it.
- KPPP portal — kppp.karnataka.gov.in
- OpenCity ward dataset — data.opencity.in
Data pulled from KPPP on 30 June 2026. Links verified working 4 July 2026.