Neighbouring Plots and Owners API for Tamil Nadu
Yes. The LandLens neighbouring plots API takes a point inside a Tamil Nadu plot (and its survey number, when known) and returns every parcel that shares a boundary with it, each with its recorded owner in Tamil and English, patta number, land type, extent and boundary, and a flag for road or street, government land and watercourse. A road_access summary says whether any boundary-sharing parcel is a road or public land, which is the recorded evidence of access. It costs 2 credits per call, and nothing when no neighbours are found.
https://verified.realestate/api/v1/tools/neighbours- Price
- 2 credits per answer
- Source
- Cadastral map with the revenue registers
- Coverage
- Village and town land statewide
- Answers in
- Usually 1 to 2 seconds
Example
curl -X POST https://verified.realestate/api/v1/tools/neighbours \
-H "Authorization: Bearer $LANDLENS_KEY" \
-H "Content-Type: application/json" \
-d '{"lat":12.842117,"lng":80.030955,"survey_number":"65","sub_division":"4B","village_code":"196"}'
{
"ok": true,
"status": "ok",
"data": {
"found": true,
"mode": "adjacent",
"source_parcel": {
"survey": "65/4B",
"district_code": "3",
"taluk_code": "14",
"village_code": "196"
},
"source_geojson": "{\"type\":\"Polygon\",\"coordinates\":[[[80.0309257,12.8423138],[80.031065,12.8423017],…]]}",
"nearby_geojson": null,
"count": 6,
"neighbours": [
{
"survey_number": "65",
"sub_division": "4A",
"survey": "65/4A",
"district_code": "3",
"taluk_code": "14",
"village_code": "196",
"distance_meters": 0,
"shares_boundary": true,
"boundary_geojson": "{\"type\":\"Polygon\",\"coordinates\":[[[80.0309257,12.8423138],[80.030851,12.8419662],…]]}",
"is_govt": false,
"is_road": false,
"extent_sqm": 350,
"ownership_source": "The rural land register",
"land_type_ta": "நஞ்சை",
"land_type_en": "Wet",
"patta_no": "2880",
"is_watercourse": false
}
],
"road_access": {
"touches_road_or_street_parcel": false,
"road_parcels": [],
"touches_government_land": false,
"government_parcels": [],
"watercourse_parcels": [],
"unclassified_government_parcels": [],
"unregistered_parcels": [],
"note": "No adjacent parcel is classified as a road/street in the registers. That SUGGESTS no direct recorded road frontage, but private pathways, easements and unregistered access are not in these registers - recommend a field survey / FMB check before concluding the land is landlocked."
},
"note": "These are ONLY the parcels sharing a boundary with the source parcel, each with its recorded owner inline (single response, no further owner lookups needed). Owners come from the offline registers, confirm against the live patta/TSLR for legal use. For road-access questions answer directly from road_access."
},
"credits_charged": 2
}
A real answer from the API (22 Oct 2026). Six neighbours came back; one is shown, with its owners left out and its boundary shortened. The plot's own outline is shortened too.
What it returns
One call, one plot and its neighbours. found is false (status not_found, nothing charged) when no parcel or no neighbour is found.
| Field | What it holds |
|---|---|
neighbours[] | Each boundary-sharing parcel: survey, survey_number, sub_division, the revenue codes, boundary_geojson and shares_boundary. |
neighbours[].owners[] | The recorded holders, each with name_en and name_ta. |
neighbours[].patta_no, land_type_en, land_type_ta, extent_sqm | The patta number, the land type (Wet, Dry, Poramboke) and the extent in square metres. |
neighbours[].is_road, is_govt, is_watercourse, classification | Whether the parcel is a road or street, government land or a watercourse, and the register's description where it gives one. |
neighbours[].ownership_source | Which register the owner was read from, in plain words. |
neighbours[].other_village | Set when the neighbour lies across a village line, with that village's name. |
road_access | touches_road_or_street_parcel, road_parcels, touches_government_land, government_parcels, watercourse_parcels, unclassified_government_parcels, unregistered_parcels, and a note in plain words. |
source_parcel, source_geojson | The plot the neighbours were found for, and its outline. |
mode | adjacent when the plot was found; radius_fallback when the point was in no parcel and the list is by distance only. |
Inputs
The JSON body of the POST is the arguments. lat and lng are required. Send the survey number and village code from resolve_parcel too.
| Argument | Type | What to send |
|---|---|---|
latrequired |
number | Latitude in decimal degrees |
lngrequired |
number | Longitude in decimal degrees |
survey_number |
string | When the plot is already resolved, its survey number (without the sub-division). It anchors the plot exactly; without it a point near a boundary can anchor to the neighbour. |
sub_division |
string | The plot's sub-division, e.g. 4B. |
village_code |
string | Village code of the resolved plot, when known |
radius |
number | The window, in metres, searched for candidates (10 to 500, default 150). Adjacency itself is by shared boundary. |
firka_ward_number |
string | Town survey ward of the resolved plot (urban only), when known |
ulpin |
string | ULPIN of the resolved plot, when known. It names one parcel exactly, so pass it whenever the resolved plot carries one. |
urban_block_number |
string | Town survey block of the resolved plot (urban only). A town survey number repeats in every block, so pass it with the survey number when known. |
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/neighbours \
-H "Authorization: Bearer $LANDLENS_KEY" \
-H "Content-Type: application/json" \
-d '{"lat":12.842117,"lng":80.030955,"survey_number":"65","sub_division":"4B","village_code":"196"}'
import os, requests
r = requests.post(
"https://verified.realestate/api/v1/tools/neighbours",
headers={"Authorization": f"Bearer {os.environ['LANDLENS_KEY']}"},
json={
"lat": 12.842117,
"lng": 80.030955,
"survey_number": "65",
"sub_division": "4B",
"village_code": "196"
},
timeout=60,
)
body = r.json()
print(body["status"], body["credits_charged"], body["data"])
const res = await fetch("https://verified.realestate/api/v1/tools/neighbours", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LANDLENS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"lat": 12.842117,
"lng": 80.030955,
"survey_number": "65",
"sub_division": "4B",
"village_code": "196"
}),
});
const body = await res.json();
console.log(body.status, body.credits_charged, body.data);
Who owns the plots next to survey 65/4B in Kavanoor, and does my land touch a road?
Your AI resolves the plot, says the price, and lists each neighbour with its owner and whether any is a road.
Responses
Every answer has the same envelope. What status can say for this call:
| status | What it means |
|---|---|
ok | Neighbours were found. Charged 2 credits. |
not_found | No parcel at the point, no neighbour inside the window (retry with a larger radius), the point is outside Tamil Nadu, or the lookup failed. Nothing is charged. |
invalid_args | lat or lng is missing. |
insufficient_credits | The account does not hold enough credits for the call. |
Where the data comes from
The Tamil Nadu cadastral boundary layer for the parcel outlines, with each neighbour's owner and classification from the revenue A-register (village land) and the town survey land register (town land).
Village survey land and town survey land across Tamil Nadu, wherever the state map carries the parcel outlines.
Read from our copies of the state parcel map and the registers. Owners are as the register last recorded them; confirm against a live patta or TSLR for legal use.
The plot is fixed by its survey number when you send one, otherwise by the parcel containing the point. Neighbours are the parcels whose outline touches the plot's, not merely those nearby. A road, watercourse or government flag is read from the register's own classification and remarks; a government parcel the register does not describe is reported as unclassified rather than guessed.
Who uses it
Advocates
Check the boundaries in a sale deed's schedule (north, south, east, west) against the recorded neighbours.
Buyers
See whether a plot touches a road or is landlocked behind private land, before paying an advance.
Developers
Find the owners of adjoining parcels when assembling land for a project.
Limits and good practice
- Owners are from the registers as last recorded, not proof of title. Confirm with a live patta or TSLR before legal use.
- A road flag is the register's classification. Private pathways, easements and unregistered access are not in the registers; no road flag means no RECORDED road, not no access.
- Some boundary-sharing parcels have no entry in either register; they are listed in unregistered_parcels rather than counted as private or government.
- When the point is in no parcel, mode is radius_fallback and the list is by distance, not adjacency.
Pricing
Each call costs 2 credits when neighbours are found; nothing when none are. 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 find who owns the land next to mine in Tamil Nadu?
Yes, this one. Send a point in your plot and you get every parcel sharing its boundary, with the owner the register records.
Can it tell me if my land has road access?
It tells you whether any boundary-sharing parcel is recorded as a road, street or public land, in road_access. That is recorded evidence of access; private paths are not in the registers.
Why should I send the survey number as well as the point?
A point near a boundary can fall in the neighbour's parcel. The survey number fixes the plot exactly.
What does it cost?
Each call costs 2 credits when neighbours are found, and nothing otherwise.
Updated 22 Oct 2026 · OpenAPI description