HR template

Salary Certificate

Bilingual EN/AR bank-acceptable salary certificate with stamped letter format, full salary breakdown, and validity period.

Pro, Business & Scale plansCountry: AELanguage: ar+en
slug: salary-certificateRendered 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": "salary-certificate",
    "data": {
      "referenceNumber": "SC-2026-0473",
      "issueDate": "2026-04-22",
      "validityDays": 30,
      "isOnLeave": false,
      "employer": {
        "name": "Helios Technologies FZ-LLC",
        "address": "Dubai Internet City, Building 17, Dubai, UAE",
        "phone": "+971 4 391 1234",
        "email": "[email protected]"
      },
      "employee": {
        "name": "Aditi Patel",
        "title": "Senior Backend Engineer",
        "titleAr": "مهندسة برمجيات أولى",
        "department": "Engineering",
        "departmentAr": "الهندسة",
        "hireDate": "2024-09-01",
        "idType": "Emirates ID",
        "passportOrId": "784-1990-3344556-1"
      },
      "compensation": {
        "basic": 18000,
        "housing": 6000,
        "transport": 1500,
        "other": 0,
        "grossMonthly": 25500,
        "grossAnnual": 306000,
      // …
    }
  }'
node.js
import { Kamy } from "@kamydev/sdk";

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

const { url } = await kamy.render({
  templateSlug: "salary-certificate",
  data: {
    "referenceNumber": "SC-2026-0473",
    "issueDate": "2026-04-22",
    "validityDays": 30,
    "isOnLeave": false,
    "employer": {
      "name": "Helios Technologies FZ-LLC",
      "address": "Dubai Internet City, Building 17, Dubai, UAE",
      "phone": "+971 4 391 1234",
      "email": "[email protected]"
    },
    "employee": {
      "name": "Aditi Patel",
      "title": "Senior Backend Engineer",
      "titleAr": "مهندسة برمجيات أولى",
      "department": "Engineering",
      "departmentAr": "الهندسة",
      "hireDate": "2024-09-01",
      "idType": "Emirates ID",
      "passportOrId": "784-1990-3344556-1"
    },
    "compensation": {
      "basic": 18000,
      "housing": 6000,
      "transport": 1500,
      "other": 0,
      "grossMonthly": 25500,
      "grossAnnual": 306000,
    // …
  },
});

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": "salary-certificate",
        "data": {
          "referenceNumber": "SC-2026-0473",
          "issueDate": "2026-04-22",
          "validityDays": 30,
          "isOnLeave": false,
          "employer": {
            "name": "Helios Technologies FZ-LLC",
            "address": "Dubai Internet City, Building 17, Dubai, UAE",
            "phone": "+971 4 391 1234",
            "email": "[email protected]"
          },
          "employee": {
            "name": "Aditi Patel",
            "title": "Senior Backend Engineer",
            "titleAr": "مهندسة برمجيات أولى",
            "department": "Engineering",
            "departmentAr": "الهندسة",
            "hireDate": "2024-09-01",
            "idType": "Emirates ID",
            "passportOrId": "784-1990-3344556-1"
          },
          "compensation": {
            "basic": 18000,
            "housing": 6000,
            "transport": 1500,
            "other": 0,
            "grossMonthly": 25500,
            "grossAnnual": 306000,
          // …
        },
    },
)
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": "SC-2026-0473",
  "issueDate": "2026-04-22",
  "validityDays": 30,
  "isOnLeave": false,
  "employer": {
    "name": "Helios Technologies FZ-LLC",
    "address": "Dubai Internet City, Building 17, Dubai, UAE",
    "phone": "+971 4 391 1234",
    "email": "[email protected]"
  },
  "employee": {
    "name": "Aditi Patel",
    "title": "Senior Backend Engineer",
    "titleAr": "مهندسة برمجيات أولى",
    "department": "Engineering",
    "departmentAr": "الهندسة",
    "hireDate": "2024-09-01",
    "idType": "Emirates ID",
    "passportOrId": "784-1990-3344556-1"
  },
  "compensation": {
    "basic": 18000,
    "housing": 6000,
    "transport": 1500,
    "other": 0,
    "grossMonthly": 25500,
    "grossAnnual": 306000,
    "currency": "AED"
  },
  "bank": {
    "purpose": "personal loan application with Emirates NBD",
    "name": "Emirates NBD",
    "iban": "AE07 0331 2345 6789 0123 456"
  },
  "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",
    "employee",
    "compensation",
    "validityDays",
    "signer"
  ],
  "properties": {
    "referenceNumber": {
      "type": "string"
    },
    "issueDate": {
      "type": "string"
    },
    "validityDays": {
      "type": "number"
    },
    "isOnLeave": {
      "type": "boolean"
    },
    "leaveStart": {
      "type": "string"
    },
    "leaveEnd": {
      "type": "string"
    },
    "employer": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "address": {
          "type": "string"
        },
        "phone": {
          "type": "string"
        },
        "email": {
          "type": "string",
          "format": "email"
        }
      }
    },
    "employee": {
      "type": "object",
      "required": [
        "name",
        "title",
        "hireDate"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "titleAr": {
          "type": "string"
        },
        "department": {
          "type": "string"
        },
        "departmentAr": {
          "type": "string"
        },
        "hireDate": {
          "type": "string"
        },
        "idType": {
          "type": "string"
        },
        "passportOrId": {
          "type": "string"
        }
      }
    },
    "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"
        }
      }
    },
    "bank": {
      "type": "object",
      "properties": {
        "purpose": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "iban": {
          "type": "string"
        }
      }
    },
    "signer": {
      "type": "object",
      "required": [
        "name",
        "title"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "title": {
          "type": "string"
        }
      }
    }
  }
}
Salary Certificate template — Kamy PDF API — Kamy