Download OpenAPI specification:Download
Public API of the Harver Platform available only for the Customers of Harver.
We 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.
Available Harver environments for clients:
https://api.harver-test.com
https://api.harver.com
Harver Public API uses Oauth2 authentication, once you obtained an access token (valid for 1 hour) you can use it in the Authentication Header as a “Bearer” token for all following requests.
Endpoint:
POST https://api.harver.com/oauth/token
Note:
in TEST env, POST https://api.harver-test.com/oauth/token
Content-Type:
application/x-www-form-urlencoded
Body:
After a successful request, the response will contain the “access-token“.
Example
curl --location --request POST 'https://api.harver-test.com/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id={your_client_id}' \
--data-urlencode 'client_secret={your_client_secret}'
Harver API is guarded by rate-limiting. When the allocated rate-limit is exceeded, the API returns HTTP status code 429. (Too many requests).
In 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 bellow.
The responses now include a new header called X-Correlation-Id
. When submitting a support request, please include this ID.
Submit candidates to Harver in order to invite them to complete the Harver Journey.
Harver can invite the candidate by sending an email to the candidate with a magic link to start the Harver journey
You can also redirect candidates directly to the magic link from the endpoint’s response. The candidate is then immediately logged into Harver.
The 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.
Endpoint:
POST https://api.harver.com/api/v1.0/vacancies/:vacancyId/applications
Header:
Authorization: Bearer {access_token}
Body:
{
"data": {
"type": "applications",
"attributes": {
"key1": "value1", //Optional key-value pairs
"key2": "value2", //You can retrieve them with the "ats" include
"key3": "value3", //with the GET Application request
},
"relationships": {
"candidate": {
"data": {
"type": "candidates",
"attributes": {
"emailAddress": "candidate@gmail.com", //Mandatory
"firstName": "CandidateFirstName", //Mandatory
"lastName": "CandidateLastName" //Mandatory
}
}
}
}
}
}
Response: The response includes the unique Application ID and a Magic-link for the Candidate. payload here
{
"data": {
"magicLink": "https://my.harver.com/app/landing/{harver_vacancy_id}/magic-link/{unique_code}",
"applicationId": "{harver_application_id}"
}
}
Repeating this request with the same email address will return the same Application ID with renewed Magic-Link.
If 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.
Return_url parameter
A special attribute can be used when creating a candidate: return_url. That url will be use to redirect the candidate back to, when completed the Harver assessment. This way it is possible to add dynamic attributes to that url.
Example:
{
"data": {
"type": "applications",
"attributes": {
"return_url": "https:/my-ats.com/welcomeback?candidate_id=12345"
},
...
}
To 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.
Endpoint:
GET https://api.harver.com/api/v1.0/applications/{applicationId}
Header:
Authorization: Bearer {access_token}
Basic response
This part is always available, the rest depends on included modules
"type": "applications",
"id": "{harver_application_id}",
"attributes": {
"appliedAt": 1630335533, // timestamp registration
"completedAt": 1630336749, // timestamp completed (when completed)
"status": "new", // status "new" means completed Harver assessment, and "new" for recruitement
"progress": { // Number of modules (incl video & content pages)
"all": 19,
"completed": 19
},
"matchingScore": 69, // Overall Matching Score
"language": "ENG",
"matchingProfile": { // Filled when Matching Profile are used in the account
"bracketId": "great",
"label": "Green"
}
},
"relationships": {
"candidate": {
"data": {
"type": "candidates",
"id": "{harver_application_id}",
"email": "{email}",
"attributes": {
"firstName": "{firstname}",
"lastName": "{lastname}",
"email": "{email}"
}
}
},
personal-info
& additional-info
→ Candidate personal info and additional questions
ats
→ ATS Parameters. These can be your id’s, source parameters, eg like a candidate_id
, reqId
, utm_source
-- When the candidate is registered using the API: these are the ones that are sent as key-value attributes in creating the candidates -- When the candidate registers directly in Harver: these are the url parameters
Example:
"included": [
{
"type": "ats-parameters",
"attributes": {
"candidate_id": "{ats_candidate_id}",
"job_code": "{ats_job_id}",
"request_id": "{ats_request_id}",
"return_url": "https://...", // url to return the candidate to when completed Harver
}
}
]
report
→ A link to:matching-results
→ detailed scores on the modulesmatching-indicators
→ detailed info on matching indicators (KMI’s) when configured in the accountScoring & report information
matchingScore
"matchingProfile"
→ label
.matching-indicators
"Included"
→ "type": "matching-indicators"
for each matching indicatorreport
To retrieve a list of the candidates and their applications in a vacancy.
Each candidate has a status. Main statuses:
Endpoint:
GET https://api.harver.com/api/v1.0/vacancies/{vacancyId}/candidates
Header:
Authorization: Bearer {access_token}
Useful filter params:
You can combine params like this: ?filter[status]=new**&**filter[status-updated-at][since]=1582211393
After 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.
If 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.
List of possible filters:
filter[status]
filter[status-updated-at][since]
filter[status-updated-at][until]
filter[locations]
filter[region]
filter[external_location_id]
filter[job_function]
filter[skip_aggregration]
Webhooks 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.
Available events:
We support NoAuth and Basic Auth (username & password) authentication.
Use the Harver Application Id to get all the details of the application
Content-Type should be set to application/x-www-form-urlencoded
To obtain API tokens for any of your client applications, perform a POST operation to the /oauth/token
endpoint with a payload in the following format
This type of authorization is used when applications require access to access their own resources, and is not done on behalf of an user. For instance, an Applicant Tracking System checking whether there are new applicants that have completed their application.
Once you have retrieved an Access Token, it can be used until the token expires or is revoked. To use it, send this token in the Authorization
header when making requests to protected resources.
Authorization: Bearer <token>
curl -X GET \
'https://api.harver.com/api/v1.0/accounts' \
-H 'Authorization: Bearer eyJhbGciOiJIXzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVzZXIiOnsiaWQiOiI1OWVkZDZhNvU4YzNlNDI3MDZjOWY3NjgifX0sImlhdCI6MTUzMzEzNDk5Mn0.otr7V1XMzF78LrB3oLRKUvTCxLqYM1CqKKp7UFDcPK8'
Client ID, Client Secret, Grant Type that should be sent in the request body
client_id required | string Your Client ID, as provided by Harver |
client_secret required | string Your Client Secret, as provided by Harver |
grant_type required | string Value: "client_credentials" Must be set to client_credentials |
{- "user": {
- "id": "string"
}, - "userProfile": "string",
- "accessToken": "string",
- "accessTokenExpiresAt": "2019-08-24T14:15:22Z",
- "client": {
- "secret": "string",
- "userId": "string",
- "roles": [
- "string"
], - "redirectUris": [
- "string"
], - "grants": [
- "password"
], - "id": "string"
}
}
To validate a token, perform a POST operation to the /oauth/authenticate
endpoint with authorization header Bearer <token>
curl -X POST \
'https://api.harver.com/auth/authenticate' \
-H 'Authorization: Bearer eyJhbGciOiJIXzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVzZXIiOnsiaWQiOiI1OWVkZDZhNvU4YzNlNDI3MDZjOWY3NjgifX0sImlhdCI6MTUzMzEzNDk5Mn0.otr7V1XMzF78LrB3oLRKUvTCxLqYM1CqKKp7UFDcPK8'
{- "statusCode": 0,
- "status": 0,
- "code": 0,
- "message": "string",
- "name": "string"
}
{- "data": [
- {
- "attributes": {
- "name": "string",
- "domain": "string"
}, - "relationships": {
- "images": {
- "data": [
- {
- "id": "string",
- "type": "images",
- "meta": {
- "image": "string",
- "type": "string",
- "removable": true
}
}
]
}, - "configurations": {
- "data": {
- "type": "string",
- "attributes": {
- "rejectReasonsEnabled": true,
- "retailFlowEnabled": true,
- "schedulingEnabled": true
}
}
}
}
}
], - "meta": {
- "count": 0
}
}
To obtain the list of candidates in an Account, perform a GET
operation to the /accounts/<account-id>/candidates
endpoint.
Optionally, to limit the scope of the results, you can use the following query parameters:
filter[email]
To fetch one candidate in account 5ab8845731e881343fa7458c
with the email address testuser@harver.com
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/5ab8845731e881343fa7458c/candidates?filter[email]=testuser@harver.com' \
-H 'Authorization: Bearer ...'
accountId required | string ID of the Account to consider |
{- "data": [
- {
- "type": "candidates",
- "id": "string",
- "attributes": {
- "emailAddress": "string",
- "firstName": "string",
- "lastName": "string",
- "address": "string",
- "registeredAt": 0
}
}
]
}
accountId required | string ID of the Account to consider |
candidateId required | string ID of the candidate to consider |
{- "data": [
- {
- "type": "applications",
- "id": "string",
- "attributes": {
- "appliedAt": 0,
- "matchingScore": 100,
- "status": "new"
}, - "relationships": {
- "candidate": {
- "data": {
- "type": "candidates",
- "id": "string"
}
}
}
}
]
}
To obtain the list of Vacancies available for an Account, perform a GET
operation to the /accounts/<account-id>/vacancies
endpoint.
To get the content in a specific language (if available), specify the language in the request header Accept-Language
. More info about Accept-Language and locales. Please note, that multiple languages preferences are not supported, content language will be defined by the first language on the list.
The language of the response content will be specified in the response header Content-Language
. More info about Content-Language.
Optionally, to limit the scope of the results, you can use the following query parameters:
filter[status]
filter[locations]
filter[regions]
filter[external_location_id]
filter[skip_aggregation]
For filtering by locations, regions and external location ID, comma separated values can be used. Ex: ?filter[locations]={ID1},{ID2}
To fetch all vacancies of account 5ab8845731e881343fa7458c
that have vacancies in status draft
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/5ab8845731e881343fa7458c/vacancies?filter[status]=draft' \
-H 'Accept-Language: en' \
-H 'Authorization: Bearer ...'
To fetch all vacancies of account 5ab8845731e881343fa7458c
that have vacancies in status draft
, location ID 5c484fdece609b10529e1e3f
and in language nl
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/5ab8845731e881343fa7458c/vacancies?filter[status]=draft&filter[locations]=5c484fdece609b10529e1e3f' \
-H 'Accept-Language: nl' \
-H 'Authorization: Bearer ...'
filter[skip_aggregation]=true
will skip aggregating candidate count in a vacancy, resulting a faster response
accountId required | string ID of the Account to consider |
object The Vacancy filter to apply |
Accept-Language | string Enum: "en" "nl" "it" "es" "de" Language to localize resource (if not provided, default to en) |
{- "data": [
- {
- "type": "vacancies",
- "id": "string",
- "attributes": {
- "name": "string",
- "title": "string",
- "description": "string",
- "location": "string",
- "createdAt": 0,
- "applicationUrl": "string"
}, - "meta": {
- "candidates-per-status": {
- "new": 0,
- "in-progress": 0,
- "rejected": 0,
- "invited": 0,
- "talent-pool": 0,
- "hired": 0,
- "shortlisted": 0,
- "contract": 0
}
}
}
], - "meta": {
- "count": 0
}, - "relationships": {
- "locations": {
- "data": [
- {
- "type": "locations",
- "id": "string",
- "attributes": {
- "name": "string",
- "externalLocationId": "string",
- "jobFunctions": [
- "string"
]
}
}
]
}, - "regions": {
- "data": [
- {
- "type": "regions",
- "id": "string"
}
]
}
}
}
To obtain the list of Vacancies available for a specific Channel, perform a GET
operation to the /accounts/<account-id>/channels/<channel-id>/vacancies
endpoint.
To get the content in a specific language (if available), specify the language in the request header Accept-Language
. More info about Accept-Language and locales. Please note, that multiple languages preferences are not supported, content language will be defined by the first language on the list.
The language of the response content will be specified in the response header Content-Language
. More info about Content-Language.
Optionally, to limit the scope of the results, you can use the following query parameters:
filter[status]
To fetch all vacancies of an Account in a specific Channel and in language nl
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/{accountId}/channels/{channelName}/vacancies' \
-H 'Accept-Language: nl' \
-H 'Authorization: Bearer ...'
To fetch all open Vacancies of the account 5ab8845731e881343fa7458c
, available for publishing in a specific channel in English (en), you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/5ab8845731e881343fa7458c/channels/{channelName}/vacancies?filter[status]=open' \
-H 'Accept-Language: en' \
-H 'Authorization: Bearer ...'
accountId required | string ID of the Account to consider |
channelId required | string string GUID of the Channel to consider |
object The Vacancy filter to apply |
Accept-Language | string Enum: "en" "nl" "it" "es" "de" Language to localize resource (if not provided, default to en) |
{- "data": [
- {
- "type": "vacancies",
- "id": "string",
- "attributes": {
- "name": "string",
- "title": "string",
- "description": "string",
- "location": "string",
- "createdAt": 0,
- "applicationUrl": "string"
}, - "meta": {
- "candidates-per-status": {
- "new": 0,
- "in-progress": 0,
- "rejected": 0,
- "invited": 0,
- "talent-pool": 0,
- "hired": 0,
- "shortlisted": 0,
- "contract": 0
}, - "customAttributes": {
- "title": "string",
- "description": "string",
- "Region": [
- "string"
], - "Organization": [
- "string"
], - "City": [
- "string"
], - "Location": [
- "string"
], - "Department": [
- "string"
], - "Hours per week": [
- "string"
], - "Contract type": [
- "string"
]
}
}
}
], - "meta": {
- "count": 0
}
}
accountId required | string ID of the Account to consider |
{- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "attributes": {
- "text": "string"
}, - "relationships": {
- "vacancy": {
- "data": {
- "type": "string",
- "id": "string"
}
}
}
}
]
}
Supports pagination with filter[limit] and filter[offset] parameters. When having these two filter parameters related to pagination, an extra object called 'meta' will be included in the body. This will include the count of all the available locations
accountId required | string ID of the Account to consider |
object The location pagination filters to apply |
{- "data": [
- {
- "type": "locations",
- "id": "string",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string"
}, - "email": "string",
- "externalId": "string",
- "hiringChance": 0,
- "walkInTimems": [
- {
- "from": 0,
- "to": 0
}
], - "isActive": true
}, - "relationships": {
- "region": {
- "data": {
- "type": "regions",
- "id": "string"
}
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "status": "open"
}
}
]
}, - "location-specific-questions": {
- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "language": "string",
- "attributes": {
- "question": "string",
- "vacancy": "string"
}
}
]
}
}
}
], - "meta": {
- "count": 0
}
}
Creates a location and send the created location or all the locations in that account
last_insert
: Can be true
or false
. When true
, only the created location is sent. When false
or the query param is not added, all the locations in the account is sent after creating the locationaccountId required | string ID of the Account to consider |
last_insert | string Enum: "true" "false" Whether to send the created location or all the locations in the account. When the value is 'true', only the created location is sent |
Location object to be created
required | object |
{- "data": {
- "type": "locations",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string"
}, - "email": "string",
- "externalId": "string",
- "hiringChance": 0,
- "walkInTimes": [
- {
- "from": 0,
- "to": 0,
- "date": {
- "day": 0,
- "month": 0,
- "year": 0
}
}
], - "isActive": true
}, - "relationships": {
- "region": {
- "data": {
- "type": "regions",
- "id": "string"
}
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "status": "open"
}
}
]
}, - "location-specific-questions": {
- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "language": "string",
- "attributes": {
- "question": "string",
- "vacancy": "string"
}
}
]
}
}
}
}
{- "data": {
- "type": "locations",
- "id": "string",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string"
}, - "email": "string",
- "externalId": "string",
- "hiringChance": 0,
- "walkInTimems": [
- {
- "from": 0,
- "to": 0
}
], - "isActive": true
}, - "relationships": {
- "region": {
- "data": {
- "type": "regions",
- "id": "string"
}
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "status": "open"
}
}
]
}, - "location-specific-questions": {
- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "language": "string",
- "attributes": {
- "question": "string",
- "vacancy": "string"
}
}
]
}
}
}
}
accountId required | string ID of the Account to consider |
locationId required | string ID of the Location to consider |
{- "data": [
- {
- "type": "locations",
- "id": "string",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string"
}, - "email": "string",
- "externalId": "string",
- "hiringChance": 0,
- "walkInTimems": [
- {
- "from": 0,
- "to": 0
}
], - "isActive": true
}, - "relationships": {
- "region": {
- "data": {
- "type": "regions",
- "id": "string"
}
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "status": "open"
}
}
]
}, - "location-specific-questions": {
- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "language": "string",
- "attributes": {
- "question": "string",
- "vacancy": "string"
}
}
]
}
}
}
]
}
accountId required | string ID of the Account to consider |
locationId required | string ID of the Location to consider |
Location object to be updated
required | object |
{- "data": {
- "type": "locations",
- "id": "externalLocationId",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string"
}, - "email": "string",
- "hiringChance": 0,
- "walkInTimes": [
- {
- "from": 0,
- "to": 0,
- "date": {
- "day": 0,
- "month": 0,
- "year": 0
}
}
], - "isActive": true
}, - "relationships": {
- "region": {
- "data": {
- "type": "regions",
- "id": "string"
}
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "status": "open"
}
}
]
}, - "location-specific-questions": {
- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "language": "string",
- "attributes": {
- "question": "string",
- "vacancy": "string"
}
}
]
}
}
}
}
{- "data": [
- {
- "type": "locations",
- "id": "string",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string"
}, - "email": "string",
- "externalId": "string",
- "hiringChance": 0,
- "walkInTimems": [
- {
- "from": 0,
- "to": 0
}
], - "isActive": true
}, - "relationships": {
- "region": {
- "data": {
- "type": "regions",
- "id": "string"
}
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "status": "open"
}
}
]
}, - "location-specific-questions": {
- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "language": "string",
- "attributes": {
- "question": "string",
- "vacancy": "string"
}
}
]
}
}
}
]
}
accountId required | string ID of the Account to consider |
externalLocationId required | string ID of the External Location to consider |
{- "data": [
- {
- "type": "locations",
- "id": "string",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string"
}, - "email": "string",
- "externalId": "string",
- "hiringChance": 0,
- "walkInTimems": [
- {
- "from": 0,
- "to": 0
}
], - "isActive": true
}, - "relationships": {
- "region": {
- "data": {
- "type": "regions",
- "id": "string"
}
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "status": "open"
}
}
]
}, - "location-specific-questions": {
- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "language": "string",
- "attributes": {
- "question": "string",
- "vacancy": "string"
}
}
]
}
}
}
]
}
accountId required | string ID of the Account to consider |
externalLocationId required | string ID of the External Location to consider |
Location object to be updated
required | object |
{- "data": {
- "type": "locations",
- "id": "externalLocationId",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string"
}, - "email": "string",
- "hiringChance": 0,
- "walkInTimes": [
- {
- "from": 0,
- "to": 0,
- "date": {
- "day": 0,
- "month": 0,
- "year": 0
}
}
], - "isActive": true
}, - "relationships": {
- "region": {
- "data": {
- "type": "regions",
- "id": "string"
}
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "status": "open"
}
}
]
}, - "location-specific-questions": {
- "data": [
- {
- "type": "location-specific-questions",
- "id": "string",
- "language": "string",
- "attributes": {
- "question": "string",
- "vacancy": "string"
}
}
]
}
}
}
}
accountId required | string ID of the Account to consider |
Region that needs to be added to the Account
required | object |
{- "data": {
- "type": "regions",
- "attributes": {
- "name": "string"
}
}
}
{- "data": {
- "type": "regions",
- "id": "string",
- "attributes": {
- "name": "string"
}
}
}
accountId required | string ID of the Account to consider |
regionId required | string ID of the Region to consider |
Region that needs to be updated in the Account
required | object |
{- "data": {
- "type": "regions",
- "id": "string",
- "attributes": {
- "name": "string"
}
}
}
{- "data": {
- "type": "regions",
- "id": "string",
- "attributes": {
- "name": "string"
}
}
}
location
region
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/{accountId}/users/{userId}?include=locations,regions' \
-H 'Authorization: Bearer ...'
accountId required | string ID of the Account to consider |
userProfileId required | string ID of userProfile |
{- "data": {
- "type": "account-users",
- "id": "string",
- "attributes": {
- "role": "super-user",
- "candidatesPiiAllowed": true,
- "createdAt": 0
}, - "relationships": {
- "account": {
- "data": {
- "type": "accounts",
- "id": "string"
}
}, - "locations": {
- "data": [
- {
- "type": "locations",
- "id": "string"
}
]
}, - "regions": {
- "data": [
- {
- "type": "regions",
- "id": "string"
}
]
}
}
}, - "included": [
- {
- "type": "regions",
- "id": "string",
- "attributes": {
- "name": "string"
}
}
]
}
accountId required | string ID of the Account to consider |
Job function that needs to be added to the Account
required | object |
{- "data": {
- "type": "job-functions",
- "attributes": {
- "title": "string",
- "description": "string",
- "minAge": 0,
- "image": {
- "key": "string",
- "placeHolder": "string",
- "value": "string"
}
}
}
}
{- "data": {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "title": "string",
- "description": "string",
- "minAge": 0
}
}
}
accountId required | string ID of the Account to consider |
{- "data": [
- {
- "type": "email-templates",
- "id": "string",
- "attributes": {
- "status": "NEW",
- "template": {
- "IT": {
- "content": "string",
- "subject": "string"
}, - "ES": {
- "content": "string",
- "subject": "string"
}, - "DE": {
- "content": "string",
- "subject": "string"
}, - "FR": {
- "content": "string",
- "subject": "string"
}, - "NL": {
- "content": "string",
- "subject": "string"
}, - "ENG": {
- "content": "string",
- "subject": "string"
}
}
}
}
]
}
To obtain the list of Job board vacancies and their locations and job-functions details, perform a GET
operation to the /accounts/<account-id>/jobboard
endpoint.
Optionally, to limit the scope of the results, you can use the following query parameters:
filter[vacancy]
filter[language]
For filtering by language, comma separated values can be used. Ex: ?filter[language]=<language1>,<language2>
To fetch all job board vacancies of account <testAccountId>
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/<testAccountId>/jobboard' \
-H 'Authorization: Bearer ...'
To fetch a specific vacancy of the job board in account <testAccountId>
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/<testAccountId>/jobboard?filter[vacancy]=<testVacancyId>' \
-H 'Authorization: Bearer ...'
To fetch a specific vacancy of the job board in account <testAccountId>
and filter by language ENG
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/<testAccountId>/jobboard?filter[vacancy]=<testVacancyId>&filter[language]=EN' \
-H 'Authorization: Bearer ...'
To fetch a specific vacancy of the job board in account <testAccountId>
and filter by language ENG
and NL
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/accounts/<testAccountId>/jobboard?filter[vacancy]=<testVacancyId>&filter[language]=ENG,NL' \
-H 'Authorization: Bearer ...'
accountId required | string ID of the Account to consider |
object Vacancy and Location filter |
{- "data": [
- {
- "type": "jobboard",
- "id": "string",
- "attributes": {
- "language": "ENG",
- "link": "string",
- "title": "string",
- "description": "string"
}, - "relationships": {
- "location": {
- "data": {
- "type": "locations",
- "id": "string"
}
}, - "jobFunction": {
- "data": {
- "type": "job-functions",
- "id": "string"
}
}, - "vacancy": {
- "data": {
- "type": "vacancies",
- "id": "string"
}
}
}
}
], - "included": [
- {
- "type": "vacancies",
- "id": "string",
- "attributes": {
- "name": "string",
- "address": "string",
- "addressDetails": {
- "country": "string",
- "state": "string",
- "postalCode": "string",
- "city": "string",
- "street": "string",
- "streetNumber": "string",
- "latitude": "string",
- "longitude": "string"
}, - "externalId": "string",
- "title": "string"
}
}
]
}
To create a new application in Harver Platform, perform a POST
operation to the /vacancies/<vacancy-id>/applications
endpoint. The response provides a magic link to complete a candidate journey in Harver Platform. The magic link is generated for a new or an existing applicant.
If the candidate already applied for the vacancy in Harver the magic link for that application will be returned.
vacancyId required | string ID of the Vacancy to consider |
Candidate Application details
required | object |
{- "data": {
- "type": "applications",
- "attributes": {
- "key": "value",
- "property1": null,
- "property2": null
}, - "relationships": {
- "candidate": {
- "data": {
- "type": "candidates",
- "attributes": {
- "emailAddress": "string",
- "firstName": "string",
- "lastName": "string"
}
}
}
}
}
}
{- "data": {
- "magicLink": "string",
- "applicationId": "string"
}
}
To create a new application in Harver Platform, perform a POST
operation to the /vacancies/<vacancy-id>/applications
endpoint. The response provides a magic link to complete a candidate journey in Harver Platform. The magic link is generated for a new or an existing applicant.
If the candidate already applied for the vacancy in Harver the magic link for that application will be returned.
vacancyId required | string ID of the Vacancy to consider |
Candidate Application details
required | object |
{- "data": {
- "type": "applications",
- "attributes": {
- "key": "value",
- "property1": null,
- "property2": null
}, - "relationships": {
- "candidate": {
- "data": {
- "type": "candidates",
- "attributes": {
- "emailAddress": "string",
- "firstName": "string",
- "lastName": "string"
}
}
}
}
}
}
{- "data": {
- "magicLink": "string",
- "applicationId": "string"
}
}
To obtain the list of Candidates and their Applications, perform a GET
operation to the /vacancies/<vacancy-id>/candidates
endpoint.
Optionally, to limit the scope of the results, you can use the following query parameters:
filter[status]
filter[status-updated-at][since]
filter[status-updated-at][until]
filter[locations]
filter[region]
filter[external_location_id]
filter[job_function]
For filtering by locations, regions, external location ID and job function, comma separated values can be used. Ex: ?filter[locations]={ID1},{ID2}
To fetch all candidates of vacancy 5ac774c431e881242fa7164b
that have been in status new
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/vacancies/5ac774c431e881242fa7164b/candidates?filter[status]=new' \
-H 'Authorization: Bearer ...'
To fetch all candidates of vacancy 5ac774c431e881242fa7164b
that have been in status new
since at least April 1st, 2018
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/vacancies/5ac774c431e881242fa7164b/candidates?filter[status]=new&filter[status-updated-at][since]=1522540800' \
-H 'Authorization: Bearer ...'
To fetch all candidates of vacancy 5ac774c431e881242fa7164b
and filter by locations 5c41a7db42dd2c4d3a34cfd2
and 5c484fdece609b10529e1e3f
, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/vacancies/5ac774c431e881242fa7164b/candidates?filter[locations]=5c41a7db42dd2c4d3a34cfd2,5c484fdece609b10529e1e3f' \
-H 'Authorization: Bearer ...'
To 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:
curl -X GET \
'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' \
-H 'Authorization: Bearer ...'
vacancyId required | string ID of the Vacancy to consider |
object The Vacancy filter to apply |
{- "data": [
- {
- "type": "candidates",
- "id": "string",
- "attributes": {
- "emailAddress": "string",
- "fullName": "string",
- "firstName": "string",
- "lastName": "string",
- "language": "string",
- "address": "string",
- "registeredAt": 0
}, - "relationships": {
- "application": {
- "data": {
- "type": "applications",
- "id": "string"
}
}
}
}
], - "included": [
- {
- "type": "applications",
- "id": "string",
- "attributes": {
- "appliedAt": 0,
- "status": "new",
- "matchingScore": 100,
- "statusUpdatedAt": 0,
- "locations": [
- {
- "id": "string",
- "name": "string",
- "regionId": "string",
- "externalLocationId": "string",
- "status": "string"
}
], - "jobFunctions": [
- {
- "id": "string",
- "title": "string"
}
]
}
}
], - "meta": {
- "count": 0,
- "new": 0,
- "in-progress": 0,
- "rejected": 0,
- "invited": 0,
- "talent-pool": 0,
- "hired": 0,
- "shortlisted": 0,
- "contract": 0,
- "ready-for-grading": 0
}
}
vacancyId required | string ID of the Vacancy to consider |
moduleId required | string ID of the Module to consider |
{- "data": {
- "type": "modules",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "settings": {
- "appliedIndicator": "string",
- "dimensionSettings": [
- {
- "id": "string",
- "name": "string",
- "targetScore": 0,
- "isActive": true
}
], - "competencySettings": [
- {
- "id": "string",
- "name": "string",
- "targetScore": 0,
- "isActive": true
}
], - "jobAnalysisSettings": [
- {
- "scaleLeftSide": "string",
- "scaleRightSide": "string"
}
]
}
}
}
}
filter[skip_aggregation]
- Supports true
or false
include
- Supports combination of locations
, regions
and job-functions
as a comma separated single string. Max length 31ex : locations,job-functions
filter[skip_aggregation]=true
will skip aggregating candidate count in a vacancy, resulting a faster response
To get the details of locations assigned to a vacancy, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/vacancies/:vacancyId?include=locations' \
-H 'Authorization: Bearer ...'
To get the details of regions assigned to a vacancy, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/vacancies/:vacancyId?include=regions' \
-H 'Authorization: Bearer ...'
To get the details of job-functions assigned to a vacancy, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/vacancies/:vacancyId?include=job-functions' \
-H 'Authorization: Bearer ...'
vacancyId required | string ID of the Vacancy to consider |
{- "data": {
- "meta": {
- "candidates-per-status": {
- "new": 0,
- "in-progress": 0,
- "rejected": 0,
- "invited": 0,
- "talent-pool": 0,
- "hired": 0,
- "shortlisted": 0,
- "contract": 0,
- "ready-for-grading": 0
}
}, - "relationships": {
- "regions": {
- "data": [
- {
- "type": "regions",
- "id": "string"
}
]
}, - "locations": {
- "data": [
- {
- "type": "locations",
- "id": "string"
}
]
}, - "jobFunctions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string"
}
]
}
}, - "type": "vacancies",
- "id": "string",
- "attributes": {
- "name": "string",
- "title": [ ],
- "description": [ ],
- "location": "string",
- "createdAt": 0,
- "applicationUrl": "string"
}
}, - "included": [
- {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "name": "string",
- "address": "string",
- "email": "string",
- "externalId": "string",
- "region": "string",
- "hiringChance": 0,
- "minHoursAvailability": 0,
- "walkingTimes": [
- {
- "from": 0,
- "to": 0
}
], - "assignedLocation": "string"
}
}
]
}
!!! IMPORTANT - This endpoint is will be removed soon. Please use Updates attached locations of a vacancy
endpoint
This endpoint updates the locations of a vacancy. It supports two options configs 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 skips 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 replaces by the new locations. Else will add the new locations to the previous locations.vacancyId required | string ID of the Vacancy to consider |
The Vacancy status to update
object |
{- "attributes": {
- "locations": [
- "621f456062c05d000825b694",
- "621f456062c05d000825b695",
- "621f456062c05d000825b696"
], - "switchToLocations": false,
- "replaceLocations": false
}
}
{- "data": {
- "message": "Vacancy locations updated successfully"
}
}
This endpoint updates the attached locations of a vacancy. It supports two configs to manipulate location update.
forceOperation
- This option accepts boolean value true
or false
.
If set to true
, it will attach sent locations to the job vacancy, EVEN IF there are already regions attached to it.
If set to false
, will verify if the job vacancy already has regions attached. If regions are already attached, an error response is sent.
replaceValues
- This option accepts boolean value true
or false
.
If set to true
, the new locations will completely replace any existing ones in the vacancy.
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.
vacancyId required | string ID of the Vacancy to consider |
The Vacancy status to update
object |
{- "attributes": {
- "locations": [
- "621f456062c05d000825b694",
- "621f456062c05d000825b695",
- "621f456062c05d000825b696"
], - "forceOperation": false,
- "replaceValues": false
}
}
{- "data": {
- "message": "Vacancy locations updated successfully"
}
}
This endpoint updates the attached regions of a vacancy. It supports two configs to manipulate regions update.
forceOperation
- This option accepts boolean value true
or false
.
If set to true
, it will attach sent regions to the job vacancy, EVEN IF there are already locations attached to it.
If set to false
, will verify if the job vacancy already has locations attached. If locations are already associated, an error response is sent.
replaceValues
- This option accepts boolean value true
or false
.
If set to true
, the new regions will completely replace any existing ones in the vacancy.
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.
vacancyId required | string ID of the Vacancy to consider |
The Vacancy status to update
object |
{- "attributes": {
- "regions": [
- "621f456062c05d000825b694",
- "621f456062c05d000825b695",
- "621f456062c05d000825b696"
], - "forceOperation": false,
- "replaceValues": false
}
}
{- "data": {
- "message": "Vacancy regions updated successfully"
}
}
Get harver application ids based on ats-parameters or search by vacancy and email.
To improve the search of applications using atsParameters, the endpoint has been limited to search applications using standardized parameters only. Bellow is the list of standardized parameters.
Apart from these, harver provides another 5 customizable standard atsParameters. So the client can do a custom mapping from the client's side and use these standard atsParameters for an application search.
To search an application based on atsCandidateId, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/applications?accountId=:accountId&filter[atsParameters][atsCandidateId]=123456789&filter[atsParameters][atdVacancyId]=56254122' \
-H 'Authorization: Bearer ...'
To search an application based on vacancy and email, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/applications?accountId=:accountId&filter[applicationMeta][vacancy]=123456789&filter[applicationMeta][email]=email@test.com' \
-H 'Authorization: Bearer ...'
accountId required | string The account to look for |
filter required | string Enum: "atsParameters[candidateId]" "atsParameters[srcId]" "atsParameters[vacancyId]" "applicationMeta[vacancy]" "applicationMeta[email]" The filter to apply |
{- "data": [
- {
- "type": "string",
- "id": "string",
- "vacancyId": "string"
}
]
}
Avoid using all the include
criteria, unless all modules are enabled in your account. Use include
criteria for the modules activated in your account.
To retrieve an Application's relationship data (such as a PDF report, submitted resume etc.), you can make a basic GET applications/{applicationId}
, while also providing the include
parameter. This parameter represents 'a list of comma-separated includes', which are to be included in the response.
vacancy
report
cover-letter
resume
profile-photo
matching-results
video-pitches
video-interviews
personal-info
additional-info
grading
ats
open-questions
consents
application-locations
locations
availability
job-functions
diagnostics
location-specific-question
custom-document
virtual-interviews
matching-indicators
geolocation
account-questions
personal-information
sessions
fraud-flags
Accept-Language
. Please note, that multiple languages preferences are not supported. The language of the response content will be specified in the response header Content-Language
.questions
field as an array of questions, where each question has the following attributes:questionId(string)
question(string)
answer(mixed)
answerType(string)
For Retail Flow accounts, the personal-info include's module type will be Vacancy Questions
personal-information
. Schema example is added in the response samples.To fetch an application with the ID 5bd17c67c081252955b19659
and include matching-results
and ats
information in the response, you would call the following endpoint:
curl -X GET \
'https://api.harver.com/api/v1.0/applications/5bd17c67c081252955b19659?include=matching-results,ats' \
-H 'Authorization: Bearer ...'
open-questions
include will be deprecated, please use open-question
instead.applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
include | string Enum: "vacancy" "report" "cover-letter" "resume" "profile-photo" "matching-results" "video-pitches" "video-interviews" "personal-info" "additional-info" "grading" "ats" "open-questions" "consents" "application-locations" "locations" "availability" "job-functions" "diagnostics" "location-specific-question" "custom-document" "virtual-interviews" "matching-indicators" "geolocation" "account-questions" "personal-information" The include to apply for relationship data. Use comma separated values for include |
{- "data": {
- "type": "applications",
- "id": "string",
- "attributes": {
- "appliedAt": 0,
- "completedAt": 0,
- "status": "string",
- "progress": {
- "all": 0,
- "completed": 0
}, - "matchingScore": 100,
- "language": "ENG",
- "matchingProfile": {
- "bracketId": "good",
- "label": "Good Fit"
}, - "isRejectedByHardQuestion": true
}, - "relationships": {
- "candidate": {
- "data": {
- "id": "string",
- "type": "candidates",
- "email": "string",
- "attributes": {
- "firstName": "string",
- "lastName": "string",
- "email": "string"
}
}
}, - "vacancy": {
- "data": {
- "type": "vacancies",
- "id": "string"
}
}, - "report": {
- "data": {
- "type": "reports",
- "id": "string"
}
}, - "fact-sheets": {
- "data": {
- "type": "fact-sheets",
- "id": "string"
}
}, - "candidate-detail-page": {
- "data": {
- "type": "candidate-detail-page",
- "id": "string"
}
}, - "cover-letter": {
- "data": {
- "type": "cover-letters",
- "id": "string"
}
}, - "resume": {
- "data": {
- "type": "resumes",
- "id": "string"
}
}, - "profile-photo": {
- "data": {
- "type": "profile-photos",
- "id": "string"
}
}, - "custom-document": {
- "data": {
- "type": "custom-documents",
- "id": "string"
}
}, - "additional-info": {
- "data": {
- "type": "additional-info",
- "id": "string"
}
}, - "personal-info": {
- "data": {
- "type": "personal-info",
- "id": "string"
}
}, - "video-interviews": {
- "data": [
- {
- "type": "video-interviews",
- "id": "string"
}
]
}, - "video-pitches": {
- "data": [
- {
- "type": "video-pitches",
- "id": "string"
}
]
}, - "matching-results": {
- "data": [
- {
- "type": "matching-results",
- "id": "string"
}
]
}, - "job-functions": {
- "data": [
- {
- "type": "job-functions",
- "id": "string"
}
]
}, - "locations": {
- "data": [
- {
- "type": "locations",
- "id": "string"
}
]
}, - "consents": {
- "data": [
- {
- "type": "consents",
- "id": "string"
}
]
}, - "open-question": {
- "data": [
- {
- "type": "open-question",
- "id": "string"
}
]
}, - "system-diagnostics": {
- "data": {
- "type": "system-diagnostics",
- "id": "string"
}
}, - "application-locations": {
- "data": [
- {
- "type": "application-locations",
- "id": "string"
}
]
}, - "location-specific-question": {
- "data": [
- {
- "type": "location-specific-question",
- "id": "string"
}
]
}, - "availability": {
- "data": {
- "type": "availability",
- "id": "string"
}
}, - "virtual-interviews": {
- "data": [
- {
- "type": "virtual-interviews",
- "id": "string"
}
]
}, - "matching-indicators": {
- "data": [
- {
- "type": "matching-indicators",
- "id": "string"
}
]
}, - "account-questions": {
- "data": {
- "type": "account-questions",
- "id": "string"
}
}, - "personal-information": {
- "data": {
- "type": "personal-information",
- "id": "string"
}
}
}
}, - "included": [
- {
- "type": "vacancies",
- "id": "string",
- "attributes": {
- "name": "string",
- "location": "string"
}
}, - {
- "type": "reports",
- "id": "string",
- "attributes": {
- "expiresAt": 0,
- "url": "string"
}
}, - {
- "type": "fact-sheets",
- "id": "string",
- "attributes": {
- "expiresAt": 0,
- "url": "string"
}
}, - {
- "type": "candidate-detail-page",
- "id": "string",
- "attributes": {
- "url": "string"
}
}, - {
- "type": "matching-results",
- "id": "string",
- "meta": null,
- "relationships": {
- "modules": {
- "data": {
- "type": "modules",
- "id": "string"
}
}
}, - "attributes": {
- "moduleType": "string",
- "language": "string",
- "calculatedAt": 0,
- "moduleScore": 100,
- "moduleWeight": 1,
- "status": "pass"
}
}, - {
- "type": "personal-info",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "questions": [
- {
- "questionId": "string",
- "question": "string",
- "answer": "string",
- "answerType": null,
- "showStoppertype": "string",
- "isFalseAnswer": true
}
]
}
}, - {
- "type": "ats-parameters",
- "attributes": {
- "vacancy_id": "string",
- "candidate_id": "string",
- "application_id": "string",
- "src_id": "string"
}
}, - {
- "type": "open-questions",
- "attributes": {
- "id": {
- "_id": "string",
- "__t": "string",
- "images": [
- {
- "_id": "string",
- "key": "string",
- "value": "string",
- "placeHolder": "string",
- "fileName": "string",
- "__v": "string",
- "isRemovable": true
}
]
}, - "answers": [
- {
- "answer": "string",
- "question": "string"
}
]
}
}, - {
- "type": "open-question",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "question": "string",
- "answer": "string",
- "images": [
- {
- "value": "string",
- "placeHolder": "string",
- "key": "string",
- "fileName": "string"
}
]
}
}, - {
- "type": "consents",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "text": "string",
- "consent": true
}
}, - {
- "type": "grading",
- "attributes": {
- "grading_status": "string",
- "grading_notes": "string",
- "grader_name": "string",
- "grader_email": "string"
}
}, - {
- "type": "application-locations",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "name": "string",
- "status": "string",
- "isPreferred": true,
- "location-specific-questions": {
- "ENG": [
- {
- "vacancy": "string",
- "question": "string",
- "_id": "string"
}
]
}
}
}, - {
- "type": "availability",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "selectedHoursPerWeek": {
- "selected": true,
- "hours": {
- "overflow": true,
- "value": 0
}
}, - "selectedDaysPerWeek": {
- "selected": true,
- "days": [
- {
- "name": "string",
- "timeslots": [
- {
- "name": "string"
}
]
}
]
}
}
}, - {
- "type": "locations",
- "id": "string",
- "attributes": {
- "name": "string",
- "externalId": "string"
}
}, - {
- "type": "job-functions",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "title": "string"
}
}, - {
- "type": "system-diagnostics",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "finalStatus": "pass",
- "statusDescription": "string",
- "metaResults": [
- {
- "platform": "pass",
- "processor": "pass",
- "browser": "pass",
- "ram": "pass",
- "freeSpace": "pass",
- "machineType": "pass",
- "downloadSpeed": "pass",
- "uploadSpeed": "pass",
- "latency": "pass",
- "connectionType": "pass"
}
]
}
}, - {
- "type": "location-specific-question",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "question": "string",
- "answerType": "string",
- "answer": "string",
- "locationName": "string"
}
}, - {
- "type": "virtual-interviews",
- "id": "string",
- "attributes": {
- "moduleType": "Virtual Interviews",
- "questions": [
- {
- "question": "string",
- "questionUrl": "string",
- "answerUrl": "string",
- "answerToken": "string",
- "isAnswerSkipped": true
}
]
}
}, - {
- "type": "matching-indicators",
- "id": "string",
- "attributes": {
- "name": "string",
- "score": "string",
- "bracketId": "string",
- "externalId": "string",
- "fail": true,
- "label": "string",
- "brackets": [
- {
- "bracketId": "string",
- "cutoff": true,
- "name": "string",
- "treshold": 0
}
]
}
}, - {
- "type": "geolocation",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "sessions": [
- {
- "timestamp": 0,
- "ipAddress": "string"
}
]
}
}, - {
- "type": "account-questions",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "questions": [
- {
- "key": "string",
- "questionId": "string",
- "question": "string",
- "answerIds": [ ],
- "answer": "string",
- "answerType": "string"
}
]
}
}, - {
- "type": "personal-information",
- "id": "string",
- "attributes": {
- "moduleType": "string",
- "questions": [
- {
- "key": "string",
- "questionId": "string",
- "question": "string",
- "answerIds": [ ],
- "answers": [ ],
- "answerType": "string"
}
]
}
}, - {
- "type": "sessions",
- "attributes": {
- "candidateSessions": [
- {
- "eventId": "string",
- "ip": "string",
- "timestamp": "string",
- "device": {
- "type": "string",
- "model": "string",
- "vendor": "string"
}, - "os": {
- "name": "string",
- "version": "string"
}, - "browser": {
- "name": "string",
- "version": "string"
}, - "sessionLocation": {
- "city": "string",
- "country": "string",
- "continent": "string",
- "coordinates": {
- "latitude": "string",
- "longitude": "string",
- "accuracyRadius": "string"
}
}, - "anonymizerTypes": {
- "isAnonymous": true,
- "isAnonymousVpn": true,
- "isHostingProvider": true,
- "isPublicProxy": true,
- "isResidentialProxy": true,
- "isTorExitNode": true
}
}
]
}
}, - {
- "type": "fraud-flags",
- "attributes": {
- "fraudDetectionSessions": {
- "vpnLocation": {
- "vpnFlag": "string",
- "location": { }
}, - "reapplyFlag": {
- "flagged": true,
- "applications": [
- {
- "id": "string",
- "completedAt": "string"
}
]
}
}
}
}
]
}
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
The Application status to update
object |
{- "attributes": {
- "status": "new",
- "message": {
- "ENG": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "NL": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "FR": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "DE": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "ES": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "IT": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "en-GB": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "pt-PT": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "sv-SE": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "da-DK": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "nb-NO": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "replyToMail": "string",
- "ccMailsList": [
- "string"
]
}, - "rejectionReasonData": {
- "reason": "string",
- "note": "string"
}
}
}
To delete an application, the requesting user should have access to the account and the vacancy which the application resides. Also the user should be an admin in the account to delete the application
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
{- "data": {
- "applicationId": "A mongo id",
- "message": "Application has been deleted"
}
}
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
{- "data": [
- {
- "type": "notes",
- "id": "string",
- "attributes": {
- "body": "string",
- "author": "string",
- "createdAt": 0,
- "modifiedAt": 0,
- "rejectionReason": "string",
- "rejectedFor": "string",
- "rejectingUser": "string",
- "rejectedLocation": "string"
}
}
]
}
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
Note that needs to be added to the Application
required | object |
{- "data": {
- "type": "notes",
- "attributes": {
- "body": "string",
- "author": "string"
}
}
}
Endpoint to update the 'ATS Parameters' for a candidate application
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
Ats parameters that needs to be updated in the candidate application
object |
{- "data": {
- "type": "ats-parameters",
- "id": "string",
- "attributes": {
- "key": "value",
- "property1": null,
- "property2": null
}
}
}
Endpoint to add locations to a candidate application
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
Location IDs that need to be added to the candidate application
object |
{- "data": {
- "type": "application-locations",
- "id": "<applicationId>",
- "attributes": {
- "locations": [
- "<locationId>",
- "<locationId>"
]
}
}
}
Endpoint to update the 'status' per external location for a candidate application
When changing the status to 'HIRED', the job function ID can be sent in the request body (optional attribute).
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
externalLocationId required | string ID of the External Location to consider |
Application status (per external location) that needs to be updated in the candidate application
object |
{- "data": {
- "type": "application-externalLocations",
- "id": "<externalLocationId>",
- "attributes": {
- "status": "NEW",
- "message": {
- "ENG": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "NL": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "FR": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "DE": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "ES": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "IT": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "en-GB": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "pt-PT": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "sv-SE": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "da-DK": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "nb-NO": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "replyToMail": "string",
- "ccMailsList": [
- "string"
]
}, - "hiredJobFunctionId": "string",
- "rejectionReasonData": {
- "reason": "string",
- "note": "string"
}
}
}
}
Endpoint to update the 'status' per location for a candidate application
When changing the status to 'HIRED', the job function ID can be sent in the request body (optional attribute).
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
locationId required | string ID of the Location to consider |
Application status (per location) that needs to be updated in the candidate application
object |
{- "data": {
- "type": "application-locations",
- "id": "<locationId>",
- "attributes": {
- "status": "NEW",
- "message": {
- "ENG": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "NL": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "FR": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "DE": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "ES": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "IT": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "en-GB": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "pt-PT": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "sv-SE": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "da-DK": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "nb-NO": {
- "mailTitle": "string",
- "mailBody": "string"
}, - "replyToMail": "string",
- "ccMailsList": [
- "string"
]
}, - "hiredJobFunctionId": "string",
- "rejectionReasonData": {
- "reason": "string",
- "note": "string"
}
}
}
}
This endpoint checks whether a candidate is eligible for re-applying. If a candidate is not found 404 is returned
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
{- "data": {
- "canReapply": true
}
}
This endpoint returns a link to access development report. Development report can be searched with either matchingIndicatorId
OR url-encoded matchingIndicatorName
along with the applicationId
applicationId required | string ID of the Application to consider ([0-9a-f]{24}) |
matchingIndicatorId | string The matching indicator id ([0-9a-f]{24}) |
matchingIndicatorName | string The matching indicator name. This should be url-encoded |
{- "data": {
- "id": "string",
- "type": "users",
- "attributes": {
- "firstName": "string",
- "lastName": "string",
- "address": "string",
- "phoneNumber": "string",
- "profilePicture": "string",
- "registeredAt": 0,
- "lastUpdatedAt": 0
}
}
}
Device details and the push notification status
Array of objects |
{- "data": [
- {
- "type": "notified-device",
- "attributes": {
- "deviceId": "string",
- "enabled": true,
- "platform": "fcm"
}
}
]
}
accountId required | string ID of the Account to consider |
Interview details that needs to be added for scheduling an interview
required | object |
{- "data": {
- "type": "scheduling",
- "attributes": {
- "interviewerIds": [
- "string"
], - "requiredNumberOfInterviewers": "string",
- "interviewDuration": 0,
- "interviewWithinDays": 0,
- "timezoneId": "string"
}
}
}
{- "data": {
- "type": "scheduling",
- "attributes": {
- "noOfAvailableSlots": 0,
- "schedulingLink": "string"
}
}
}
accountId required | string ID of the Account to consider |
candidateId required | string ID of the Candidate to consider |
{- "data": {
- "type": "interview-details",
- "id": "string",
- "attributes": {
- "candidateId": "string",
- "scheduleId": "string",
- "scheduledBy": "string",
- "schedulingLink": "string",
- "interviewers": [
- "string"
], - "interviewerIds": [
- "string"
], - "requiredNumberOfInterviewers": "string",
- "interviewDuration": 0,
- "interviewWithinDays": 0,
- "timezoneId": "string",
- "location": "string",
- "status": "string",
- "createdAt": "string",
- "startTime": "string",
- "endTime": "string"
}
}
}
Harver dev team can configure the webhooks for you
Available events
{- "triggeredAt": 123238983298,
- "event": "ApplicationStarted",
- "data": {
- "type": "applications",
- "id": "60dedb8d4bb3ca0009ff9dcd",
- "attributes": {
- "status": "in-progress"
}
}, - "relationships": {
- "account": {
- "data": {
- "type": "account",
- "id": "60ca01c2d70c100006122053"
}
}
}
}