> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Breathe HR

The Breathe HR connector lets your AI agent act in each user's Breathe HR account. Each user connects their own Breathe HR API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 61 tools.

**Authentication:** API Key
**Categories:** Productivity
**Tools:** 61: 42 read, 15 write, 4 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=BREATHEHR)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Breathe HR connection

   In **AgentKit > Connections**, create a Breathe HR connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'breathehr'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Breathe HR:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'breathehr_absences_list',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "breathehr"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Breathe HR:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="breathehr_absences_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Breathe HR credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'breathehr_absences_list',
  toolInput: {},
  connector: 'breathehr',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="breathehr_absences_list",
    tool_input={},
    connection_name="breathehr",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `breathehr_absences_list`

List Absences · Read-only

List approved absences (holiday and other leave) across the account, optionally filtered by type, leave reason, employee, department or date range.
Returns absences: an array of absence records with id, employee, start_date, end_date, half-day flags, type, leave_reason, cancelled, deducted, work_units and notes.
Use breathehr_absences_list for taken or booked time off. Use breathehr_leave_requests_list for requests and their approval status, and breathehr_sicknesses_list for sickness.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `department_id` (`integer`, optional): Return absences for this department only. Example: 12.
- `employee_id` (`integer`, optional): Return absences for this employee only. Example: 1234.
- `end_date` (`string`, optional): Upper date bound for the absences returned. Format YYYY-MM-DD. Example: 2026-12-31.
- `exclude_cancelled_absences` (`boolean`, optional): Set to true to leave out cancelled absences. Example: true.
- `other_leave_reason_id` (`integer`, optional): Return only other-leave absences with this leave reason ID, from breathehr_other_leave_reasons_list. Example: 2.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.
- `start_date` (`string`, optional): Return absences on or after this date. Format YYYY-MM-DD. Example: 2026-01-01.
- `type` (`string`, optional): Type of absence to return: Holiday or OtherLeave. Example: Holiday. One of: `Holiday`, `OtherLeave`.

Example input: `{}`

### `breathehr_account_get`

Get Account · Read-only

Get the Breathe HR account that the API key belongs to.
Returns account: an array with one account record holding id, name, domain and uuid.
Use breathehr_account_get to confirm which company account the connection uses.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `breathehr_benefits_list`

List Benefits · Read-only

List benefit records (such as pensions) across the account.
Returns benefits: an array of benefit records with id, provider, amount, start_date, end_date, review_date, pension_opt_out and employer and employee contributions.
Use breathehr_benefits_list for the whole account. Use breathehr_employee_benefits_list or breathehr_department_benefits_list to narrow it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_bonuses_list`

List Bonuses · Read-only

List bonus records across the account.
Returns bonuses: an array of bonus records with id, description, amount and award_date.
Use breathehr_bonuses_list for the whole account. Use breathehr_employee_bonuses_list or breathehr_department_bonuses_list to narrow it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_change_requests_list`

List Change Requests · Read-only

List employee detail change requests across the account.
Returns change_requests: an array of change request records with id, field_name, value, approved and approved_at.
Use breathehr_change_requests_list to review pending changes for everyone. Use breathehr_employee_change_requests_list for one employee.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_company_documents_list`

List Company Documents · Read-only

List the company documents stored in Breathe.
Returns company_documents: an array of document records with id, nice_name, created_at and updated_at.
Use breathehr_company_documents_list to see which policies and handbooks are published.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_company_project_get`

Get Company Project · Read-only

Get one company project by ID.
Returns company_projects: an array with one project record holding id, name, due_on and complete.
Use breathehr_company_project_get when you have a project ID. Use breathehr_company_projects_list to find it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `company_project_id` (`integer`, required): ID of the company project, from breathehr_company_projects_list. Example: 7.

Example input: `{"company_project_id":7}`

### `breathehr_company_projects_list`

List Company Projects · Read-only

List the company's projects.
Returns company_projects: an array of project records with id, name, due_on and complete.
Use breathehr_company_projects_list to find a company_project_id for expenses. Use breathehr_company_project_get for one project.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_company_training_types_list`

List Training Types · Read-only

List the company's training types.
Returns company_training_types: an array of training type records with id and name.
Use breathehr_company_training_types_list to find company_training_type_id for breathehr_training_course_create.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_department_absences_list`

List Department Absences · Read-only

List absences (holiday and other leave) for employees in one department.
Returns absences: an array of absence records with id, employee, start_date, end_date, half-day flags, type, leave_reason, cancelled, deducted, work_units and notes.
Use breathehr_department_absences_list for one department. Use breathehr_absences_list to filter by type, employee or date range.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `department_id` (`integer`, required): Breathe ID of the department, from breathehr_departments_list. Example: 12.
- `exclude_cancelled_absences` (`boolean`, optional): Set to true to leave out cancelled absences. Example: true.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"department_id":12}`

### `breathehr_department_benefits_list`

List Department Benefits · Read-only

List benefit records for employees in one department.
Returns benefits: an array of benefit records with id, provider, amount, start_date, end_date, review_date, pension_opt_out and employer and employee contributions.
Use breathehr_department_benefits_list for one department. Use breathehr_benefits_list for everyone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `department_id` (`integer`, required): Breathe ID of the department, from breathehr_departments_list. Example: 12.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"department_id":12}`

### `breathehr_department_bonuses_list`

List Department Bonuses · Read-only

List bonus records for employees in one department.
Returns bonuses: an array of bonus records with id, description, amount and award_date.
Use breathehr_department_bonuses_list for one department. Use breathehr_bonuses_list for everyone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `department_id` (`integer`, required): Breathe ID of the department, from breathehr_departments_list. Example: 12.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"department_id":12}`

### `breathehr_department_leave_requests_list`

List Department Leave Requests · Read-only

List leave requests for employees in one department.
Returns leave_requests: an array of leave request records with id, start_date, end_date, half-day flags, action, status and notes.
Use breathehr_department_leave_requests_list for one department. Use breathehr_leave_requests_list to filter by employee or date range.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `department_id` (`integer`, required): Breathe ID of the department, from breathehr_departments_list. Example: 12.
- `exclude_cancelled_requests` (`boolean`, optional): Set to true to leave out cancelled leave requests. Example: true.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"department_id":12}`

