Kenjo Recruiting API

Positions, candidates, and applications.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/kenjo-recruiting-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

kenjo-recruiting-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Kenjo Attendance Recruiting 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: Recruiting
  description: Positions, candidates, and applications.
paths:
  /recruiting/positions:
    get:
      operationId: listPositions
      tags:
      - Recruiting
      summary: List job positions
      description: Returns a list of job openings, including public positions usable to build a custom career site.
      responses:
        '200':
          description: A list of positions.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericList'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /recruiting/candidates:
    get:
      operationId: listCandidates
      tags:
      - Recruiting
      summary: List candidates
      responses:
        '200':
          description: A list of candidates.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericList'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createCandidate
      tags:
      - Recruiting
      summary: Create a candidate
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CandidateInput'
      responses:
        '201':
          description: The created candidate.
        '401':
          $ref: '#/components/responses/Unauthorized'
  /recruiting/candidates/{candidateId}:
    get:
      operationId: getCandidate
      tags:
      - Recruiting
      summary: Get a candidate
      parameters:
      - $ref: '#/components/parameters/CandidateId'
      responses:
        '200':
          description: The candidate.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateCandidate
      tags:
      - Recruiting
      summary: Update a candidate
      parameters:
      - $ref: '#/components/parameters/CandidateId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CandidateInput'
      responses:
        '200':
          description: The updated candidate.
        '401':
          $ref: '#/components/responses/Unauthorized'
  /recruiting/candidates/{candidateId}/attachment:
    post:
      operationId: addCandidateAttachment
      tags:
      - Recruiting
      summary: Add a candidate attachment
      parameters:
      - $ref: '#/components/parameters/CandidateId'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '201':
          description: The attachment was added.
        '401':
          $ref: '#/components/responses/Unauthorized'
  /recruiting/candidates/{candidateId}/documents:
    get:
      operationId: getCandidateDocuments
      tags:
      - Recruiting
      summary: Get candidate documents
      parameters:
      - $ref: '#/components/parameters/CandidateId'
      responses:
        '200':
          description: A list of candidate documents.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericList'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /recruiting/applications:
    get:
      operationId: listApplications
      tags:
      - Recruiting
      summary: List applications
      responses:
        '200':
          description: A list of applications.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericList'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /recruiting/applications/position/{positionId}/candidate/{candidateId}:
    post:
      operationId: createApplication
      tags:
      - Recruiting
      summary: Create an application
      description: Creates an application tying a candidate to a position.
      parameters:
      - $ref: '#/components/parameters/PositionId'
      - $ref: '#/components/parameters/CandidateId'
      responses:
        '201':
          description: The created application.
        '401':
          $ref: '#/components/responses/Unauthorized'
    put:
      operationId: updateApplication
      tags:
      - Recruiting
      summary: Update an application
      parameters:
      - $ref: '#/components/parameters/PositionId'
      - $ref: '#/components/parameters/CandidateId'
      responses:
        '200':
          description: The updated application.
        '401':
          $ref: '#/components/responses/Unauthorized'
  /recruiting/applications/position/{positionId}/candidate/{candidateId}/attachment:
    post:
      operationId: addApplicationAttachment
      tags:
      - Recruiting
      summary: Add an application attachment
      parameters:
      - $ref: '#/components/parameters/PositionId'
      - $ref: '#/components/parameters/CandidateId'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '201':
          description: The attachment was added.
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  schemas:
    Error:
      type: object
      properties:
        code:
          type: string
        message:
          type: string
    GenericList:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            additionalProperties: true
        page:
          type: integer
        limit:
          type: integer
        total:
          type: integer
    CandidateInput:
      type: object
      properties:
        firstName:
          type: string
        lastName:
          type: string
        email:
          type: string
          format: email
        phone:
          type: string
  parameters:
    PositionId:
      name: positionId
      in: path
      required: true
      schema:
        type: string
      description: The unique identifier of the position.
    CandidateId:
      name: candidateId
      in: path
      required: true
      schema:
        type: string
      description: The unique identifier of the candidate.
  responses:
    Unauthorized:
      description: The bearer token is missing, invalid, or expired.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Bearer token obtained from POST /auth/login by exchanging a Kenjo API key.