Built in India, for India's builders

Give your AI
India's district data.

Connect Claude, Cursor, ChatGPT or your own agent to every public Indian dataset through one MCP server — already cleaned, crosswalked onto a single district geography, and carrying its own source, vintage and caveat. Or call the same data directly with a keyless REST API. Free to use. No key. No signup.

800+ districts131 indicators14 data domains10+ official sources

Connected in about 30 seconds.

A remote MCP server at https://api.spatialindia.com/mcp. Nothing to install, nothing to authorise, no key to paste — pick the client you already work in and copy one line.

ClaudeCursorChatGPTVS CodeYour own agent

Spatial India MCP

DistrictsIndicatorsBoundariesMethodologyMap links

Settings → Connectors → Add custom connector, then paste this URL.

https://api.spatialindia.com/mcp

Restart Claude afterwards — tools are discovered once, at startup.

Rather have your assistant do it? Copy the whole setup as a prompt.

See Spatial India keep an AI grounded.

Three questions a model gets wrong on its own: a ranking it cannot source, the wrong Bilaspur, three survey years in one sentence.

You

Which districts in Uttar Pradesh have the worst child stunting?

Spatial India MCP

  1. find_indicatorthe child stunting indicator id
  2. rank_districtsUttar Pradesh districts by child stunting
  3. get_methodologythe child stunting definition, vintage and attribution

The three worst-affected districts in Uttar Pradesh, out of the 75 the survey reached:

DistrictChild Stunting
1Bahraich52.1%
2Budaun51.8%
3Sambhal51.6%

Height-for-age below −2 SD (WHO Child Growth Standard). National Family Health Survey (NFHS-5), 2019–21. Every district in the state is covered.

Open Uttar Pradesh on the map

Ask anything about India. Get an answer you can cite.

You ask in plain English. It works out which indicator you mean, ranks or compares the districts, and hands back the definition, the year and a map — so the number is one you can put in print.

Find the right measure

Say “stunting” or “land inequality” — it returns the exact indicator, its unit and its source.

Land on the right place

Two districts are named Bilaspur. It hands back both and asks which — it never quietly picks one.

Put places side by side

Jaipur, Indore and Patna on health, literacy and credit — columns never published together, in one call.

Find the best and the worst

Best or worst, nationwide or inside one state. Districts a survey missed never fake an extreme.

Defend the number

Source, year, definition, caveat and a citation you can paste — before the figure reaches print.

Finish with a map

Every answer links a live map — ready to explore interactively, screenshot, or embed.

Everything, already stitched together.

14 domains, one schema, one call. 96 datasets from 10+ official sources, every one crosswalked onto the current 800+ district geography and versioned.

Demographics

Population, sex ratio, urbanization — the baseline for every model.

11 indicators
RESTMCP

Health & Nutrition

Stunting, anemia, institutional births for healthcare planning.

7 indicators
RESTMCP

Health Coverage

Insurance and vaccination coverage for underwriting and outreach.

11 indicators
RESTMCP

Education

Literacy and schooling to segment markets and target programs.

8 indicators
RESTMCP

Women & Gender

Gender gaps in literacy, work, and safety — lived-experience signals.

13 indicators
RESTMCP

Infrastructure

Sanitation, electricity, water, banking access for site selection.

18 indicators
RESTMCP

Transport & Connectivity

Highway and rail network length per district for logistics and corridor analysis.

9 indicators
RESTMCP

Governance

Judicial backlog and case delay as institutional-quality proxies.

7 indicators
RESTMCP

Safety & Crime

Seven crime rates per lakh for risk scoring and safety indices.

23 indicators
RESTMCP

Climate & Environment

Climate vulnerability for ESG and physical-risk assessment.

8 indicators
RESTMCP

Employment

Worker participation and MGNREGA demand as distress signals.

10 indicators
RESTMCP

Economy

MSME density, bank credit, agricultural land — the economic pulse.

13 indicators
RESTMCP

Land & Agriculture

Holding size, irrigation, land equity for agri and credit models.

11 indicators
RESTMCP

Lifestyle & Diseases