### `breathehr_department_salaries_list`

List Department Salaries · Read-only

List salary records for employees in one department.
Returns salaries: an array of salary records with id, amount, basis, start_date and end_date.
Use breathehr_department_salaries_list for one department. Use breathehr_salaries_list for everyone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `department_id` (`integer`, required): Breathe ID of the department, from breathehr_departments_list. Example: 12.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"department_id":12}`

### `breathehr_departments_list`

List Departments · Read-only

List the company's departments.
Returns departments: an array of department records with id and name.
Use breathehr_departments_list to find a department ID for filters or new employees.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_divisions_list`

List Divisions · Read-only

List the company's divisions.
Returns divisions: an array of division records with id and name.
Use breathehr_divisions_list to find a division ID for a new employee.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `breathehr_employee_absences_list`

List Employee Absences · Read-only

List absences (holiday and other leave) for one employee.
Returns absences: an array of absence records with id, employee, start_date, end_date, half-day flags, type, leave_reason, cancelled, deducted, work_units and notes.
Use breathehr_employee_absences_list for a single employee. Use breathehr_absences_list to filter across employees by type or date range.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `exclude_cancelled_absences` (`boolean`, optional): Set to true to leave out cancelled absences. Example: true.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"employee_id":1234}`

### `breathehr_employee_benefits_list`

List Employee Benefits · Read-only

List benefit records for one employee.
Returns benefits: an array of benefit records with id, provider, amount, start_date, end_date, review_date, pension_opt_out and employer and employee contributions.
Use breathehr_employee_benefits_list for one employee. Use breathehr_benefits_list for everyone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"employee_id":1234}`

### `breathehr_employee_bonuses_list`

List Employee Bonuses · Read-only

List bonus records for one employee.
Returns bonuses: an array of bonus records with id, description, amount and award_date.
Use breathehr_employee_bonuses_list for one employee. Use breathehr_bonuses_list for everyone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"employee_id":1234}`

### `breathehr_employee_change_requests_list`

List Employee Change Requests · Read-only

List detail change requests for one employee.
Returns change_requests: an array of change request records with id, field_name, value, approved and approved_at.
Use breathehr_employee_change_requests_list for a single employee. Use breathehr_change_requests_list for the whole account.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"employee_id":1234}`

### `breathehr_employee_get`

Get Employee · Read-only

Get one employee's full record by ID.
Returns employees: an array with one employee record with id, first_name, last_name, email, job_title, status, join and job start dates, department, division, location, working_pattern, holiday_allowance, line_manager, holiday_approver, salary, custom_fields and personal details such as dob and nationality.
Use breathehr_employee_get when you have an employee ID. Use breathehr_employees_list to find the ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.

Example input: `{"employee_id":1234}`

### `breathehr_employee_holiday_years_list`

List Employee Holiday Years · Read-only

List an employee's holiday years with their allowance and usage.
Returns employee_holiday_years: an array of holiday year records with id, start_date, end_date, allowance, adjustment, carry-over, used_from_this_year, used_from_last_year, used_from_next_year, finished, working_pattern and holiday_allowance.
Use breathehr_employee_holiday_years_list to check how much holiday an employee has left. Use breathehr_employee_absences_list for the individual absences.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `for_date` (`string`, optional): Return only the holiday year that includes this date. Format YYYY-MM-DD. Example: 2026-10-14.

Example input: `{"employee_id":1234}`

### `breathehr_employee_jobs_list`

List Employee Jobs · Read-only

List job history records, optionally for one employee.
Returns employee_jobs: an array of job records with title, fulltime_parttime, start_date, end_date and contract_end_date.
Use breathehr_employee_jobs_list for job history. Use breathehr_employee_get for the employee's current job title.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, optional): Return jobs for this employee only. Example: 1234.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_employee_leave_requests_list`

List Employee Leave Requests · Read-only

List leave requests for one employee.
Returns leave_requests: an array of leave request records with id, start_date, end_date, half-day flags, action, status and notes.
Use breathehr_employee_leave_requests_list for a single employee. Use breathehr_leave_requests_list to filter across employees by date or department.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `exclude_cancelled_requests` (`boolean`, optional): Set to true to leave out cancelled leave requests. Example: true.

Example input: `{"employee_id":1234}`

### `breathehr_employee_salaries_list`

List Employee Salaries · Read-only

List salary records for one employee.
Returns salaries: an array of salary records with id, amount, basis, start_date and end_date.
Use breathehr_employee_salaries_list for one employee's salary history. Use breathehr_salaries_list for everyone.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{"employee_id":1234}`

### `breathehr_employee_sicknesses_list`

List Employee Sicknesses · Read-only

List sickness records for one employee.
Returns sicknesses: an array of sickness records with id, employee, company_sicknesstype, start_date, end_date, half-day flags, status, reason, review_notes, deducted and fit_note_required.
Use breathehr_employee_sicknesses_list for a single employee. Use breathehr_sicknesses_list to filter across employees by date or department.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.

Example input: `{"employee_id":1234}`

### `breathehr_employees_list`

List Employees · Read-only

List employees in the Breathe HR account, one page at a time, optionally limited to HR managers or line managers.
Returns employees: an array of employee records with id, first_name, last_name, email, job_title, status, join and job start dates, department, division, location, working_pattern, holiday_allowance, line_manager, holiday_approver and salary.
Use breathehr_employees_list to find employee IDs or browse the roster. Use breathehr_employee_get for one employee's full record.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `filter` (`string`, optional): Return only employees with this role: hr (HR managers), line_manager, either, or neither. Example: line_manager. One of: `hr`, `line_manager`, `either`, `neither`.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_expense_claim_get`

Get Expense Claim · Read-only

Get one expense claim by ID, with its expense items.
Returns employee_expense_claims: an array with one expense claim record, including employee_expenses and state.
Use breathehr_expense_claim_get when you have a claim ID. Use breathehr_expense_claims_list to find it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `expense_claim_id` (`integer`, required): ID of the expense claim, from breathehr_expense_claims_list. Example: 610.

