---
title: "POST /v1/workers/employee"
method: POST
path: "/v1/workers/employee"
tags: ["Workers"]
---

# POST /v1/workers/employee

`POST /v1/workers/employee`

Create a new US employee. The worker will be created in draft status and must be invited separately via the invite endpoint. If hiring in a state without an existing tax registration, you must specify the stateRegistration field.

## Request body

- object
  - `firstName` string, required — a string with no leading or trailing whitespace
  - `lastName` string, required — a string with no leading or trailing whitespace
  - `position` string, required — a string with no leading or trailing whitespace
  - `startDate` string, required — A date string in the form YYYY-MM-DD
  - `email` string, required — Personal email address. The invite will be sent here.
  - `workEmail` string, nullable — An email with a reasonably valid regex (shamelessly taken from zod)
  - `requireI9` boolean — Whether the employee is required to complete I-9 work authorization. Set to false if the employee has already been verified off-platform. Defaults to true.
  - `stateRegistration` 'self_managed' | 'warp_managed' — How state tax registration is handled for this employee's work state. Required when hiring in a state where your company doesn't have an existing registration. Use 'self_managed' if you've already registered in this state, or 'warp_managed' for Warp to handle registration on your behalf.
  - `departmentId` string, required — The department to assign this employee to.
  - `managerId` string, required — The worker id of this employee's direct manager.
  - `stockOptions` number, nullable — a non-negative number
  - `workLocation` union, required — Where the employee will work. Either an existing company workplace or a remote US state.
    - OfficeWorkLocation — Employee works from a company workplace.
      - `type` 'office', required
      - `workplaceId` string, required — Public workplace identifier
    - RemoteWorkLocation — Employee works remotely from a US state.
      - `type` 'remote', required
      - `state` 'AL' | 'AK' | 'AZ' | 'AR' | 'CA' | 'CO' | 'CT' | 'DC' | 'DE' | 'FL' | 'GA' | 'HI' | 'ID' | 'IL' | 'IN' | 'IA' | 'KS' | 'KY' | 'LA' | 'ME' | 'MD' | 'MA' | 'MI' | 'MN' | 'MS' | 'MO' | 'MT' | 'NE' | 'NV' | 'NH' | 'NJ' | 'NM' | 'NY' | 'NC' | 'ND' | 'OH' | 'OK' | 'OR' | 'PA' | 'RI' | 'SC' | 'SD' | 'TN' | 'TX' | 'UT' | 'VT' | 'VA' | 'WA' | 'WV' | 'WI' | 'WY', required — The US state where the remote employee works. Required for tax purposes.
  - `compensation` object, required — The employee's base compensation.
    - `amount` number, required — a positive number
    - `per` 'hour' | 'year', required — Whether the amount is per hour or per year.
  - `paySchedule` 'weekly' | 'biweekly' | 'monthly' | 'semimonthly' | 'quarterly' | 'annually', nullable — The employee's pay schedule. Must be a pay schedule that the company has configured.

## Response `201`

Success

- object
  - `id` string, required — The id of the worker.
  - `position` string, required
  - `type` 'employee' | 'contractor', required
  - `status` 'draft' | 'invited' | 'onboarding' | 'active' | 'offboarding' | 'inactive', required
  - `startDate` string, required — A date string in the form YYYY-MM-DD
  - `endDate` string, nullable, required — A date string in the form YYYY-MM-DD
  - `isBusiness` boolean, nullable, required
  - `businessName` string, nullable, required
  - `firstName` string, required
  - `lastName` string, required
  - `email` string, required — An email with a reasonably valid regex (shamelessly taken from zod)
  - `workEmail` string, nullable, required — An email with a reasonably valid regex (shamelessly taken from zod)
  - `preferredName` string, nullable, required
  - `displayName` string, required — The "ui" name of a worker. If it's a business contractor business name is used. Otherwise we default to preferred name, then first-last.
  - `timeZone` string, nullable, required — The IANA timezone of the worker (e.g., America/New_York).
  - `department` object, nullable, required — The department the worker belongs to, or null if unassigned.
    - `id` string, required — The unique public id of the department
    - `name` string, required

## Other responses

- `400` — The request did not match the expected schema
- `401` — ApiKeyUnauthorized
- `403` — MissingRequiredPermissions
- `404` — DepartmentNotFound
- `429` — RateLimitExceeded
- `500` — InternalServerError

## Changes

- **2026-03-23** `9018dab36c2d` — 2 info
  - added the new optional request property `paySchedule`
  - added `#/components/schemas/PayScheduleNotConfigured` to the response body `anyOf` list for the response status `404`
- **2026-03-19** `a896c17cf988` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/teamwarp/apis/warp-api/changes/v1/workers/employee/post.md)

---

[API](https://skmtc.dev/teamwarp/apis/warp-api.md) · [All operations](https://skmtc.dev/teamwarp/apis/warp-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/teamwarp/warp-api/revisions/f3df5d5ca575/schema)
