Everything an AI agent can do with the BambooHR API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints28
API versionv1
Last updated23 June 2026
Orientation

How the BambooHR API works.

The BambooHR API is how an app or AI agent works with a company's HR records: reading and updating employee details, listing the directory, requesting and approving time off, pulling reports, and reading job and compensation history. Access is granted through an API key tied to one person's account, and a call can only see and change what that person could, since the API carries no separate scopes of its own. BambooHR can also push a notification to a webhook when a monitored employee field changes.

28Endpoints
7Capability groups
18Read
10Write
0Permissions
Authentication
Every request is authenticated with an API key over HTTP Basic auth, sending the key as the username and any string as the password. The key is a 160-bit hexadecimal value generated per person inside BambooHR. OAuth 2.0 is also supported for registered applications, added in March 2025, where an integration acts on behalf of a user instead of holding a standing key. A missing or invalid key returns 401.
Permissions
There are no granular API scopes. Access is governed entirely by the BambooHR access level of the user the key or token belongs to, which decides exactly which employees and which fields each request can view or edit. A key made from an admin account can reach everything that admin can; a key from a limited account is limited the same way. A request that asks for something the account cannot reach returns 403, or simply omits the fields it is not allowed to see.
Versioning
The API has one version, v1, carried in the request path. BambooHR does not publish dated versions or a version header, and does not run parallel versions. Changes are shipped continuously and recorded in a historical changelog, so there is no version to pin or migrate between; an integration tracks the changelog for new endpoints and changed behaviour.
Data model
Records are organised around the employee. Core details sit under /api/v1/employees/{id}, with repeating history such as job information and compensation exposed as named tables under that employee, and files attached the same way. Account-wide resources sit at the top level, such as /api/v1/reports for saved reports, /api/v1/time_off for time off, /api/v1/meta for the fields and users that describe the account, and /api/v1/webhooks for change notifications. Responses are returned as JSON or XML depending on the Accept header.
Connect & authenticate

Connection & authentication methods.

How an app or AI agent connects to BambooHR determines what it can reach. There are two routes, an API key tied to a person's account and OAuth on behalf of a user, and each one inherits exactly what that person can see and edit inside BambooHR.

Ways to connect

REST API

The REST API answers at {companyDomain}.bamboohr.com/api/v1. As of July 2025 this is the standard host; the older api.bamboohr.com/api/gateway.php route is being retired. Responses are JSON or XML, chosen by the Accept header.

Best forConnecting an app or AI agent to BambooHR.
Governed byThe account behind the API key and the access level it carries.
Docs ↗

Webhooks

Webhooks deliver a notification when a monitored employee field changes, or when an employee is added or removed. A webhook is registered against chosen fields and posts the changed values to a receiver URL, removing the need to poll.

Best forReacting to employee record changes without polling.
Governed byThe account that created the webhook, which bounds the fields it can report.
Docs ↗
Authentication

API key (Basic auth)

An API key is generated per person inside BambooHR and sent over HTTP Basic auth, as the username with any string for the password. The key inherits that person's access level, so it can see and edit exactly what they can. There are no separate API scopes.

TokenPer-user API key (160-bit hex)
Best forServer-to-server access tied to one account
Docs ↗

OAuth 2.0

OAuth 2.0 lets a registered application act on behalf of a user instead of holding a standing key. It was added in March 2025 and needs an application registered in the Developer Portal. Access is still bounded by the user's BambooHR permissions, not by API scopes.

TokenOAuth access token
Best forIntegrations acting for a user without a stored key
Docs ↗
Capability map

What an AI agent can do in BambooHR.

The BambooHR API is split into areas an agent can act on, such as employee records, files, time off, reports, table data, and the fields that describe an account. There are no per-area permission settings on the API itself; what a call can reach is decided entirely by the account behind the key.

Endpoint reference

Every BambooHR API method.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion

Employees

Read a single employee, add and update employees, and pull the published company directory.5

