# BambooHR

> Manage your BambooHR employee records, time off, and reports: look people up, keep their details current, and see who is out.

App · Jobs & Hiring · 20 actions. Web page: https://docs.lodol.com/docs/integrations/bamboohr

## Actions

### Approve or deny time off

Approve, deny or cancel an existing BambooHR time off request.

**Inputs**

- Request ID (`request_id`, text, required): The time off request to act on, from 'List time off requests'.
- New status (`status`, text, required): What to set the request to. One of: `approved`, `denied`, `canceled`.
- Note (`note`, text): A note explaining the decision.

**Outputs**

- `note` (text)
- `request_id` (text)
- `status` (text)
- `updated` (true/false)

**Example output**

```json
{
  "note": "Have a good break.",
  "request_id": "902",
  "status": "approved",
  "updated": true
}
```

### Create a time off request

Request time off for an employee. They have to be on a policy for the type you choose.

**Inputs**

- Employee ID (`employee_id`, text, required): The internal BambooHR employee ID, as returned by 'List employees'. This is not the editable Employee # shown on a profile.
- First day off (`start`, date, required): The first day of the absence.
- Last day off (`end`, date, required): The last day of the absence.
- Time off type (`time_off_type_id`, text, required): Which kind of time off this is.
- Amount (`amount`, number): How much time off, in the unit the chosen type is measured in, usually hours. Must be more than zero. Leave empty to let BambooHR work it out from the dates. From 0.0 to 10000.0.
- Status (`status`, text): What state to create the request in. Approving it outright needs the connected user to have that permission. One of: `requested`, `approved`, `denied`. Default: `requested`.
- Note (`note`, text): A note to attach to the request.

**Outputs**

- `employee_id` (text)
- `request` (object)
- `request_id` (text)

**Example output**

```json
{
  "employee_id": "42",
  "request": {
    "amount": {
      "amount": 16,
      "unit": "hours"
    },
    "employeeId": "42",
    "end": "2026-11-03",
    "id": "902",
    "name": "Ada Lovelace",
    "start": "2026-11-02",
    "status": {
      "status": "requested"
    },
    "type": {
      "id": "78",
      "name": "Vacation"
    }
  },
  "request_id": "902"
}
```

### Create an employee

Add a new employee to BambooHR. Work emails have to be unique across the account.

**Inputs**

- First name (`first_name`, text, required): The employee's first name.
- Last name (`last_name`, text, required): The employee's last name.
- Work email (`work_email`, text): The employee's work email. BambooHR rejects one that another employee already has.
- Job title (`job_title`, text): The employee's job title.
- Department (`department`, text): The department the employee belongs to.
- Division (`division`, text): The division the employee belongs to.
- Location (`location`, text): The location the employee works from.
- Hire date (`hire_date`, date): The day the employee started.
- Mobile phone (`mobile_phone`, text): The employee's mobile number.
- Other fields (`extra_fields`, object): Any other BambooHR field, by its field name, including this account's custom ones. Run 'List fields' to see every name.

**Outputs**

- `employee` (object)
- `employee_id` (text)

**Example output**

```json
{
  "employee": {
    "displayName": "Grace Hopper",
    "firstName": "Grace",
    "id": "43",
    "lastName": "Hopper",
    "workEmail": "grace@example.com"
  },
  "employee_id": "43"
}
```

### Delete an employee

Permanently delete a BambooHR employee and everything attached to them. This cannot be undone.

**Inputs**

- Employee ID (`employee_id`, text, required): The internal BambooHR employee ID, as returned by 'List employees'. This is not the editable Employee # shown on a profile.

**Outputs**

- `deleted` (true/false)
- `employee_id` (text)

**Example output**

```json
{
  "deleted": true,
  "employee_id": "43"
}
```

### Get an employee

Fetch one BambooHR employee's record by their internal employee ID.

**Inputs**

- Employee ID (`employee_id`, text, required): The internal BambooHR employee ID, as returned by 'List employees'. This is not the editable Employee # shown on a profile.
- Fields (`fields`, list): Which fields to return. Leave empty for the standard identity and job fields. Run 'List fields' to see every name this account has.
- Only current values (`only_current`, true/false): Turn off to include future-dated rows from the history tables (job, compensation, status). Default: `true`.

**Outputs**

- `employee` (object)

**Example output**