Example input: `{"expense_claim_id":610}`

### `breathehr_expense_claims_list`

List Expense Claims · Read-only

List expense claims, optionally for one employee or in one state.
Returns employee_expense_claims: an array of expense claim records with id, employee, employee_expenses, state, description, submitted, approved, rejected, paid and closed dates, approver and reject_reason.
Use breathehr_expense_claims_list to find claims awaiting approval. Use breathehr_expense_claim_get for one claim and its expense items.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, optional): Return expense claims for this employee only. Example: 1234.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.
- `state_filter` (`string`, optional): Return only claims in this state: submitted, approved, completed or rejected. Example: submitted. One of: `submitted`, `approved`, `completed`, `rejected`.

Example input: `{}`

### `breathehr_expense_get`

Get Expense · Read-only

Get one employee expense item by ID.
Returns employee_expenses: an array with one expense record.
Use breathehr_expense_get when you have an expense ID. Use breathehr_expenses_list to find it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `expense_id` (`integer`, required): ID of the employee expense item, from breathehr_expenses_list. Example: 4321.

Example input: `{"expense_id":4321}`

### `breathehr_expenses_list`

List Expenses · Read-only

List employee expense items, optionally for one employee and including already-claimed items.
Returns employee_expenses: an array of expense records with id, employee_id, employee_expense_claim_id, expense_date, description, company_expense_type_id, company_project_id, amount, vat, miles, payable_to_employee, chargeable_to_client and client_name.
Use breathehr_expenses_list for individual expense items. Use breathehr_expense_claims_list for submitted claims.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, optional): Return expenses for this employee only. Example: 1234.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.
- `show_claimed` (`boolean`, optional): Set to true to include expenses that are already part of a claim. Example: true.

Example input: `{}`

### `breathehr_holiday_allowances_list`

List Holiday Allowances · Read-only

List the company's holiday allowance schemes.
Returns holiday_allowances: an array of holiday allowance records with id, default, and the allowance for each year of service (year_1 to year_10).
Use breathehr_holiday_allowances_list to find a holiday allowance ID for a new employee. Use breathehr_employee_holiday_years_list for one employee's balance.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `breathehr_leave_request_cancelling_get`

Get Request Being Cancelled · Read-only

Get the original leave request that a cancellation request is cancelling.
Returns leave_requests: an array with the original leave request record.
Use breathehr_leave_request_cancelling_get on a request whose action is a cancellation. Use breathehr_leave_request_get for the request itself.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `leave_request_id` (`integer`, required): ID of the cancellation leave request, from breathehr_leave_requests_list. Example: 9013.

Example input: `{"leave_request_id":9013}`

### `breathehr_leave_request_get`

Get Leave Request · Read-only

Get one leave request by ID.
Returns leave_requests: an array with one leave request record holding id, start_date, end_date, half-day flags, action, status and notes.
Use breathehr_leave_request_get when you have a leave request ID. Use breathehr_leave_requests_list to find it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `leave_request_id` (`integer`, required): ID of the leave request, from breathehr_leave_requests_list. Example: 9012.

Example input: `{"leave_request_id":9012}`

### `breathehr_leave_requests_list`

List Leave Requests · Read-only

List leave requests across the account, optionally filtered by employee, department or start-date range.
Returns leave_requests: an array of leave request records with id, start_date, end_date, half-day flags, action, status and notes.
Use breathehr_leave_requests_list to find requests awaiting approval. Use breathehr_leave_request_get for one request and breathehr_absences_list for approved time off.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `department_id` (`integer`, optional): Return leave requests for this department only. Example: 12.
- `employee_id` (`integer`, optional): Return leave requests for this employee only. Example: 1234.
- `end_date` (`string`, optional): Return leave requests starting on or before this date. Format YYYY-MM-DD. Example: 2026-12-31.
- `exclude_cancelled_requests` (`boolean`, optional): Set to true to leave out cancelled leave requests. Example: true.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.
- `start_date` (`string`, optional): Return leave requests starting on or after this date. Format YYYY-MM-DD. Example: 2026-01-01.

Example input: `{}`

### `breathehr_locations_list`

List Locations · Read-only

List the company's locations.
Returns locations: an array of location records with id and name.
Use breathehr_locations_list to find a location ID for a new employee.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `breathehr_other_leave_reasons_list`

List Other Leave Reasons · Read-only

List the company's reasons for other (non-holiday) leave.
Returns other_leave_reasons: an array of leave reason records with id and name.
Use breathehr_other_leave_reasons_list to find the other_leave_reason_id filter for breathehr_absences_list.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `breathehr_salaries_list`

List Salaries · Read-only

