KalHR logo

API reference

Employees

List your organisation's employees with filters, and read one employee's full record.

Both endpoints need Employee Management: View. Pay is included only when the key also has Payroll: View; without it, salary is left out.

Two fields are easy to confuse: id is KalHR's id for the employee record, which you use to call the API, and employeeId is your own employee number, such as ACM-0042.

One person can have a record in each company of your organisation they work for. Each record has its own id.

List employees

GET/v1/employee/listKey needs Employee Management: View

Returns your organisation's employees, a page at a time, most recently added first.

Query parameters

ParameterTypeDefaultDescription
PageNumberinteger1The page to return
PageSizeinteger25Employees per page
Statusname or integerOnly employees with this status, such as Active. See statuses.
SearchTermstringMatches first, last or full name, email, phone or employee number
Companiesuuid, repeatedOnly these companies: Companies=…&Companies=…. Ids come from Companies.
DepartmentIduuidOnly this department
JobRoleIduuidOnly this job role
WorkModename or integerRemote (0), Onsite (1) or Hybrid (2)
OrderColumninteger1Sort by 0 the date they joined, or 1 the date they were added to KalHR
OrderByinteger10 ascending, 1 descending
GET v1/employee/list
curl "https://api.kalhr.com/v1/employee/list?Status=Active&PageNumber=1&PageSize=25" \
  -H "Authorization: Bearer $KALHR_API_KEY"

Response

{
  "isSuccessful": true,
  "code": "00",
  "message": "Success",
  "data": {
    "data": [
      {
        "id": "4b9d2c1e-7a3f-4e8b-9c21-5d6e7f8a9b0c",
        "employeeId": "ACM-0042",
        "companyId": "1f2e3d4c-5b6a-4987-8a6b-5c4d3e2f1a0b",
        "firstName": "Ada",
        "lastName": "Okafor",
        "email": "ada.okafor@acme.ng",
        "phoneNumber": "08031234567",
        "workMode": 2,
        "status": "Active",
        "nationality": "Nigeria",
        "nationalityId": 160,
        "employmentType": "Full time",
        "employmentTypeId": "6a5b4c3d-2e1f-4a0b-9c8d-7e6f5a4b3c2d",
        "jobRoles": [
          {
            "id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
            "title": "Payroll Officer",
            "gradingSystem": { "id": "3a4b5c6d-7e8f-4a9b-8c7d-6e5f4a3b2c1d", "name": "Grade 6", "minimum": 500000, "maximum": 800000 }
          }
        ],
        "departments": [{ "id": "2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f", "name": "Finance" }],
        "salary": {
          "id": "7d6c5b4a-3f2e-4d1c-9b0a-8f7e6d5c4b3a",
          "employeeId": "4b9d2c1e-7a3f-4e8b-9c21-5d6e7f8a9b0c",
          "companyId": "1f2e3d4c-5b6a-4987-8a6b-5c4d3e2f1a0b",
          "organizationId": "8c1d0e2f-4a6b-4c8d-9e0f-1a2b3c4d5e6f",
          "grossSalary": 650000,
          "netSalary": 512340.5,
          "salary": 512340.5
        }
      }
    ],
    "pageNumber": 1,
    "pageSize": 25,
    "totalRecords": 134,
    "totalPages": 6
  }
}

Employee fields

FieldTypeDescription
iduuidKalHR's id for this employee record. Use it with Get an employee.
employeeIdstringYour employee number, as entered in KalHR
companyIduuidThe company this record belongs to
firstName, lastNamestringName
emailstringWork email
phoneNumberstringPhone number
photoUrlstringLink to their profile photo, when they have one
workModeinteger0 Remote, 1 Onsite, 2 Hybrid
statusstringSee statuses
nationality, nationalityIdstring, integerThe country's name and KalHR's id for it
employmentType, employmentTypeIdstring, uuidSuch as Full time or Contract
jobRolesarrayEach id, title, and gradingSystem: the grade's id, name, and and the minimum and maximum pay set for that grade
departmentsarrayEach id and name
salaryobjectTheir current pay, with Payroll: View, when they have a salary in KalHR (below)

The list's salary:

FieldTypeDescription
iduuidThe salary record
employeeId, companyId, organizationIduuidWho and where it belongs to
grossSalarynumberMonthly gross pay, in naira
netSalarynumberMonthly take-home pay, after deductions, pension and PAYE
salarynumberThe same as netSalary

For the breakdown (allowances, deductions, PAYE, pension), get the employee.

Employee statuses

statusNumberMeaning
InActive0Not active
Active1Working
OnLeave2On leave
Resigned3Left by resigning
Retired4Retired
LaidOff5Made redundant
Terminated6Dismissed
Suspended7Suspended
Furloughed8Furloughed

To filter, send the name or the number: Status=Active or Status=1.

Get an employee

GET/v1/employee/{id}Key needs Employee Management: View