NCD and lifestyle indicators for insurance and pharma.

3 indicators
RESTMCP

+More shipping regularly

UDISE+ education, HMIS health, crop production, PM2.5, elections — new sources land as new ids in the same schema. Additive, versioned, never breaking.

What people are actually asking it.

Research, journalism, policy, product work — one connection, four different jobs. Each of these is a real request, with the tools it reaches for underneath.

Research

“Build me a replication table for these 50 districts, with the citation.”

One district geography across every source, and a citation that survives peer review.

compare_districts → get_methodology

Journalism

“Which districts have high literacy but the lowest bank credit?”

A sourced number before deadline, the caveat that keeps it defensible, and a map to run beside it.

find_indicator → rank_districts → build_map_link

Policy

“Find districts where stunting is above 40% and institutional births below the median.”

Targeting on measured conditions rather than on the districts someone already had a spreadsheet for.

rank_districts across domains

Data products

“Give me every district with its boundary and the source for each field.”

District search, full profiles and polygons, without owning the pipeline that produces them.

/v1/districts?q= and /v1/boundaries/{objectid}.geojson

Or call it directly.

The same data, the same numbers, over 5 endpoints and no SDK to learn. Open one for its parameters, its caps and a call you can paste.

Every indicator id with its unit, source, vintage, caveat, estimation method, ranking polarity, district coverage and how many of those districts report a hard zero. Start here — ids are stable and are what every other endpoint takes.

qstring
Free-text filter. Every word must appear in the id, name, description, category, source or caveat.
limitinteger
Page size.
offsetinteger
Page offset.
curl "https://api.spatialindia.com/v1/indicators?q=land+inequality"

Without `indicators` this is the district directory. With them it is the joined table, sorted and paged. Ranking, comparison and name search are all this one endpoint.

statestring
Restrict to one state.
qstring
District name or a known alternative spelling. Exact match first, substring only if nothing matched exactly. Returns every match with its state.
indicatorscsv
Up to 5 indicator ids.
sortstring
A field: objectid, district, state, population_2011, area_sqkm, or an indicator you asked for. This names a field — direction is `order`.
orderasc | desc
Defaults to asc.
limitinteger
Max 100, defaults to 50.
offsetinteger
Page offset.
curl "https://api.spatialindia.com/v1/districts?q=bilaspur"

Every published indicator for one district in a single call. `indicators` narrows it and, unlike on /v1/districts, is uncapped — the default is already everything.

indicatorscsv
Optional. Omit for the full profile.
curl "https://api.spatialindia.com/v1/districts/421"

A GeoJSON Feature with the polygon, its objectid, name and state.

curl "https://api.spatialindia.com/v1/boundaries/421.geojson"

OpenAPI 3.1 for everything above. Generate a client from it — we do not ship SDKs.

curl "https://api.spatialindia.com/v1/openapi.json"

Full types and response schemas are in the OpenAPI document. Generate a client from it — we do not ship SDKs, because two hand-written ones are two things to keep current.

One call. The number, its source, and everything around it.

Three numbers are the answer. The rest of the response is the definition, the vintage, the coverage and the citation — so you never publish a figure you cannot defend.

GET/v1/districts

curl "https://api.spatialindia.com/v1/districts?state=Maharashtra&indicators=nfhs5_stunting&sort=nfhs5_stunting&order=desc&limit=3"

Top 3 districts by child stunting, Maharashtra

