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 or companyJobCode) 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