Curvestone

Compare Leases Against a Master Template

Batch-check 200 leases against your standard template to find deviations.

Who is this for

Legal Team / Paralegal at a law firm or in-house legal department. You have a portfolio of leases and need to identify which ones deviate from your master template — without reading every clause of every document manually.

What you'll do

  • Upload your master lease template as a reference document
  • Batch-submit individual tenant leases for clause-by-clause comparison
  • Receive a structured report of deviations per lease, triaged by severity
  • Focus review time on leases that actually differ from standard terms

Submit lease comparisons

Open your master template once, then loop through each tenant lease and submit it for comparison. Tag each job with metadata so you can filter and group results later.

compare_leases.py
python
from curvestone import Agent
import glob
agent = Agent()
# Upload master template once
master = open("master_lease_template.pdf", "rb")
# Batch-submit leases for comparison
results = []
for lease_path in glob.glob("leases/*.pdf"):
result = agent.check(
case_type="lease_comparison",
depth="comprehensive",
documents=[master, open(lease_path, "rb")],
reference=f"LEASE-{lease_path.split('/')[-1]}",
metadata={"batch": "Q1-2026-portfolio-review"},
)
results.append(result)
print(f"Submitted {len(results)} lease comparisons")

Batch API alternative

For large portfolios, you can also submit all jobs in a single call using the batch endpoint. This is more efficient and returns a batch ID you can poll for overall progress.

batch_submit.py
python
# Async batch submission (Python)
results = await agent.check_batch(
jobs=[
{
"case_type": "lease_comparison",
"depth": "comprehensive",
"documents": [master, open(f"leases/{f}", "rb")],
"reference": f"LEASE-{f}",
"metadata": {"batch": "Q1-2026-portfolio-review"},
}
for f in lease_files
]
)
print(f"Batch ID: {results.batch_id}")
print(f"Jobs queued: {results.total}")

Response

Each lease returns a structured comparison with clause-level findings. Here is a single lease result:

response.json
json
1{
2 "id": "job_2mNx8kQpT1",
3 "type": "check",
4 "status": "completed",
5 "triage": "amber",
6 "reference": "LEASE-unit-42.pdf",
7 "processing_time": "89s",
8 "checks": [
9 {
10 "name": "Rent Escalation Clause",
11 "triage": "red",
12 "finding": "Non-standard escalation: 5% annual vs 3% template"
13 },
14 {
15 "name": "Break Clause",
16 "triage": "green"
17 },
18 {
19 "name": "Repair Obligations",
20 "triage": "amber",
21 "finding": "Tenant repair scope broader than template — includes structural elements"
22 },
23 {
24 "name": "Insurance Requirements",
25 "triage": "green"
26 },
27 {
28 "name": "Assignment & Subletting",
29 "triage": "green"
30 }
31 ],
32 "cost": "£6.00"
33}

What happens

Clause-by-clause comparison

Each lease is compared against the master template at the clause level. The agent identifies the corresponding section in each document and flags deviations with a severity: green means the clause matches the template, amber indicates a minor deviation, and red signals a significant departure from standard terms.

Focus your review time

Instead of reading all 200 leases cover-to-cover, your legal team can filter for amber and red results and focus review time on the leases that actually differ from standard terms. Green leases can be approved in bulk.

Processing time

Individual leases typically complete in 60-120 seconds. For a portfolio of 200 leases, expect 3-4 hours total processing time as jobs run in parallel. Use webhooks to get notified as each lease completes rather than polling.