Nandurbar45.8%
Buldhana45.0%
Latur43.2%
Dataset
National Family Health Survey (NFHS-5) · 2019–21
Definition
Height-for-age below −2 SD (WHO Child Growth Standard).
Coverage
36 of 36 districts in Maharashtra carry a value
Citation
Spatial India. (2026). …
{
  "meta": {
    "dataset_version": "2026-09-15",
    "boundary_vintage": "808-polygon district geography, 780 named",
    "districts": 780,
    "indicators": [
      {
        "id": "nfhs5_stunting",
        "name": "Child Stunting",
        "unit": "%",
        "source": "National Family Health Survey (NFHS-5)",
        "vintage": "2019–21",
        "caveat": "Height-for-age below −2 SD (WHO Child Growth Standard).",
        "estimation_method": "Inherited from parent district",
        "polarity": "higher-worse",
        "status": "published"
      }
    ],
    "attribution": [
      "Census of India 2011, …",
      "NFHS-5 2019–21, …"
    ],
    "citation": "Spatial India. (2026). …"
  },
  "total": 36,
  "count": 3,
  "limit": 3,
  "offset": 0,
  "districts": [
    {
      "objectid": 550,
      "dist_lgd": "486",
      "district": "Nandurbar",
      "state": "Maharashtra",
      "population_2011": 1648295,
      "area_sqkm": 5736.4,
      "values": {
        "nfhs5_stunting": 45.8
      },
      "estimated": {
        "nfhs5_stunting": false
      }
    },
    {
      "objectid": 567,
      "dist_lgd": "472",
      "district": "Buldhana",
      "state": "Maharashtra",
      "population_2011": 2586258,
      "area_sqkm": 9401.44,
      "values": {
        "nfhs5_stunting": 45
      },
      "estimated": {
        "nfhs5_stunting": false
      }
    },
    {
      "objectid": 545,
      "dist_lgd": "481",
      "district": "Latur",
      "state": "Maharashtra",
      "population_2011": 2454196,
      "area_sqkm": 6997.13,
      "values": {
        "nfhs5_stunting": 43.2
      },
      "estimated": {
        "nfhs5_stunting": false
      }
    }
  ]
}

The gotchas, already solved.

Indian district data breaks on names, spellings and duplicates long before it breaks on statistics. Each of these is one call, and each answer below is what it really returns.

What is the id for the thing I care about?

curl "https://api.spatialindia.com/v1/indicators?q=land+inequality"

One match: ag_gini, the land Gini coefficient, Agricultural Census 2015–16.

Two states share this district name. Which is which?

curl "https://api.spatialindia.com/v1/districts?q=bilaspur"

Two rows — Himachal Pradesh (62) and Chhattisgarh (134) — each with its own objectid.

I have the spelling the source used, not yours.

curl "https://api.spatialindia.com/v1/districts?q=baramulla"

Resolved through the alias table to Baramula, objectid 8.

Everything known about one district.

curl https://api.spatialindia.com/v1/districts/421

Majuli, Assam: all 131 published indicators in a single read.

Just the district list, before I know what I want.

curl https://api.spatialindia.com/v1/districts

The spine — name, state, dist_lgd, population and area for every district. 50 rows by default, 100 at most.

Just the boundary, for a map.

curl https://api.spatialindia.com/v1/boundaries/421.geojson

One GeoJSON Feature: the polygon, its objectid, name and state.

Free. Here is exactly how free.

No key and no quota to buy. The caps are the product boundary rather than a performance guard — they are the whole difference between this and a bulk export.

Free

Live now

Everything on this page, today.

Authentication
None. No key, no signup, no header.
Indicators per call
5 on /v1/districts. Uncapped on a single district profile.
Rows per call
100 maximum, 50 by default.
Rate limit
20 requests per minute per IP on /v1, 12 on /mcp. Cached responses count.
Caching
Responses are cached for up to a week. The data only changes at build.
CORS
Open. Call it from a browser.
Licence
Personal and non-commercial, with attribution. Commercial is not open yet.

Nothing here needs an account.

Bulk & commercial

SOON

The one thing the caps deliberately prevent — the whole table in one read.

  • The whole joined table in one call
  • No cap on indicators per row
  • A commercial licence — ship it in what you sell
  • CSV with the metadata header
  • Crosswalks onto your own geography
  • Invoice billing
Tell us what you need →

What the numbers do and do not say.

Each of these is a mistake we have watched a spreadsheet or a model actually make. Skim the headings; open the one that describes what you are about to do.

96 datasets publish 131 indicator ids, because twenty of them carry more than one value — Population alone is Male and Female. Every id resolves to exactly one number, which is what sorting and ranking require. Both counts are correct and they measure different things.

