Employees
Public API

Lists all employees in the authenticated caller's company as a cursor-paginated list. Use this to list employees, fetch the employee roster, or batch-lookup multiple employees by ID.

Response shape. The response is a JSON object with data (an array of employee records), meta.total (count of all employees matching the filter, not just the current page), meta.page (cursor pagination state), and _links (self, plus next / prev when more pages exist). Each employee record always includes the default identity and job fields, plus any additional fields requested via fields. employeeId is returned as a string and is the internal employee ID — see the employeeId and employeeNumber field documentation in the response schema for the distinction between the internal ID and the editable Employee # value. IDs for filter[ids] come from prior responses of this endpoint.

Employee photos. Each record includes a photoUrl field with a time-limited signed URL. This is the recommended way for AI connectors to display or link to an employee photo, since fetching raw photo bytes through get-employee-photo produces base64 payloads too large for an AI model to consume reliably.

Permissions. Field values the caller cannot read are returned as null, and the names of those suppressed fields are listed on the record in _restrictedFields. On an unfiltered request an employee remains in data even when the caller can read none of the requested fields: employeeId still carries its real value, every unreadable field is null and named in _restrictedFields, values that are not permission-gated such as photoUrl may still be populated, and meta.total counts the row. Separately, if the caller cannot read a field used in filter or sort, the affected employee is dropped from the result set entirely to avoid leaking presence, so a name search can return meta.total: 0 even though matching employees exist. Neither an empty result nor a fully nulled row means no such employee exists.

Counts and aggregates are only valid when the caller can read every field being grouped on. A caller with full access can safely count and group these rows. A restricted caller cannot: unreadable values come back null and filtered queries drop employees entirely, so grouping what such a caller receives understates the real figures and produces a confident but wrong total. Before reporting any count, headcount, department or location breakdown, or turnover figure, compare meta.total against the number of rows carrying readable values for the field in question. If those differ, the aggregate is incomplete: either state plainly how many employees were actually readable, or use Get Data from Dataset (v2) (get-data-from-dataset-v2) or the custom report endpoints instead, which require broader access and fail loudly rather than returning a partial answer.

Related endpoints. For a single employee with the full set of fields, use get-employee. For complex filtering, arbitrary sorting, or tabular reports across many fields, use Get Data from Dataset (v2) (get-data-from-dataset-v2). To look up information published in a coworker's company directory entry, such as job title, department, location, work contact details, or who they report to, use Get Employees Directory (get-employees-directory), which is governed by directory sharing settings rather than by per-employee record permissions and is available when directory or org-chart access is shared with the caller's access level.

OAuth Scopes: employee, employee:job, employee:name, employee_directory, sensitive_employee:protected_info

get/api/v1/employees

Request

  • Base URL
    https://companySubDomain.bamboohr.com
  • Auth
    • HTTP basic
    • or OAuth 2
      Authorization code/authorize.php
      Token URL/token.php
      Scopesemployee
    • or OAuth 2
      Authorization code/authorize.php
      Token URL/token.php
      Scopesemployee:name
    • or OAuth 2
      Authorization code/authorize.php
      Token URL/token.php
      Scopesemployee:job
    • or OAuth 2
      Authorization code/authorize.php
      Token URL/token.php
      Scopesemployee_directory
    • or OAuth 2
      Authorization code/authorize.php
      Token URL/token.php
      Scopessensitive_employee:protected_info
  • TypeScript
    A function with typed inputs. Its response is checked against the schema.

Query parameters

addressLine1string

Substring match (case-insensitive).

addressLine2string

Substring match (case-insensitive).

allergiesstring

Substring match (case-insensitive).

birthplacestring

Substring match (case-insensitive).

citizenshipstring

Substring match (case-insensitive).

citystring

Substring match (case-insensitive).

compensationChangeReasonstring

Substring match (case-insensitive).

compensationCommentstring

Substring match (case-insensitive).

countrystring

Substring match (case-insensitive).

departmentNamestring

Substring match (case-insensitive).

