Legal Opinion API on your property documents
Yes. The LandLens legal opinion API takes the documents you hold on a Tamil Nadu property (sale deeds, patta, EC, parent documents) and returns a title opinion. Upload each file as base64, then create the project with the location and survey numbers: you get an itemised quote from 10 credits for up to 100 pages, more for longer files and for each survey number beyond three. Once approved, every page is read, classified and cross-checked against the land registers, and the opinion is written: verdict, risk score, the title chain, red flags and recommendations. It takes one to several hours; poll its status, answer anything it asks for, and read the finished report with legal_opinion.
https://verified.realestate/api/v1/tools/legal_opinion_project- Price
- 10 credits on approval
- Source
- Your documents, read against the registers
- Coverage
- Tamil Nadu property, rural and urban
- Answers in
- Quote at once; the opinion in one to several hours
Example
curl -X POST https://verified.realestate/api/v1/tools/legal_opinion_project \
-H "Authorization: Bearer $LANDLENS_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"create","survey_numbers":["65/4B"],"lat":12.8421,"lng":80.031,"district_code":"03","taluk_code":"14","village_code":"196","village_name":"Kavanoor","rural_urban":"rural","upload_ids":["up_lcja6mbi1t"]}'
{
"ok": true,
"status": "proposal",
"data": {
"proposal": true,
"action": "legal_opinion_project",
"params": { "name": "Legal opinion - Survey 65, Kavanoor", "survey_numbers": [{ "number": "65", "subdivision": "4B", "isPrimary": true }], "...": "..." },
"quote": {
"credits": 10,
"lines": ["10 credits for the opinion (up to 100 pages)"],
"pages": 1,
"documents": 1,
"survey_numbers": 1
},
"documents": [
{ "upload_id": "up_lcja6mbi1t", "file_name": "sample-sale-deed.pdf", "pages": 1, "size_kb": 1, "uploaded_at": "2026-10-22T21:38:36+05:30" }
],
"registration_office": { "sro": "Tambaram Joint 1", "village": "KAVANOOR" },
"what_happens": "On approval 10 credits are billed up front and the documents are read, classified and cross-checked against the land registers; the AI opinion then generates. Expect one to several hours. ...",
"message": "Legal opinion on 1 document(s), 1 page(s), survey 65/4B: 10 credits."
},
"credits_quoted": 0,
"credits_charged": 0,
"next": { "tool": "approve_action", "arguments": { "action": "legal_opinion_project", "params": { "...": "..." } } }
}
A real quote from the API on a one-page test file, trimmed for length. It was not approved.
What it returns
Six free steps around one paid approval. upload and create are free; create returns the quote with status proposal; approve_action starts the opinion; status and answer follow it.
| Field | What it holds |
|---|---|
upload (upload) | upload_id, file_name, pages and size_kb for the file kept, how many uploads are waiting and their total pages. Files wait 24 hours. |
quote (create) | credits, the lines that make it up, pages, documents and survey_numbers. |
documents, registration_office, what_happens (create) | The files the opinion will read, the sub registrar office worked out from the revenue codes, and what happens on approval. |
project_id, credits_used, project_url (approve_action) | The project created, what it cost, and its page in LandLens. |
status (status) | The processing stage and progress, whether a report is ready, what is pending (missing documents, questions) and next, the step to take now. |
recorded, submitted, pending (answer) | What your answer recorded, whether the opinion resumed, and anything still open. |
Ways to call it
The steps, in order. Every step but the approval is free.
1. Upload each document
One file per call, base64. A file over about 900 KB goes in numbered parts: part 1 with file_name and parts, then the rest with the upload_id part 1 returned.
{"action": "upload","file_name": "sale-deed-2011.pdf","file_base64": "JVBERi0xLjQK..."}
2. Create, and get the quote
The location, the survey numbers and the revenue codes (resolve_parcel gives them). Leave out upload_ids to use every waiting file.
{"action": "create","survey_numbers": ["65/4B"],"lat": 12.8421,"lng": 80.031,"district_code": "03","taluk_code": "14","village_code": "196"}
3. Approve
Send the next block to approve_action unchanged. This is where the opinion is charged.
{"action": "legal_opinion_project","params": {"...": "..."}}
4. Follow it
Poll status. If it asks for a document, upload it and attach it with answer; answer its questions the same way, then submit_all.
{"action": "status","project_id": 101}
Inputs
The JSON body of the POST is the arguments. Only action is required by the schema; each step takes the inputs shown in its row above.
| Argument | Type | What to send |
|---|---|---|
actionrequired |
string: upload, uploads, remove, create, status, answer | "upload", "uploads" (list waiting files), "remove", "create" (the quote), "status" or "answer". |
file_name |
string | upload: the file name with its extension, e.g. sale-deed-2019.pdf |
file_base64 |
string | upload: the file, base64 encoded, at most about 900 KB per call. Bigger files go in parts. |
part |
integer | upload: this part number, 1-based, when a file is sent in parts |
parts |
integer | upload: how many parts the file is sent in (omit for a single-call upload) |
upload_id |
string | remove: the upload_id to drop; upload parts 2..N: the upload_id part 1 returned |
survey_numbers |
array | create: the survey numbers, e.g. ["65/4B"] or [{"number": "65", "subdivision": "4B"}]. |
lat |
number | |
lng |
number | |
district_code |
string | create: revenue codes from the free parcel lookup; they let the register checks run without guessing |
taluk_code |
string | |
village_code |
string | |
rural_urban |
string: rural, urban | |
upload_ids |
array | create: which waiting files to use. Leave out to use them all. |
project_id |
integer | status and answer: the project from the approval, or from legal_opinion list. |
document_actions |
object | answer: keyed by the missing document id from status; each {action: uploaded|not_available|explained|identifier_provided, upload_id?, value?} |
question_answers |
object | answer: keyed by the question id from status; the answer text |
submit_all |
boolean | answer: true to hand the answers to the pipeline and continue |
attach_upload_ids |
array | answer: pending uploads to add to the project as further documents when they answer no particular request |
district_name |
string | |
firka_ward_number |
string | |
is_merged_upload |
boolean | upload: true when one file holds several documents scanned together |
name |
string | create: a name for the project (optional) |
questionnaire |
object | create: what the workspace asks: dealer_name, dealer_relationship, property_type, cersai_property_type, area_value, area_unit, is_vacant, concerns |
sro_code |
string | create: the sub-registrar office code from the free SRO lookup or the EC in hand; used when the revenue codes do not map to an office, common in Chennai |
sro_name |
string | |
survey_numbers_uncertain |
boolean | |
taluk_details_uncertain |
boolean | |
taluk_name |
string | |
urban_block_number |
string | |
village_name |
string |
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/legal_opinion_project \
-H "Authorization: Bearer $LANDLENS_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"create","survey_numbers":["65/4B"],"lat":12.8421,"lng":80.031,"district_code":"03","taluk_code":"14","village_code":"196","village_name":"Kavanoor","rural_urban":"rural","upload_ids":["up_lcja6mbi1t"]}'
import os, requests
r = requests.post(
"https://verified.realestate/api/v1/tools/legal_opinion_project",
headers={"Authorization": f"Bearer {os.environ['LANDLENS_KEY']}"},
json={
"action": "create",
"survey_numbers": [
"65/4B"
],
"lat": 12.8421,
"lng": 80.031,
"district_code": "03",
"taluk_code": "14",
"village_code": "196",
"village_name": "Kavanoor",
"rural_urban": "rural",
"upload_ids": [
"up_lcja6mbi1t"
]
},
timeout=60,
)
body = r.json()
print(body["status"], body["credits_charged"], body["data"])
const res = await fetch("https://verified.realestate/api/v1/tools/legal_opinion_project", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LANDLENS_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"action": "create",
"survey_numbers": [
"65/4B"
],
"lat": 12.8421,
"lng": 80.031,
"district_code": "03",
"taluk_code": "14",
"village_code": "196",
"village_name": "Kavanoor",
"rural_urban": "rural",
"upload_ids": [
"up_lcja6mbi1t"
]
}),
});
const body = await res.json();
console.log(body.status, body.credits_charged, body.data);
Here are the sale deed, parent deed and patta for survey 65/4B in Kavanoor. Get me a legal opinion on them.
Your AI uploads the files, shows you the itemised quote, and starts the opinion only after you say yes.
Responses
Every answer has the same envelope. What status can say for this call:
| status | What it means |
|---|---|
ok | upload, uploads, remove, status or answer completed; or, from approve_action, the project was created and is processing. |
proposal | From create: the quote. Nothing is charged. Approve it by sending next.arguments to approve_action within 30 minutes, unchanged. |
not_found | status for a project id that is not on your account. |
invalid_args | A step was missing what it needs (no file, no survey numbers, a part out of order, a file over 25 MB), or the waiting files behind a quote have expired. error says which. |
insufficient_credits | HTTP 402 at approval, with the credits needed, your balance and where to top up. |
Where the data comes from
The documents you upload, read page by page, cross-checked against the revenue records, the registration department's encumbrance index and the other registers the LandLens pipeline reads, and written into one opinion.
Tamil Nadu property, village or town survey. PDF, JPEG, PNG, DOC and DOCX files up to 25 MB each, up to 25 files waiting for one project.
The registers are read when the opinion runs, so the cross-checks are as of that day.
The same pipeline as the LandLens workspace: documents are classified, the title chain reconstructed from them and checked against the registers, and anything missing becomes a question or a document request you answer before the opinion is finished.
Who uses it
Banks and NBFCs
Send the borrower's title documents from your loan system and get a verdict, risk score and conditions back on the file.
Law firms
Get a first reading of a bundle of deeds, with the reconstructed chain and the gaps, before the advocate's own review.
Property platforms
Offer a title opinion on the documents a seller uploads, inside your own flow.
Limits and good practice
- One file per call, about 900 KB of file per call. Larger files go in numbered parts; each document can be up to 25 MB.
- Waiting files are kept 24 hours. A quote whose files have expired is refused at approval; upload again and create again.
- The opinion reads what the documents and registers show. Points it lists as needing manual verification have not been verified, and it is not a substitute for an advocate's signed opinion where one is required.
- The opinion can pause and ask for a missing document or an answer. Poll status and reply with answer, or it waits.
Pricing
An opinion costs from 10 credits for up to 100 pages, with more for each further 50 pages and for each survey number beyond three, all shown in the quote. It is charged once, at approval; every other step is 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 API for a property legal opinion in India?
Yes, for Tamil Nadu property. Upload the documents to LandLens over the API, approve the quote, and read the finished title opinion as JSON: verdict, risk score, title chain, red flags and recommendations.
How much does it cost?
From 10 credits for up to 100 pages and three survey numbers. Longer files and more survey numbers add to it, and the quote shows the exact total before you approve.
How long does it take?
One to several hours after approval. Poll status for the stage and progress.
How do I send a large PDF?
In parts: part 1 with file_name and parts, then each further part with the upload_id part 1 returned, each at most about 900 KB of file.
How do I read the finished opinion?
With legal_opinion, action read and the project_id.
Updated 22 Oct 2026 · OpenAPI description