Real Estate template
UAE Tenancy Contract
Bilingual EN/AR Dubai-style tenancy contract aligned with RERA / Ejari fields — parties, premises, term, rent + cheque schedule, standard obligations.
Pro, Business & Scale plansCountry: AELanguage: ar+enUAE-RERA
slug: uae-tenancy-contractRendered with sample data
01
Quick start
Reference the template by its slug and pass your data. The same call works from any language; pick whichever fits your stack. Replace $KAMY_API_KEY with a key from the dashboard.
curl
curl https://kamy.dev/api/v1/render \
-H "Authorization: Bearer $KAMY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateSlug": "uae-tenancy-contract",
"data": {
"contractNumber": "TC-2026-00184",
"issueDate": "2026-04-15",
"ejariPropertyId": "EJ-DXB-1102-04-1801",
"landlord": {
"name": "Khalid bin Ahmed Al-Falasi",
"idType": "Emirates ID",
"idNumber": "784-1981-1234567-8",
"phone": "+971 50 555 0184",
"email": "[email protected]",
"address": "Villa 12, Jumeirah 1, Dubai"
},
"tenant": {
"name": "Sara M. Reyes",
"idType": "Passport",
"idNumber": "P12345678",
"phone": "+971 56 444 0190",
"email": "[email protected]",
"nationality": "Filipino"
},
"premises": {
"propertyType": "Apartment",
"usage": "Residential",
"plot": "1102-1801",
"address": "Tower 1, Apt 1801, Burj Khalifa Boulevard, Downtown Dubai",
"areaSqft": 1240,
"rooms": "2 BR + maid",
"parking": 1,
// …
}
}'node.js
import { Kamy } from "@kamydev/sdk";
const kamy = new Kamy({ apiKey: process.env.KAMY_API_KEY! });
const { url } = await kamy.render({
templateSlug: "uae-tenancy-contract",
data: {
"contractNumber": "TC-2026-00184",
"issueDate": "2026-04-15",
"ejariPropertyId": "EJ-DXB-1102-04-1801",
"landlord": {
"name": "Khalid bin Ahmed Al-Falasi",
"idType": "Emirates ID",
"idNumber": "784-1981-1234567-8",
"phone": "+971 50 555 0184",
"email": "[email protected]",
"address": "Villa 12, Jumeirah 1, Dubai"
},
"tenant": {
"name": "Sara M. Reyes",
"idType": "Passport",
"idNumber": "P12345678",
"phone": "+971 56 444 0190",
"email": "[email protected]",
"nationality": "Filipino"
},
"premises": {
"propertyType": "Apartment",
"usage": "Residential",
"plot": "1102-1801",
"address": "Tower 1, Apt 1801, Burj Khalifa Boulevard, Downtown Dubai",
"areaSqft": 1240,
"rooms": "2 BR + maid",
"parking": 1,
// …
},
});
console.log(url); // signed URL, valid for 1 hourpython
import os, requests
resp = requests.post(
"https://kamy.dev/api/v1/render",
headers={"Authorization": f"Bearer {os.environ['KAMY_API_KEY']}"},
json={
"templateSlug": "uae-tenancy-contract",
"data": {
"contractNumber": "TC-2026-00184",
"issueDate": "2026-04-15",
"ejariPropertyId": "EJ-DXB-1102-04-1801",
"landlord": {
"name": "Khalid bin Ahmed Al-Falasi",
"idType": "Emirates ID",
"idNumber": "784-1981-1234567-8",
"phone": "+971 50 555 0184",
"email": "[email protected]",
"address": "Villa 12, Jumeirah 1, Dubai"
},
"tenant": {
"name": "Sara M. Reyes",
"idType": "Passport",
"idNumber": "P12345678",
"phone": "+971 56 444 0190",
"email": "[email protected]",
"nationality": "Filipino"
},
"premises": {
"propertyType": "Apartment",
"usage": "Residential",
"plot": "1102-1801",
"address": "Tower 1, Apt 1801, Burj Khalifa Boulevard, Downtown Dubai",
"areaSqft": 1240,
"rooms": "2 BR + maid",
"parking": 1,
// …
},
},
)
resp.raise_for_status()
print(resp.json()["url"])02
Sample payload
The full sample data the live preview above renders from. Use it as a starting point for your own integration — every field is optional except those marked required in the schema below.
json
{
"contractNumber": "TC-2026-00184",
"issueDate": "2026-04-15",
"ejariPropertyId": "EJ-DXB-1102-04-1801",
"landlord": {
"name": "Khalid bin Ahmed Al-Falasi",
"idType": "Emirates ID",
"idNumber": "784-1981-1234567-8",
"phone": "+971 50 555 0184",
"email": "[email protected]",
"address": "Villa 12, Jumeirah 1, Dubai"
},
"tenant": {
"name": "Sara M. Reyes",
"idType": "Passport",
"idNumber": "P12345678",
"phone": "+971 56 444 0190",
"email": "[email protected]",
"nationality": "Filipino"
},
"premises": {
"propertyType": "Apartment",
"usage": "Residential",
"plot": "1102-1801",
"address": "Tower 1, Apt 1801, Burj Khalifa Boulevard, Downtown Dubai",
"areaSqft": 1240,
"rooms": "2 BR + maid",
"parking": 1,
"furnished": "Unfurnished",
"makaniNumber": "2624 49452"
},
"term": {
"startDate": "2026-05-01",
"endDate": "2027-04-30",
"durationMonths": 12,
"autoRenewal": "Yes (Law 26/2007 default)"
},
"rent": {
"annual": 145000,
"currency": "AED",
"numberOfCheques": 4,
"depositAmount": 7250,
"cheques": [
{
"date": "2026-05-01",
"bank": "Emirates NBD",
"amount": 36250
},
{
"date": "2026-08-01",
"bank": "Emirates NBD",
"amount": 36250
},
{
"date": "2026-11-01",
"bank": "Emirates NBD",
"amount": 36250
},
{
"date": "2027-02-01",
"bank": "Emirates NBD",
"amount": 36250
}
]
},
"customClauses": [
"Tenant may not keep pets weighing more than 15 kg without written landlord consent."
]
}03
JSON Schema
The render endpoint validates your payload against this JSON Schema before queuing the render. Validation errors come back with HTTP 400 and a VALIDATION_FAILED code listing every offending path.
json
{
"type": "object",
"required": [
"contractNumber",
"issueDate",
"landlord",
"tenant",
"premises",
"term",
"rent"
],
"properties": {
"contractNumber": {
"type": "string",
"minLength": 1
},
"issueDate": {
"type": "string"
},
"ejariPropertyId": {
"type": "string"
},
"landlord": {
"type": "object",
"required": [
"name",
"idType",
"idNumber"
],
"properties": {
"name": {
"type": "string"
},
"idType": {
"type": "string"
},
"idNumber": {
"type": "string"
},
"phone": {
"type": "string"
},
"email": {
"type": "string",
"format": "email"
},
"address": {
"type": "string"
}
}
},
"tenant": {
"type": "object",
"required": [
"name",
"idType",
"idNumber"
],
"properties": {
"name": {
"type": "string"
},
"idType": {
"type": "string"
},
"idNumber": {
"type": "string"
},
"phone": {
"type": "string"
},
"email": {
"type": "string",
"format": "email"
},
"nationality": {
"type": "string"
}
}
},
"premises": {
"type": "object",
"required": [
"propertyType",
"address"
],
"properties": {
"propertyType": {
"type": "string"
},
"usage": {
"type": "string"
},
"plot": {
"type": "string"
},
"address": {
"type": "string"
},
"areaSqft": {
"type": "number"
},
"rooms": {
"type": "string"
},
"parking": {
"type": "number"
},
"furnished": {
"type": "string"
},
"makaniNumber": {
"type": "string"
}
}
},
"term": {
"type": "object",
"required": [
"startDate",
"endDate",
"durationMonths"
],
"properties": {
"startDate": {
"type": "string"
},
"endDate": {
"type": "string"
},
"durationMonths": {
"type": "number"
},
"autoRenewal": {
"type": "string"
}
}
},
"rent": {
"type": "object",
"required": [
"annual",
"currency",
"numberOfCheques"
],
"properties": {
"annual": {
"type": "number"
},
"currency": {
"type": "string"
},
"numberOfCheques": {
"type": "number"
},
"depositAmount": {
"type": "number"
},
"cheques": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"bank": {
"type": "string"
},
"amount": {
"type": "number"
}
}
}
}
}
},
"customClauses": {
"type": "array",
"items": {
"type": "string"
}
}
}
}