---
title: "Create Employee"
method: POST
path: "/api/v1/employees"
tags: ["Employees", "Public API"]
---

# Create Employee

`POST /api/v1/employees`

Create a new employee. At minimum, provide a first name and last name in a JSON object or XML document. The request body schema lists commonly used fields, but any valid writable employee field name may be included as a key. To discover available field names, call the List Fields endpoint (operationId: list-fields, GET /api/v1/meta/fields).

This endpoint does not upload, set, or remove the employee profile photo. Photo-related keys (e.g. `photo`, `photoUrl`) included in the body are silently ignored: the request still creates the employee and returns 201, but no photo is attached. After creation, use the Upload Employee Photo endpoint (`upload-employee-photo`) to attach a profile photo. AI connectors cannot use that endpoint reliably and should redirect the user to the BambooHR web UI.

Trax Payroll note: Employees added to a pay schedule synced with Trax Payroll must include the required payroll-related employee fields: employeeNumber (unless the company has automatic employee numbers enabled), firstName, lastName, dateOfBirth, ssn or ein, gender, maritalStatus, hireDate, address1, city, state, zipcode, country, employmentHistoryStatus, exempt, payType, payRate, payPer, overtimeRate, and location.

OAuth Scopes: employee, employee.write, employee:assets.write, employee:compensation.write, employee:contact.write, employee:custom_fields.write, employee:custom_fields_encrypted.write, employee:demographic.write, employee:dependent.write, employee:dependent:ssn.write, employee:education.write, employee:emergency_contacts.write, employee:identification.write, employee:job, employee:job.write, employee:management.write, employee:name.write, employee:payroll.write, employee:photo.write, employee:vaccination.write, sensitive_employee:address.write, sensitive_employee:creditcards.write, sensitive_employee:protected_info.write

## Request body

- PostNewEmployee — A dictionary of employee field names and their values for the new employee. At minimum, firstName and lastName are required. The properties listed below are commonly used fields, but any valid writable employee field name can be used as a key. To discover all available field names, call the List Fields endpoint (operationId: list-fields, GET /api/v1/meta/fields). Additional fields may use string, number, boolean, array, object, or null values depending on the field type. Some string-valued fields are backed by lists or lookups, so callers should use valid option values from BambooHR metadata rather than assuming any free-text string will persist as entered. Photo data is not writable through this schema: photo-related keys are silently ignored. After creation, use the Upload Employee Photo endpoint (`upload-employee-photo`) to attach a profile photo. AI connectors cannot use that endpoint reliably and should redirect the user to the BambooHR web UI.
  - `firstName` string, required — Legal first name (required).
  - `lastName` string, required — Legal last name (required).
  - `workEmail` string — Work email address.
  - `jobTitle` string — Job title.
  - `department` string — Department name.
  - `hireDate` string, date — Hire date in YYYY-MM-DD format.

## Response `201`

Employee created successfully.

- GetEmployeeResponse — Employee data returned by the Get Employee endpoint. The `id` field is always present; all other named properties are included only when explicitly requested via the `fields` query parameter. Additional custom or company-configured fields may also appear.
  - `id` string, required — The internal employee ID — the canonical, immutable identifier for this employee across all employee endpoints. Equivalent to `employeeId` on `list-employees` and `eeid` on the `employee` dataset. Use this value (not `employeeNumber`) for employee ID inputs such as `{id}` path parameters or `filter[ids]`.
  - `employeeNumber` string, nullable — The employee's editable Employee # value (the HR-visible display field on the employee profile). This is not the internal employee ID used by API inputs such as `filter[ids]` and `{id}` path parameters; those inputs expect `id` on this endpoint, `employeeId` on `list-employees`, or `eeid` on the `employee` dataset. Passing `employeeNumber` there may fail with `404` or resolve to a different employee if its value matches another employee's internal employee ID. Only included when requested via the `fields` parameter.
  - `firstName` string, nullable — Employee's first name
  - `lastName` string, nullable — Employee's last name
  - `preferredName` string, nullable — Employee's preferred name
  - `middleName` string, nullable — Employee's middle name
  - `photoUrl` string, nullable — URL to the employee's profile photo
  - `jobTitleName` string, nullable — Employee's current job title
  - `jobTitleId` string, nullable — Employee's job title ID
  - `status` 'Active' | 'Inactive', nullable — Employee's current status
  - `workEmail` string, nullable — Employee's work email address
  - `homeEmail` string, nullable — Employee's home email address
  - `bestEmail` string, nullable — Employee's best email address
  - `workPhone` string, nullable — Employee's work phone number
  - `workPhoneExtension` string, nullable — Employee's work phone extension
  - `mobilePhone` string, nullable — Employee's mobile phone number
  - `homePhone` string, nullable — Employee's home phone number
  - `skypeUsername` string, nullable — Employee's Skype username
  - `linkedinUrl` string, nullable — Employee's LinkedIn profile URL
  - `facebookUrl` string, nullable — Employee's Facebook profile URL
  - `instagramUrl` string, nullable — Employee's Instagram profile URL
  - `twitterUrl` string, nullable — Employee's Twitter/X profile URL
  - `pinterestUrl` string, nullable — Employee's Pinterest profile URL
  - `birthDate` string, nullable — Employee's birth date
  - `hireDate` string, nullable — Employee's hire date
  - `originalHireDate` string, nullable — Employee's original hire date
  - `terminationDate` string, nullable — Employee's termination date
  - `address1` string, nullable — Employee's street address
  - `city` string, nullable — Employee's city
  - `state` string, nullable — Employee's state or province
  - `country` string, nullable — Employee's country
  - `gender` string, nullable — Employee's gender
  - `marital` string, nullable — Employee's marital status
  - `payRate` string, nullable — Employee's pay rate
  - `payType` string, nullable — Employee's pay type
  - `payPeriod` string, nullable — Employee's pay period
  - `exempt` string, nullable — Whether the employee is FLSA exempt
  - `canUploadPhoto` boolean, nullable — Whether the requesting user can upload a photo for this employee
  - `division` string, nullable — Employee's division name
  - `divisionId` string, nullable — Employee's division ID
  - `department` string, nullable — Employee's department name
  - `departmentId` string, nullable — Employee's department ID
  - `location` string, nullable — Employee's location name
  - `locationId` string, nullable — Employee's location ID
  - `employmentStatus` string, nullable — Employee's current employment status name
  - `employmentStatusId` string, nullable — Employee's current employment status ID
  - `reportsToName` string, nullable — Name of the employee's manager
  - `reportsToId` string, nullable — Internal employee ID of the employee's manager

## Other responses

- `400` — If the posted XML or JSON is invalid or the minimum fields are not provided.
- `403` — If the API user does not have permission to add an employee.
- `409` — If an employee field was given an invalid value.

---

[API](https://skmtc.net/bamboohr/apis/bamboohr-api.md) · [All operations](https://skmtc.net/bamboohr/apis/bamboohr-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/bamboohr/bamboohr-api/revisions/19ebf391a399/schema)
