All four endpoints need Leave: View .
Leave statuses
A request's status is a number in leaveStatusId and a name in leaveStatus. To filter, send either:
LeaveStatus=Approved or LeaveStatus=2.
leaveStatusIdleaveStatusMeaning 0 SubmittedAsked for, no decision yet 1 PendingApproved by some approvers, waiting for the rest 2 ApprovedApproved 3 RejectedRejected 4 AbandonedWithdrawn by the employee or HR 5 ExpiredNot decided in time
List leave requests
GET /v1/leaverequest/list Key needs Leave: View
Returns your organisation's leave requests, a page at a time, newest first.
Query parameters
Parameter Type Default Description PageNumberinteger 1 The page to return PageSizeinteger 25 Requests per page CompanyIduuid Only this company's employees. Ids come from Companies . DepartmentIduuid Only employees in this department LeaveTypeIduuid Only this leave type LeaveStatusname or integer Only this status , such as Approved StartDate, EndDatedate Only leave starting between these dates, as YYYY-MM-DD. Send both. SearchTermstring Matches the employee's name or email, or the leave type's name OrderByinteger 1 0 oldest first, 1 newest first
cURL JavaScript Python C# PHP
GET v1/leaverequest/listcurl "https://api.kalhr.com/v1/leaverequest/list?LeaveStatus=Approved&StartDate=2026-11-01&EndDate=2026-11-30" \
-H "Authorization: Bearer $KALHR_API_KEY" Copy
Response
{
"isSuccessful": true,
"code": "00",
"message": "Success",
"data": {
"data": [
{
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"employeeId": "4b9d2c1e-7a3f-4e8b-9c21-5d6e7f8a9b0c",
"employeeName": "Ada Okafor",
"leaveTypeName": "Annual leave",
"startDate": "2026-11-02T00:00:00",
"endDate": "2026-11-06T00:00:00",
"leaveStatusId": 2,
"leaveStatus": "Approved",
"comments": "Family trip",
"requestedOn": "2026-10-14T08:02:55.381",
"days": 5
}
],
"pageNumber": 1,
"pageSize": 25,
"totalRecords": 1,
"totalPages": 1
}
}
Copy
Field Type Description iduuid The leave request's id employeeId, employeeNameuuid, string Who asked leaveTypeNamestring The leave type startDate, endDatedate First and last day off (calendar dates) daysinteger Working days requested: weekends, the employee's days off and holidays aren't counted leaveStatusId, leaveStatusinteger, string See the table above commentsstring The employee's note requestedOndatetime When it was asked for (UTC)
Get a leave request
GET /v1/leaverequest/details/{id} Key needs Leave: View
Returns one request with the employee's role and department, supporting documents and relievers.
cURL JavaScript Python C# PHP
GET v1/leaverequest/details/a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5dcurl "https://api.kalhr.com/v1/leaverequest/details/a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d" \
-H "Authorization: Bearer $KALHR_API_KEY" Copy
Response
{
"isSuccessful": true,
"code": "00",
"message": "Success",
"data": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"employeeId": "4b9d2c1e-7a3f-4e8b-9c21-5d6e7f8a9b0c",
"firstName": "Ada",
"lastName": "Okafor",
"employeeName": "Ada Okafor",
"workMode": "Hybrid",
"jobRoles": ["Payroll Officer"],
"department": ["Finance"],
"leaveTypeName": "Annual leave",
"startDate": "2026-11-02T00:00:00",
"endDate": "2026-11-06T00:00:00",
"leaveStatusId": 2,
"leaveStatus": "Approved",
"comments": "Family trip",
"requestedOn": "2026-10-14T08:02:55.381",
"days": 5,
"documents": [],
"relievers": [{ "id": "7e21a9c0-…", "fullName": "Tunde Bello", "email": "tunde.bello@acme.ng" }],
"handoffNote": "Payroll inputs are in the shared drive."
}
}
Copy
Besides the list's fields:
Field Type Description firstName, lastNamestring The employee's name workModestring Remote, Onsite or Hybrid (a name here, not a number)jobRolesstring array Job role titles departmentstring array Department names documentsarray Supporting documents: id, name, mime and document. document is a link when storage is 0; when it is 1 the file is private and opens only in KalHR. relieversarray Colleagues covering: id, fullName, email handoffNotestring The employee's handover note
Get a leave balance
GET /v1/leavebalance/get-leave-balance Key needs Leave: View
How many days of one leave type an employee has, has taken and has left this year.
Parameter Type Description EmployeeIduuid Required. The employee's idLeaveTypeIduuid Required. The leave type's id, from List leave types
cURL JavaScript Python C# PHP
GET v1/leavebalance/get-leave-balancecurl "https://api.kalhr.com/v1/leavebalance/get-leave-balance?EmployeeId=4b9d2c1e-7a3f-4e8b-9c21-5d6e7f8a9b0c&LeaveTypeId=c0ffee00-1234-4abc-9def-0123456789ab" \
-H "Authorization: Bearer $KALHR_API_KEY" Copy
Response
{
"isSuccessful": true,
"code": "00",
"message": "Success",
"data": {
"totalDays": 20,
"daysTaken": 5,
"daysRemaining": 15,
"leavePending": 3,
"leaveRejected": 0
}
}
Copy
Field Type Description totalDaysinteger Days allowed this year daysTakeninteger Days of approved leave deducted daysRemaininginteger Days left to request leavePendinginteger Working days in this year's requests still waiting for a decision leaveRejectedinteger Working days in rejected requests this year
An employee who has never had this leave type's balance set up gets the type's full allowance, with nothing taken.
An employee or leave type outside your organisation answers isSuccessful: false.
List leave types
GET /v1/leavetype/list Key needs Leave: View
Query parameters
Parameter Type Default Description PageNumberinteger 1 The page to return PageSizeinteger 25 Leave types per page CompanyIduuid Only this company's SearchTermstring Part of the name IsActiveboolean Only active (true) or inactive (false) types EligibilityCriteriainteger 0 organisation, 1 company, 2 department, 3 unit, 4 named employees
cURL JavaScript Python C# PHP
GET v1/leavetype/listcurl "https://api.kalhr.com/v1/leavetype/list?IsActive=true" \
-H "Authorization: Bearer $KALHR_API_KEY" Copy
Response
{
"isSuccessful": true,
"code": "00",
"message": "Success",
"data": {
"data": [
{
"id": "c0ffee00-1234-4abc-9def-0123456789ab",
"name": "Annual leave",
"description": "Paid annual leave",
"maxLeaveDays": 20,
"carryForward": { "maxCarryForwardLimit": 5, "expirationDate": 2 },
"eligibilityCriteria": 0,
"requiresDocument": false,
"requiredDocument": [],
"isActive": true,
"created": "2025-01-06T10:00:00"
}
],
"pageNumber": 1,
"pageSize": 25,
"totalRecords": 4,
"totalPages": 1
}
}
Copy
Field Type Description id, name, descriptionuuid, string, string The leave type maxLeaveDaysinteger Days a year carryForwardobject maxCarryForwardLimit days, carried days expiring in expirationDate (month: 0 January … 11 December)eligibilityCriteriainteger Who it covers (see the parameter above) requiresDocument, requiredDocumentboolean, array Whether a document must be attached, and its templates (id, name, document) isActiveboolean Whether it can be requested created, lastModifieddatetime UTC
Event catalogue : leave.requested, leave.approved, leave.rejected, leave.cancelled