---
updatedAt: 2026-02-16T16:08:06.000Z
---

Fetch the complete documentation index at: https://apidocs.hibob.com/llms.txt. Use this file to discover all available pages before exploring further.

# Update Position

Updates an existing position **Notes:**<br> - Currently, you cannot use approval flows, 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>
 


# OpenAPI definition

```json
{
  "openapi": "3.1.1",
  "info": {
    "title": "Workforce Planning API",
    "description": "Use Public API to access Workforce Planning in Bob",
    "license": {
      "name": "Proprietary",
      "url": "https://apidocs.hibob.com/docs/api-terms-of-use"
    },
    "contact": {
      "name": "Hi Bob, Inc."
    },
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://api.hibob.com/v1",
      "description": "Production"
    },
    {
      "url": "https://api.sandbox.hibob.com/v1",
      "description": "Sandbox"
    }
  ],
  "x-readme": {
    "metrics-enabled": false
  },
  "tags": [
    {
      "name": "Workforce Planning",
      "description": "Operations for managing workforce planning in Bob"
    },
    {
      "name": "Workforce Planning Webhooks",
      "description": "Webhook events for workforce planning-related operations"
    }
  ],
  "webhooks": {
    "positionCreated": {
      "post": {
        "operationId": "post_webhook_workforce-planning-position-created",
        "tags": [
          "Workforce Planning Webhooks"
        ],
        "summary": "Position created webhook",
        "description": "Webhook sent when a new position is created in the Workforce Planning module.\n\nPositions are a core entity of the Workforce Planning module, enabling you to allocate\nbudgets and assign specific roles to positions for your workforce's current and future needs.\n\n**Best practice:** Use the event as a notification only, and retrieve the complete position\ndetails using the <a href=\"https://apidocs.hibob.com/reference/post_objects-position-search\" target=\"_blank\">Read company positions</a> API endpoint.\n\nIn the right panel, open **Examples** and select **Payload Example** to see a real payload.\n",
        "parameters": [
          {
            "name": "bob-signature",
            "in": "header",
            "required": true,
            "description": "Base64-encoded signature sent with each webhook request. Use it to verify that the request came from Bob. To verify webhook authenticity, see <a href=\"https://apidocs.hibob.com/reference/getting-started-webhooks#how-does-bob-calculate-the-signature\" target=\"_blank\">How does Bob calculate the signature</a>.",
            "schema": {
              "type": "string",
              "example": "EQScIBkAtTKFW0ictgt5zzOsqIc2+xGEsM88jOdLuW4CM/a3gLEfrKV+IC5IHx0xbirzLKPIfaZjCGwzuiyI8w=="
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PositionCreatedEvent"
              },
              "example": {
                "companyId": 637323,
                "type": "workforcePlanning.position.created",
                "triggeredBy": "3418533772247696340",
                "triggeredAt": "2024-10-03T09:29:00.831502Z",
                "version": "v2",
                "data": {
                  "positionId": 123
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          },
          "400": {
            "description": "Invalid webhook payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "positionUpdated": {
      "post": {
        "operationId": "post_webhook_workforce-planning-position-updated",
        "tags": [
          "Workforce Planning Webhooks"
        ],
        "summary": "Position updated webhook",
        "description": "Webhook sent when any position fields are modified in the Workforce Planning module.\n\nPositions can have various attributes such as department, site, employment type, and manager.\nThe payload includes `fieldUpdatesIds` to indicate which fields were changed.\n\n**Best practice:** Use the event as a notification only, and retrieve the complete position\ndetails using the <a href=\"https://apidocs.hibob.com/reference/post_objects-position-search\" target=\"_blank\">Read company positions</a> API endpoint.\nUse the `fieldUpdatesIds` from the payload to retrieve only the updated field values.\n\nIn the right panel, open **Examples** and select **Payload Example** to see a real payload.\n",
        "parameters": [
          {
            "name": "bob-signature",
            "in": "header",
            "required": true,
            "description": "Base64-encoded signature sent with each webhook request. Use it to verify that the request came from Bob. To verify webhook authenticity, see <a href=\"https://apidocs.hibob.com/reference/getting-started-webhooks#how-does-bob-calculate-the-signature\" target=\"_blank\">How does Bob calculate the signature</a>.",
            "schema": {
              "type": "string",
              "example": "EQScIBkAtTKFW0ictgt5zzOsqIc2+xGEsM88jOdLuW4CM/a3gLEfrKV+IC5IHx0xbirzLKPIfaZjCGwzuiyI8w=="
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PositionUpdatedEvent"
              },
              "example": {
                "companyId": 637323,
                "type": "workforcePlanning.position.updated",
                "triggeredBy": "3418533772247696340",
                "triggeredAt": "2024-10-03T09:29:00.831502Z",
                "version": "v2",
                "data": {
                  "positionId": 123,
                  "fieldUpdatesIds": [
                    {
                      "id": "/position/status"
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          },
          "400": {
            "description": "Invalid webhook payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "positionOpeningCreated": {
      "post": {
        "operationId": "post_webhook_workforce-planning-position-opening-created",
        "tags": [
          "Workforce Planning Webhooks"
        ],
        "summary": "Position opening created webhook",
        "description": "Webhook sent when a new position opening is created. Position openings are always linked\nto a Position in Bob.\n\nThey allow organizations to plan multiple hiring scenarios under the same position (e.g.\nmaternity leave replacements or organizational growth) without duplicating positions. Each\nopening can have its recruitment status, expected start date, and opening name.\n\n**Best practice:** Use the event as a notification only, and retrieve the complete position\nopening details using the <a href=\"https://apidocs.hibob.com/reference/post_positions-position-openings-search\" target=\"_blank\">Read company positions openings</a> API endpoint.\nNote that position opening events don't include the position ID; you can get it by\nretrieving the opening details.\n\nIn the right panel, open **Examples** and select **Payload Example** to see a real payload.\n",
        "parameters": [
          {
            "name": "bob-signature",
            "in": "header",
            "required": true,
            "description": "Base64-encoded signature sent with each webhook request. Use it to verify that the request came from Bob. To verify webhook authenticity, see <a href=\"https://apidocs.hibob.com/reference/getting-started-webhooks#how-does-bob-calculate-the-signature\" target=\"_blank\">How does Bob calculate the signature</a>.",
            "schema": {
              "type": "string",
              "example": "EQScIBkAtTKFW0ictgt5zzOsqIc2+xGEsM88jOdLuW4CM/a3gLEfrKV+IC5IHx0xbirzLKPIfaZjCGwzuiyI8w=="
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PositionOpeningCreatedEvent"
              },
              "example": {
                "companyId": 637323,
                "type": "workforcePlanning.positionOpening.created",
                "triggeredBy": "3418533772247696340",
                "triggeredAt": "2024-10-03T09:29:00.831502Z",
                "version": "v2",
                "data": {
                  "positionOpeningId": 123
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          },
          "400": {
            "description": "Invalid webhook payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "positionOpeningUpdated": {
      "post": {
        "operationId": "post_webhook_workforce-planning-position-opening-updated",
        "tags": [
          "Workforce Planning Webhooks"
        ],
        "summary": "Position opening updated webhook",
        "description": "Webhook sent when position opening fields are modified. Position openings are always linked\nto a Position in Bob.\n\nThe payload includes `fieldUpdatesIds` to indicate which fields were changed.\n\n**Best practice:** Use the event as a notification only, and retrieve the complete position\nopening details using the <a href=\"https://apidocs.hibob.com/reference/post_positions-position-openings-search\" target=\"_blank\">Read company positions openings</a> API endpoint.\nUse the `fieldUpdatesIds` from the payload to retrieve only the updated field values.\n\nIn the right panel, open **Examples** and select **Payload Example** to see a real payload.\n",
        "parameters": [
          {
            "name": "bob-signature",
            "in": "header",
            "required": true,
            "description": "Base64-encoded signature sent with each webhook request. Use it to verify that the request came from Bob. To verify webhook authenticity, see <a href=\"https://apidocs.hibob.com/reference/getting-started-webhooks#how-does-bob-calculate-the-signature\" target=\"_blank\">How does Bob calculate the signature</a>.",
            "schema": {
              "type": "string",
              "example": "EQScIBkAtTKFW0ictgt5zzOsqIc2+xGEsM88jOdLuW4CM/a3gLEfrKV+IC5IHx0xbirzLKPIfaZjCGwzuiyI8w=="
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PositionOpeningUpdatedEvent"
              },
              "example": {
                "companyId": 637323,
                "type": "workforcePlanning.positionOpening.updated",
                "triggeredBy": "3418533772247696340",
                "triggeredAt": "2024-10-03T09:29:00.831502Z",
                "version": "v2",
                "data": {
                  "positionOpeningId": 123,
                  "fieldUpdatesIds": [
                    {
                      "id": "/positionOpening/status"
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          },
          "400": {
            "description": "Invalid webhook payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "positionOpeningDeleted": {
      "post": {
        "operationId": "post_webhook_workforce-planning-position-opening-deleted",
        "tags": [
          "Workforce Planning Webhooks"
        ],
        "summary": "Position opening deleted webhook",
        "description": "Webhook sent when a position opening is removed. Position openings are always linked\nto a Position in Bob.\n\n**Best practice:** Use the event as a notification only, and verify the deletion using the\n<a href=\"https://apidocs.hibob.com/reference/post_positions-position-openings-search\" target=\"_blank\">Read company positions openings</a> API endpoint.\n\nIn the right panel, open **Examples** and select **Payload Example** to see a real payload.\n",
        "parameters": [
          {
            "name": "bob-signature",
            "in": "header",
            "required": true,
            "description": "Base64-encoded signature sent with each webhook request. Use it to verify that the request came from Bob. To verify webhook authenticity, see <a href=\"https://apidocs.hibob.com/reference/getting-started-webhooks#how-does-bob-calculate-the-signature\" target=\"_blank\">How does Bob calculate the signature</a>.",
            "schema": {
              "type": "string",
              "example": "EQScIBkAtTKFW0ictgt5zzOsqIc2+xGEsM88jOdLuW4CM/a3gLEfrKV+IC5IHx0xbirzLKPIfaZjCGwzuiyI8w=="
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PositionOpeningDeletedEvent"
              },
              "example": {
                "companyId": 637323,
                "type": "workforcePlanning.positionOpening.deleted",
                "triggeredBy": "3418533772247696340",
                "triggeredAt": "2024-10-03T09:29:00.831502Z",
                "version": "v2",
                "data": {
                  "positionOpeningId": 123
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          },
          "400": {
            "description": "Invalid webhook payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "positionBudgetCreated": {
      "post": {
        "operationId": "post_webhook_workforce-planning-position-budget-created",
        "tags": [
          "Workforce Planning Webhooks"
        ],
        "summary": "Position budget created webhook",
        "description": "Webhook sent when a new position budget is created. Position budgets are always linked\nto a Position in Bob.\n\nThey allow tracking of the financial allocation for specific roles within the organization.\nBudget attributes include the budget date (when funding starts), currency, base salary, and\nvariable pay. Budgets are available only if you activate the position cost feature in the\nworkforce planning settings.\n\n**Best practice:** Use the event as a notification only, and retrieve the complete position\nbudget details using the <a href=\"https://apidocs.hibob.com/reference/post_positions-position-budget-search\" target=\"_blank\">Read company positions budgets</a> API endpoint.\nNote that budget events include the position ID, because budget details don't return it.\n\nIn the right panel, open **Examples** and select **Payload Example** to see a real payload.\n",
        "parameters": [
          {
            "name": "bob-signature",
            "in": "header",
            "required": true,
            "description": "Base64-encoded signature sent with each webhook request. Use it to verify that the request came from Bob. To verify webhook authenticity, see <a href=\"https://apidocs.hibob.com/reference/getting-started-webhooks#how-does-bob-calculate-the-signature\" target=\"_blank\">How does Bob calculate the signature</a>.",
            "schema": {
              "type": "string",
              "example": "EQScIBkAtTKFW0ictgt5zzOsqIc2+xGEsM88jOdLuW4CM/a3gLEfrKV+IC5IHx0xbirzLKPIfaZjCGwzuiyI8w=="
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PositionBudgetCreatedEvent"
              },
              "example": {
                "companyId": 636192,
                "type": "workforcePlanning.positionBudget.created",
                "triggeredBy": "3332883804594373380",
                "triggeredAt": "2025-07-07T14:30:47.831523Z",
                "version": "v2",
                "data": {
                  "positionBudgetId": 16649969,
                  "positionId": 16649970
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          },
          "400": {
            "description": "Invalid webhook payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": []
      }
    },
    "positionBudgetUpdated": {
      "post": {
        "operationId": "post_webhook_workforce-planning-position-budget-updated",
        "tags": [
          "Workforce Planning Webhooks"
        ],
        "summary": "Position budget updated webhook",
        "description": "Webhook sent when position budget fields are modified. Position budgets are always linked\nto a Position in Bob.\n\nThey allow tracking of the financial allocation for specific roles within the organization.\nThe payload includes `fieldUpdatesIds` to indicate which fields were changed.\n\n**Best practice:** Use the event as a notification only, and retrieve the complete position\nbudget details using the <a href=\"https://apidocs.hibob.com/reference/post_positions-position-budget-search\" target=\"_blank\">Read company positions budgets</a> API endpoint.\nUse the `fieldUpdatesIds` from the payload to retrieve only the updated field values. Note\nthat budget events include the position ID, because budget details don't return it.\n\nIn the right panel, open **Examples** and select **Payload Example** to see a real payload.\n",
        "parameters": [
          {
            "name": "bob-signature",
            "in": "header",
            "required": true,
            "description": "Base64-encoded signature sent with each webhook request. Use it to verify that the request came from Bob. To verify webhook authenticity, see <a href=\"https://apidocs.hibob.com/reference/getting-started-webhooks#how-does-bob-calculate-the-signature\" target=\"_blank\">How does Bob calculate the signature</a>.",
            "schema": {
              "type": "string",
              "example": "EQScIBkAtTKFW0ictgt5zzOsqIc2+xGEsM88jOdLuW4CM/a3gLEfrKV+IC5IHx0xbirzLKPIfaZjCGwzuiyI8w=="
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PositionBudgetUpdatedEvent"
              },
              "example": {
                "companyId": 637323,
                "type": "workforcePlanning.positionBudget.updated",
                "triggeredBy": "3418533772247696340",
                "triggeredAt": "2024-10-03T09:29:00.831502Z",
                "version": "v2",
                "data": {
                  "positionBudgetId": 123,
                  "positionId": 124,
                  "fieldUpdatesIds": [
                    {
                      "id": "/positionBudget/baseSalary"
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Webhook received successfully"
          },
          "400": {
            "description": "Invalid webhook payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": []
      }
    }
  },
  "paths": {
    "/workforce-planning/positions/{positionId}": {
      "patch": {
        "operationId": "patch_workforce-planning-positions-positionid",
        "tags": [
          "Workforce Planning"
        ],
        "summary": "Update Position",
        "description": "Updates an existing position **Notes:**<br> - Currently, you cannot use approval flows, 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>\n \n",
        "parameters": [
          {
            "name": "positionId",
            "in": "path",
            "required": true,
            "description": "The ID of the position to update",
            "schema": {
              "type": "number"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PublicPositionUpdateRequest"
              },
              "example": {
                "items": [
                  {
                    "objectType": "position",
                    "fields": {
                      "/position/name": {
                        "value": "Senior Software Engineer"
                      },
                      "/position/effectiveDate": {
                        "value": "2025-04-01"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Position updated successfully"
          },
          "204": {
            "description": "No Content"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "Basic": []
          },
          {
            "Bearer": []
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "PublicPositionUpdateRequest": {
        "type": "object",
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "maxItems": 1,
            "items": {
              "$ref": "#/components/schemas/PublicPositionUpdateItem"
            }
          }
        }
      },
      "PublicPositionUpdateItem": {
        "type": "object",
        "required": [
          "objectType",
          "fields"
        ],
        "properties": {
          "objectType": {
            "type": "string",
            "enum": [
              "position"
            ]
          },
          "fields": {
            "$ref": "#/components/schemas/PublicPositionUpdate"
          }
        }
      },
      "PublicPositionUpdate": {
        "type": "object",
        "properties": {
          "/position/name": {
            "type": "object",
            "description": "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. \n",
            "properties": {
              "value": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "/position/effectiveDate": {
            "type": "object",
            "description": "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. \n",
            "properties": {
              "value": {
                "type": "string",
                "format": "date",
                "example": "2025-04-01"
              }
            }
          },
          "/position/managerPositionId": {
            "type": "object",
            "description": "The manager's position backend-id (a reference to the manager's position in Bob), that allows the creation of a hierarchical org structure.\n",
            "properties": {
              "value": {
                "type": "number"
              }
            }
          },
          "/position/positionType": {
            "type": "object",
            "description": "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`).\n",
            "properties": {
              "value": {
                "type": "string"
              }
            }
          },
          "/position/fte": {
            "type": "object",
            "description": "A numeric field representing the job % allocated to each “chair.” \n",
            "properties": {
              "value": {
                "type": "number"
              }
            }
          },
          "/position/employmentType": {
            "type": "object",
            "description": "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`.",
            "properties": {
              "value": {
                "type": "string"
              }
            }
          },
          "/position/department": {
            "type": "object",
            "description": "The position's department. Possible values depend on the values of the department list (list name: `department`). ",
            "properties": {
              "value": {
                "type": "string"
              }
            }
          },
          "/position/site": {
            "type": "object",
            "description": "The position's site. Possible values are list-items from the sites list in Bob (list name: `site`). ",
            "properties": {
              "value": {
                "type": "number"
              }
            }
          },
          "/position/jobProfile": {
            "type": "object",
            "description": "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>\n  **Note**: You must use **Job Catalog 2.0** in order to have access to job profiles. ",
            "properties": {
              "value": {
                "type": "number"
              }
            }
          },
          "/position/reason": {
            "type": "object",
            "description": "Reason for changing or creating this position.",
            "properties": {
              "value": {
                "type": "string"
              }
            }
          }
        }
      },
      "ApiErrorResponse": {
        "type": "object",
        "description": "Standard API error response body",
        "properties": {
          "key": {
            "type": "string",
            "description": "The unique identifier of the error."
          },
          "error": {
            "type": "string",
            "description": "A human readable error message."
          }
        }
      },
      "Error": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "The unique identifier of the error."
          },
          "error": {
            "type": "string",
            "description": "A human readable error message."
          }
        }
      },
      "WebhookEvent": {
        "type": "object",
        "description": "Base webhook event structure containing common webhook properties",
        "properties": {
          "companyId": {
            "type": "number",
            "description": "The company ID"
          },
          "type": {
            "type": "string",
            "description": "The event type (e.g., workforcePlanning.position.created)"
          },
          "triggeredBy": {
            "type": "string",
            "description": "The backend-id of the employee that triggered the event or 'system' for events triggered automatically by the system"
          },
          "triggeredAt": {
            "type": "string",
            "format": "date-time",
            "description": "The timestamp when the event occurred"
          },
          "version": {
            "type": "string",
            "description": "The webhook version"
          },
          "data": {
            "type": "object",
            "description": "Contains the actual data and differs for each event type"
          }
        },
        "required": [
          "companyId",
          "type",
          "triggeredBy",
          "triggeredAt",
          "version",
          "data"
        ]
      },
      "FieldId": {
        "type": "object",
        "description": "Field ID structure for field updates",
        "properties": {
          "id": {
            "type": "string",
            "description": "The field path (e.g., /position/status)"
          }
        },
        "required": [
          "id"
        ]
      },
      "PositionCreatedEvent": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "workforcePlanning.position.created"
                ],
                "description": "The event type for position creation"
              },
              "data": {
                "type": "object",
                "properties": {
                  "positionId": {
                    "type": "number",
                    "description": "The ID of the created position"
                  }
                },
                "required": [
                  "positionId"
                ]
              }
            },
            "description": "Webhook sent when a new position is created in the Workforce Planning module."
          }
        ]
      },
      "PositionUpdatedEvent": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "workforcePlanning.position.updated"
                ],
                "description": "The event type for position update"
              },
              "data": {
                "type": "object",
                "properties": {
                  "positionId": {
                    "type": "number",
                    "description": "The ID of the updated position"
                  },
                  "fieldUpdatesIds": {
                    "type": "array",
                    "description": "List of field paths that were updated",
                    "items": {
                      "$ref": "#/components/schemas/FieldId"
                    }
                  }
                },
                "required": [
                  "positionId",
                  "fieldUpdatesIds"
                ]
              }
            },
            "description": "Webhook sent when any position fields are modified in the Workforce Planning module."
          }
        ]
      },
      "PositionOpeningCreatedEvent": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "workforcePlanning.positionOpening.created"
                ],
                "description": "The event type for position opening creation"
              },
              "data": {
                "type": "object",
                "properties": {
                  "positionOpeningId": {
                    "type": "number",
                    "description": "The ID of the created position opening"
                  }
                },
                "required": [
                  "positionOpeningId"
                ]
              }
            },
            "description": "Webhook sent when a new position opening is created."
          }
        ]
      },
      "PositionOpeningUpdatedEvent": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "workforcePlanning.positionOpening.updated"
                ],
                "description": "The event type for position opening update"
              },
              "data": {
                "type": "object",
                "properties": {
                  "positionOpeningId": {
                    "type": "number",
                    "description": "The ID of the updated position opening"
                  },
                  "fieldUpdatesIds": {
                    "type": "array",
                    "description": "List of field paths that were updated",
                    "items": {
                      "$ref": "#/components/schemas/FieldId"
                    }
                  }
                },
                "required": [
                  "positionOpeningId",
                  "fieldUpdatesIds"
                ]
              }
            },
            "description": "Webhook sent when position opening fields are modified."
          }
        ]
      },
      "PositionOpeningDeletedEvent": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "workforcePlanning.positionOpening.deleted"
                ],
                "description": "The event type for position opening deletion"
              },
              "data": {
                "type": "object",
                "properties": {
                  "positionOpeningId": {
                    "type": "number",
                    "description": "The ID of the deleted position opening"
                  }
                },
                "required": [
                  "positionOpeningId"
                ]
              }
            },
            "description": "Webhook sent when a position opening is removed."
          }
        ]
      },
      "PositionBudgetCreatedEvent": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "workforcePlanning.positionBudget.created"
                ],
                "description": "The event type for position budget creation"
              },
              "data": {
                "type": "object",
                "properties": {
                  "positionBudgetId": {
                    "type": "number",
                    "description": "The ID of the created position budget"
                  },
                  "positionId": {
                    "type": "number",
                    "description": "The ID of the position this budget is linked to"
                  }
                },
                "required": [
                  "positionBudgetId",
                  "positionId"
                ]
              }
            },
            "description": "Webhook sent when a new position budget is created. The event payload includes the position ID that this budget is linked to."
          }
        ]
      },
      "PositionBudgetUpdatedEvent": {
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookEvent"
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "workforcePlanning.positionBudget.updated"
                ],
                "description": "The event type for position budget update"
              },
              "data": {
                "type": "object",
                "properties": {
                  "positionBudgetId": {
                    "type": "number",
                    "description": "The ID of the updated position budget"
                  },
                  "positionId": {
                    "type": "number",
                    "description": "The ID of the position this budget is linked to"
                  },
                  "fieldUpdatesIds": {
                    "type": "array",
                    "description": "List of field paths that were updated",
                    "items": {
                      "$ref": "#/components/schemas/FieldId"
                    }
                  }
                },
                "required": [
                  "positionBudgetId",
                  "positionId",
                  "fieldUpdatesIds"
                ]
              }
            },
            "description": "Webhook sent when position budget fields are modified. The event payload includes the position ID that this budget is linked to."
          }
        ]
      }
    },
    "securitySchemes": {
      "Basic": {
        "type": "http",
        "scheme": "basic"
      },
      "Bearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "OAuth 2.0",
        "description": "OAuth 2.0 authentication using an Access Token is available for registered partners only.  Try It! does not support the full HiBob OAuth flow. You can follow <a href=\"https://apidocs.hibob.com/reference/oauth-20#testing-from-the-public-api-reference\" target=\"_blank\">these steps</a> to complete the OAuth 2.0 flow in Postman and then paste the token here."
      }
    }
  }
}
```