```json
{
  "employee": {
    "department": "Engineering",
    "displayName": "Ada Lovelace",
    "firstName": "Ada",
    "hireDate": "2024-03-01",
    "id": "42",
    "jobTitle": "Software Engineer",
    "lastName": "Lovelace",
    "workEmail": "ada@example.com"
  }
}
```

### Get company information

Fetch your company's BambooHR profile: legal name, display name, address and phone number.

**Inputs**: None.

**Outputs**

- `company` (object)

**Example output**

```json
{
  "company": {
    "address": {
      "city": "Lindon",
      "line1": "1 Example Way",
      "state": "UT",
      "zip": "84042"
    },
    "displayName": "Acme",
    "legalName": "Acme Corporation",
    "phone": "+1 555 0100"
  }
}
```

### Get employee table data

Read one of an employee's history tables: job info, compensation, employment status, emergency contacts and the rest.

**Inputs**

- Employee ID (`employee_id`, text, required): The internal BambooHR employee ID, or 'all' to read the table for every employee this connection can see.
- Table (`table`, text, required): Which of the employee's tables to read.

**Outputs**

- `count` (number)
- `employee_id` (text)
- `rows` (list)
- `table` (text)

**Example output**

```json
{
  "count": 1,
  "employee_id": "42",
  "rows": [
    {
      "date": "2024-03-01",
      "department": "Engineering",
      "employeeId": "42",
      "id": "1",
      "jobTitle": "Software Engineer"
    }
  ],
  "table": "jobInfo"
}
```

### Get the employee directory

Fetch your company's published BambooHR employee directory: who everyone is, their job title, department and work contact details.

**Inputs**

- Only current employees (`only_current`, true/false): Turn off to also include people whose hire date is still in the future. Default: `true`.

**Outputs**

- `count` (number)
- `employees` (list)
- `fields` (list)

**Example output**

```json
{
  "count": 1,
  "employees": [
    {
      "department": "Engineering",
      "displayName": "Ada Lovelace",
      "id": "42",
      "jobTitle": "Software Engineer",
      "workEmail": "ada@example.com"
    }
  ],
  "fields": [
    {
      "id": "displayName",
      "name": "Display Name",
      "type": "text"
    }
  ]
}
```

### Get time off balances

Work out how much time off an employee has left, as of today or a date you choose.

**Inputs**

- Employee ID (`employee_id`, text, required): The internal BambooHR employee ID, as returned by 'List employees'. This is not the editable Employee # shown on a profile.
- As of (`as_of`, date): The date to calculate the balance for. A future date projects the balance forward. Defaults to today.
- Decimal places (`precision`, number): How precisely to round the balances. From 0 to 4.

**Outputs**

- `balances` (list)
- `count` (number)
- `employee_id` (text)

**Example output**

```json
{
  "balances": [
    {
      "balance": "62.50",
      "end": "2026-09-03",
      "name": "Vacation",
      "policyType": "accruing",
      "timeOffType": "78",
      "units": "hours",
      "usedYearToDate": "16.00"
    }
  ],
  "count": 1,
  "employee_id": "42"
}
```

### List changed employees

List the employees whose records were added, updated or deleted since a given moment: the way to keep another system in step with BambooHR.

**Inputs**

- Changed since (`since`, date and time, required): Only report employees changed after this moment. Use the 'latest' value from the last run to pick up where it left off.
- Change type (`change_type`, text): Which kind of change to report. One of: `all` (All changes), `inserted` (Added), `updated`, `deleted`. Default: `all`.

**Outputs**

- `count` (number)
- `employees` (list)
- `latest` (text)

**Example output**

```json
{
  "count": 1,
  "employees": [
    {
      "action": "Updated",
      "id": "42",
      "lastChanged": "2026-09-01T12:00:00+00:00"
    }
  ],
  "latest": "2026-09-01T12:00:00+00:00"
}
```

### List employees

List the employees in your BambooHR account, optionally filtered to one field's value and sorted, a page at a time.

**Inputs**

