Gov APImahabhulekh.maharashtra.gov.in ↗
Access Maharashtra Bhulekh land records via API. Retrieve 7/12 Satbara, 8A, and property cards by district, taluka, village, and survey number.
What is the Gov API?
This API exposes 8 endpoints for navigating Maharashtra's Bhulekh land records portal, covering the full administrative hierarchy from district down to individual survey numbers. Use get_districts to fetch all Maharashtra districts with Marathi names and numeric IDs, then drill into talukas, villages, and survey numbers before retrieving official 7/12 (Satbara), 8A, or property card documents. All names are returned in Marathi as they appear on the official portal.
// select an endpoint above
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace mahabhulekh-maharashtra-gov-in-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Maharashtra Bhulekh Land Records — navigate the district/taluka/village/survey hierarchy."""
from parse_apis.maharashtra_bhulekh_land_records_api import Bhulekh, District, NotFoundError
client = Bhulekh()
# List all districts in Maharashtra
for district in client.districts.list(limit=5):
print(district.id, district.name)
# Drill into a known district's talukas via constructible resource
pune = client.district(id="25")
for taluka in pune.talukas.list(limit=3):
print(taluka.id, taluka.name, taluka.district_id)
# Navigate deeper: first taluka -> its villages
taluka = pune.talukas.list(limit=1).first()
if taluka:
for village in taluka.villages.list(limit=3):
print(village.id, village.name)
# Get survey numbers for the first village
village = taluka.villages.list(limit=1).first()
if village:
try:
for survey in village.survey_numbers.list(survey_prefix="1", limit=5):
print(survey.id, survey.name)
except NotFoundError as exc:
print(f"Survey lookup failed: {exc}")
# Retrieve a fresh captcha token for record searches
token = client.captchatokens.get()
print(token.viewstate_generator, len(token.captcha_image_b64))
print("exercised: districts.list / district().talukas.list / taluka.villages.list / village.survey_numbers.list / captchatokens.get")
About the Gov API
Administrative Hierarchy Navigation
The API follows a strict cascade: start with get_districts (no inputs required), which returns an array of objects each containing an id and a Marathi name. Pass the district_id to get_talukas to receive taluka-level objects that include id, name, and the parent district_id. From there, get_villages requires both district_id and taluka_id, returning village objects with long numeric id strings alongside their Marathi names. Finally, get_survey_numbers accepts an optional survey_prefix string to filter the result set to entries whose survey/gat number starts with that value — useful when you know a partial survey number and want to narrow the list.
Captcha-Gated Record Retrieval
Searching for actual land records requires completing a captcha challenge first. Call get_captcha to receive a captcha_image_b64 (a base64-encoded PNG) alongside three ASP.NET session tokens: viewstate, viewstate_generator, and event_validation. These tokens are session-specific and expire quickly, so they must be used promptly. Once you have solved the captcha text, pass it along with all four token fields and the relevant location IDs to one of the three search endpoints.
Record Search Endpoints
search_712 returns the 7/12 Satbara utara — the primary land ownership and crop record in Maharashtra — as an HTML string in the data.html field along with a status value. search_8a retrieves the 8A record (rights register extract) using a khata_id in place of survey_id. search_property_card targets urban property cards, substituting cts_id for the survey identifier and office_id for the taluka context. All three search endpoints accept an optional mobile number (10 digits) and return the same {data: {html}, status} shape. The HTML in the response mirrors the formatted record as it appears on the official Bhulekh portal.
The Gov API is a managed, monitored endpoint for mahabhulekh.maharashtra.gov.in — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when mahabhulekh.maharashtra.gov.in changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official mahabhulekh.maharashtra.gov.in API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Automating bulk retrieval of 7/12 Satbara records across multiple villages for agricultural due diligence
- Building a district-to-survey-number lookup tree for a Maharashtra property research tool
- Extracting land ownership data from 8A records to verify khata holder information before transactions
- Populating a property card database for urban Maharashtra wards using search_property_card
- Filtering survey numbers by prefix via survey_prefix to locate a specific parcel within a large village
- Integrating Bhulekh record lookups into a legal or fintech workflow that requires verified Maharashtra land data
- Auditing land records programmatically across talukas to detect anomalies in survey number assignments
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does mahabhulekh.maharashtra.gov.in have an official developer API?+
What does get_survey_numbers return, and how does the survey_prefix filter work?+
id and a name representing individual survey or gat numbers within the specified village. The optional survey_prefix parameter narrows the result to entries whose name starts with that string — for example, passing "12" would return survey numbers like "12", "12/1", "120", etc. Omitting it returns the full list for the village.How quickly do the captcha tokens from get_captcha expire?+
viewstate, viewstate_generator, and event_validation tokens returned by get_captcha are session-scoped and expire quickly — typically within a few minutes. You should solve the captcha and submit the search request in the same short window. Calling get_captcha again generates a fresh set.Does the API return parsed land record fields like owner name, area, or crop details separately?+
search_712, search_8a, search_property_card) return the record as a raw HTML string in data.html rather than as discrete structured fields. You can fork this API on Parse and revise it to parse the HTML and extract specific fields such as owner name, survey area, or encumbrance details as structured output.