Create Apply Connect Jobs
As part of LinkedIn's Apply Connect offering, the SimpleJobPostings API is used to create a new job posting. This API also allows the client to enable onsite application collection via webhook based mechanism.
Note
When a customer’s first job is sent via the SJP API, all that customer’s open public jobs should be sent via API. All future public jobs should also be sent via API. Post Apply Connect GA, customers (who have opted in for Apply Connect) should leverage only SimpleJobPosting API based ingestion method and should continue to do so until and after LinkedIn & Partner mutually agree to stop processing jobs through other job ingestion mechanisms like XML feeds and career site scraping (potentially 3 months after GA). Partner should enforce this by always invoking SimpleJobPosting API for publishing customer’s open and public jobs on LinkedIn job board.
About Recruiter System Connect or Premium Job Posting
If you have a Recruiter System Connect or Premium Job Posting integration with us, you are already using this API for syncing Jobs to LinkedIn. However, you need to provide additional fields for Apply Connect jobs as described in the sections below. This is because LinkedIn hosts the application experience for Apply Connect jobs on its own platform and delivers the applications to its partners as opposed to PJP jobs or RSC jobs (which may or may not even be posted on LinkedIn).
Requirements
- If you have an Apply Connect integration, please continue to maintain XML Feeds
- Ensure job Ids (
externalJobPostingId
orcompanyJobCode
) match across XML feed / career sites and API jobs. - Ensure data parity for jobs, syncing all available data on external career sites / XML feeds.
- Once one job is sent via API, all open, public jobs must be sent via API.
Note
- LinkedIn will inform you once all customers are migrated to API and when to disable the XML Feeds (typically around 3 months after GA).
Job Posting Field Schema
In order to publish an onsite enabled job, you need to construct the request body with all required fields for Simple Job Posting schema. Additional fields are required for onsite enabled jobs. To know more, refer to Onsite Apply Schema.
This API utilizes the onsiteApplyConfiguration field that you can use to specify the questions that need to be answered to complete the job application and host the application experience entirely on LinkedIn. In addition to the questions, you should specify a webhook URL against field jobApplicationWebhookUrl
where LinkedIn will POST
job applications.
Type | Field | Value |
---|---|---|
Basic Jobs | availability |
PUBLIC for Apply Connect enabled jobs |
Caution
If the integrationContext
field is unavailable for a given customer, companyPageURL
field should be provided in the payload.
API Endpoint
POST https://api.linkedin.com/v2/simpleJobPostings
Sample Request
Authorization: Bearer {access_token}
x-restli-method: batch_create
Sample Request Body
{
"elements": [
{
"externalJobPostingId": "external-job-id-0001",
"title": "Test Job",
"description": "Lorem Ipsum is simply. . .",
"integrationContext": "urn:li:organization:1234",
"listedAt": 1558045934000,
"jobPostingOperationType":"CREATE",
"location": "Enterprise, UT",
"availability": "PUBLIC",
"industries": [
"urn:li:industry:3"
],
"categories": [
"advr"
],
"trackingPixelUrl": "http://localhost:5000/jobs/tracking",
"companyApplyUrl": "http://localhost:5000",
"posterEmail": "test@email.com",
"onsiteApplyConfiguration": {
"jobApplicationWebhookUrl": "https://customer-webhook.com/api/webhook",
"questions": {
"voluntarySelfIdentificationQuestions": {},
"educationQuestions": {
"educationExperienceQuestionSet": {}
},
"workQuestions": {
"workExperienceQuestionSet": {}
},
"additionalQuestions": {
"customQuestionSets": [
{
"repeatLimit": 1,
"questions": [
{
"required": true,
"partnerQuestionIdentifier": "question1",
"questionText": "Please choose the right answer",
"questionDetails": {
"multipleChoiceQuestionDetails": {
"choices": [
{
"symbolicName": "wrong",
"displayValue": "This is the wrong answer"
},
{
"symbolicName": "right",
"displayValue": "This is the correct answer"
},
{
"symbolicName": "right2",
"displayValue": "This is also the correct answer"
}
],
"selectMultiple": false,
"defaultValueSymbolicName": "right",
"preferredFormComponent": "DROPDOWN",
"favorableMultipleChoiceAnswer": {
"favorableSymbolicNames": [
"right",
"right2"
]
}
}
}
}
]
}
]
}
}
}
}
]
}
Note
The questionText
field supports the following formats:
- Unordered list
<ui>
- List item
<li>
- Bold
<b>
- Italic
<i>
- Links
<a>
- Paragraph
<p>
Sample Response Body
A successful request will return a 200 OK
response code, and you will find the simpleJobPostingTask
in the response body.
Since Job Postings API is asynchronous, you can refer to Check Job Operation Task Status for task status.
Sample Response for Success
{
"elements": [
{
"location": "/simpleJobPostings/urn%3Ali%3AsimpleJobPostingTask%3A413d-954e-9b3ed6af71ba",
"status": 202,
"id": "urn:li:simpleJobPostingTask:c9f5-413d-954e-9b3ed6af71ba"
}
]
}
Apply Connect Jobs Lifecycle
Listed below are the four job posting operations supported by LinkedIn:
- CREATE
- CLOSE
- UPDATE
- RENEW
For all the above operations, value for jobPostingOperationType
field in API schema determines the operation to be performed. In order to update a job posting you can re-post the job with jobPostingOperationType
as UPDATE
. You can also re-post the job with jobPostingOperationType
as RENEW
to extend its life by 30 days. To close a job, re-post the job with jobPostingOperationType
as CLOSE
.
Sample Response for Error
{
"elements": [
{
"error": {
"message": "ERROR :: /onsiteApplyConfiguration/questions/additionalQuestions/customQuestionSets/0/questions/0/partnerQuestionIdentifier :: field is required but not found and has no default value\n",
"status": 422
},
"status": 422
}
]
}
HTTP Status Codes and Errors
LinkedIn provides standard HTTP status codes and clear messages to help you easily understand errors.
HTTP CODE | RESPONSE STATUS | ERROR MESSAGE | DESCRIPTION |
---|---|---|---|
400 | 400 | ERROR_INVALID_LISTED_AT_FIELD | The listedAt field with value: 1234567894000 for the job cannot be a future time. An epoch time for future is provided in the listedAt field |
401 | 401 | Invalid access token | Access token is tampered |
401 | 401 | The token used in the request has expired | The access token used in Authorization header is a valid token but it has expired |
403 | 403 | Caller is not authorized to access the jobs for contract: urn:li:contract:{contract_id} | The application used for posting premium job does not belong to the Job posting contract |
403 | 403 | Not enough permissions to access: POST /simpleJobPostings | The application does not have enough permissions to use /simpleJobPostings API |
422 | 1100 | Required one non-null optional field in /questionDetails |
questionDetails in SimpleTalentQuestionDefinition should have exactly one field. For example, if dateQuestionDetails is present then other fields should not be present |
422 | 1101 | PrerequisiteQuestion cannot depend on the response of another PrerequisiteQuestion |
Prerequisite question in prerequisiteQuestionResponse can not be a dependent question. For example, with two questions, Q1 and Q2, if Q2 has Q1 as its prerequisiteQuestionResponse then Q1 should have a null prerequisiteQuestionResponse |
422 | 1102 | PrerequisiteQuestion must be present within the same customQuestions set/array |
Prerequisite question in prerequisiteQuestionResponse should be defined within the same customQuestions array |
422 | 1103 | Repeatable questions cannot have PrerequisiteQuestion |
If any of the question types in SimpleTalentQuestions has repeatLimit > 1 then all of the questions in it must have a null prerequisiteQuestionResponse |
When Apply Connect task status is FAILED, then errorCode
and errorMessage
are also present in the response.
TASK STATUS | ERROR CODE | ERROR MESSAGE | DESCRIPTION |
---|---|---|---|
Failed | 150 | LinkedIn Apply update failed | This error occurs due to some issue on LinkedIn and no action is required from the customer side |
Failed | 1151 | Unable to process questions | This error occurs due to issues with question transformation/validation or due to duplicate question identifiers. Partners are advised to re-validate the question payload. |
Failed | 1152 | No parent developer application found | This error occurs when the developer application used in job posting does not have a parent developer application in our system |
Failed | 1153 | Unable to register jobApplicationWebhookUrl | This error occurs when the job application webhook url is not successfully registered for sending the job applications to the partners |
Continue Apply Connect Development
- Check Job Posting Status module.