No API scope. Which fields come back depends on the access level of the account behind the key; restricted fields are omitted rather than refused. Up to 400 fields can be requested at once.

Acts onemployee
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. The account must have permission to add employees. A success returns 201 with a Location header pointing at the new record. Photo fields in the body are ignored.

Acts onemployee
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventemployee_changed
Rate limitStandard limits apply

No API scope. The account can only change fields it has edit permission for; an update to a field it cannot edit is rejected.

Acts onemployee
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventemployee_changed
Rate limitStandard limits apply

No API scope. Returns the directory the account is permitted to see. The directory must be enabled in the account for this to return data.

Acts ondirectory
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Added October 2025 as a more flexible way to retrieve employees. The returned set is limited to the employees the account can see.

Acts onemployee
Permission (capability)None required
VersionIntroduced 2025-10-02
Webhook eventNone
Rate limitStandard limits apply

Employee files

List the files on an employee, download a file's contents, and upload a new file.3

No API scope. Only the files and categories the account is permitted to see are listed.

Acts onfile
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Returns the file's MIME type and original filename. Employee id 0 refers to the file of the account holding the key.

Acts onfile
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. The request must be multipart/form-data, with the file plus category, fileName, and share fields. The account needs permission to add files to the employee.

Acts onfile
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Time off

Read time off requests, add a request, approve or deny one, estimate a future balance, and see who is out.5

No API scope. The start and end query parameters are both required, in YYYY-MM-DD format. Results are limited to requests the account can see.

Acts ontime off request
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. A request must be approved before it counts in the history, though an account with enough permission can create and approve it in one step.

Acts ontime off request
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Valid statuses are approved, denied (or declined), and canceled. The account must be allowed to approve the request.

Acts ontime off request
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Returns a projected balance per time off type, so the account needs to be able to see that employee's time off.

Acts ontime off balance
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Returns approved time off and holidays in the window the account is permitted to see.

Acts ontime off request
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Tables

Read, add, and update rows in employee tables such as job information and compensation.3

No API scope. The {table} value is a name like jobInfo or compensation. Compensation in particular is often restricted, so the call returns rows only if the account can see that table.

Acts ontable row
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. The account must be allowed to edit that table for the employee. Fields are submitted as name and value pairs in JSON or XML.

Acts ontable row
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. The account must be allowed to edit that table for the employee. This changes real job or pay history.

Acts ontable row
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Reports

List saved reports, pull a saved report by id, and request an ad-hoc custom report.3

No API scope. Returns each report's id and name. The reports listed are those the account can access.

Acts onreport
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. A report can return data across the whole company at once, so the account's access level decides which rows and columns it sees.

Acts onreport
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Returns JSON, XML, CSV, XLS, or PDF. This is a read despite using POST, because it builds a report rather than changing data; the account's access still bounds what it can pull.

Acts onreport
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Metadata

List the fields available in the account, list tabular fields, and list the account's users.3

No API scope. Returns the field catalogue that describes the account, used to know which field ids exist before reading or writing them.

Acts onfield
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Used to discover the names of standard and custom tables before reading their rows.

Acts onfield
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Since March 2025, email addresses in this response are returned only to admin accounts. Support admin accounts are always excluded.

Acts onuser
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Webhooks

List, read, create, update, and delete webhooks, and list the fields a webhook can monitor.6

No API scope. Returns each webhook's id, name, url, creation time, and last-fired time. Only the caller's own webhooks are listed.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Returns the webhook's name, url, format, monitored fields, post fields, events, and timestamps. Only a webhook the account owns can be read.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. A permissioned webhook can only ever report fields the creating account is allowed to see. The fields available to monitor come from the List Monitor Fields endpoint.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventemployee_changed
Rate limitStandard limits apply

No API scope. This is a full replacement, so every body field overwrites the existing value and any omitted optional field reverts to its default.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Only a webhook the account owns can be deleted, and the removal cannot be undone.

Acts onwebhook
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

