Land Parcels inside a Drawn Area API
Yes. The LandLens area sweep lists every survey parcel inside an area you draw, sent as a GeoJSON polygon, anywhere in Tamil Nadu. Filter by size in acres and leave out industrial zones, eco-sensitive zones, the flood layer, reserve forest, aquifer recharge areas, road widening lines or government land. Each parcel comes with its survey number, revenue codes, area in acres and hectares, boundary as GeoJSON and, where the revenue register holds one, the recorded owner. Where the boundary layer has no parcel inside your area, the government's point service is asked which survey lies there. A sweep costs 4 credits, and a sweep that finds nothing is not charged.
https://verified.realestate/api/v1/tools/region_discovery- Price
- 4 credits per sweep
- Source
- State cadastral boundary layer (FMB)
- Coverage
- Mapped survey parcels across Tamil Nadu
- Answers in
- Usually under a second for a small area
Example
curl -X POST https://verified.realestate/api/v1/tools/region_discovery \
-H "Authorization: Bearer $LANDLENS_KEY" \
-H "Content-Type: application/json" \
-d '{"region_geojson":{"type":"Polygon","coordinates":[[[80.227,12.9],[80.229,12.9],[80.229,12.902],[80.227,12.902],[80.227,12.9]]]},"min_area_acres":1}'
{
"ok": true,
"status": "ok",
"data": {
"found": true,
"page": 1,
"page_size": 30,
"total": 7,
"capped": false,
"area_unit": "acres",
"filters_applied": ["min area 1 acres"],
"unfiltered": false,
"parcels": [
{
"survey": "722",
"survey_number": "722",
"district_code": "2",
"taluk_code": "11",
"village_code": "013",
"area_acres": 4.78,
"area_hectares": 1.934,
"is_govt": false,
"boundary_geojson": "{\"type\":\"MultiPolygon\",\"coordinates\":[[[[80.2277681,12.901071], ...]]]}",
"rural_urban": "rural"
}
],
"filter_note": "Applied: min area 1 acres. Anything in cannot_filter_by was NOT applied, so say so rather than implying the list already satisfies it."
},
"credits_quoted": 4,
"credits_charged": 4,
"credits_waived": 0
}
A real answer for a 200 metre square at Sholinganallur, Chennai, trimmed: one of seven parcels, its boundary cut short, and empty fields and cannot_filter_by left out.
What it returns
One call, one page of up to 30 parcels. found is false (status not_found) when nothing matches, and message says why.
| Field | What it holds |
|---|---|
parcels[] | Each parcel: survey (with sub-division), survey_number, sub_division, district_code, taluk_code, village_code, area_acres, area_hectares, is_govt, boundary_geojson and rural_urban. |
owner_name, owner_name_ta, owner_source | Where the revenue register holds the parcel: the recorded owner in English and Tamil ("+N more" when there are several) and which register it came from. |
total, page, page_size, capped | How many parcels lie in the area, which page this is, and whether the sweep stopped at its cap. |
filters_applied, unfiltered, cannot_filter_by, filter_note | Exactly which filters were applied, and what this sweep cannot filter by (zoning, vacancy, water body distance, guideline value, ownership). |
surveys_here, identified_by_government | When the boundary layer is empty here: the surveys the state survey service names inside the area, with village names and owner_records_held. |
message | When nothing matched: whether the filters ruled every parcel out or the area is not mapped. |
Ways to call it
The area travels as region_geojson. LandLens's own map supplies it, so it is not in the input schema; an API caller sends it with the filters.
Every parcel in the area
The polygon alone. A GeoJSON Polygon, coordinates in longitude, latitude order.
{"region_geojson": {"type": "Polygon","coordinates": [[[80.227,12.9],[80.229,12.9],[80.229,12.902],[80.227,12.902],[80.227,12.9]]]}}
Filtered by size and zone
Add a size range and the zones to leave out.
{"region_geojson": {"type": "Polygon","coordinates": [["..."]]},"min_area_acres": 1,"exclude": ["flood","govt"]}
Inputs
The JSON body of the POST is the arguments. Send region_geojson as well: a GeoJSON Polygon object (longitude, latitude). Without it the call answers not_found and charges nothing.
| Argument | Type | What to send |
|---|---|---|
min_area_acres |
number | Smallest parcel to list, in acres. |
max_area_acres |
number | Largest parcel to list, in acres. |
exclude |
array | Leave out parcels touching any of: industrial, eco_sensitive, flood, reserve_forest, aquifer, road_widening, govt. |
page |
integer | Page number, 30 parcels a page. Default 1. |
Code
Set LANDLENS_KEY to your key. In an AI app, connect https://verified.realestate/mcp once and ask in plain words instead. In Postman, download this API's collection, import it (File, Import) and set apiKey.
curl -X POST https://verified.realestate/api/v1/tools/region_discovery \
-H "Authorization: Bearer $LANDLENS_KEY" \
-H "Content-Type: application/json" \
-d '{"region_geojson":{"type":"Polygon","coordinates":[[[80.227,12.9],[80.229,12.9],[80.229,12.902],[80.227,12.902],[80.227,12.9]]]},"min_area_acres":1}'
import os, requests
r = requests.post(
"https://verified.realestate/api/v1/tools/region_discovery",
headers={"Authorization": f"Bearer {os.environ['LANDLENS_KEY']}"},
json={
"region_geojson": {
"type": "Polygon",
"coordinates": [
[
[
80.227,
12.9
],
[
80.229,
12.9
],
[
80.229,
12.902
],
[
80.227,
12.902
],
[
80.227,
12.9
]
]
]
},
"min_area_acres": 1
},
timeout=30,
)
body = r.json()
print(body["status"], body["credits_charged"], body["data"])
const res = await fetch("https://verified.realestate/api/v1/tools/region_discovery", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LANDLENS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"region_geojson": {
"type": "Polygon",
"coordinates": [
[
[
80.227,
12.9
],
[
80.229,
12.9
],
[
80.229,
12.902
],
[
80.227,
12.902
],
[
80.227,
12.9
]
]
]
},
"min_area_acres": 1
}),
});
const body = await res.json();
console.log(body.status, body.credits_charged, body.data);
Here is the boundary of the area we are looking at as GeoJSON. List every parcel inside it of 1 acre or more, and leave out government land.
Your AI sends the polygon with the filters and lists the parcels, saying which of your conditions it could not filter by.
Responses
Every answer has the same envelope. What status can say for this call:
| status | What it means |
|---|---|
ok | At least one parcel matched. Charged for a sweep (see pricing). |
not_found | No parcel matched, no region_geojson was sent, or the register did not answer. message or error says which. Not charged. |
insufficient_credits | HTTP 402, with the credits needed, your balance and where to top up. |
error | The call failed on our side. Nothing is charged. |
Where the data comes from
The state cadastral boundary layer (the FMB survey parcels), with owners from the revenue A-register and the town survey register, and government land from the register's own classification.
Survey parcels mapped in the state cadastral layer across Tamil Nadu. The layer has no polygon for some large undivided surveys; for those the sweep names the survey from the state survey service instead, with how many owner records the register holds on it.
Read from our copy of the state cadastral layer, downloaded again about once a year, and our copy of the revenue registers for owners.
Every parcel that intersects your polygon is listed, filtered by size and by the exclusion layers you name. An empty sweep is re-run without filters to say whether the filters or the mapping explain it, and an unmapped area is probed at two interior points through the state survey service.
Who uses it
Land aggregators
Draw the corridor you are buying in and get every parcel inside it, with owners to trace.
GIS teams
Send a project boundary from your own map and get the survey parcels, revenue codes and boundaries back as GeoJSON.
Infrastructure and acquisition consultants
List the survey numbers an alignment or a site boundary touches, before the notification.
Limits and good practice
- The polygon is not in the published input schema. Send it as region_geojson anyway; the API accepts it.
- No land use, wet or dry, vacancy or guideline value filter. Check classification per parcel afterwards with igr_classification or zone_check.
- The cadastral layer is uneven across the state. Few results can mean a thinly mapped area, not an empty one.
- A parcel is listed if it touches the polygon, so the area of the parcels listed can exceed the area drawn.
- Tamil Nadu only.
Pricing
A sweep costs 4 credits, charged on the first page that returns parcels. The next pages of the same sweep are free up to the fifth; each further block of five pages carries a smaller charge, shown in credits_charged. A sweep that finds nothing is not charged. Credits come from the same LandLens wallet as the chat and the minis. How billing works.
For thousands of calls a month, a portfolio sweep or a platform built on these registers, we quote a customised bulk price, with invoicing to match.
Questions
Is there an API to get all land parcels inside a polygon in Tamil Nadu?
Yes. Send LandLens a GeoJSON polygon and it returns every mapped survey parcel inside it, with revenue codes, size, boundary and recorded owner, over plain HTTPS or as an MCP tool.
How much does it cost?
A sweep costs 4 credits, which covers its first five pages. A sweep that finds nothing is not charged.
What format does the area take?
A GeoJSON Polygon in region_geojson, with coordinates in longitude, latitude order.
What if nothing is mapped inside my area?
The state survey service is asked which survey lies there, and the answer names it with how many owner records the register holds on it.
Updated 22 Oct 2026 · OpenAPI description