Bilaspur, Balrampur, Hamirpur and Pratapgarh each name two districts in different states. Resolve a name with /v1/districts?q= — it returns every match with its state — and keep the objectid. Ids are pinned across data refreshes.

No source covers all 780 districts. A missing value is null, and every catalogue entry carries the count of districts that do have one. Sorting puts nulls last in both directions, so a "worst 20" never leads with districts the survey skipped.

coverage counts every district with a number, including the ones reporting 0. On the crime counts most of coverage IS zeros — the domestic-violence id is 0 in 734 of 769 districts, because those cases are filed under a different act — so ranking ascending returns hundreds of tied zeros. Read zero_districts before you call the bottom of a ranking the best.

Twenty datasets publish both — POCSO cases and POCSO cases per lakh, blood banks and blood banks per lakh. The count tracks how many people live there. unit is "cases" or "plants" on one and "per lakh" on the other, and every count is polarity neutral for that reason. Rank a count and you have ranked population.

Where a district was created after a source was published, its value is inherited or apportioned from the parent district. Each value carries its own estimated flag and the method that produced it — one source can be measured in 750 districts and estimated in 19. A rate divided by Census population inherits the flag from its denominator too, so estimation_method on those names both methods.

Census figures are 2011; NFHS-5 is 2019–21; RBI credit is current. Every response carries the source, vintage and caveat of each indicator it returns. Quote them alongside the number.

higher-better, higher-worse, or neutral. Neutral means neither tail is good or bad — a headcount, a share, a rate with two failure modes — and must not be ranked as an achievement.

Spatial India is not a government body. This is a harmonisation of published government releases onto one district geography. Where a figure matters, check it against the source named in the response.

Frequently Asked Questions

No key, no signup, no rate-limit tier to buy. The API is free and read-only, bounded by the caps above.

Bulk and commercial. The whole joined table for as many indicators as you want, in one call, as CSV with the metadata header — that is the one thing the caps here deliberately prevent — and a licence that lets you put the data in something you sell. Neither is on sale, and there is no date. Nothing on this page needs an account. Tell us what you need in the box at the bottom — what you would build, at what volume, under what licence. That is what decides the order these get built in, and there is no other queue.

Not yet. The default licence in our terms is personal and non-commercial, and this API ships under it. The underlying government sources are commercially usable under their own licences — that is what the attribution array in every response is for — but we have not yet written the commercial terms that would let you redistribute our harmonisation. Say so in the box at the bottom if that is what you need.

Frozen. /v1 changes are additive only, and a published indicator id is never removed or reused — a retired one stays in the catalogue with status "deprecated", every value null, and a replaced_by pointer. A district keeps its objectid across refreshes. A breaking change would be /v2.

When a source publishes. Each response carries dataset_version, so you can tell exactly which vintage you read. New sources arrive as new indicator ids in the same schema.

No, and there will not be. There is an OpenAPI 3.1 document at /v1/openapi.json — generate a client in whatever language you use. A hand-written SDK in two languages is two things to keep current and two ways to fall behind the API.

An open standard for connecting AI assistants to tools. Our server is remote, keyless and read-only, and exposes six task-shaped tools rather than a mirror of the REST endpoints — so an assistant gets the caveat and the vintage with the number, and can hand back a map link.

Any client that speaks remote MCP over streamable HTTP — the section above has copy-paste setup for Claude, Claude Code, Cursor, VS Code, ChatGPT, Gemini, Codex and Windsurf, and the server URL alone is enough for anything else. There is no npm package to install: it is a URL, not a program you run.

No. It is read-only and it has no idea who you are. Six tools, all of them lookups against published government data. There is no write path, no account, no key and nothing stored about a call beyond ordinary edge logs.

It returns every match with its state and refuses to pick one. Bilaspur, Balrampur, Hamirpur and Pratapgarh each name two districts, so guessing would produce a confident answer about the wrong place. The assistant is expected to ask you which one you meant.

Yes — that is what the box at the bottom of this page is for. Requests with a concrete use case get built first. Corrections get looked at the same week.

Feature requests

What is missing?

The catalogue grows from what people ask for. Tell us the indicator, the endpoint or the district you need and what you are building — concrete use cases get built first.