No API scope. Returns the set of fields available to watch, which is bounded by what the calling account is permitted to see.

Acts onfield
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

BambooHR can notify an app or AI agent when an employee record changes, instead of the app repeatedly asking. A webhook is registered against a chosen set of monitored fields, and BambooHR posts the changed values to a receiver URL whenever one of those fields changes, or when an employee is added or removed.

EventWhat it signalsTriggered by
Employee created, updated, or deletedFires when a monitored employee field changes, or when an employee is added or removed. On an update the payload lists the changed monitored fields and their current values; on a create or delete the changed-fields list is empty and the event simply reports that the employee was added or removed./api/v1/employees/
/api/v1/employees/{id}
/api/v1/webhooks
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

BambooHR does not publish a fixed request quota. It throttles requests it judges to be too frequent and answers a throttled call with a 503 status, so an app or AI agent should slow down and retry rather than assume a hard ceiling.

Request rate

BambooHR does not publish a fixed numeric rate limit. The documentation states that requests can be throttled if BambooHR judges them too frequent, and a throttled request is answered with a 503 status, sometimes carrying a Retry-After header that says how long to wait. The practical model is to back off and retry on a 503 rather than to plan against a known per-minute or per-hour ceiling. A 429 status can also be returned when a limit is exceeded.

Pagination

Most endpoints return a full result set rather than paging. The newer List Employees endpoint added in October 2025 is the exception: it uses cursor-based pagination, returning a data array plus a meta block with the total count and the cursor state, and _links carrying next and prev when more pages exist. Older list-style endpoints, such as the directory and reports, return the whole collection in one response.

Request size

Requests and responses are JSON or XML, chosen by the Accept header. A single employee request can name up to 400 fields. File uploads are sent as multipart/form-data, and custom reports can be returned as JSON, XML, CSV, XLS, or PDF. No single overall payload size limit is documented across the API.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
400Bad RequestThe request was malformed, such as an invalid field name or value or a body that could not be parsed.Check the field names against the account's field catalogue and fix the request body, then resend.
401UnauthorizedThe API key is missing or invalid.Send a valid API key over Basic auth, as the username with any string for the password.
403ForbiddenThe key is valid but the account behind it lacks permission for the employee, field, or action requested.Use a key from an account whose BambooHR access level covers the request, since the API has no separate scopes to grant.
404Not FoundThe resource does not exist, or the path is wrong.Confirm the employee id, table name, or report id, and the path, then retry.
406Not AcceptableThe requested response format in the Accept header is not supported for this endpoint.Request a supported format, such as application/json or application/xml.
409ConflictThe request conflicts with the current state of the resource.Refetch the current state, resolve the conflict, then retry.
429Limit ExceededA request limit was exceeded.Slow the request rate and retry after a pause.
503UnavailableThe request was throttled because BambooHR judged it too frequent, or the service is temporarily unavailable. A Retry-After header may say how long to wait.Honour the Retry-After header if present, then back off and retry.
Versioning & freshness

Version history.

BambooHR has a single API version, v1, in the request path. It does not mint new dated versions; changes ship continuously and are recorded in a historical changelog, with new endpoints and field behaviour added in place.

Version history

What changed, and when

Latest versionv1
v1Current version
Single continuously updated API version

BambooHR runs one API version, v1, carried in the request path. It does not mint new dated versions or run parallel versions; changes ship continuously and are recorded in a historical changelog. The dated entries below are notable changes from that changelog, newest first.

What changed
  • 2026-06-11: API reference sections renamed for change tracking and employee tables, and the Get Changed Employee Table Data endpoint moved.
  • 2026-02-26: Added meal and rest break endpoints under time tracking.
  • 2026-01-23: Added benefits endpoints for company benefits and employee enrollments.
2025-10-02Feature update
Flexible List Employees endpoint

Added a new List Employees endpoint with filtering, sorting, optional field selection, and cursor-based pagination, a more efficient way to retrieve employee data than the directory.

