---
title: "Create Position"
method: POST
path: "/workforce-planning/positions"
tags: ["Workforce Planning"]
---

# Create Position

`POST /workforce-planning/positions`

Creates new positions with associated position opening and optional position budget. <br><br> **Limitations:** <br> - You can create up to 10 positions per request. <br> - If the request includes more than 10 positions, the operation will fail and return an error. <br><br> **Notes:**<br> - When creating a Position, the position opening is mandatory.<br> - Position budget is optional and will be created only if the service user has the required permission.<br> - The endpoint will return the ID of the positions and the position opening that were created. To find out the budget ID you should read the position details.<br> - Currently, you cannot create "position requests" that require an approval flow, which are not supported via the API.<br> - This endpoint requires linking the position to a job profile, and can be used only with Job Catalog 2.0. To retrieve the `jobProfile`, use the <a href="https://apidocs.hibob.com/reference/job-catalog">Job Catalog API</a>.<br> - For fields that require reference to a list in Bob (e.g. `department`), use the <a href="https://apidocs.hibob.com/reference/get_company-named-lists-listname">metadata endpoint</a> to fetch list values.<br> - For custom fields, use the Examples >  Request Example, and copy to an external API client tool to add custom fields to the payload.<br>

## Request body

- PublicPositionCreateRequest
  - `items` PublicPositionCreateItem[], required
    - `objectType` 'position', required
    - `fields` PublicPositionCreate, required
      - `/position/name` object — A unique identifier combined with text, numbers, and other characters of your choosing. When creating a position without passing the name, this will be automatically filled by the system, but it can be changed to reflect the format chosen by your organization.
        - `value` string, nullable
      - `/position/effectiveDate` object, required — The date from which this position is budgeted for and should be filled. This can be different from the Start date if the position is filled later than expected. This is a mandatory field.
        - `value` string, date, required
      - `/position/managerPositionId` object — The manager's position backend-id (a reference to the manager's position in Bob), that allows the creation of a hierarchical org structure.
        - `value` number, nullable
      - `/position/positionType` object — The position's type is an open list of values in Bob. The value must be a valid list item. Out-of-the-box values include: `Growth`, `Promotion`, `Replacement` (list name: `positionType`).
        - `value` string, nullable
      - `/position/fte` object, required — A numeric field representing the job % allocated to each “chair.” This is a mandatory field.
        - `value` number, required
      - `/position/employmentType` object — The position's employment type is an open list (list name: `payrollEmploymentType`) of values taken from your company’s Employment table. Out-of-the-box values: `Permanent`, `Temporary`, `Apprentice`, `Contractor`, `Non-guaranteed`.
        - `value` string, nullable
      - `/position/department` object, required — The position's department. Possible values are list-items from the department list in Bob (list name: `department`).
        - `value` string, required
      - `/position/site` object, required — The position's site. Possible values are list-items from the sites list in Bob (list name: `site`).
        - `value` number, required
      - `/position/jobProfile` object, required — The backend ID of the job profile assigned to this position. Use the Job Catalog API to retrieve job profiles and their IDs. <br><br> **Note**: You must use **Job Catalog 2.0** in order to have access to job profiles.
        - `value` number, required
      - `/position/reason` object — Reason for changing or creating this position.
        - `value` string, nullable
      - `/position/positionOpening` PublicPositionOpeningCreateItem, required
        - `objectType` 'positionOpening', required
        - `fields` PublicPositionOpeningCreate, required
          - `/positionOpening/positionOpeningName` object — A unique identifier for each opening within a position. Using the API you can provide the name that reflects the format chosen by your organization. If not passed, the system will automatically fill this out.
            - `value` string, nullable
          - `/positionOpening/expectedStartDate` object, required — The expected start date is the realistic forecast of the date on which the position should be filled. This is a mandatory field.
            - `value` string, date, required
          - `/positionOpening/recruitmentStatus` object — A list of possible recruitment status for the position opening. Out-of-the-box values include: `open`, `onHold`, and `closed` (list name: `recruitmentStatus`).
            - `value` string, nullable
      - `/position/positionBudget` PublicPositionBudgetCreateItem
        - `objectType` 'positionBudget', required
        - `fields` PublicPositionBudgetCreate, required
          - `/positionBudget/expectedBaseSalaryCurrencyValue` object — The expected base salary is the fixed amount of money allocated as regular compensation for a position, not including bonuses or other variable pay.
            - `value` number, nullable
          - `/positionBudget/salaryPayPeriod` object, required — Specifies the frequency and timing of salary payments for this budget, such as monthly or weekly. The possible values are a list in Bob (list name: `payPeriod`)
            - `value` 'Annual' | 'Annual 13' | 'Annual 14' | 'Hourly' | 'Daily' | 'Weekly' | 'Monthly' | 'Monthly 13' | 'Monthly 14' | 'Quarterly', required
          - `/positionBudget/totalPositionCostCurrencyValue` object — The total position cost related to this budget.
            - `value` number, nullable
          - `/positionBudget/currency` object, required — The currency of the position budget. To obtain the available currency codes, call the <a href="https://apidocs.hibob.com/reference/get_company-named-lists-listname"> Get all company lists Metadata API</a> with `currency` in the listname path parameter.
            - `value` string, required
          - `/positionBudget/variablePayPeriod` object
            - `value` 'Quarterly' | 'Monthly' | 'Half-Yearly' | 'Annual', required
          - `/positionBudget/expectedVariablePayCurrencyValue` object
            - `value` number, required

## Response `200`

Position request created successfully

- PositionWithOpeningResponse
  - `id` number — The ID of the created position
  - `positionOpeningId` number — The ID of the created position opening

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `429` — Rate limit exceeded
- `500` — Internal server error

---

[API](https://skmtc.net/hibob/apis/employee-data-api.md) · [All operations](https://skmtc.net/hibob/apis/employee-data-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/hibob/employee-data-api/versions/0781ebbdda91/schema)