- Extra fields (`fields`, list): Extra employee fields to include beyond the standard identity and job ones, by BambooHR field name, for example workEmail or hireDate. Run 'List fields' to see every name this account has.
- Filter on field (`filter_field`, text): Narrow the list to employees whose chosen field matches 'Filter value'. One of: `firstName` (First name), `lastName` (Last name), `preferredName` (Preferred name), `jobTitleName` (Job title), `status` (Employment status), `workEmail` (Work email), `departmentName` (Department), `divisionName` (Division), `locationName` (Location).
- Filter value (`filter_value`, text): The value the chosen field has to match.
- Only these employee IDs (`employee_ids`, list): Look up specific employees by their internal IDs instead of listing everyone.
- Sort by (`sort`, text): The order the employees come back in. One of: `lastName` (Last name (A-Z)), `-lastName` (Last name (Z-A)), `firstName` (First name (A-Z)), `-firstName` (First name (Z-A)), `employeeId` (Employee ID (ascending)), `-employeeId` (Employee ID (descending)), `jobTitleName` (Job title (A-Z)), `-jobTitleName` (Job title (Z-A)), `status` (Status (A-Z)), `-status` (Status (Z-A)).
- Employees per page (`limit`, number): How many employees to return in one page. From 1 to 2500. Default: `100`.
- Next page cursor (`cursor`, text): The 'next_cursor' from a previous run of this step, to fetch the following page.

**Outputs**

- `count` (number)
- `employees` (list)
- `has_more` (true/false)
- `next_cursor` (text)
- `total` (number)

**Example output**

```json
{
  "count": 1,
  "employees": [
    {
      "departmentName": "Engineering",
      "displayName": "Ada Lovelace",
      "employeeId": "42",
      "firstName": "Ada",
      "jobTitleName": "Software Engineer",
      "lastName": "Lovelace",
      "status": "Active",
      "workEmail": "ada@example.com"
    }
  ],
  "has_more": false,
  "next_cursor": null,
  "total": 1
}
```

### List fields

List every employee field this BambooHR account has, custom fields included: the names the other steps accept.

**Inputs**: None.

**Outputs**

- `count` (number)
- `fields` (list)

**Example output**

```json
{
  "count": 1,
  "fields": [
    {
      "alias": "firstName",
      "deprecated": false,
      "id": "1",
      "name": "First name",
      "type": "text"
    }
  ]
}
```

### List reports

List the saved custom reports in your BambooHR account, so a later step can run one.

**Inputs**

- Page (`page`, number): Which page of reports to return. At least 1. Default: `1`.
- Reports per page (`page_size`, number): How many reports to return in one page. From 1 to 1000. Default: `100`.

**Outputs**