dietaryRestrictionsstring

Substring match (case-insensitive).

displayNamestring

Substring match (case-insensitive).

divisionNamestring

Substring match (case-insensitive).

eeoJobCategorystring

Substring match (case-insensitive).

eligibleForRehirestring

Substring match (case-insensitive).

employeeNamestring

Substring match (case-insensitive).

employeeNumberstring

Substring match (case-insensitive).

employmentStatusNamestring

Substring match (case-insensitive).

employmentStatusCommentstring

Substring match (case-insensitive).

employmentTypestring

Substring match (case-insensitive).

ethnicitystring

Substring match (case-insensitive).

facebookUrlstring

Substring match (case-insensitive).

firstNameLastNamestring

Substring match (case-insensitive).

firstNameMiddleInitialstring

Substring match (case-insensitive).

flsaCodestring

Substring match (case-insensitive).

homeEmailstring

Substring match (case-insensitive).

homePhonestring

Substring match (case-insensitive).

instagramUrlstring

Substring match (case-insensitive).

jacketSizestring

Substring match (case-insensitive).

linkedinUrlstring

Substring match (case-insensitive).

locationNamestring

Substring match (case-insensitive).

maritalStatusstring

Substring match (case-insensitive).

middleInitialstring

Substring match (case-insensitive).

middleNamestring

Substring match (case-insensitive).

mobilePhonestring

Substring match (case-insensitive).

nationalInsuranceCategorystring

Substring match (case-insensitive).

nationalitystring

Substring match (case-insensitive).

nickNamestring

Substring match (case-insensitive).

noticePeriodstring

Substring match (case-insensitive).

paySchedulestring

Substring match (case-insensitive).

pinterestUrlstring

Substring match (case-insensitive).

preferredNameLastNamestring

Substring match (case-insensitive).

pronounsstring

Substring match (case-insensitive).

reportsToNamestring

Substring match (case-insensitive).

secondaryLanguagestring

Substring match (case-insensitive).

shirtSizestring

Substring match (case-insensitive).

skypeUsernamestring

Substring match (case-insensitive).

statestring

Substring match (case-insensitive).

terminationReasonstring

Substring match (case-insensitive).

terminationRegrettablestring

Substring match (case-insensitive).

terminationTypestring

Substring match (case-insensitive).

tShirtSizestring

Substring match (case-insensitive).

twitterUrlstring

Substring match (case-insensitive).

vaccinationStatusstring

Substring match (case-insensitive).

vaccineReceivedstring

Substring match (case-insensitive).

workEmailstring

Substring match (case-insensitive).

workPhonestring

Substring match (case-insensitive).

workPhoneExtensionstring

Substring match (case-insensitive).

zipcodestring

Substring match (case-insensitive).

gender'Male' | 'Female' | 'Non-Binary'

Exact match.

paidPer'Day' | 'Week' | 'Month' | 'Quarter' | 'Year' | 'PayPeriod' | 'Piece'

Exact match.

payType'Hourly' | 'Salary' | 'Commission'

Exact match.

citizenshipIdinteger

Exact match against an integer ID.

compensationChangeReasonIdinteger

Exact match against an integer ID.

countryIdinteger

Exact match against an integer ID.

departmentIdinteger

Exact match against an integer ID.

divisionIdinteger

Exact match against an integer ID.

eeoJobCategoryIdinteger

Exact match against an integer ID.

eligibleForRehireIdinteger

Exact match against an integer ID.

employmentStatusIdinteger

Exact match against an integer ID.

employmentTypeIdinteger

Exact match against an integer ID.

ethnicityIdinteger

Exact match against an integer ID.

flsaCodeIdinteger

Exact match against an integer ID.

jacketSizeIdinteger

Exact match against an integer ID.

jobTitleIdinteger

Exact match against an integer ID.

locationIdinteger

Exact match against an integer ID.

nationalInsuranceCategoryIdinteger

Exact match against an integer ID.

nationalityIdinteger

Exact match against an integer ID.

noticePeriodIdinteger

