openapi: 3.0.0 info: version: 1.37.0 title: Harver Public accounts vacancies API description: "Public API of the Harver Platform available only for the Customers of Harver.
\n# Quick Start\n## How to access our environments\nWe provide the API access keys and Account IDs for each standard environment. We suggest using our TEST (harver-test.com) environment during the development phase.\n\nAvailable Harver environments for clients:\n- Test: `https://api.harver-test.com`\n- Production: `https://api.harver.com`\n\n## Authentication\nHarver Public API uses OAuth2 authentication. Once you have obtained an access token (valid for 1 hour) you can use it in the Authentication Header as a “Bearer” token for all following requests.\n\n**Endpoint:**
\n`POST https://api.harver.com/oauth/token`\n\n**Note:**
\nin TEST env, POST https://api.harver-test.com/oauth/token\n\n**Content-Type:**
\napplication/x-www-form-urlencoded\n\n**Body:**\n- grant_type → client_credentials\n- client_id → Provided by Harver\n- client_secret → Provided by Harver\n\nAfter a successful request, the response will contain the “access-token“.\n\n**Example**\n```\ncurl --location --request POST 'https://api.harver-test.com/oauth/token' \\\n--header 'Content-Type: application/x-www-form-urlencoded' \\\n--data-urlencode 'grant_type=client_credentials' \\\n--data-urlencode 'client_id={your_client_id}' \\\n--data-urlencode 'client_secret={your_client_secret}'\n```\n**[detailed documentation](https://api.harver.com/docs#tag/oauth)**\n\n\n## Rate - Limiting\n\nHarver API is guarded by rate-limiting. When the allocated rate-limit is exceeded, the API returns HTTP status code 429. (Too many requests).\n\nIn the Production and Testing environments, the default limits will be 450 and 300 requests per minute, respectively. There are two new rate-limiting headers added to the responses as below.\n\n- **Ratelimit-Limit** – The request limit for the time period\n- **Ratelimit-Reset** - The time remaining in the current window, specified in seconds\n\n## Correlation ID\n\nThe responses now include a new header called `X-Correlation-Id`. When submitting a support request, please include this ID. \n\n## How to create a candidate with an application\nSubmit candidates to Harver in order to invite them to complete the Harver Journey.\n\nHarver can invite the candidate by sending an email to the candidate with a magic link to start the Harver journey\n\nYou can also redirect candidates directly to the magic link from the endpoint’s response. The candidate is then immediately logged into Harver.\n\nThe attributes allow you to pass your custom list of key-value pairs. You can use this to place for example your IDs like “candidate_id“, “requisition_id”, “source” etc to help you link and sync Harver to your system.\n\n**Endpoint:**
\n`POST https://api.harver.com/api/v1.0/vacancies/:vacancyId/applications`\n\n**Header:**
\nAuthorization: Bearer {access_token}\n\n**Body:**\n```JSON\n{\n  \"data\": {\n    \"type\": \"applications\",\n    \"attributes\": {\n      \"key1\": \"value1\", //Optional key-value pairs\n      \"key2\": \"value2\", //You can retrieve them with the \"ats\" include\n      \"key3\": \"value3\" //with the GET Application request\n    },\n    \"relationships\": {\n      \"candidate\": {\n        \"data\": {\n          \"type\": \"candidates\",\n          \"attributes\": {\n            \"emailAddress\": \"candidate@gmail.com\", //Mandatory\n            \"firstName\": \"CandidateFirstName\",  //Mandatory\n            \"lastName\": \"CandidateLastName\" //Mandatory\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n***Response:***\nThe response includes the unique Application ID and a Magic-link for the Candidate.\npayload here\n```\n{\n \"data\": {\n \"magicLink\": \"https://my.harver.com/app/landing/{harver_vacancy_id}/magic-link/{unique_code}\",\n \"applicationId\": \"{harver_application_id}\"\n }\n}\n```\n\nRepeating this request with the same email address will return the same Application ID with renewed Magic-Link.\n\nIf your account is set to “Magic-link” based authentication for candidates, you can send this link to your candidates or use it to redirect your candidate to Harver. The Magic-link is valid for 1 hour. A ”Magic Link” is kind of an authenticated URL, which you send to the candidate. This helps them to log in to Harver with just one click of the link without entering username & password. It removes all the friction points that might cause the user to drop out of the application process.\n\n**[detailed documentation](https://api.harver.com/docs#tag/candidateApplications)**\n\n***Return_url parameter***\n\nA special attribute can be used when creating a candidate: return_url. That url will be used to redirect the candidate back when they complete the Harver assessment. This way it is possible to add dynamic attributes to that url.\n\n***Example:***\n```\n{\n  \"data\": {\n    \"type\": \"applications\",\n    \"attributes\": {\n      \"return_url\": \"https:/my-ats.com/welcomeback?candidate_id=12345\"\n    },\n ...\n}\n```\n## Get all information of an application\nTo retrieve an application's relationship data (such as a PDF report, scores etc.), you can make a basic GET applications/{applicationId}, while also providing the include parameter. This include parameter represents a list of comma-separated includes.\n\nEndpoint:
\n`GET https://api.harver.com/api/v1.0/applications/{applicationId}`\n\nHeader:
\n`Authorization: Bearer {access_token}`\n\nBasic response\n\nThis part is always available, the rest depends on included modules\n```\n\"type\": \"applications\",\n\"id\": \"{harver_application_id}\",\n\"attributes\": {\n \"appliedAt\": 1630335533, // timestamp registration\n \"completedAt\": 1630336749, // timestamp completed (when completed)\n \"status\": \"new\", // status \"new\" means completed Harver assessment, and \"new\" for recruitment\n \"progress\": { // Number of modules (incl video & content pages)\n \"all\": 19,\n \"completed\": 19\n },\n \"matchingScore\": 69, // Overall Matching Score\n \"language\": \"ENG\",\n \"matchingProfile\": { // Filled when Matching Profile are used in the account\n \"bracketId\": \"great\",\n \"label\": \"Green\"\n }\n},\n\"relationships\": {\n \"candidate\": {\n \"data\": {\n \"type\": \"candidates\",\n \"id\": \"{harver_application_id}\",\n \"email\": \"{email}\",\n \"attributes\": {\n \"firstName\": \"{firstname}\",\n \"lastName\": \"{lastname}\",\n \"email\": \"{email}\"\n }\n }\n },\n```\n### Get Application ‘include’ modules\n- `personal-info` & `additional-info` → Candidate personal info and additional questions\n- `ats` → ATS Parameters. These can be your id’s, source parameters, e.g. like a `candidate_id`, `reqId`, `utm_source`\n\n -- When the candidate is registered using the API: these are the ones that are sent as key-value attributes in creating the candidates\n -- When the candidate registers directly in Harver: these are the url parameters\n\nExample:\n```\n\"included\": [\n {\n \"type\": \"ats-parameters\",\n \"attributes\": {\n \"candidate_id\": \"{ats_candidate_id}\",\n \"job_code\": \"{ats_job_id}\",\n \"request_id\": \"{ats_request_id}\",\n \"return_url\": \"https://...\", // url to return the candidate to when completed Harver\n }\n }\n]\n```\n- `report` → A link to:\n - Harver PDF report. Generated link that will expire in 15 minutes.\n - Fact Sheet (1 page report). Generated link that will expire in 15 minutes.\n - Candidate Detail Page. You’ll need to have a Harver account, or SSO enabled, to access the Candidate Detail Page. Will not expire.\n- `matching-results` → detailed scores on the modules\n- `matching-indicators` → detailed info on matching indicators (KMI’s) when configured in the account\n\nExample url: https://api.harver.com/api/v1.0/applications/{application_id}?include=report,cover-letter,resume,matching-results,personal-info,additional-info,ats,matching-indicators\n\n**Scoring & report information**\n- **Overall Matching score:**\n - Module: always available\n - Field: `matchingScore`\n - This is a numerical 0 - 100 score\n- **Score label or Band**\n - Module: always available if Matching Profiles are configured in Harver Platform.\n - Field: `\"matchingProfile\"` → `label`.\n - This is a label or band that can be configured in the Harver Platform based on the score. Typical examples: “Great Fit” / “Good Fit” / “Bad Fit”, “Passed” / “Failed”, “Red” / “Green”\n- **Module scores**\n - Module: `matching-indicators`\n - There is a `\"Included\"` → `\"type\": \"matching-indicators\"` for each matching indicator\n- **PDF Report, Factsheet and Candidate result page**\n - Module: `report`\n - A direct link to the Candidate’s PDF report and Factsheet.\n - Note: these links are only available for 15 minutes after requested!\n - The link to the Candidate detail page is a link to Harver. For this an account at Harver is necessary or SSO needs to be enabled. This link does not expire.\n\n**[detailed documentation](https://api.harver.com/docs#tag/applications/paths/~1applications~1%7BapplicationId%7D/get)**\n\n## Get all candidates and their applications in a vacancy (using the filters)\nTo retrieve a list of the candidates and their applications in a vacancy.\n\nEach candidate has a status. Main statuses:\n- in-progress: Registered, but hasn't completed the application process yet.\n- **new**: Application process completed. It is recommended to filter for this status\n- hired: candidate is hired\n- rejected: candidate is rejected\n\n**Endpoint:**
\n`GET https://api.harver.com/api/v1.0/vacancies/{vacancyId}/candidates`\n\n**Header:**
\n`Authorization: Bearer {access_token}`\n\n**Useful filter params:**\n\n- filter[status]=new\n- filter[status-updated-at][since]={epoch_timestamp}\n\nYou can combine params like this:\n?filter[status]=new**&**filter[status-updated-at][since]=1582211393\n\nAfter a successful request, the response body will contain the list of (new) Candidates in the Vacancy. Each candidate has an application listed in the “relationships”, this can be used to request the Application Results.\n\nIf you need to periodically query newly finished candidates, we suggest using the “[status-updated-at][since]” filter with the Epoch timestamp of the previous query.\n\nList of possible filters:\n- `filter[status]`\n- `filter[status-updated-at][since]`\n- `filter[status-updated-at][until]`\n- `filter[locations]`\n- `filter[region]`\n- `filter[external_location_id]`\n- `filter[job_function]`\n- `filter[skip_aggregration]`\n\n**[detailed documentation](https://api.harver.com/docs#tag/vacancies/paths/~1vacancies~1%7BvacancyId%7D~1candidates/get)**\n\n## Webhooks from Harver to an ATS\n\nWebhooks allow you to build or set up integrations which subscribe to certain events in Harver. When one of those events is triggered, we’ll send an HTTP POST payload to the webhook’s configured endpoint. The Harver integrations team can configure the webhooks for you.\n\nAvailable events:\n\n- ApplicationStarted - A candidate registered at Harver. (Candidate Status: in-progress)\n- PersonalInfoWasCreated - A candidate filled in the “Personal information” module. (Candidate Status: in-progress)\n- AdditionalInfoWasUpdated - A candidate filled in the “Additional information” module. (Candidate Status: in-progress)\n- CandidateStatusNew - A candidate completed the Harver Journey. (Candidate Status = new)\n\nWe support NoAuth and Basic Auth (username & password) authentication.\n\nUse the Harver Application Id to get all the details of the application\n\n**[detailed documentation](https://api.harver.com/docs#tag/webhook)**\n# Definitions\n- **Account** - An Account is what holds all of the company specific information within the platform where users of the account can manage settings, Vacancies and Flows.\n- **Vacancy** - Vacancy represents an open position within a company. The Vacancy is where specific information is collected which includes the candidates who wish to apply to that position and their personal information. A Vacancy contains specific information regarding the position for example the location and hours per week the candidate will be expected to work. A vacancy always must have a flow connected to it.\n- **Flow** - A flow is a set of assessment modules and content (videos, static texts), created by an Admin in the system. A Flow must be connected to one or multiple Vacancies.\n- **Modules or Flow modules** - Modules are the separate components used to build a Flow. For instance, a form for the candidate to fill in his/her personal information, a personality questionnaire, multitasking test, etc.\n- **Matching score** - The matching score indicates the extent to which the assessment results of a candidate fit the Vacancy requirements/benchmark. The matching score is calculated based on the combination of results of the different modules that are part of the Flow.\n- **Candidate** - A Candidate represents a person who applied to one or multiple Vacancies.\n- **Application** - A Candidate can apply to multiple Vacancies within an Account. Once a candidate applies to a Vacancy the Application is created.\n- **Webhooks** - Webhooks allow you to build or set up integrations which subscribe to events in Harver. When one of those events is triggered, we’ll send an HTTP POST payload to the webhook’s configured URL.\n" contact: name: Harver Support Team email: support@harver.com url: https://support.harver.com servers: - url: https://api.harver.com/api/v1.0/ description: Production Server tags: - name: vacancies paths: /vacancies/{vacancyId}/candidates: get: summary: Returns all Candidates of a Vacancy description: "To obtain the list of Candidates and their Applications, perform a `GET` operation to the `/vacancies//candidates` endpoint.\n### Limiting results\nOptionally, to limit the scope of the results, you can use the following [query parameters](https://en.wikipedia.org/wiki/Query_string):\n- `filter[status]`\n- `filter[status-updated-at][since]`\n- `filter[status-updated-at][until]`\n- `filter[locations]`\n- `filter[region]`\n- `filter[external_location_id]`\n- `filter[job_function]`\n\nFor filtering by locations, regions, external location ID and job function, comma separated values can be used. Ex: `?filter[locations]={ID1},{ID2}`\n#### Example query:\nTo fetch all candidates of vacancy `5ac774c431e881242fa7164b` that have been in status `new`, you would call the following endpoint:\n\n curl -X GET \\\n 'https://api.harver.com/api/v1.0/vacancies/5ac774c431e881242fa7164b/candidates?filter[status]=new' \\\n -H 'Authorization: Bearer ...'\nTo fetch all candidates of vacancy `5ac774c431e881242fa7164b` that have been in status `new` since at least `April 1st, 2018`, you would call the following endpoint:\n\n curl -X GET \\\n 'https://api.harver.com/api/v1.0/vacancies/5ac774c431e881242fa7164b/candidates?filter[status]=new&filter[status-updated-at][since]=1522540800' \\\n -H 'Authorization: Bearer ...'\nTo fetch all candidates of vacancy `5ac774c431e881242fa7164b` and filter by locations `5c41a7db42dd2c4d3a34cfd2` and `5c484fdece609b10529e1e3f`, you would call the following endpoint:\n\n curl -X GET \\\n 'https://api.harver.com/api/v1.0/vacancies/5ac774c431e881242fa7164b/candidates?filter[locations]=5c41a7db42dd2c4d3a34cfd2,5c484fdece609b10529e1e3f' \\\n -H 'Authorization: Bearer ...'\nTo fetch all candidates of vacancy `5ac774c431e881242fa7164b` and filter by locations `5c41a7db42dd2c4d3a34cfd2` and `5c484fdece609b10529e1e3f`, region as `5c484f8bce609b10529e1e1b`, external location id as `78945` and job function as `5c484fa8ce609b10529e1e2b`, you would call the following endpoint:\n\n curl -X GET \\\n 'https://api.harver.com/api/v1.0/vacancies/5ac774c431e881242fa7164b/candidates?filter[locations]=5c41a7db42dd2c4d3a34cfd2,5c484fdece609b10529e1e3f&filter[region]=5c484f8bce609b10529e1e1b&filter[external_location_id]=78945&filter[job_function]=5c484fa8ce609b10529e1e2b' \\\n -H 'Authorization: Bearer ...'\n" tags: - vacancies parameters: - in: path name: vacancyId schema: type: string required: true description: ID of the Vacancy to consider - in: query name: filter description: The Vacancy filter to apply schema: type: object properties: status: type: string enum: - new - in-progress - rejected - invited - talent-pool - hired - shortlisted - contract status-updated-at: properties: since: type: integer format: int64 until: type: integer format: int64 locations: type: string region: type: string external_location_id: type: string job_function: type: string responses: '200': description: An array of Candidates content: application/json: schema: type: object additionalProperties: false required: - data - included properties: data: type: array items: allOf: - allOf: - type: object required: - type - id - attributes properties: type: type: string example: candidates id: type: string attributes: additionalProperties: false required: - emailAddress - fullName - firstName - lastName - language - address - registerdAt properties: emailAddress: type: string fullName: type: string firstName: type: string lastName: type: string language: type: string address: type: string registeredAt: type: integer format: int64 - type: object required: - relationships properties: relationships: additionalProperties: false required: - application properties: application: additionalProperties: false required: - data properties: data: type: object properties: type: type: string example: applications id: type: string included: type: array items: allOf: - type: object properties: type: type: string example: applications id: type: string attributes: properties: appliedAt: type: integer format: int64 status: type: string enum: - new - in-progress - rejected - invited - talent-pool - hired - shortlisted - contract matchingScore: type: integer format: int32 minimum: 0 maximum: 100 statusUpdatedAt: type: integer format: int64 locations: type: array items: properties: id: type: string name: type: string regionId: type: string externalLocationId: type: string status: type: string jobFunctions: type: array items: properties: id: type: string title: type: string meta: type: object properties: count: type: integer new: type: integer in-progress: type: integer rejected: type: integer invited: type: integer talent-pool: type: integer hired: type: integer shortlisted: type: integer contract: type: integer ready-for-grading: type: integer /vacancies/{vacancyId}/modules/{moduleId}: get: summary: Returns the module settings of a Vacancy tags: - vacancies parameters: - in: path name: vacancyId schema: type: string required: true description: ID of the Vacancy to consider - in: path name: moduleId schema: type: string required: true description: ID of the Module to consider responses: '200': description: The module settings of the Vacancy content: application/json: schema: type: object additionalProperties: false required: - data properties: data: allOf: - type: object properties: type: type: string example: modules id: type: string attributes: properties: moduleType: type: string settings: oneOf: - type: object properties: appliedIndicator: type: string dimensionSettings: type: array items: properties: id: type: string name: type: string targetScore: type: integer format: int32 isActive: type: boolean competencySettings: type: array items: properties: id: type: string name: type: string targetScore: type: integer format: int32 isActive: type: boolean jobAnalysisSettings: type: array items: allOf: - properties: id: type: string name: type: string targetScore: type: integer format: int32 isActive: type: boolean - type: object properties: scaleLeftSide: type: string scaleRightSide: type: string - type: object properties: testVersion: type: string /vacancies/{vacancyId}: get: summary: Find vacancy by id description: "#### Available [query parameters](https://en.wikipedia.org/wiki/Query_string):\n- `filter[skip_aggregation]` - Supports `true` or `false`\n- `include` - Supports combination of `locations`, `regions` and `job-functions` as a comma separated single string. Max length 31\n\nex : locations,job-functions\n\n#### Increasing Performance\n`filter[skip_aggregation]=true` will skip aggregating candidate count in a vacancy, resulting in a faster response\n\n#### Example queries:\nTo get the details of locations assigned to a vacancy, you would call the following endpoint:\n\n curl -X GET \\\n 'https://api.harver.com/api/v1.0/vacancies/:vacancyId?include=locations' \\\n -H 'Authorization: Bearer ...'\n\nTo get the details of regions assigned to a vacancy, you would call the following endpoint:\n\n curl -X GET \\\n 'https://api.harver.com/api/v1.0/vacancies/:vacancyId?include=regions' \\\n -H 'Authorization: Bearer ...'\n\nTo get the details of job-functions assigned to a vacancy, you would call the following endpoint:\n\n curl -X GET \\\n 'https://api.harver.com/api/v1.0/vacancies/:vacancyId?include=job-functions' \\\n -H 'Authorization: Bearer ...'\n" tags: - vacancies parameters: - in: path name: vacancyId schema: type: string required: true description: ID of the Vacancy to consider responses: '200': description: Returns a single vacancy content: application/json: schema: type: object additionalProperties: false required: - data properties: data: type: object required: - meta - relationships properties: meta: type: object allOf: - type: object required: - candidates-per-status properties: candidates-per-status: additionalProperties: false required: - new - in-progress - rejected - invited - talent-pool - hired - shortlisted - contract properties: new: type: integer format: int32 in-progress: type: integer format: int32 rejected: type: integer format: int32 invited: type: integer format: int32 talent-pool: type: integer format: int32 hired: type: integer format: int32 shortlisted: type: integer format: int32 contract: type: integer format: int32 ready-for-grading: type: integer format: int32 relationships: type: object required: - regions - locations properties: regions: type: object allOf: - type: object required: - data properties: data: type: array items: additionalProperties: false required: - type - id properties: type: type: string example: regions id: type: string locations: type: object allOf: - type: object required: - data properties: data: type: array items: additionalProperties: false required: - type - id properties: type: type: string example: locations id: type: string jobFunctions: type: object allOf: - type: object required: - data properties: data: type: array items: additionalProperties: false required: - type - id properties: type: type: string example: job-functions id: type: string allOf: - required: - id - type properties: type: type: string enum: - vacancies id: type: string - type: object required: - attributes properties: attributes: additionalProperties: false required: - name - title - description - location - createdAt - applicationUrl properties: name: type: string title: anyOf: - type: array - type: string description: anyOf: - type: array - type: string location: type: string createdAt: type: integer format: int64 applicationUrl: type: string account: type: string included: type: array items: allOf: - type: object properties: type: type: string enum: - locations id: type: string attributes: type: object properties: name: type: string address: type: string email: type: string externalId: type: string region: type: string nullable: true hiringChance: type: integer minHoursAvailability: type: integer walkingTimes: type: array items: type: object properties: from: type: integer format: int64 to: type: integer format: int64 - type: object properties: type: type: string enum: - regions id: type: string attributes: type: object properties: name: type: string - type: object properties: type: type: string enum: - job-functions id: type: string attributes: type: object properties: name: type: string assignedLocation: type: string patch: summary: Update a Vacancy Status tags: - vacancies parameters: - in: path name: vacancyId schema: type: string required: true description: ID of the Vacancy to consider requestBody: description: The Vacancy status to update required: true content: application/json: schema: type: object properties: attributes: properties: status: type: string enum: - open - closed - draft responses: '204': description: Status indication of Vacancy updated /vacancies/{vacancyId}/locations: patch: deprecated: true summary: Updates locations of a vacancy description: '!!! IMPORTANT - This endpoint will be removed soon. Please use `Updates attached locations of a vacancy` endpoint This endpoint updates the locations of a vacancy. It supports two config option keys to manipulate location update. - `switchToLocations` - Supports boolean value `true` or `false`. If `true`, will force switching to a vacancy. If there are any regions attached to the vacancy, this will skip the regions check and remove regions and attach locations to the vacancy. Else will check if there are any regions attached to the vacancy before updating the locations, and if so, will not allow location update. - `replaceLocations` - Supports boolean value `true` or `false`. If `true`, previous existing locations will be replaced by the new locations. Else will add the new locations to the previous locations. ' tags: - vacancies parameters: - in: path name: vacancyId schema: type: string required: true description: ID of the Vacancy to consider requestBody: description: The Vacancy status to update required: true content: application/json: schema: type: object properties: attributes: properties: locations: type: array items: type: string example: - 621f456062c05d000825b694 - 621f456062c05d000825b695 - 621f456062c05d000825b696 switchToLocations: type: boolean example: false replaceLocations: type: boolean example: false responses: '200': description: Successfully updated the locations content: application/json: schema: type: object properties: data: type: object properties: message: type: string example: Vacancy locations updated successfully '400': description: Validation error content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: ValidationError status: type: number example: 400 title: type: string example: A message thrown by JOI schema validator '500': description: Any failures content: application/json: schema: type: object properties: data: type: object properties: error: type: string example: Trying to update a vacancy with regions /vacancies/{vacancyId}/locations-v2: patch: summary: Updates attached locations of a vacancy description: "\nThis endpoint updates the attached locations of a vacancy. It supports two configs to manipulate location update.\n- `forceOperation` - This option accepts boolean value `true` or `false`. \n\n - If set to `true`, it will attach sent locations to the job vacancy, EVEN IF there are already regions attached to it.\n\n - If set to `false`, will verify if the job vacancy already has regions attached. If regions are already attached, an error response is sent.\n\n- `replaceValues` - This option accepts boolean value `true` or `false`.\n\n - If set to `true`, the new locations will completely replace any existing ones in the vacancy.\n \n - If set to `false`, the new locations will be added alongside the existing ones, creating a combined list of locations and attaching them to the vacancy.\n" tags: - vacancies parameters: - in: path name: vacancyId schema: type: string required: true description: ID of the Vacancy to consider requestBody: description: The Vacancy status to update required: true content: application/json: schema: type: object properties: attributes: properties: locations: type: array items: type: string example: - 621f456062c05d000825b694 - 621f456062c05d000825b695 - 621f456062c05d000825b696 forceOperation: type: boolean example: false replaceValues: type: boolean example: false responses: '200': description: Successfully updated the locations content: application/json: schema: type: object properties: data: type: object properties: message: type: string example: Vacancy locations updated successfully '400': description: Validation error content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: ValidationError status: type: number example: 400 title: type: string example: A message thrown by JOI schema validator '403': description: Forbidden error content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: Forbidden status: type: string example: '403' title: type: string example: Forbidden detail: type: string example: Does not have permission to perform this action '404': description: Not Found error content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: Not Found status: type: string example: '404' title: type: string example: Not Found detail: type: string example: Vacancy not found '500': description: Any other failures content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: InternalServerError status: type: string example: '500' title: type: string example: Internal Server Error detail: type: string example: Unexpected error occurred /vacancies/{vacancyId}/regions: patch: summary: Updates attached regions of a vacancy description: "\nThis endpoint updates the attached regions of a vacancy. It supports two configs to manipulate regions update.\n\n- `forceOperation` - This option accepts boolean value `true` or `false`. \n\n - If set to `true`, it will attach sent regions to the job vacancy, EVEN IF there are already locations attached to it.\n\n - If set to `false`, will verify if the job vacancy already has locations attached. If locations are already associated, an error response is sent.\n\n- `replaceValues` - This option accepts boolean value `true` or `false`.\n\n - If set to `true`, the new regions will completely replace any existing ones in the vacancy.\n \n - If set to `false`, the new regions will be added alongside the existing ones, creating a combined list of regions and attaching them to the vacancy.\n" tags: - vacancies parameters: - in: path name: vacancyId schema: type: string required: true description: ID of the Vacancy to consider requestBody: description: The Vacancy status to update required: true content: application/json: schema: type: object properties: attributes: properties: regions: type: array items: type: string example: - 621f456062c05d000825b694 - 621f456062c05d000825b695 - 621f456062c05d000825b696 forceOperation: type: boolean example: false replaceValues: type: boolean example: false responses: '200': description: Successfully updated the regions content: application/json: schema: type: object properties: data: type: object properties: message: type: string example: Vacancy regions updated successfully '400': description: Validation error content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: ValidationError status: type: number example: 400 title: type: string example: A message thrown by JOI schema validator '403': description: Forbidden error content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: Forbidden status: type: string example: '403' title: type: string example: Forbidden detail: type: string example: Does not have permission to perform this action '404': description: Not Found error content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: Not Found status: type: string example: '404' title: type: string example: Not Found detail: type: string example: Vacancy not found '500': description: Any other failures content: application/json: schema: type: object properties: errors: type: array items: type: object properties: id: type: string example: InternalServerError status: type: string example: '500' title: type: string example: Internal Server Error detail: type: string example: Unexpected error occurred