What changed
  • Introduced GET /api/v1/employees with cursor pagination and field selection.
2025-08-05Requires migration
Real-time webhooks

Webhooks moved to real-time, event-driven delivery, gained support for the delete event, and lost the older cron-based scheduling and rate-limiting controls.

What changed
  • Webhooks switched to real-time event-driven delivery with delete-event support.
  • Cron-based webhook scheduling and rate-limiting removed.
  • Low-usage webhook fields deprecated, with affected customers notified directly.
2025-07-03Feature update
API routing centralised

Requests moved to the {companyDomain}.bamboohr.com/api/ host, replacing the older api.bamboohr.com/api/gateway.php/{companyDomain}/ routing.

What changed
  • Standard host became {companyDomain}.bamboohr.com/api/.
2025-03-31Feature update
OAuth 2.0 authentication

OAuth 2.0 was added as an authentication method, letting a registered application act on behalf of a user instead of holding a standing API key. The legacy API key login flow began a gradual deprecation.

What changed
  • OAuth 2.0 supported for API authentication.
  • New applications no longer support the legacy oidcLogin User API Key flow.
2025-03-10Feature update
Email addresses restricted in meta users

Email addresses in the meta users endpoint were restricted so that only admin accounts can retrieve them.

What changed
  • Email retrieval in /api/v1/meta/users limited to admin accounts.

There is one version, v1, so there is nothing to pin or migrate between. Track the changelog for behaviour changes.

BambooHR API changelog ↗
Questions

BambooHR API, answered.

How does an agent authenticate to BambooHR?+
With an API key over HTTP Basic auth. The key is generated for a specific person inside BambooHR and is sent as the username, with any string as the password. OAuth 2.0 is also supported for registered applications since March 2025, letting an integration act on behalf of a user rather than holding a standing key. A missing or invalid key returns 401.
What scopes or permissions does the API use?+
None at the API level. BambooHR has no granular API scopes. What a call can read or change is decided entirely by the BambooHR access level of the user the key belongs to. A key from an admin account can reach everything that admin can see and edit; a key from a restricted account is held to the same limits in the API as that person has in the web app. This is why scoping an agent matters: the key itself carries the account's full reach.
What are the rate limits?+
BambooHR does not publish a fixed quota. It throttles requests it judges to be too frequent and answers a throttled call with a 503 status, sometimes with a Retry-After header. The right approach is to slow down and retry when a 503 is returned, rather than planning against a fixed per-minute or per-hour number.
How does an agent get notified of changes instead of polling?+
Through webhooks. A webhook is created against a chosen set of monitored fields, and BambooHR posts the changed values to a receiver URL whenever one of those fields changes, or when an employee is added or removed. The List Monitor Fields endpoint returns the fields that can be watched. A permissioned webhook only ever reports fields the creating user is allowed to see.
How do I read job or compensation history?+
Through employee tables. Repeating data such as job information and compensation is exposed as named tables under an employee, read with GET /api/v1/employees/{id}/tables/{table}, where {table} is a name like jobInfo or compensation. Whether the call returns anything depends on the account's access level, since compensation in particular is often restricted to certain people.
JSON or XML?+
Either. The API returns XML by default and JSON when the request sends Accept: application/json, and most write endpoints accept either format in the request body. Custom reports can additionally be returned as CSV, XLS, or PDF.
Related

More hr API guides for agents

What is Bollard AI?

Control what every AI agent can do in BambooHR.

Bollard AI sits between a team's AI agents and BambooHR. Grant each agent exactly the access it needs, read or write, area by area, and every call is checked and logged.

  • Set read, write, or full access per agent, never a shared BambooHR key.
  • Denied by default, so an agent reaches only what has been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
BambooHR
People Ops Agent
Read employee directory ResourceOffReadFull use
Approve time off requests ActionOffReadFull use
Read compensation table ResourceOffReadFull use
Per-agent access, set in Bollard AI, not in BambooHR