May 22, 2026 · 6 min read · Data
ISO 3166-2:IN — state codes that work everywhere.
India has 36 states and union territories. There are at least six competing code systems for naming them, and most engineering teams discover this the hard way — when a join silently drops half the rows.
The six conventions you'll meet
Pull data about Indian states from any three sources and you'll see three different code systems. Off the top:
- Census of India abbreviations — MH for Maharashtra, KA for Karnataka, UP for Uttar Pradesh. Two letters, mostly.
- RTO (Regional Transport Office) codes — same MH/KA/UP for the most part, but they double as the licence-plate prefix and have additional districts beneath.
- Indian Postal abbreviations — broadly aligned with Census but inconsistent for UTs. "DL" for Delhi versus "DEL" depending on the dataset.
- Tourism-board names — long-form, frequently localized. "Kerala Tourism" labels, "Madhya Pradesh — The Heart of Incredible India," etc. Useful for prose, useless for joins.
- GST state codes — numeric. 27 = Maharashtra, 32 = Kerala, 07 = Delhi. Built into every GSTIN, used by tax software, ignored by everything else.
- ISO 3166-2:IN — IN-MH, IN-KL, IN-DL. Two-letter region code with the country prefix.
A few of these collide deceptively. AP is Andhra Pradesh in Census, but also Arunachal Pradesh — context-dependent. MP is Madhya Pradesh everywhere except in older British-era cartographic data where it sometimes meant something else. Ambiguity in two-letter codes without a country prefix is real, and it is the central reason ISO wins.
The table
A subset, to make the difference concrete:
- Maharashtra → Census
MH· GST27· ISOIN-MH - Kerala → Census
KL· GST32· ISOIN-KL - Delhi → Census
DL· GST07· ISOIN-DL - Tamil Nadu → Census
TN· GST33· ISOIN-TN - Uttar Pradesh → Census
UP· GST09· ISOIN-UP - Telangana → Census
TS· GST36· ISOIN-TG - Andhra Pradesh → Census
AP· GST37· ISOIN-AP - Ladakh → Census
LA· GST38· ISOIN-LA - Jammu and Kashmir → Census
JK· GST01· ISOIN-JK
Note that even ISO disagrees with Census on Telangana: ISO chose
IN-TG, Census uses TS. If you mix the two
sources without normalizing, your Telangana row falls out of the join.
The curly cases
State boundaries are not static. Two reorganizations in the last twelve years matter for any historical dataset.
Telangana split off from Andhra Pradesh in 2014. Hyderabad sits in Telangana now but served as joint capital for ten years. Pre-2014 records will assign Hyderabad to Andhra Pradesh; post that, Telangana. If your travel content predates the split, your state_code is wrong.
Ladakh became its own UT in 2019, separated from Jammu and
Kashmir. Leh and Kargil are now IN-LA, not
IN-JK. Most travel CMSes haven't been audited since.
Daman and Diu merged with Dadra and Nagar Haveli in 2020.
The combined UT has ISO code IN-DH; older data will still
list IN-DD or IN-DN separately.
Why our state_code column uses ISO
TravelMindsAI's state_code column on every Indian city
is ISO 3166-2:IN. Three reasons.
It joins cleanly across systems. Wikidata uses ISO
3166-2 as the canonical statement value for P300 (administrative
division). OpenStreetMap tags with ISO3166-2. Most
international travel datasets either use ISO or have an ISO column
available. Census codes work inside India and almost nowhere else.
It carries the country. IN-MH is
self-disambiguating. MH alone could be Maharashtra, the
Marshall Islands country code, or a US state in some legacy systems.
ISO maintains the boundary changes. When Ladakh
became IN-LA in 2019, the ISO Maintenance Agency
published the updated subdivision list within months. Census revisions
follow a slower, decade-aligned cadence.
Every row in /v1/cities with iso_alpha2 = "IN"
has a populated state_code in the IN-XX
form. Joins to your tax data, your transit data, your GIS data all
work without a translation table.
If you're storing Indian states by Census abbreviation today, this is a decision worth revisiting before the next dataset import surprises you with three states quietly dropped on the floor.