Returns one employee's full record: everything in the list, plus personal and statutory details, addresses, referees, guarantors and their line manager.

Path parameterTypeDescription
iduuidThe employee's id from the list (not their employee number)
GET v1/employee/4b9d2c1e-7a3f-4e8b-9c21-5d6e7f8a9b0c
curl "https://api.kalhr.com/v1/employee/4b9d2c1e-7a3f-4e8b-9c21-5d6e7f8a9b0c" \
  -H "Authorization: Bearer $KALHR_API_KEY"

Response

{
  "isSuccessful": true,
  "code": "00",
  "message": "Success",
  "data": {
    "id": "4b9d2c1e-7a3f-4e8b-9c21-5d6e7f8a9b0c",
    "employeeId": "ACM-0042",
    "firstName": "Ada",
    "middleName": "Ngozi",
    "lastName": "Okafor",
    "email": "ada.okafor@acme.ng",
    "phoneNumber": "08031234567",
    "workMode": 2,
    "maritalStatus": 1,
    "gender": "Female",
    "genderId": 1,
    "dateOfBirth": "1991-04-12T00:00:00Z",
    "dateJoined": "2023-02-01T00:00:00Z",
    "status": "Active",
    "nationalityId": 160,
    "nationality": "Nigeria",
    "taxAccountNumber": "12345678-0001",
    "pensionAccountNumber": "PEN100123456789",
    "pensionProvider": "Example Pensions Ltd",
    "nhfNumber": "",
    "nhisNumber": "",
    "nin": "12345678901",
    "driverLicenseNumber": "",
    "officeLocation": "12 Admiralty Way, Lekki, Lagos",
    "officeLocationId": "5e4d3c2b-1a0f-4e9d-8c7b-6a5f4e3d2c1b",
    "employmentType": "Full time",
    "employmentTypeId": "6a5b4c3d-2e1f-4a0b-9c8d-7e6f5a4b3c2d",
    "workingDays": [1, 2, 3, 4, 5],
    "company": { "id": "1f2e3d4c-5b6a-4987-8a6b-5c4d3e2f1a0b", "name": "Acme Nigeria Ltd" },
    "addresses": [{ "street": "4 Bode Thomas Street", "state": "Lagos", "stateId": 25, "country": "Nigeria", "countryId": 160 }],
    "references": [],
    "guarantors": [],
    "jobRoles": [{ "id": "…", "title": "Payroll Officer", "gradingSystem": { "id": "…", "name": "Grade 6", "minimum": 500000, "maximum": 800000 } }],
    "departments": [{ "id": "…", "name": "Finance", "leaders": [{ "id": "…", "fullName": "Tunde Bello", "email": "tunde.bello@acme.ng" }] }],
    "lineManager": { "id": "…", "fullName": "Tunde Bello", "email": "tunde.bello@acme.ng" }
  }
}

Fields

Everything in the list, plus:

FieldTypeDescription
middleNamestringMiddle name
maritalStatusinteger0 Single, 1 Married, 2 Divorced
gender, genderIdstring, integer0 Male, 1 Female, 2 Other
dateOfBirth, dateJoineddateCalendar dates: use the date part
taxAccountNumber, pensionAccountNumber, pensionProvider, nhfNumber, nhisNumber, nin, driverLicenseNumberstringStatutory numbers. Empty text when not recorded.
officeLocation, officeLocationIdstring, uuidTheir office: one of their company's addresses
workingDaysinteger arrayThe days they work: 0 Sunday … 6 Saturday
companyobjectid, name
addressesarrayHome addresses: street, zipCode, state, stateId, country, countryId
referencesarrayReferees: firstName, lastName, phoneNumber, email, organization, position
guarantorsarrayfirstName, lastName, phoneNumber, email, address, occupation
departmentsarrayAs in the list, with each department's leaders: id, fullName, email
lineManagerobjectid, fullName, email
salaryobjectTheir full pay set-up, with Payroll: View (below)

Here salary has the full breakdown:

FieldDescription
grossSalary, netSalary, monthlyAllowance, monthlyDeduction, payePerMonth, pensionPerMonthMonthly figures, in naira
grossAnnual, netAnnual, totalAnnualAllowance, totalAnnualDeduction, payeAnnual, pensionAnnualAnnual figures
allowances, deductionsEach id, name, type ({ "id": 0, "name": "Percentage" } or 1 FixedAmount) and amount (an array holding one number)
payCycleid, name (Monthly, SemiMonthly or Weekly), payPeriod, payDayOfMonth
payType{ "id": 0, "name": "NetPay" } or 1 GrossPay
levelid, name
payeTaxTypeHow PAYE is worked out

An id that isn't one of your organisation's employees answers isSuccessful: false with Employee not found.

Last updated October 19, 2026

Missing an endpoint or an event?

Tell us what you're building. The API grows from what integrators ask for.

See KalHR in action - 30 min demo