Encumbrance Certificate API for Tamil Nadu
Yes. LandLens reads the Tamil Nadu Registration Department's encumbrance records live for any property, by survey number, document number, plot or flat, or sub registrar village. You get back every registered transaction in the period (sales, mortgages, releases, gifts, partitions) with dates, parties, consideration, a written summary of ownership and charges, and a report link you can share. A pull costs 1 credit, and is refunded if no transactions come back.
https://verified.realestate/api/v1/tools/ec_transactions- Price
- 1 credit on approval
- Source
- Registration department encumbrance records
- Coverage
- Every sub registrar office in the state
- Answers in
- Quote at once; the pull usually within a minute
Example
curl -X POST https://verified.realestate/api/v1/tools/ec_transactions \
-H "Authorization: Bearer $LANDLENS_KEY" \
-H "Content-Type: application/json" \
-d '{"search_by":"survey","rev_district_code":"03","rev_taluk_code":"14","rev_village_code":"196","rev_village_name":"Kavanoor","survey_number":"65","sub_division":"4B","rural_urban":"rural","from":"2005-01-01","to":"2024-12-31"}'
{
"ok": true,
"status": "proposal",
"data": {
"proposal": true,
"action": "ec_transactions",
"label": "Pull the registered transaction history for survey 65/4B in KAVANOOR",
"details": [
{ "k": "Searched under", "v": "KAVANOOR, Kundrathur taluk, Kancheepuram district" },
{ "k": "Period", "v": "01 Jan 2005 to 31 Dec 2024" },
{ "k": "Sub registrar office", "v": "Tambaram Joint 1" }
],
"cost": 1,
"note": "Live fetch from the registration department, it can take a minute. Charged only if transactions come back."
},
"credits_charged": 0,
"next": {
"tool": "approve_action",
"arguments": { "action": "ec_transactions", "params": { "survey_number": "65", "sub_division": "4B", "...": "..." } }
}
}
A real quote from the API, trimmed for length. Approving it starts the pull; job_status returns the rows.
What it returns
The first call returns a quote, with status proposal. Send its next block to approve_action within 30 minutes and the pull runs in the background: you get a job_id, and job_status hands back the result below once it is delivered.
| Field | What it holds |
|---|---|
transactions | Every registered entry in the period: date, document number, the nature of the deed, the executant and the claimant (in Tamil, with English where the record gives it), consideration, extent and the survey numbers the deed names. |
count | How many entries came back. |
summary | A plain reading of the rows: current_owner, ownership_chain, encumbrance_status, red_flags, points_to_note, summary and recommendation. It is written by a model from the rows; the rows are the record. |
security_interests | Every entry whose wording reads as a mortgage, a deposit of title deeds or an othi, matched in English and Tamil, with its document number and date. security_interest_rows is the count. |
report_url | A lasting link to the EC and its summary that anyone can open, to keep on a loan file or send to a client. |
ec_pdf_url | The certificate as the department issued it, when the route that answered produced one. |
sro | The sub registrar office the entries were read from, which is what a certified copy is ordered against. |
search_by, searched_survey | What was actually searched, so the reach of the rows is never in doubt. A document search lists that document's entries only, not later charges on the land. |
Ways to call it
Pick the mode by what you hold. Every mode returns the same quote first.
By survey number
The default. The revenue codes come free from resolve_parcel (a map point) or resolve_revenue_codes (district, taluk and village names).
{"search_by": "survey","rev_district_code": "03","rev_taluk_code": "14","rev_village_code": "196","survey_number": "65","sub_division": "4B","rural_urban": "rural"}
By document number
For a deed you already hold. Name the office, or send the revenue codes so the office resolves itself.
{"search_by": "document","document_number": "2711","document_year": "2019","sro_name": "Neelankarai"}
By plot or flat
For apartments and layouts, where a survey search returns the whole block. Add the survey number to narrow it.
{"search_by": "plot","rev_district_code": "03","rev_taluk_code": "14","rev_village_code": "196","plot_no": "12","flat_no": "B2"}
By sub registrar village
When you know the office and its own village list rather than the revenue village. Zone, district, office and village codes come from sro_lookup.
{"search_by": "registration","zone_code": "…","reg_district_code": "…","sro_code": "…","reg_village_code": "…","survey_number": "65"}
Inputs
The JSON body of the POST is the arguments. Nothing is strictly required: a call with too little to search on answers not_found with what is missing, and charges nothing.
| Argument | Type | What to send |
|---|---|---|
search_by |
string: survey, document, plot, registration | How to search. Default survey. |
rev_district_code |
string | Revenue district code (survey and plot modes; resolves the SRO in document mode) |
rev_taluk_code |
string | Revenue taluk code |
rev_village_code |
string | Revenue village code |
survey_number |
string | Survey number, e.g. 178 (survey mode; optional extra filter in plot mode) |
sub_division |
string | Subdivision, e.g. 5A. Optional. |
rural_urban |
string: rural, urban | "rural" or "urban", as resolve_parcel returns it. For a city property it decides whether the town survey entry of the village is searched first, so send it. |
from |
string | Start date YYYY-MM-DD. Optional, defaults to a wide window. |
to |
string | End date YYYY-MM-DD. Optional, defaults to today. |
document_number |
string | Registered document number (document mode) |
document_year |
string | Registration year of the document, e.g. 2019 (document mode) |
sro_code |
string | SRO code (document and registration modes; from the free SRO lookup when the user names the office) |
sro_name |
string | SRO name (document and registration modes) |
plot_no |
string | Plot number (plot mode) |
flat_no |
string | Flat / apartment number (plot mode) |
block_code |
string | Town survey parcels: the block, from resolve_parcel's land_data. |
document_type |
string | Document type as the SRO lists it. Optional, defaults to a regular document. |
reg_district_code |
string | Registration district code (registration mode) |
reg_village_code |
string | Registration village code as the SRO lists it (registration mode) |
reg_village_name |
string | Registration village name (registration mode) |
rev_district_name |
string | Revenue district name, improves the primary route |
rev_taluk_name |
string | Revenue taluk name |
rev_village_name |
string | Revenue village name |
town_code |
string | Town survey parcels: the revenue town code from resolve_parcel's land_data. |
ward_code |
string | Town survey parcels: the ward, from resolve_parcel's land_data. |
whatsapp |
string | Optional WhatsApp number with country code (e.g. 919876543210). On a busy register the department emails the certificate instead of showing it; with a number it is forwarded there when it arrives. |
zone_code |
string | Registration zone code (registration mode) |
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; the quote, the approval and the job status are chained for you.
curl -X POST https://verified.realestate/api/v1/tools/ec_transactions \
-H "Authorization: Bearer $LANDLENS_KEY" \
-H "Content-Type: application/json" \
-d '{"search_by":"survey","rev_district_code":"03","rev_taluk_code":"14","rev_village_code":"196","rev_village_name":"Kavanoor","survey_number":"65","sub_division":"4B","rural_urban":"rural","from":"2005-01-01","to":"2024-12-31"}'
import os, requests
r = requests.post(
"https://verified.realestate/api/v1/tools/ec_transactions",
headers={"Authorization": f"Bearer {os.environ['LANDLENS_KEY']}"},
json={
"search_by": "survey",
"rev_district_code": "03",
"rev_taluk_code": "14",
"rev_village_code": "196",
"rev_village_name": "Kavanoor",
"survey_number": "65",
"sub_division": "4B",
"rural_urban": "rural",
"from": "2005-01-01",
"to": "2024-12-31"
},
timeout=30,
)
body = r.json()
print(body["status"], body["credits_charged"], body["data"])
const res = await fetch("https://verified.realestate/api/v1/tools/ec_transactions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LANDLENS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"search_by": "survey",
"rev_district_code": "03",
"rev_taluk_code": "14",
"rev_village_code": "196",
"rev_village_name": "Kavanoor",
"survey_number": "65",
"sub_division": "4B",
"rural_urban": "rural",
"from": "2005-01-01",
"to": "2024-12-31"
}),
});
const body = await res.json();
console.log(body.status, body.credits_charged, body.data);
Pull the encumbrance certificate for survey 65/4B in Kavanoor village, Kundrathur taluk, from 2005 to today. Tell me the current owner and whether any mortgage is still open.
Your AI finds the village codes itself, shows you the quote, and pulls only after you say yes.
Responses
Every answer has the same envelope. What status can say for this call:
| status | What it means |
|---|---|
proposal | The quote. Nothing is charged. Approve it by sending next.arguments to approve_action within 30 minutes, unchanged. |
queued | What approve_action answers (HTTP 202), with a job_id. Ask job_status every 30 to 60 seconds; its data.status reads running until the pull ends in done or failed. |
done | In job_status data.status: the payload holds the transactions, summary and report link, and credits_charged says what the pull cost. |
failed | In job_status data.status: the pull could not be completed, with the reason in error. The credit held when it started is returned. |
not_found | Too little to search on (codes or survey number missing). The answer lists what it already has and how to get the rest. |
insufficient_credits | HTTP 402 at approval, with the credits needed, your balance and where to top up. |
Where the data comes from
The encumbrance index of the Tamil Nadu Registration Department: the same entries a sub registrar office certifies when it issues an encumbrance certificate.
Every revenue village and sub registrar office in Tamil Nadu, for the period you ask for. Village survey numbers, town survey numbers (with ward and block), plots and flats in layouts and apartment blocks, and a single registered document by its number and year.
Live. Each approved pull reads the department's index at that moment, so a deed shows as soon as the office has indexed it. Nothing is served from a cache.
The pull searches the office that holds the property, and when that comes back empty it retries at the office directly and then through the state record service, saying which route answered. When the department will not show a long period on screen and emails the certificate instead, the result says so, and a WhatsApp number you pass gets the certificate when it arrives.
Who uses it
Banks and housing finance companies
Run the EC at login rather than waiting for the advocate's report: open mortgages and missing releases show up before the file reaches credit.
Law firms
Start a title opinion from the full registered chain, with document numbers to order certified copies against, and the report link on the file.
Property platforms
Check that the seller on a listing is the last registered owner, and flag an unreleased mortgage before the buyer pays an advance.
Buyers and their advisers
Ask an AI assistant connected to LandLens for the EC in plain words, read the summary, and keep the report link.
Limits and good practice
- Survey mode needs revenue codes, not names. Get them free: resolve_parcel from a map point, resolve_revenue_codes from district, taluk and village names.
- Town survey numbers repeat across wards and blocks. For a city parcel send town_code, ward_code and block_code, or the search can read a different parcel.
- An EC lists what was registered. An equitable mortgage a bank recorded only with CERSAI, an unregistered agreement or an oral partition will not appear in it. Run the CERSAI API alongside it for lender charges.
- A quote lives 30 minutes. Approve it with the arguments exactly as returned; an edited quote is refused.
- On a busy office the department sometimes emails the certificate instead of showing it. Pass whatsapp (with country code) to have it forwarded when it lands.
- The summary is a reading aid, not a legal opinion. Read the deed types in the rows before stating a property is unencumbered.
Pricing
A pull costs 1 credit, held when it starts and returned if no transactions come back. The quote, availability checks and the code lookups before it are free. 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 official TNREGINET API for encumbrance certificates?
The Registration Department does not offer a public developer API for its encumbrance index; its portal is built for one person searching one property. LandLens reads that index for you and returns the entries as JSON, over plain HTTPS or as an MCP tool your AI assistant can call.
How much does an EC pull cost through the API?
A pull costs 1 credit, and it is returned automatically when no transactions come back. Getting the quote is free, and so are the code lookups you make before it.
How far back does the encumbrance search go?
As far as the from and to dates you send, within what the department holds in its online index. Leave them out and a wide window is searched.
Can I search by document number instead of survey number?
Yes. Use search_by document with the document number, its year and the sub registrar office. The result lists that document's own entries, not every later deed on the property.
Does it work for apartments and layout plots?
Yes. Use search_by plot with the plot number or flat number. A survey search on an apartment block returns every flat's deeds, which is rarely what you want.
How does it fit with a legal opinion or a certified copy?
The rows carry the document numbers and the office, which is what a certified copy is ordered against, and the report link can sit on the file the advocate reads.
Updated 22 Oct 2026 · OpenAPI description