HR template

UAE Offer Letter

Bilingual offer of employment compliant with UAE Federal Decree-Law 33 of 2021. Captures position, compensation breakdown, term + probation, leave, and benefits.

Pro, Business & Scale plansCountry: AELanguage: ar+enUAE-MOHRE
slug: uae-offer-letterRendered 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-offer-letter",
    "data": {
      "referenceNumber": "OL-2026-0291",
      "issueDate": "2026-04-15",
      "acceptByDate": "2026-04-29",
      "employer": {
        "name": "Helios Technologies FZ-LLC",
        "address": "Dubai Internet City, Building 17, Dubai, UAE",
        "mohreNumber": "734821"
      },
      "candidate": {
        "name": "Aditi Patel"
      },
      "position": {
        "title": "Senior Backend Engineer",
        "department": "Engineering",
        "reportsTo": "VP of Engineering",
        "location": "Dubai Internet City, Dubai",
        "weeklyHours": 40
      },
      "term": {
        "startDate": "2026-06-01",
        "contractType": "Limited (12 months, renewable)",
        "probationMonths": 6
      },
      "compensation": {
        "basic": 18000,
        "housing": 6000,
        "transport": 1500,
      // …
    }
  }'
node.js
import { Kamy } from "@kamydev/sdk";

const kamy = new Kamy({ apiKey: process.env.KAMY_API_KEY! });

const { url } = await kamy.render({
  templateSlug: "uae-offer-letter",
  data: {
    "referenceNumber": "OL-2026-0291",
    "issueDate": "2026-04-15",
    "acceptByDate": "2026-04-29",
    "employer": {
      "name": "Helios Technologies FZ-LLC",
      "address": "Dubai Internet City, Building 17, Dubai, UAE",
      "mohreNumber": "734821"
    },
    "candidate": {
      "name": "Aditi Patel"
    },
    "position": {
      "title": "Senior Backend Engineer",
      "department": "Engineering",
      "reportsTo": "VP of Engineering",
      "location": "Dubai Internet City, Dubai",
      "weeklyHours": 40
    },
    "term": {
      "startDate": "2026-06-01",
      "contractType": "Limited (12 months, renewable)",
      "probationMonths": 6
    },
    "compensation": {
      "basic": 18000,
      "housing": 6000,
      "transport": 1500,
    // …
  },
});

console.log(url); // signed URL, valid for 1 hour
python
import os, requests

resp = requests.post(
    "https://kamy.dev/api/v1/render",
    headers={"Authorization": f"Bearer {os.environ['KAMY_API_KEY']}"},
    json={
        "templateSlug": "uae-offer-letter",
        "data": {
          "referenceNumber": "OL-2026-0291",
          "issueDate": "2026-04-15",
          "acceptByDate": "2026-04-29",
          "employer": {
            "name": "Helios Technologies FZ-LLC",
            "address": "Dubai Internet City, Building 17, Dubai, UAE",
            "mohreNumber": "734821"
          },
          "candidate": {
            "name": "Aditi Patel"
          },
          "position": {
            "title": "Senior Backend Engineer",
            "department": "Engineering",
            "reportsTo": "VP of Engineering",
            "location": "Dubai Internet City, Dubai",
            "weeklyHours": 40
          },
          "term": {
            "startDate": "2026-06-01",
            "contractType": "Limited (12 months, renewable)",
            "probationMonths": 6
          },
          "compensation": {
            "basic": 18000,
            "housing": 6000,
            "transport": 1500,
          // …
        },
    },
)
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
{
  "referenceNumber": "OL-2026-0291",
  "issueDate": "2026-04-15",
  "acceptByDate": "2026-04-29",
  "employer": {
    "name": "Helios Technologies FZ-LLC",
    "address": "Dubai Internet City, Building 17, Dubai, UAE",
    "mohreNumber": "734821"
  },
  "candidate": {
    "name": "Aditi Patel"
  },
  "position": {
    "title": "Senior Backend Engineer",
    "department": "Engineering",
    "reportsTo": "VP of Engineering",
    "location": "Dubai Internet City, Dubai",
    "weeklyHours": 40
  },
  "term": {
    "startDate": "2026-06-01",
    "contractType": "Limited (12 months, renewable)",
    "probationMonths": 6
  },
  "compensation": {
    "basic": 18000,
    "housing": 6000,
    "transport": 1500,
    "other": 0,
    "grossMonthly": 25500,
    "grossAnnual": 306000,
    "currency": "AED"
  },
  "leave": {
    "annualDays": 30
  },
  "benefits": {
    "healthInsurance": "Premium plan covering employee + spouse + 2 dependents",
    "airTicket": "One return ticket to Mumbai per year for employee + dependents",
    "other": [
      "13th-month bonus",
      "Annual learning budget AED 8,000"
    ]
  },
  "signer": {
    "name": "Reem Al-Sabbagh",
    "title": "Head of People"
  }
}
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": [
    "referenceNumber",
    "issueDate",
    "employer",
    "candidate",
    "position",
    "term",
    "compensation",
    "leave",
    "benefits",
    "signer",
    "acceptByDate"
  ],
  "properties": {
    "referenceNumber": {
      "type": "string"
    },
    "issueDate": {
      "type": "string"
    },
    "acceptByDate": {
      "type": "string"
    },
    "employer": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "address": {
          "type": "string"
        },
        "mohreNumber": {
          "type": "string"
        }
      }
    },
    "candidate": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string"
        }
      }
    },
    "position": {
      "type": "object",
      "required": [
        "title",
        "department",
        "location",
        "weeklyHours"
      ],
      "properties": {
        "title": {
          "type": "string"
        },
        "department": {
          "type": "string"
        },
        "reportsTo": {
          "type": "string"
        },
        "location": {
          "type": "string"
        },
        "weeklyHours": {
          "type": "number"
        }
      }
    },
    "term": {
      "type": "object",
      "required": [
        "startDate",
        "contractType",
        "probationMonths"
      ],
      "properties": {
        "startDate": {
          "type": "string"
        },
        "contractType": {
          "type": "string"
        },
        "probationMonths": {
          "type": "number"
        }
      }
    },
    "compensation": {
      "type": "object",
      "required": [
        "basic",
        "grossMonthly",
        "grossAnnual",
        "currency"
      ],
      "properties": {
        "basic": {
          "type": "number"
        },
        "housing": {
          "type": "number"
        },
        "transport": {
          "type": "number"
        },
        "other": {
          "type": "number"
        },
        "grossMonthly": {
          "type": "number"
        },
        "grossAnnual": {
          "type": "number"
        },
        "currency": {
          "type": "string"
        }
      }
    },
    "leave": {
      "type": "object",
      "required": [
        "annualDays"
      ],
      "properties": {
        "annualDays": {
          "type": "number"
        }
      }
    },
    "benefits": {
      "type": "object",
      "properties": {
        "healthInsurance": {
          "type": "string"
        },
        "airTicket": {
          "type": "string"
        },
        "other": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "signer": {
      "type": "object",
      "required": [
        "name",
        "title"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "title": {
          "type": "string"
        }
      }
    }
  }
}
UAE Offer Letter template — Kamy PDF API — Kamy