From bamboohr-pack
Generates minimal TypeScript examples for BambooHR REST API: fetch employee directory, get single employee by ID. For starting integrations, testing setups, or learning patterns.
How this skill is triggered — by the user, by Claude, or both
Slash command
/bamboohr-pack:bamboohr-hello-worldThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Minimal working examples for the three most common BambooHR API operations: fetch the employee directory, get a single employee by ID, and run a custom report.
Minimal working examples for the three most common BambooHR API operations: fetch the employee directory, get a single employee by ID, and run a custom report.
bamboohr-install-auth setupBAMBOOHR_API_KEY and BAMBOOHR_COMPANY_DOMAIN env vars setimport 'dotenv/config';
const COMPANY = process.env.BAMBOOHR_COMPANY_DOMAIN!;
const API_KEY = process.env.BAMBOOHR_API_KEY!;
const BASE = `https://api.bamboohr.com/api/gateway.php/${COMPANY}/v1`;
const AUTH = `Basic ${Buffer.from(`${API_KEY}:x`).toString('base64')}`;
// GET /employees/directory — returns all active employees
const dirRes = await fetch(`${BASE}/employees/directory`, {
headers: { Authorization: AUTH, Accept: 'application/json' },
});
const directory = await dirRes.json();
console.log(`Company has ${directory.employees.length} employees`);
for (const emp of directory.employees.slice(0, 5)) {
console.log(` ${emp.displayName} — ${emp.jobTitle} (${emp.department})`);
}
Directory response shape:
{
"fields": [
{ "id": "displayName", "type": "text", "name": "Display Name" },
{ "id": "jobTitle", "type": "text", "name": "Job Title" }
],
"employees": [
{
"id": "123",
"displayName": "Jane Smith",
"firstName": "Jane",
"lastName": "Smith",
"jobTitle": "Software Engineer",
"department": "Engineering",
"location": "Remote",
"workEmail": "[email protected]",
"photoUrl": "https://..."
}
]
}
// GET /employees/{id}/?fields=firstName,lastName,jobTitle,department,hireDate,workEmail
const empRes = await fetch(
`${BASE}/employees/123/?fields=firstName,lastName,jobTitle,department,hireDate,workEmail,status`,
{ headers: { Authorization: AUTH, Accept: 'application/json' } },
);
const employee = await empRes.json();
console.log(`${employee.firstName} ${employee.lastName}`);
console.log(` Title: ${employee.jobTitle}`);
console.log(` Dept: ${employee.department}`);
console.log(` Hired: ${employee.hireDate}`);
console.log(` Email: ${employee.workEmail}`);
Common employee fields you can request:
| Field | Description |
|---|---|
firstName, lastName, displayName | Name fields |
jobTitle, department, division | Position |
workEmail, homeEmail, mobilePhone | Contact |
hireDate, originalHireDate | Dates |
status | Active or Inactive |
employeeNumber, location, supervisor | Org data |
payRate, payType, exempt | Compensation (admin only) |
// POST /reports/custom?format=JSON
const reportRes = await fetch(`${BASE}/reports/custom?format=JSON`, {
method: 'POST',
headers: {
Authorization: AUTH,
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify({
title: 'Hello World Report',
fields: ['firstName', 'lastName', 'department', 'jobTitle', 'hireDate'],
filters: {
lastChanged: { includeNull: 'no', value: '2024-01-01T00:00:00Z' },
},
}),
});
const report = await reportRes.json();
console.log(`Report: ${report.title} — ${report.employees.length} rows`);
for (const row of report.employees) {
console.log(` ${row.firstName} ${row.lastName} | ${row.department}`);
}
import os, requests
from dotenv import load_dotenv
load_dotenv()
COMPANY = os.environ["BAMBOOHR_COMPANY_DOMAIN"]
API_KEY = os.environ["BAMBOOHR_API_KEY"]
BASE = f"https://api.bamboohr.com/api/gateway.php/{COMPANY}/v1"
# Employee directory
r = requests.get(f"{BASE}/employees/directory",
auth=(API_KEY, "x"),
headers={"Accept": "application/json"})
directory = r.json()
for emp in directory["employees"][:5]:
print(f" {emp['displayName']} — {emp['jobTitle']}")
# Single employee
r = requests.get(f"{BASE}/employees/123/",
params={"fields": "firstName,lastName,department,hireDate"},
auth=(API_KEY, "x"),
headers={"Accept": "application/json"})
print(r.json())
| Error | Cause | Solution |
|---|---|---|
| 401 Unauthorized | Bad API key | Check BAMBOOHR_API_KEY value |
| 404 Not Found | Wrong employee ID or company domain | Verify ID exists; check BAMBOOHR_COMPANY_DOMAIN |
| 400 Bad Request | Invalid field name in request | Check field name list in docs |
Empty employees array | No active employees or permissions | Verify API key has read access |
Proceed to bamboohr-local-dev-loop for development workflow setup.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin bamboohr-packProvides TypeScript and Python patterns for production BambooHR REST API clients with type safety, retries, auth, and error handling. For integrations and reusable wrappers.
Automates BambooHR HR operations like employee directories, changes tracking, time-off balances, benefits, dependents via Composio toolkit over Rube MCP. Use after setting active connection.
Automates BambooHR HR tasks like listing/searching employees, tracking changes, managing time-off via Rube MCP and Composio toolkit. Requires active connection; search tools first for schemas.