List salary records across the account.
Returns salaries: an array of salary records with id, amount, basis, start_date and end_date.
Use breathehr_salaries_list for the whole account. Use breathehr_employee_salaries_list or breathehr_department_salaries_list to narrow it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_sicknesses_list`

List Sicknesses · Read-only

List sickness records across the account, optionally filtered by employee, department or start-date range.
Returns sicknesses: an array of sickness records with id, employee, company_sicknesstype, start_date, end_date, half-day flags, status, reason, review_notes, deducted and fit_note_required.
Use breathehr_sicknesses_list to report on sickness. Use breathehr_employee_sicknesses_list for one employee.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `department_id` (`integer`, optional): Return sicknesses for this department only. Example: 12.
- `employee_id` (`integer`, optional): Return sicknesses for this employee only. Example: 1234.
- `end_date` (`string`, optional): Return sicknesses starting on or before this date. Format YYYY-MM-DD. Example: 2026-12-31.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.
- `start_date` (`string`, optional): Return sicknesses starting on or after this date. Format YYYY-MM-DD. Example: 2026-01-01.

Example input: `{}`

### `breathehr_statutory_holiday_countries_list`

List Statutory Holiday Countries · Read-only

List the countries whose statutory (public) holidays Breathe can apply.
Returns statutory_holiday_countries: an array of country records with id and name.
Use breathehr_statutory_holiday_countries_list to find statutory_holiday_country_id for breathehr_employee_create.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `breathehr_training_courses_list`

List Training Courses · Read-only

List employee training course records, optionally for one employee.
Returns employee_training_courses: an array of training records with id, name, status, outcome, start_on, end_on, half_day, hours, cost, followup_date, expires_on, notes, employee, company_training_type, company_training_category and company_training_provider.
Use breathehr_training_courses_list to review training. Use breathehr_training_course_create to record new training.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `employee_id` (`integer`, optional): Return training courses for this employee only. Example: 1234.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Defaults to 1. Example: 2.
- `per_page` (`integer`, optional): Number of records per page, up to 100. Defaults to 25. Example: 50.

Example input: `{}`

### `breathehr_working_patterns_list`

List Working Patterns · Read-only

List the company's working patterns.
Returns working_patterns: an array of working pattern records with id, name, default, total_hours, the working days (mon to sun) and hours per day (mon_hr to sun_hr).
Use breathehr_working_patterns_list to find a working pattern ID for a new employee.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `breathehr_absence_cancel`

Cancel Absence · Write

Cancel an absence by ID, optionally recording a reason.
Returns the cancellation as a leave request record with id, dates, action and status.
Use breathehr_absence_cancel to withdraw booked time off. Use breathehr_leave_request_reject to turn down a pending request.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `absence_id` (`integer`, required): ID of the absence to cancel, from breathehr_absences_list. Example: 5678.
- `reason` (`string`, optional): Reason for cancelling the absence. Example: Trip postponed.

Example input: `{"absence_id":5678}`

### `breathehr_employee_change_request_approve`

Approve Change Request · Write

Approve a pending change request so the new value is applied to the employee's record.
Returns change_requests: an array with the approved change request record.
Use breathehr_employee_change_request_approve for requests left pending. Use breathehr_employee_change_request_create with approved true to apply a change in one step.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `change_request_id` (`integer`, required): ID of the change request to approve, from breathehr_employee_change_requests_list. Example: 777.
- `employee_id` (`integer`, required): Breathe ID of the employee the change request belongs to. Example: 1234.

Example input: `{"change_request_id":777,"employee_id":1234}`

### `breathehr_employee_change_request_create`

Create Change Request · Write

Request a change to one field of an employee's record, optionally applying it straight away.
Returns change_requests: an array with the created change request record, including its id and approved flag.
Use breathehr_employee_change_request_create to update an existing employee's details. Use breathehr_employee_change_request_approve to apply a pending request later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `field` (`string`, required): Employee field to change, from Breathe's fixed list (for example job details, contact details, address, bank details and personal details such as last_name, email, address1, postcode, personal_mobile or company_department_id). Example: personal_mobile. One of: `account_holder_name`, `account_number`, `bank_branch`, `bank_name`, `building_society`, `company_contract_type_id`, `company_department_id`, `company_division_id`, `company_location_id`, `company_noticeperiod_id`, `contract_provider`, `custom_field_1`, `custom_field_2`, `custom_field_3`, `custom_field_4`, `custom_field_5`, `ddi`, `email`, `employee_location_id`, `employee_ref`, `ethnicity`, `facebook`, `first_name`, `join_date`, `known_as`, `last_name`, `company_pronoun_id`, `linked_in`, `middle_name`, `prefix`, `probation_date`, `probation_date_reminder_on`, `ref_number`, `remuneration_currency_id`, `skype`, `sort_code`, `twitter`, `weekly_working_hours`, `work_ext`, `work_mobile`, `is_a_director`, `p46`, `person_type`, `address1`, `address2`, `address3`, `city`, `company_disability_ids`, `company_ethnicity_id`, `company_religious_belief_id`, `company_sexual_orientation_id`, `county`, `country`, `dob`, `driving_license`, `gender_id`, `home_telephone`, `marital_status`, `nationality`, `national_insurance_no`, `personal_email`, `personal_mobile`, `postcode`, `gender_for_payroll`.
- `value` (`string`, required): New value for the field. Send IDs and dates as text, dates as YYYY-MM-DD. Example: 07700 900789.
- `approved` (`boolean`, optional): Set to true to apply the change immediately instead of leaving it pending approval. Example: false.

Example input: `{"employee_id":1234,"field":"account_holder_name","value":"<value>"}`

### `breathehr_employee_create`

Create Employee · Write

Create a new employee record in Breathe HR.
Returns employees: an array with the created employee record, including its new id.
Use breathehr_employee_create to add a new starter. To change an existing employee's details, use breathehr_employee_change_request_create.
Get department, division, location, working pattern and holiday allowance IDs from their list tools first.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `company_join_date` (`string`, required): Date the employee joined the company. Format YYYY-MM-DD. Example: 2026-11-01.
- `email` (`string`, required): Employee's work email address. Example: priya.shah@example.com.
- `first_name` (`string`, required): Employee's first name. Example: Priya.
- `last_name` (`string`, required): Employee's last name. Example: Shah.
- `ddi` (`string`, optional): Direct dial-in phone number. Example: 020 7946 0000.
- `department_id` (`integer`, optional): ID of the employee's department, from breathehr_departments_list. Example: 12.
- `division_id` (`integer`, optional): ID of the employee's division, from breathehr_divisions_list. Example: 3.
- `dob` (`string`, optional): Date of birth. Format YYYY-MM-DD. Example: 1990-04-15.
- `employee_ref` (`string`, optional): Your own employee reference number. Example: EMP-0042.
- `ethnicity` (`string`, optional): Ethnicity. Example: Prefer not to say.
- `full_or_part_time` (`string`, optional): Whether the employee is Full-Time or Part-Time. Example: Full-Time. One of: `Full-Time`, `Part-Time`.
- `gender` (`string`, optional): Gender ID, as the Breathe spec defines this field. Example: 2.
- `holiday_allowance_id` (`integer`, optional): ID of the employee's holiday allowance, from breathehr_holiday_allowances_list. Example: 1.
- `home_telephone` (`string`, optional): Home telephone number. Example: 0161 496 0000.
- `hr` (`boolean`, optional): Set to true to give the employee HR manager permissions. Example: false.
- `ignore_working_pattern` (`boolean`, optional): Set to true to ignore the working pattern and enter the time lost manually when leave is requested. Example: false.
- `job_start_date` (`string`, optional): Start date of the employee's current job. Format YYYY-MM-DD. Example: 2026-11-01.
- `job_title` (`string`, optional): Employee's job title. Example: Account Manager.
- `line_manager` (`boolean`, optional): Set to true to give the employee line manager permissions. Example: false.
- `location_id` (`integer`, optional): ID of the employee's location, from breathehr_locations_list. Example: 5.
- `marital_status` (`string`, optional): Marital status: Single, Co-Habiting, Married, Civil Partnership, Separated, Divorced or Widowed. Example: Married. One of: `Single`, `Co-Habiting`, `Married`, `Civil Partnership`, `Separated`, `Divorced`, `Widowed`.
- `middle_name` (`string`, optional): Employee's middle name. Example: Anne.
- `national_insurance_no` (`string`, optional): UK National Insurance number. Example: QQ123456C.
- `nationality` (`string`, optional): Nationality, from Breathe's fixed list (for example British, Irish, Indian, USA). Example: British. One of: `British`, `Afghan`, `Albanian`, `Algerian`, `Andorran`, `Angolan`, `Antiguans`, `Argentinean`, `Armenian`, `Australian`, `Austrian`, `Azerbaijani`, `Bahamian`, `Bahraini`, `Bangladeshi`, `Barbadian`, `Barbudans`, `Belarusian`, `Belgian`, `Belizean`, `Beninese`, `Bermudian`, `Bhutanese`, `Bolivian`, `Bosnian`, `Botswana`, `Brazilian`, `Bruneian`, `Bulgarian`, `Burkinabe`, `Burmese`, `Burundian`, `Cambodian`, `Cameroonian`, `Canadian`, `Cape Verdean`, `Caymanian`, `Central African`, `Chadian`, `Chilean`, `Chinese`, `Colombian`, `Comoran`, `Congolese`, `Cornish British`, `Costa Rican`, `Croatian`, `Cuban`, `Cypriot`, `Czech`, `Danish`, `Djibouti`, `Dominican`, `Dutch`, `East Timorese`, `Ecuadorean`, `Egyptian`, `Emirian`, `English`, `Equatorial Guinean`, `Eritrean`, `Estonian`, `Ethiopian`, `Fijian`, `Filipino`, `Finnish`, `French`, `Gabonese`, `Gambian`, `Georgian`, `German`, `Ghanaian`, `Greek`, `Grenadian`, `Guatemalan`, `Guinea-Bissauan`, `Guinean`, `Guyanese`, `Haitian`, `Herzegovinian`, `Honduran`, `Hongkonger`, `Hungarian`, `Icelander`, `Indian`, `Indonesian`, `Iranian`, `Iraqi`, `Irish`, `Israeli`, `Italian`, `Ivorian`, `Jamaican`, `Japanese`, `Jordanian`, `Kazakhstani`, `Kenyan`, `Kittian and Nevisian`, `Kuwaiti`, `Kyrgyz`, `Laotian`, `Latvian`, `Lebanese`, `Liberian`, `Libyan`, `Liechtensteiner`, `Lithuanian`, `Luxembourger`, `Macedonian`, `Malagasy`, `Malawian`, `Malaysian`, `Maldivan`, `Malian`, `Maltese`, `Marshallese`, `Mauritanian`, `Mauritian`, `Mexican`, `Micronesian`, `Moldovan`, `Monacan`, `Mongolian`, `Montenegrin`, `Moroccan`, `Mosotho`, `Motswana`, `Mozambican`, `Namibian`, `Nauruan`, `Nepalese`, `Netherlander`, `New Zealander`, `Ni-Vanuatu`, `Nicaraguan`, `Nigerian`, `Nigerien`, `North Korean`, `Northern Irish`, `Norwegian`, `Omani`, `Pakistani`, `Palauan`, `Palestinian`, `Panamanian`, `Papua New Guinean`, `Paraguayan`, `Peruvian`, `Polish`, `Portuguese`, `Qatari`, `Romanian`, `Russian`, `Rwandan`, `Saint Lucian`, `Salvadoran`, `Samoan`, `San Marinese`, `Sao Tomean`, `Saudi`, `Scottish`, `Senegalese`, `Serbian`, `Seychellois`, `Sierra Leonean`, `Singaporean`, `Slovakian`, `Slovenian`, `Solomon Islander`, `Somali`, `South African`, `South Korean`, `Spanish`, `Sri Lankan`, `Sudanese`, `Surinamer`, `Swazi`, `Swedish`, `Swiss`, `Syrian`, `Taiwanese`, `Tajik`, `Tanzanian`, `Thai`, `Togolese`, `Tongan`, `Trinidadian or Tobagonian`, `Tunisian`, `Turkish`, `Tuvaluan`, `Ugandan`, `Ukrainian`, `Uruguayan`, `USA`, `Uzbekistani`, `Venezuelan`, `Vietnamese`, `Vincentian`, `Welsh`, `Yemeni`, `Zambian`, `Zimbabwean`.
- `person_type` (`string`, optional): Type of person: Employee, Contractor or Volunteer. Example: Employee. One of: `Employee`, `Contractor`, `Volunteer`.
- `personal_mobile` (`string`, optional): Personal mobile number. Example: 07700 900456.
- `receives_statutory_holidays` (`boolean`, optional): Set to true if the employee receives the statutory (public) holidays of their country. Example: true.
- `salary_amount` (`integer`, optional): Starting salary amount. Send with salary_basis and salary_start_date to record a salary. Example: 42000.
- `salary_basis` (`string`, optional): Basis of the salary amount. Example: Annual.
- `salary_payment_schedule` (`string`, optional): How often the salary is paid: weekly, monthly, 4-weekly, bi-weekly or bi-monthly. Example: monthly. One of: `weekly`, `monthly`, `4-weekly`, `bi-weekly`, `bi-monthly`.
- `salary_start_date` (`string`, optional): Date the salary starts. Format YYYY-MM-DD. Example: 2026-11-01.
- `status` (`string`, optional): Employment status: Current employee, Pending leaver or Ex-employee. Example: Current employee. One of: `Current employee`, `Pending leaver`, `Ex-employee`.
- `statutory_holiday_country_id` (`integer`, optional): ID of the country whose statutory holidays apply, from breathehr_statutory_holiday_countries_list. Example: 1.
- `work_ext` (`string`, optional): Work phone extension. Example: 214.
- `work_mobile` (`string`, optional): Work mobile number. Example: 07700 900123.
- `working_pattern_id` (`integer`, optional): ID of the employee's working pattern, from breathehr_working_patterns_list. Example: 1.

Example input: `{"company_join_date":"<company_join_date>","email":"<email>","first_name":"<first_name>","last_name":"<last_name>"}`

### `breathehr_employee_leave_request_create`

Create Leave Request · Write

Create a leave request for an employee; it enters Breathe's approval workflow.
Returns leave_requests: an array with the created leave request record, including its id and status.
Use breathehr_employee_leave_request_create to request time off. Use breathehr_leave_request_approve or breathehr_leave_request_reject to act on it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `end_date` (`string`, required): Last day of leave. Format YYYY-MM-DD. Example: 2026-12-23.
- `half_start` (`boolean`, required): Set to true if the first day is a half day; false for a full first day. Example: false.
- `start_date` (`string`, required): First day of leave. Format YYYY-MM-DD. Example: 2026-12-21.
- `half_end` (`boolean`, optional): Set to true if the last day is a half day. Example: false.
- `half_end_am_pm` (`string`, optional): Which half of the last day is taken when half_end is true: am or pm. Example: am. One of: `am`, `pm`.
- `half_start_am_pm` (`string`, optional): Which half of the first day is taken when half_start is true: am or pm. Example: pm. One of: `am`, `pm`.
- `notes` (`string`, optional): Notes for the approver. Example: Family wedding.
- `type` (`string`, optional): Type of leave: Holiday or OtherLeave. Example: Holiday. One of: `Holiday`, `OtherLeave`.

Example input: `{"employee_id":1234,"end_date":"<end_date>","half_start":true,"start_date":"<start_date>"}`

### `breathehr_employee_sickness_create`

Create Sickness · Write

Record a sickness absence for an employee.
Returns sicknesses: an array with the created sickness record, including its id.
Use breathehr_employee_sickness_create to log a new sickness. Use breathehr_sickness_update to change or close an existing one.
Read a sickness type ID from an existing record in breathehr_sicknesses_list; Breathe has no endpoint that lists sickness types.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `company_sicknesstype_id` (`integer`, required): ID of the company's sickness type. Breathe has no endpoint that lists sickness types; read the company_sicknesstype.id of an existing record from breathehr_sicknesses_list. Example: 3.
- `employee_id` (`integer`, required): Breathe ID of the employee, from breathehr_employees_list. Example: 1234.
- `start_date` (`string`, required): First day of the sickness. Format YYYY-MM-DD. Example: 2026-11-02.
- `end_date` (`string`, optional): Last day of the sickness. Leave empty while the employee is still off sick. Format YYYY-MM-DD. Example: 2026-11-04.
- `half_day` (`boolean`, optional): Set to true if the sickness is a single half day. Example: false.
- `half_end` (`boolean`, optional): Set to true if the sickness ends with a half day. Example: false.
- `half_end_am_pm` (`string`, optional): Which half of the last day is taken when half_end is true: am or pm. Example: am. One of: `am`, `pm`.
- `half_start` (`boolean`, optional): Set to true if the sickness starts with a half day. Example: false.
- `half_start_am_pm` (`string`, optional): Which half of the first day is taken when half_start is true: am or pm. Example: pm. One of: `am`, `pm`.
- `reason` (`string`, optional): Reason for the sickness. Example: Flu.
- `review_notes` (`string`, optional): Return-to-work or review notes. Example: Back at work, no adjustments needed.
- `status` (`string`, optional): Status of the sickness record: open, returned, rejected, clarification or closed. Example: open. One of: `open`, `returned`, `rejected`, `clarification`, `closed`.

Example input: `{"company_sicknesstype_id":3,"employee_id":1234,"start_date":"<start_date>"}`

### `breathehr_expense_claim_create`

Create Expense Claim · Write

Submit a claim made up of an employee's unclaimed expense items.
Returns employee_expense_claims: an array with the created claim record, including its id and state.
Use breathehr_expense_claim_create after logging items with breathehr_expense_create. Use breathehr_expense_claim_review to approve or reject the claim.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `employee_expense_ids` (`array`, required): IDs of the employee's unclaimed expense items to include, from breathehr_expenses_list. Example: [4321, 4322].
- `employee_id` (`integer`, required): Breathe ID of the employee making the claim. Example: 1234.

Example input: `{"employee_expense_ids":[4321,4322],"employee_id":1234}`

### `breathehr_expense_claim_review`

Approve or Reject Expense Claim · Write

Approve or reject a submitted expense claim.
Returns employee_expense_claims: an array with the updated claim record and its new state.
Use breathehr_expense_claim_review to decide a claim. Use breathehr_expense_claims_list with state_filter submitted to find claims waiting for review.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `approve` (`boolean`, required): Set to true to approve the claim or false to reject it. Example: true.
- `approver_rejector_id` (`integer`, required): Breathe employee ID of the person approving or rejecting the claim. Example: 1001.
- `expense_claim_id` (`integer`, required): ID of the expense claim to review, from breathehr_expense_claims_list. Example: 610.
- `rejection_reason` (`string`, optional): Reason for rejecting the claim; send when approve is false. Example: Receipt missing for train ticket.

Example input: `{"approve":true,"approver_rejector_id":1001,"expense_claim_id":610}`

### `breathehr_expense_create`

Create Expense · Write

Record an expense item for an employee; it stays unclaimed until added to a claim.
Returns employee_expenses: an array with the created expense record, including its id.
Use breathehr_expense_create to log an expense. Use breathehr_expense_claim_create to submit unclaimed expenses for approval.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `amount` (`integer`, required): Expense amount. The Breathe spec types it as an integer. Example: 45.
- `company_expense_type_id` (`integer`, required): ID of the company expense type. Breathe has no endpoint that lists expense types; read company_expense_type_id from an existing item in breathehr_expenses_list. Example: 2.
- `description` (`string`, required): Description of the expense. Example: Train to client site.
- `employee_id` (`integer`, required): Breathe ID of the employee who incurred the expense, from breathehr_employees_list. Example: 1234.
- `expense_date` (`string`, required): Date the expense was incurred. Format YYYY-MM-DD. Example: 2026-10-01.
- `payable_to_employee` (`boolean`, required): Set to true if the expense should be reimbursed to the employee. Example: true.
- `chargeable_to_client` (`boolean`, optional): Set to true if the expense is rechargeable to a client. Example: false.
- `client_name` (`string`, optional): Name of the client the expense is rechargeable to. Example: Acme Ltd.
- `company_mileage_rate_id` (`integer`, optional): ID of the company mileage rate, for mileage expenses. Example: 1.
- `company_project_id` (`integer`, optional): ID of the company project to charge, from breathehr_company_projects_list. Example: 7.
- `has_receipt` (`boolean`, optional): Set to true if a receipt exists for the expense. Example: true.
- `miles` (`integer`, optional): Miles travelled, for mileage expenses. Example: 30.
- `vat` (`integer`, optional): VAT amount included in the expense. The Breathe spec types it as an integer. Example: 9.

Example input: `{"amount":45,"company_expense_type_id":2,"description":"<description>","employee_id":1234,"expense_date":"<expense_date>","payable_to_employee":true}`

### `breathehr_expense_update`

Update Expense · Write

Update an unclaimed employee expense item by ID; only the fields you send change.
Returns employee_expenses: an array with the updated expense record.
Use breathehr_expense_update to correct an expense before it is claimed. Use breathehr_expense_create for a new one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `expense_id` (`integer`, required): ID of the unclaimed employee expense item, from breathehr_expenses_list. Example: 4321.
- `amount` (`integer`, optional): Expense amount. The Breathe spec types it as an integer. Example: 45.
- `chargeable_to_client` (`boolean`, optional): Set to true if the expense is rechargeable to a client. Example: false.
- `client_name` (`string`, optional): Name of the client the expense is rechargeable to. Example: Acme Ltd.
- `company_mileage_rate_id` (`integer`, optional): ID of the company mileage rate, for mileage expenses. Example: 1.
- `company_project_id` (`integer`, optional): ID of the company project to charge, from breathehr_company_projects_list. Example: 7.
- `description` (`string`, optional): Description of the expense. Example: Train to client site.
- `expense_date` (`string`, optional): Date the expense was incurred. Format YYYY-MM-DD. Example: 2026-10-01.
- `has_receipt` (`boolean`, optional): Set to true if a receipt exists for the expense. Example: true.
- `miles` (`integer`, optional): Miles travelled, for mileage expenses. Example: 30.
- `payable_to_employee` (`boolean`, optional): Set to true if the expense should be reimbursed to the employee. Example: true.
- `vat` (`integer`, optional): VAT amount included in the expense. The Breathe spec types it as an integer. Example: 9.

Example input: `{"expense_id":4321}`

### `breathehr_leave_request_approve`

Approve Leave Request · Write

Approve a pending leave request. Breathe records the approval as made by its "API Employee".
Returns leave_requests: an array with the approved leave request record.
Use breathehr_leave_request_approve to accept a request. Use breathehr_leave_request_reject to turn it down.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `leave_request_id` (`integer`, required): ID of the leave request to approve, from breathehr_leave_requests_list. Example: 9012.

Example input: `{"leave_request_id":9012}`

### `breathehr_leave_request_reject`

Reject Leave Request · Write

Reject a pending leave request with a reason.
Returns leave_requests: an array with the rejected leave request record.
Use breathehr_leave_request_reject to turn a request down. Use breathehr_leave_request_approve to accept it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `leave_request_id` (`integer`, required): ID of the leave request to reject, from breathehr_leave_requests_list. Example: 9012.
- `rejection_reason` (`string`, required): Reason the request is rejected; shown to the employee. Example: Team already at minimum cover that week.

Example input: `{"leave_request_id":9012,"rejection_reason":"<rejection_reason>"}`

### `breathehr_sickness_update`

Update Sickness · Write

Update a sickness record by ID; only the fields you send change.
Returns sicknesses: an array with the updated sickness record.
Use breathehr_sickness_update to set an end date, change status or add review notes. Use breathehr_employee_sickness_create for a new sickness.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `sickness_id` (`integer`, required): ID of the sickness record, from breathehr_sicknesses_list. Example: 3456.
- `company_sicknesstype_id` (`integer`, optional): ID of the company's sickness type. Breathe has no endpoint that lists sickness types; read the company_sicknesstype.id of an existing record from breathehr_sicknesses_list. Example: 3.
- `end_date` (`string`, optional): Last day of the sickness. Leave empty while the employee is still off sick. Format YYYY-MM-DD. Example: 2026-11-04.
- `half_day` (`boolean`, optional): Set to true if the sickness is a single half day. Example: false.
- `half_end` (`boolean`, optional): Set to true if the sickness ends with a half day. Example: false.
- `half_end_am_pm` (`string`, optional): Which half of the last day is taken when half_end is true: am or pm. Example: am. One of: `am`, `pm`.
- `half_start` (`boolean`, optional): Set to true if the sickness starts with a half day. Example: false.
- `half_start_am_pm` (`string`, optional): Which half of the first day is taken when half_start is true: am or pm. Example: pm. One of: `am`, `pm`.
- `reason` (`string`, optional): Reason for the sickness. Example: Flu.
- `review_notes` (`string`, optional): Return-to-work or review notes. Example: Back at work, no adjustments needed.
- `start_date` (`string`, optional): First day of the sickness. Format YYYY-MM-DD. Example: 2026-11-02.
- `status` (`string`, optional): Status of the sickness record: open, returned, rejected, clarification or closed. Example: open. One of: `open`, `returned`, `rejected`, `clarification`, `closed`.

Example input: `{"sickness_id":3456}`

### `breathehr_training_course_create`

Create Training Course · Write

Record a training course for an employee.
Returns employee_training_courses: an array with the created training record, including its id.
Use breathehr_training_course_create for new training. Use breathehr_training_course_update to change its status or outcome.
Get company_training_type_id from breathehr_company_training_types_list.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `company_training_type_id` (`integer`, required): ID of the training type, from breathehr_company_training_types_list. Example: 4.
- `employee_id` (`integer`, required): Breathe ID of the employee taking the training, from breathehr_employees_list. Example: 1234.
- `name` (`string`, required): Name of the training course. Example: First Aid at Work.
- `company_training_category_id` (`integer`, optional): ID of the training category. Example: 2.
- `company_training_provider_id` (`integer`, optional): ID of the training provider. Example: 5.
- `cost` (`number`, optional): Cost of the course. Example: 250.0.
- `end_on` (`string`, optional): End date of the course. Format YYYY-MM-DD. Example: 2026-11-11.
- `followup_date` (`string`, optional): Date to follow up on the training. Format YYYY-MM-DD. Example: 2027-11-10.
- `half_day` (`boolean`, optional): Set to true if the course lasts half a day. Example: false.
- `half_day_am_pm` (`string`, optional): Which half of the day the course takes when half_day is true: am or pm. Example: am. One of: `am`, `pm`.
- `notes` (`string`, optional): Free-text notes about the course. Example: Refresher course.
- `outcome` (`string`, optional): Outcome of the course: passed or failed. Example: passed. One of: `passed`, `failed`.
- `remuneration_currency_id` (`integer`, optional): ID of the currency the cost is in. Example: 1.
- `start_on` (`string`, optional): Start date of the course. Format YYYY-MM-DD. Example: 2026-11-10.
- `status` (`string`, optional): Training status: Requested, Approved, Pending, Rejected, Booked, Completed, Cancelled, Non-attended or Expired. Example: Booked. One of: `Requested`, `Approved`, `Pending`, `Rejected`, `Booked`, `Completed`, `Cancelled`, `Non-attended`, `Expired`.

Example input: `{"company_training_type_id":4,"employee_id":1234,"name":"<name>"}`

### `breathehr_training_course_update`

Update Training Course · Write

Update an employee training course record by ID; only the fields you send change.
Returns employee_training_courses: an array with the updated training record.
Use breathehr_training_course_update to mark training booked, completed, passed or failed. Use breathehr_training_course_create for new training.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `training_course_id` (`integer`, required): ID of the employee training course record, from breathehr_training_courses_list. Example: 880.
- `company_training_category_id` (`integer`, optional): ID of the training category. Example: 2.
- `company_training_provider_id` (`integer`, optional): ID of the training provider. Example: 5.
- `company_training_type_id` (`integer`, optional): ID of the training type, from breathehr_company_training_types_list. Example: 4.
- `cost` (`number`, optional): Cost of the course. Example: 250.0.
- `end_on` (`string`, optional): End date of the course. Format YYYY-MM-DD. Example: 2026-11-11.
- `followup_date` (`string`, optional): Date to follow up on the training. Format YYYY-MM-DD. Example: 2027-11-10.
- `half_day` (`boolean`, optional): Set to true if the course lasts half a day. Example: false.
- `half_day_am_pm` (`string`, optional): Which half of the day the course takes when half_day is true: am or pm. Example: am. One of: `am`, `pm`.
- `name` (`string`, optional): Name of the training course. Example: First Aid at Work.
- `notes` (`string`, optional): Free-text notes about the course. Example: Refresher course.
- `outcome` (`string`, optional): Outcome of the course: passed or failed. Example: passed. One of: `passed`, `failed`.
- `remuneration_currency_id` (`integer`, optional): ID of the currency the cost is in. Example: 1.
- `start_on` (`string`, optional): Start date of the course. Format YYYY-MM-DD. Example: 2026-11-10.
- `status` (`string`, optional): Training status: Requested, Approved, Pending, Rejected, Booked, Completed, Cancelled, Non-attended or Expired. Example: Booked. One of: `Requested`, `Approved`, `Pending`, `Rejected`, `Booked`, `Completed`, `Cancelled`, `Non-attended`, `Expired`.

Example input: `{"training_course_id":880}`

### `breathehr_expense_claim_delete`

Delete Expense Claim · Destructive

Delete an expense claim by ID. This cannot be undone.
Returns employee_expense_claims: an array with the deleted claim record.
Use breathehr_expense_claim_delete to withdraw a claim made in error. Use breathehr_expense_claim_review to reject it instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `expense_claim_id` (`integer`, required): ID of the expense claim to delete, from breathehr_expense_claims_list. Example: 610.

Example input: `{"expense_claim_id":610}`

### `breathehr_expense_delete`

Delete Expense · Destructive

Delete an employee expense item by ID. This cannot be undone.
Returns employee_expenses: an array with the deleted expense record.
Use breathehr_expense_delete to remove an expense logged in error. Use breathehr_expense_update to correct it instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `expense_id` (`integer`, required): ID of the employee expense item to delete, from breathehr_expenses_list. Example: 4321.

Example input: `{"expense_id":4321}`

### `breathehr_sickness_delete`

Delete Sickness · Destructive

Delete a sickness record by ID. This cannot be undone.
Returns sicknesses: an array with the deleted sickness record.
Use breathehr_sickness_delete only for records entered in error. Use breathehr_sickness_update to correct or close a sickness.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `sickness_id` (`integer`, required): ID of the sickness record to delete, from breathehr_sicknesses_list. Example: 3456.

Example input: `{"sickness_id":3456}`

### `breathehr_training_course_delete`

Delete Training Course · Destructive

Delete an employee training course record by ID. This cannot be undone.
Returns employee_training_courses: an array with the deleted training record.
Use breathehr_training_course_delete only for records entered in error. Use breathehr_training_course_update with status Cancelled to keep the history.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `training_course_id` (`integer`, required): ID of the employee training course record to delete, from breathehr_training_courses_list. Example: 880.

Example input: `{"training_course_id":880}`

## Related

Other Productivity connectors ([all 144](/agentkit/connectors/?category=productivity)):

- [Slack](/agentkit/connectors/slack/): Scalekit connector, OAuth, 96 tools
- [Microsoft 365](/agentkit/connectors/microsoft365/): Scalekit connector, OAuth, 317 tools
- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
