Skip to content

Technical seats: how many India approves, and how many go empty

Built from AICTE’s approved-intake panel and AISHE enrolment — both public regulator data. No Avanti student data and no personally identifiable information.

AICTE 2012-13 to 2021-22 and AISHE 2012-13 to 2023-24. August 2026.

The supply side. The PLFS analyses in ../plfs/ and ../plfs/entry/ describe what happens to people after a qualification. This one describes the seats — how many exist, how many are filled, and which way both numbers are moving.

Built as its own analysis, with its own extracts and its own method, so that a narrative document citing these figures is quoting a completed piece of work rather than an ad-hoc query.


Higher education has grown by half in a decade

Section titled “Higher education has grown by half in a decade”

AISHE total enrolment, all higher education:

2012-13 2016-17 2019-20 2023-24
30.15m 35.71m 38.54m 45.00m

A 1.49× rise over eleven years, and it is still rising in the most recent year.

But technical seats are contracting, and have been for eight years

Section titled “But technical seats are contracting, and have been for eight years”

Engineering, AICTE approved intake:

2012-13 Peak 2021-22 Change from peak
UG (degree) 15.49 lakh 17.05 lakh (2014-15) 12.53 lakh −26.5%
Diploma 10.08 lakh 12.62 lakh (2014-15) 9.77 lakh −22.6%
PG 1.38 lakh 2.16 lakh (2014-15) 1.37 lakh −36.5%

Both peaked in the same year and have fallen every year since. Higher education grew 49% over the same period; engineering capacity shrank by a quarter.

Share of approved seats with no student in them:

Year UG engineering Engineering diploma
2012-13 37.6% 32.2%
2016-17 49.5% 43.3%
2019-20 44.3% 41.8%
2020-21 44.1% 49.1%
2021-22 34.1% 49.4%

Two different stories. UG engineering vacancy peaked at 49.5% in 2016-17 and has since fallen to 34.1% — largely because capacity was cut faster than demand fell. Diploma vacancy has gone the other way, rising from 32.2% to 49.4%, and is now the worse of the two: almost exactly half of approved engineering-diploma seats sit empty.

That matters given what the PLFS ladder finds about where a technical diploma actually leads — 30.77% formal employment, nearly double a general degree’s 16.20%.


Source. avantifellows.external_data_sources.aicte_fact_intake and aishe_fact_higher_ed_students.

One cut only, from each. Both tables stack several incompatible cuts under one schema.

  • AICTE: cut='national' with state='All' and institution_type='All' is the pre-aggregated national total. The state and institution-type cuts are the same underlying data re-sliced; mixing them double-counts.
  • AISHE: cut='state_social', metric='enrolment', basis='estimated', and the pre-aggregated 'All Categories' × 'Total' rows. This is the only cut carrying enrolment on a consistent basis for all twelve years. The ug_discipline cut uses 'actual response', a different population, and the two bases must never be compared.

Two guards on the AISHE query, which fail the query rather than warning

Section titled “Two guards on the AISHE query, which fail the query rather than warning”

aishe_fact_higher_ed_students carries gender values of Male / Female / Total — so Total is both a row and the sum of the other two. Drop gender = 'Total' and every figure doubles: 2021-22 undergraduate qualifiers go from 7,754,223 to 15,508,446, and nothing complains. 15.5 million graduates a year is wrong but not absurd, so it survives a read-through — it did exactly that during the education-ladder work. social_category carries the identical trap, with All Categories a superset of SC/ST/OBC/PwD/Muslim/EWS.

extract_aishe.sql therefore raises ERROR() on two conditions:

Guard Fires when Catches
Fan-out more than one gender, social_category or basis reaches the aggregate a future edit that loosens a filter
Anchor 2021-22 UG qualifiers ≠ 7,754,223, AISHE’s own published figure a reload that changes what the table means

Both were tested by mutation: dropping the gender filter, dropping the social-category filter, and breaking the anchor each fail the query with a message naming the violation. The clean query returns output byte-identical to before the guards were added.

One non-obvious detail. The guards are single-row CROSS JOINs, and BigQuery prunes a joined table whose columns are never projected — the first version computed both guards, referenced neither, and was silently optimised away, returning doubled enrolment with no error. The + MAX(guard.ok) + MAX(anchor.ok) in the SELECT list is what makes them load-bearing. Each is 0, so no output changes.

Vacancy is (approved_intake − enrolled) / approved_intake, both columns AICTE’s own. It is seats approved by the regulator against students actually enrolled — not a dropout rate, and it says nothing about who finishes.

Two data problems, both excluded rather than worked around

Section titled “Two data problems, both excluded rather than worked around”

AICTE 2022-23 is an incomplete load and is dropped. It reports 29.3 lakh approved seats against 0.9 lakh enrolled — a 96.9% vacancy rate — across every programme and every level, while the eleven preceding years sit in a 37–47% band. Enrolment does not fall 95% in a year while approved intake holds flat. Including it would corrupt every trend here.

The placed column is unusable and is not used. It exceeds passed in 2020-21 at every level — 345% for diplomas, 273% for UG, 161% for PG — which is impossible. It is carried into the output under the column name pct_placed_of_passed_UNUSABLE so that anyone reaching for it meets the ratio and stops. A separate analysis of NIRF placement data reached the same conclusion independently.

No placement or outcome claims. The only outcome column AICTE offers is the broken one. Every statement here is about seats and enrolment; what happens to the students is the PLFS analyses’ job.

No causal claim about why seats empty. Vacancy could be falling demand, rising quality thresholds, closures, or reporting. This measures it and does not explain it.

AISHE enrolment is a stock across all years of study, not an annual intake, and covers all higher education rather than technical alone. It is used here only to establish that participation has grown.

File What
extract.sql AICTE seats, enrolment and vacancy by level × programme × year
extract_aishe.sql AISHE total higher-education enrolment by year
output/capacity.csv · output/enrolment.csv The two extracts
Terminal window
bq query --use_legacy_sql=false --format=csv --max_rows=100000 < extract.sql > output/capacity.csv
bq query --use_legacy_sql=false --format=csv --max_rows=100000 < extract_aishe.sql > output/enrolment.csv