Kenjo Documents API
Return a paginated list of company documents stored in Kenjo. The document management surface for pulling HR document metadata out of the platform.
Return a paginated list of company documents stored in Kenjo. The document management surface for pulling HR document metadata out of the platform.
openapi: 3.0.3
info:
title: Kenjo API
description: >-
The Kenjo API is a documented REST API for the Kenjo all-in-one HR (HRIS)
platform. It exposes employees, attendance and time tracking, time off /
absences, company documents, compensation and payroll data, organizational
structure, and recruiting over HTTPS. Access is gated: the API is available
on Kenjo's top-tier Connect plan and must first be activated for your account
(sandbox or production) by the Kenjo Customer Success team. You then generate
an API key in the Kenjo web app (Settings > Integrations > API), exchange it
for a bearer token via POST /auth/login, and send that token in the
Authorization header on every request. A missing, invalid, or expired token
returns 401 UNAUTHORIZED.
Paths and HTTP methods in this document reflect Kenjo's published API
reference (kenjo.readme.io). Request and response bodies are modeled from the
documented endpoint descriptions where full field-level schemas are not
published; treat the schema components as representative rather than
exhaustive, and confirm exact fields against the live reference.
version: '1.0'
contact:
name: Kenjo Support
url: https://www.kenjo.io/legal/api
email: support@kenjo.io
servers:
- url: https://api.kenjo.io/api/v1
description: Production
- url: https://sandbox-api.kenjo.io/api/v1
description: Sandbox (test environment)
security:
- bearerAuth: []
tags:
- name: Authentication
description: Exchange an API key for a bearer token and invalidate tokens.
- name: Employees
description: Employee records and their profile sections.
- name: Attendance
description: Attendance and time-tracking entries.
- name: Time Off
description: Absences, time-off requests, types, statuses, and balances.
- name: Documents
description: Company documents.
- name: Compensation
description: Contracts, salaries, and additional payments.
- name: Organization
description: Companies, offices, departments, teams, areas, and calendars.
- name: Recruiting
description: Positions, candidates, and applications.
paths:
/auth/login:
post:
operationId: login
tags:
- Authentication
summary: Log in an API token
description: Exchanges a Kenjo API key for a bearer token used to authorize subsequent requests.
security: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/LoginRequest'
responses:
'200':
description: A bearer token.
content:
application/json:
schema:
$ref: '#/components/schemas/LoginResponse'
'401':
$ref: '#/components/responses/Unauthorized'
/auth/logout:
post:
operationId: logout
tags:
- Authentication
summary: Log out an API token
description: Invalidates the current bearer token.
responses:
'200':
description: Token invalidated.
'401':
$ref: '#/components/responses/Unauthorized'
/user-accounts:
get:
operationId: listUserAccounts
tags:
- Employees
summary: List user accounts
description: Returns a list of user accounts in the organization.
responses:
'200':
description: A list of user accounts.
content:
application/json:
schema:
$ref: '#/components/schemas/UserAccountList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees:
get:
operationId: listEmployees
tags:
- Employees
summary: List employees
description: Returns a paginated list of employees.
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A list of employees.
content:
application/json:
schema:
$ref: '#/components/schemas/EmployeeList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createEmployee
tags:
- Employees
summary: Create a new employee
description: Creates a new employee. New employees are created deactivated by default and can be activated with the activate endpoint.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/EmployeeInput'
responses:
'201':
description: The created employee.
content:
application/json:
schema:
$ref: '#/components/schemas/Employee'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}:
get:
operationId: getEmployee
tags:
- Employees
summary: Get an employee
description: Returns all sections for a given employee id.
parameters:
- $ref: '#/components/parameters/EmployeeId'
responses:
'200':
description: The employee with all sections.
content:
application/json:
schema:
$ref: '#/components/schemas/Employee'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/employees/accounts:
get:
operationId: listEmployeeAccounts
tags:
- Employees
summary: List employee accounts
description: Returns a list of employee accounts containing email, external id, language, and activation status.
responses:
'200':
description: A list of employee accounts.
content:
application/json:
schema:
$ref: '#/components/schemas/EmployeeAccountList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/personals:
get:
operationId: listEmployeePersonals
tags:
- Employees
summary: List employee personal information
description: Returns personal information for employees.
responses:
'200':
description: A list of personal information sections.
content:
application/json:
schema:
$ref: '#/components/schemas/SectionList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/works:
get:
operationId: listEmployeeWorks
tags:
- Employees
summary: List employee work information
description: Returns work information for employees.
responses:
'200':
description: A list of work information sections.
content:
application/json:
schema:
$ref: '#/components/schemas/SectionList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/work-schedules:
get:
operationId: listEmployeeWorkSchedules
tags:
- Employees
summary: List employee work schedules
description: Returns work schedules for employees.
responses:
'200':
description: A list of work schedules.
content:
application/json:
schema:
$ref: '#/components/schemas/SectionList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/addresses:
get:
operationId: listEmployeeAddresses
tags:
- Employees
summary: List employee addresses
description: Returns addresses for employees.
responses:
'200':
description: A list of address sections.
content:
application/json:
schema:
$ref: '#/components/schemas/SectionList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/financials:
get:
operationId: listEmployeeFinancials
tags:
- Employees
summary: List employee financial data
description: Returns financial data sections for employees.
responses:
'200':
description: A list of financial sections.
content:
application/json:
schema:
$ref: '#/components/schemas/SectionList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/homes:
get:
operationId: listEmployeeHomes
tags:
- Employees
summary: List employee home information
description: Returns home information sections for employees.
responses:
'200':
description: A list of home sections.
content:
application/json:
schema:
$ref: '#/components/schemas/SectionList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/emergencies:
get:
operationId: listEmployeeEmergencies
tags:
- Employees
summary: List employee emergency contacts
description: Returns emergency contact sections for employees.
responses:
'200':
description: A list of emergency contact sections.
content:
application/json:
schema:
$ref: '#/components/schemas/SectionList'
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/accounts:
put:
operationId: updateEmployeeAccount
tags:
- Employees
summary: Update employee account section
parameters:
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Section'
responses:
'200':
description: The updated section.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/personals:
put:
operationId: updateEmployeePersonal
tags:
- Employees
summary: Update employee personal section
parameters:
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Section'
responses:
'200':
description: The updated section.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/works:
put:
operationId: updateEmployeeWork
tags:
- Employees
summary: Update employee work section
parameters:
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Section'
responses:
'200':
description: The updated section.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/work-schedules:
put:
operationId: updateEmployeeWorkSchedule
tags:
- Employees
summary: Update employee work schedule section
parameters:
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Section'
responses:
'200':
description: The updated section.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/addresses:
put:
operationId: updateEmployeeAddress
tags:
- Employees
summary: Update employee address section
parameters:
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Section'
responses:
'200':
description: The updated section.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/financials:
put:
operationId: updateEmployeeFinancial
tags:
- Employees
summary: Update employee financial section
parameters:
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Section'
responses:
'200':
description: The updated section.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/homes:
put:
operationId: updateEmployeeHome
tags:
- Employees
summary: Update employee home section
parameters:
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Section'
responses:
'200':
description: The updated section.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/emergencies:
put:
operationId: updateEmployeeEmergency
tags:
- Employees
summary: Update employee emergency section
parameters:
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Section'
responses:
'200':
description: The updated section.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/activate:
put:
operationId: activateEmployee
tags:
- Employees
summary: Activate an employee
parameters:
- $ref: '#/components/parameters/EmployeeId'
responses:
'200':
description: The employee was activated.
'401':
$ref: '#/components/responses/Unauthorized'
/employees/{employeeId}/deactivate:
put:
operationId: deactivateEmployee
tags:
- Employees
summary: Deactivate an employee
parameters:
- $ref: '#/components/parameters/EmployeeId'
responses:
'200':
description: The employee was deactivated.
'401':
$ref: '#/components/responses/Unauthorized'
/attendances:
get:
operationId: listAttendances
tags:
- Attendance
summary: List attendances
description: Returns a list of attendance entries.
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A list of attendance entries.
content:
application/json:
schema:
$ref: '#/components/schemas/AttendanceList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createAttendance
tags:
- Attendance
summary: Create an attendance
description: Creates a new attendance entry, identifying the employee by userId, email, or externalId.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AttendanceInput'
responses:
'201':
description: The created attendance entry.
content:
application/json:
schema:
$ref: '#/components/schemas/Attendance'
'401':
$ref: '#/components/responses/Unauthorized'
/attendances/{attendanceId}:
get:
operationId: getAttendance
tags:
- Attendance
summary: Get an attendance
parameters:
- $ref: '#/components/parameters/AttendanceId'
responses:
'200':
description: The attendance entry.
content:
application/json:
schema:
$ref: '#/components/schemas/Attendance'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateAttendance
tags:
- Attendance
summary: Update an attendance
parameters:
- $ref: '#/components/parameters/AttendanceId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AttendanceInput'
responses:
'200':
description: The updated attendance entry.
content:
application/json:
schema:
$ref: '#/components/schemas/Attendance'
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteAttendance
tags:
- Attendance
summary: Delete an attendance
parameters:
- $ref: '#/components/parameters/AttendanceId'
responses:
'204':
description: The attendance entry was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/attendances/track-time:
post:
operationId: trackTime
tags:
- Attendance
summary: Track an attendance entry
description: Tracks a clock-in / clock-out by sending an employee identifier and a dateTime.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TrackTimeInput'
responses:
'200':
description: The tracked attendance entry.
content:
application/json:
schema:
$ref: '#/components/schemas/Attendance'
'401':
$ref: '#/components/responses/Unauthorized'
/attendances/categories:
get:
operationId: listAttendanceCategories
tags:
- Attendance
summary: List attendance categories
responses:
'200':
description: A list of attendance categories.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/attendances/expected-time:
get:
operationId: listExpectedTime
tags:
- Attendance
summary: List expected time per user
description: Returns a paginated list of expected working time by user for a given date range.
parameters:
- name: from
in: query
schema:
type: string
format: date
- name: to
in: query
schema:
type: string
format: date
responses:
'200':
description: A list of expected times.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/time-off-requests:
get:
operationId: listTimeOffRequests
tags:
- Time Off
summary: List time-off requests
responses:
'200':
description: A list of time-off requests.
content:
application/json:
schema:
$ref: '#/components/schemas/TimeOffRequestList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createTimeOffRequest
tags:
- Time Off
summary: Create a time-off request
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TimeOffRequestInput'
responses:
'201':
description: The created time-off request.
content:
application/json:
schema:
$ref: '#/components/schemas/TimeOffRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/time-off-requests/processed:
post:
operationId: createProcessedTimeOffRequest
tags:
- Time Off
summary: Create a pre-approved time-off request
description: Creates a time-off request that is already approved (processed).
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TimeOffRequestInput'
responses:
'201':
description: The created pre-approved time-off request.
content:
application/json:
schema:
$ref: '#/components/schemas/TimeOffRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/time-off-types:
get:
operationId: listTimeOffTypes
tags:
- Time Off
summary: List time-off types
responses:
'200':
description: A list of time-off types.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/time-off-status:
get:
operationId: listTimeOffStatus
tags:
- Time Off
summary: List time-off statuses
responses:
'200':
description: A list of time-off statuses.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/time-off/set-balance/{timeOffTypeId}/{employeeId}:
put:
operationId: setTimeOffBalance
tags:
- Time Off
summary: Set a time-off balance
description: Sets an employee's balance for a given time-off type.
parameters:
- name: timeOffTypeId
in: path
required: true
schema:
type: string
- $ref: '#/components/parameters/EmployeeId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BalanceInput'
responses:
'200':
description: The balance was set.
'401':
$ref: '#/components/responses/Unauthorized'
/documents/company:
get:
operationId: listCompanyDocuments
tags:
- Documents
summary: List company documents
description: Returns a paginated list of company documents.
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A list of company documents.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/compensation/contracts:
get:
operationId: listContracts
tags:
- Compensation
summary: List contracts
responses:
'200':
description: A list of contracts.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/compensation/contract-types:
get:
operationId: listContractTypes
tags:
- Compensation
summary: List contract types
responses:
'200':
description: A list of contract types.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/compensation/salaries:
get:
operationId: listSalaries
tags:
- Compensation
summary: List salaries
responses:
'200':
description: A list of salaries.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/compensation/additional-payments:
get:
operationId: listAdditionalPayments
tags:
- Compensation
summary: List additional payments
responses:
'200':
description: A list of additional payments.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/compensation/additional-payment-types:
get:
operationId: listAdditionalPaymentTypes
tags:
- Compensation
summary: List additional payment types
responses:
'200':
description: A list of additional payment types.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/companies:
get:
operationId: listCompanies
tags:
- Organization
summary: List companies
responses:
'200':
description: A list of companies.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
/offices:
get:
operationId: listOffices
tags:
- Organization
summary: List offices
responses:
'200':
description: A list of offices.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createOffice
tags:
- Organization
summary: Create an office
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NamedResourceInput'
responses:
'201':
description: The created office.
'401':
$ref: '#/components/responses/Unauthorized'
/offices/{id}:
get:
operationId: getOffice
tags:
- Organization
summary: Get an office
parameters:
- $ref: '#/components/parameters/Id'
responses:
'200':
description: The office.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateOffice
tags:
- Organization
summary: Update an office
parameters:
- $ref: '#/components/parameters/Id'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NamedResourceInput'
responses:
'200':
description: The updated office.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteOffice
tags:
- Organization
summary: Delete an office
parameters:
- $ref: '#/components/parameters/Id'
responses:
'204':
description: The office was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/departments:
get:
operationId: listDepartments
tags:
- Organization
summary: List departments
responses:
'200':
description: A list of departments.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createDepartment
tags:
- Organization
summary: Create a department
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NamedResourceInput'
responses:
'201':
description: The created department.
'401':
$ref: '#/components/responses/Unauthorized'
/departments/{id}:
get:
operationId: getDepartment
tags:
- Organization
summary: Get a department
parameters:
- $ref: '#/components/parameters/Id'
responses:
'200':
description: The department.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateDepartment
tags:
- Organization
summary: Update a department
parameters:
- $ref: '#/components/parameters/Id'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NamedResourceInput'
responses:
'200':
description: The updated department.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteDepartment
tags:
- Organization
summary: Delete a department
parameters:
- $ref: '#/components/parameters/Id'
responses:
'204':
description: The department was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/teams:
get:
operationId: listTeams
tags:
- Organization
summary: List teams
responses:
'200':
description: A list of teams.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createTeam
tags:
- Organization
summary: Create a team
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NamedResourceInput'
responses:
'201':
description: The created team.
'401':
$ref: '#/components/responses/Unauthorized'
/teams/{id}:
get:
operationId: getTeam
tags:
- Organization
summary: Get a team
parameters:
- $ref: '#/components/parameters/Id'
responses:
'200':
description: The team.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateTeam
tags:
- Organization
summary: Update a team
parameters:
- $ref: '#/components/parameters/Id'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NamedResourceInput'
responses:
'200':
description: The updated team.
'401':
$ref: '#/components/responses/Unauthorized'
delete:
operationId: deleteTeam
tags:
- Organization
summary: Delete a team
parameters:
- $ref: '#/components/parameters/Id'
responses:
'204':
description: The team was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
/areas:
get:
operationId: listAreas
tags:
- Organization
summary: List areas
responses:
'200':
description: A list of areas.
content:
application/json:
schema:
$ref: '#/components/schemas/GenericList'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createArea
tags:
- Organization
summary: Create an area
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NamedResourceInput'
responses:
'201':
description: The created area.
'401':
$ref: '#/components/responses/Unauthorized'
/areas/{id}:
get:
operationId: getArea
tags:
- Organization
summary: Get an area
parameters:
- $ref: '#/components/parameters/Id'
responses:
'200':
# --- truncated at 32 KB (46 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kenjo/refs/heads/main/openapi/kenjo-openapi.yml