- `count` (number)
- `has_more` (true/false)
- `page` (number)
- `reports` (list)
- `total` (number)

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "page": 1,
  "reports": [
    {
      "id": 128,
      "name": "Headcount by department"
    }
  ],
  "total": 1
}
```

### List time off policies

List the account's time off policies and which type of time off each one accrues.

**Inputs**: None.

**Outputs**

- `count` (number)
- `policies` (list)

**Example output**

```json
{
  "count": 1,
  "policies": [
    {
      "id": 12,
      "name": "Standard vacation",
      "timeOffTypeId": 78,
      "type": "accruing"
    }
  ]
}
```

### List time off requests

List the time off requests that overlap a date range, optionally narrowed to one employee, type or status.

**Inputs**

- From (`start`, date, required): The start of the window. A request is included when it is still running on this date, even if it began earlier.
- To (`end`, date, required): The end of the window. A request is included when it has begun by this date, even if it runs on past it.
- Employee ID (`employee_id`, text): Only this employee's requests.
- Request ID (`request_id`, text): Only this one request.
- Time off types (`type_ids`, list): Only requests of these kinds of time off.
- Statuses (`statuses`, list): Only requests in these states. One or more of: `requested`, `approved`, `denied`, `canceled`, `superceded` (Superseded).
- Scope (`scope`, text): Whose requests to report, from the connected user's point of view. One of: `view` (Requests the caller can view), `approve` (Requests the caller can approve), `myRequests` (Only the caller's own requests).
- Leave out notes (`exclude_notes`, true/false): Turn on to omit the employee and manager notes from each request. Default: `false`.

**Outputs**

- `count` (number)
- `requests` (list)

**Example output**

```json
{
  "count": 1,
  "requests": [
    {
      "amount": {
        "amount": 40,
        "unit": "hours"
      },
      "employeeId": "42",
      "end": "2026-10-09",
      "id": "901",
      "name": "Ada Lovelace",
      "start": "2026-10-05",
      "status": {
        "status": "approved"
      },
      "type": {
        "id": "78",
        "name": "Vacation"
      }
    }
  ]
}
```

### List time off types

List the kinds of time off this account tracks and the unit each is measured in.

**Inputs**

- Only types I can request (`requestable_only`, true/false): Limit the list to the types the connected user is allowed to request time off under. Default: `false`.

**Outputs**

- `count` (number)
- `default_hours` (list)
- `time_off_types` (list)

**Example output**

```json
{
  "count": 1,
  "default_hours": [
    {
      "amount": "8",
      "name": "Vacation"
    }
  ],
  "time_off_types": [
    {
      "id": "78",
      "name": "Vacation",
      "units": "hours"
    }
  ]
}
```

### List users

List the people with a BambooHR login, and which employee record each one belongs to.

**Inputs**

- Account status (`status`, list): Only report users whose login is in one of these states. Leave empty for all of them. One or more of: `enabled`, `disabled`.

**Outputs**

- `count` (number)
- `users` (list)

**Example output**

```json
{
  "count": 1,
  "users": [
    {
      "email": "ada@example.com",
      "employeeId": "42",
      "firstName": "Ada",
      "id": "7",
      "lastName": "Lovelace",
      "status": "enabled"
    }
  ]
}
```

### List who's out

See who is away between two dates, company holidays included. The range can span at most 366 days.

**Inputs**

- From (`start`, date, required): The first day of the window.
- To (`end`, date, required): The last day of the window, at most 366 days after the first.
- Employee ID (`employee_id`, text): Only this employee's time away.
- Only my direct reports (`direct_reports_only`, true/false): Limit the answer to the connected user's direct reports. Default: `false`.
- Include people details (`include_people`, true/false): Also return each absent employee's name and photo alongside the entries. Default: `false`.
- Page (`page`, number): Which page of results to return. At least 1. Default: `1`.
- Results per page (`page_size`, number): How many entries to return in one page. From 1 to 1000. Default: `100`.

**Outputs**

- `count` (number)
- `entries` (list)
- `has_more` (true/false)
- `page` (number)
- `people` (object)
- `total` (number)

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "employeeId": 42,
      "end": "2026-10-09",
      "id": "901",
      "name": "Ada Lovelace",
      "start": "2026-10-05",
      "type": "timeOff"
    }
  ],
  "has_more": false,
  "page": 1,
  "people": {},
  "total": 1
}
```

### Run a report

Run one of your saved BambooHR reports and return its rows.

**Inputs**

- Report (`report_id`, text, required): Which saved report to run.
- Duplicate rows (`deduplicate`, text): Whether to collapse rows that are identical. BambooHR removes them by default. One of: `yes` (Remove duplicate rows), `no` (Keep every row).
- Only current values (`only_current`, true/false): Turn off to include future-dated values from the history tables. Default: `true`.

**Outputs**

- `count` (number)
- `fields` (list)
- `report_id` (text)
- `rows` (list)
- `title` (text)

**Example output**

```json
{
  "count": 1,
  "fields": [
    {
      "id": "displayName",
      "name": "Display Name",
      "type": "text"
    }
  ],
  "report_id": "128",
  "rows": [
    {
      "displayName": "Ada Lovelace",
      "id": "42"
    }
  ],
  "title": "Headcount by department"
}
```

### Update an employee

Change fields on an existing BambooHR employee, then read the updated record back.

**Inputs**

- Employee ID (`employee_id`, text, required): The internal BambooHR employee ID, as returned by 'List employees'. This is not the editable Employee # shown on a profile.
- First name (`first_name`, text): A new first name, if it is changing.
- Last name (`last_name`, text): A new last name, if it is changing.
- Work email (`work_email`, text): A new work email, if it is changing.
- Job title (`job_title`, text): A new job title, if it is changing.
- Department (`department`, text): A new department, if it is changing.
- Division (`division`, text): A new division, if it is changing.
- Location (`location`, text): A new location, if it is changing.
- Mobile phone (`mobile_phone`, text): A new mobile number, if it is changing.
- Other fields (`extra_fields`, object): Any other BambooHR field to set, by its field name, including this account's custom ones.

**Outputs**

- `employee` (object)
- `employee_id` (text)
- `read_back` (true/false)
- `updated_fields` (list)

**Example output**

```json
{
  "employee": {
    "id": "42",
    "jobTitle": "Staff Engineer"
  },
  "employee_id": "42",
  "read_back": true,
  "updated_fields": [
    "jobTitle"
  ]
}
```