Exact match against an integer ID.

payScheduleIdinteger

Exact match against an integer ID.

pronounsIdinteger

Exact match against an integer ID.

reportsToIdinteger

Exact match against the internal employee ID of the employee's manager.

shirtSizeIdinteger

Exact match against an integer ID.

stateIdinteger

Exact match against an integer ID.

taxTypeIdinteger

Exact match against an integer ID.

terminationReasonIdinteger

Exact match against an integer ID.

terminationRegrettableIdinteger

Exact match against an integer ID.

terminationTypeIdinteger

Exact match against an integer ID.

tShirtSizeIdinteger

Exact match against an integer ID.

vaccinationStatusIdinteger

Exact match against an integer ID.

vaccineReceivedIdinteger

Exact match against an integer ID.

isManagerboolean

Exact match (true/false).

proofOfVaccinationboolean

Exact match (true/false).

agenumber

Exact numeric match.

tenurenumber

Exact numeric match.

hoursPerPayCyclenumber

Exact numeric match.

birthDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

compensationEffectiveDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

compensationEndDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

contractEndDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

employmentStatusEffectiveDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

finalDoseAdministrationDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

finalPayDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

hireDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

jobInformationEffectiveDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

originalHireDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

probationEndDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

terminationDatestring date

Exact match against an ISO 8601 date (YYYY-MM-DD).

firstNamestring

This will match any employees whose first name contains this string (case insensitive)

lastNamestring

This will match any employees whose last name contains this string (case insensitive)

jobTitleNamestring

This will match any employees whose current job title descriptor contains this string (case insensitive)

status'active' | 'inactive'

Employee status

idsinteger[]

List of internal employee IDs for batch fetch. Documented form: repeated keys (filter[ids][]=123&filter[ids][]=124). For backward compatibility, the endpoint also accepts a single comma-separated string (filter[ids]=123,124).

Filters used to match employees. Encode filter properties using deepObject style (filter[firstName]=Ava). Multiple filter fields are combined with AND. filter[ids] accepts either repeated keys (filter[ids][]=123&filter[ids][]=124) or a single comma-separated string (filter[ids]=123,124); both forms are supported.

{
  "ids": [
    123,
    124
  ]
}
sortstring

Comma-separated list of sortable fields. Prefix a field with - for descending order. Allowed fields: employeeId, firstName, lastName, preferredName, jobTitleName, status. Nulls sort first in ascending order and last in descending order. An invalid sort field returns a BadRequest error.

fieldsEmployeeOptionalField[]

Additional fields to include in each employee record beyond the default set. The canonical form is a comma-separated list (fields=workEmail,mobilePhone); for backward compatibility the endpoint also accepts the bracket-array form (fields[]=workEmail&fields[]=mobilePhone). Note: plain repeated keys without brackets (fields=workEmail&fields=mobilePhone) are unreliable — most HTTP stacks keep only the last value, silently dropping earlier ones; use the comma-separated form instead. Unrecognized field names are silently ignored. Returned values are subject to permission checks — fields the caller cannot read are returned as null and their names are listed in the record's _restrictedFields array.

beforestring

Cursor pointing to the start of the previous page. Use the prevCursor value from the last response to paginate backward.

afterstring

Cursor pointing to the start of the next page. Use the nextCursor value from the last response to paginate forward.

limitinteger

Maximum number of items to return. This can be at most 2500.

Cursor-based pagination parameters. page[limit] controls page size (default 250, maximum 2500). page[after] and page[before] accept opaque cursors returned in the previous response's meta.page.nextCursor / prevCursor; do not specify both at once. The response's _links.next / _links.prev are pre-built URLs that already encode the correct cursor for the next or previous page.

Response

Paginated list of employees.

Changes

    • info

      the security scope employee was added to the endpoint's security scheme oauth

    • info

      the security scope sensitive_employee:protected_info was removed from the endpoint's security scheme oauth

    • info

      added the enum value timezone to the property items/ of the query request parameter fields

    • info

      added the optional property /// to the response with the status