Easy Apply Integration
Important
We are upgrading the Easy Apply integration to Apply Connect, and therefore we are not accepting any new partnerships for Easy Apply.
Note
- The use of these APIs is restricted to those developers approved by LinkedIn. Please reach out to your LinkedIn Relationship Manager or Business Development contact as you will need to meet certain criteria and sign an API agreement with data restrictions in order to use this integration.
- If you are not yet a LinkedIn Talent Solutions Partner, please complete the LinkedIn Talent Solutions Partner Request Form.
Easy Apply enables you, the job poster, to retrieve applicants that applied to your jobs on LinkedIn. This integration benefits both the job poster and the applicant: the job poster collects applicants on LinkedIn instead of routing applicants off of LinkedIn to apply, resulting in higher conversation rate of applicants, and applicants enjoy a seamless, mobile-friendly application experience on LinkedIn with no redirecting to third-party websites.
Authorized applications may access the below APIs to retrieve job applications for premium jobs that collect applicants on LinkedIn. Retrieving job applications is a multi-step process involving the below API calls, which your app will periodically invoke on a scheduled basis. Runs should be at least 1 hour apart.
Getting Started
It is recommended to create two applications : one for development and one for production.
Please contact the member from LinkedIn Business Development who you have been working with and request to fill out the Partner Onboarding Form.
Once your app is configured, you may make API calls as described below. These requests return paged results; details on paging through results can be found here.
Retrieve Access Token
Authorization for the three requests below all require access tokens obtained via the OAuth 2 Client Credentials flow .
Be sure to follow the steps outlined in the above link:
- Generating an Access Token
- Making API Requests
After retrieving an access token, you can make authenticated requests for jobPostings, jobApplications, and applicant resumes by adding the access token to the header of your request. Remember, access tokens live for 30 minutes.
Retrieve Job Postings
Before retrieving jobs, ensure you have jobs posted to LinkedIn Job Slots that collects applicants on LinkedIn, as opposed to routing applicants off of LinkedIn to apply. Additionally, ensure that all jobs posted to LinkedIn include a companyJobCode
, as you will using this value to map your unique job posting IDs to unique LinkedIn job IDs. Be sure to communicate your job posting method (below) to your Partner Engineering contact, as they will have guidance around how and when to update your job posting method for Easy Apply. Job Posting methods:
- Job Wrapping - Jobs posted to LinkedIn via Job Wrapping will have a reference Job ID (Company Job Code) that you will need for mapping your job to a LinkedIn job.
- Job Distribution - Let your third-party job distributor know that you want them to remove the Apply URL when they post jobs to LinkedIn. You will also need to ensure you receive the reference Job ID / ATS Job ID passed to LinkedIn via the job distributor, as this value allows you to correctly map your Job to the corresponding Job on LinkedIn.
- Manual Job Posting - Collect applicants on LinkedIn instead of routing them off of LinkedIn to apply. As stated above, be sure to include a
companyJobCode
with each job posting as this value allows you to uniquely identify the job in your system and map your Job ID to the LinkedIn Job ID. Please reference our Help page for more information on manually posting jobs on LinkedIn.
Each job must be associated with your LinkedIn Recruiter contractId
(or ids). For each contract, call the following endpoint to get the list of jobPosting ids and the corresponding companyJobCode
. Remember, the below request requires a live access token obtained via the OAuth 2 Client Credentials flow .
Note: the ID returned in this call refers to the LinkedIn Job ID, which is referenced in the jobApplications API calls as a jobPosting URN (e.g. urn:li:jobPosting:123456789).
GET https://api.linkedin.com/v2/jobPostings?q=attributes&contract={Contract URN}
Query parameters
Field | Description | Format | Required | Notes |
---|---|---|---|---|
contract | LinkedIn Recruiter Contract that contains the Job Postings | contract URN in format contract=urn:li:contract:{id} | Yes | Multiple not allowed |
jobStates | Status of the job posting | jobStates=LISTED | No | |
listedAfter | Lower inclusive boundary date | Epoch in milliseconds (UTC) | No |
sample request
GET https://api.linkedin.com/v2/jobPostings?q=attributes&contract=urn:li:contract:123456789&jobStates=LISTED&listedAfter=1489422164000&start=0&count=50
sample JSON response
{
"elements": [
{
"companyJobCode": "ATS_Job_ID_123",
"companyName": "TestCompany",
"countryCode": "us",
"id": 1234,
"jobState": "LISTED",
"listDate": 1484786812000,
"locationDescription": "San Francisco, California",
"postalCode": "12345",
"title": "Test Engineer I"
},
{
"companyJobCode": "ATS_Job_ID_456",
"companyName": "TestCompany",
"countryCode": "us",
"id": 56789,
"jobState": "LISTED",
"listDate": 1484690756000,
"locationDescription": "San Francisco, California",
"postalCode": "12345",
"title": "Test Engineer II"
}
],
"paging": {
"count": 10,
"links": [],
"start": 0,
"total": 2
}
}
Retrieve Job Applications
For each job posting id
returned across all contracts, call the following endpoint to get the list of jobApplications
since the last run. Please note that:
- The endpoint currently accepts no more than 50
jobPostingId
parameters at a time. - You may retrieve job applications in intervals of up to 30 days at a time.
- Dates are expressed in epoch milliseconds.
- Reference table for Country Code
- The
vanityName
value returned can be plugged into www.linkedin.com/in/{vanityName} in order to construct the applicants LinkedIn profile URL
Remember, the below request requires a live access token obtained via the OAuth 2 Client Credentials flow.
GET https://api.linkedin.com/v2/jobApplications?q=jobPostings&jobPostings={jobPosting URN}
Query parameters
Field | Description | Format | Required | Notes |
---|---|---|---|---|
jobPostings | LinkedIn Job IDs to fetch applications for | jobPostings URN in format jobPostings=urn:li:jobPosting:{id} | Yes | Multiple allowed |
appliedAfterDate | Lower date boundary | Epoch in milliseconds (UTC) | No | Required if appliedUntilDate is supplied |
appliedUntilDate | Upper date boundary | Epoch in milliseconds (UTC) | No | Required if appliedAfterDate is supplied |
sample request
GET https://api.linkedin.com/v2/jobApplications?q=jobPostings&appliedAfterDate=1484090688000&appliedUntilDate=1484095008000&jobPostings=urn:li:jobPosting:1234&jobPostings=urn:li:jobPosting:56789&projection=(elements*(member~(id,firstName,lastName,maidenName,localizedFirstName,localizedLastName,phoneticFirstName,phoneticLastName,localizedPhoneticFirstName,localizedPhoneticLastName,headline,location,industryName,summary,specialties,positions,languages,certifications,educations,honors,skills,websites,vanityName),contactEmail,contactPhoneNumber,jobPosting,id,source,applyDate,resume),paging)
sample JSON response
{
"elements": [
{
"applyDate": 1484090688000,
"contactEmail": "test@linkedin.com",
"contactPhoneNumber": {
"number": "1234567890"
},
"id": 1667759774,
"jobPosting": "urn:li:jobPosting:123456789",
"member": "urn:li:person:5abc_dEfgH",
"member~": {
"certifications": {
"1647667610": {
"authority": {
"localized": {
"en_US": "Code School"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"company": "urn:li:company:2667670",
"created": 1455494096646,
"id": 1647667610,
"lastModified": 1455494096646,
"localizedAuthority": "Code School",
"localizedName": "TestCert",
"name": {
"localized": {
"en_US": "TestCert"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"url": "https://www.codeschool.com/courses/TestCert"
}
},
"educations": {
"42376603": {
"created": 1261417336891,
"degreeName": {
"localized": {
"en_US": "Bachelor of Science"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"endMonthYear": {
"year": 2012
},
"id": 42376603,
"lastModified": 1423684539837,
"localizedDegreeName": "Bachelor of Science",
"localizedSchoolName": "TestUniversity",
"school": "urn:li:school:18729",
"schoolName": {
"localized": {
"en_US": "TestUniversity"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"startMonthYear": {
"year": 2008
}
}
},
"firstName": {
"localized": {
"en_US": "TestFirstName"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"headline": {
"localized": {
"en_US": "TestHeadline"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"id": "5abc_dEfgH",
"industryName": {
"localized": {
"en_US": "Internet"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"languages": {
"431574801": {
"created": 1422633113128,
"id": 431574801,
"lastModified": 1422633113128,
"localizedName": "English",
"name": {
"localized": {
"en_US": "English"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"proficiency": "FULL_PROFESSIONAL"
},
"431574802": {
"created": 1422633113128,
"id": 431574802,
"lastModified": 1422633113128,
"localizedName": "Spanish",
"name": {
"localized": {
"en_US": "Spanish"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"proficiency": "NATIVE_OR_BILINGUAL"
},
"431574803": {
"created": 1422633113129,
"id": 431574803,
"lastModified": 1422633113129,
"localizedName": "French",
"name": {
"localized": {
"en_US": "French"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"proficiency": "LIMITED_WORKING"
}
},
"lastName": {
"localized": {
"en_US": "TestLastName"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"localizedFirstName": "TestFirstName",
"localizedLastName": "TestLastName",
"location": {
"countryCode": "us",
"postalCode": "94103",
"standardizedLocationUrn": "urn:li:standardizedLocationKey:(us,94103)"
},
"positions": {
"881882968": {
"company": "urn:li:company:1234",
"companyName": {
"localized": {
"en_US": "TestCompany"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"created": 1479755638552,
"id": 881882968,
"lastModified": 1493834470177,
"localizedCompanyName": "TestCompany",
"localizedLocationName": "San Francisco Bay Area",
"localizedTitle": "TestTitle",
"location": {
"countryCode": "us",
"regionCode": 84
},
"locationName": {
"localized": {
"en_US": "San Francisco Bay Area"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"startMonthYear": {
"month": 11,
"year": 2016
},
"title": {
"localized": {
"en_US": "TestTitle"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
}
}
},
"skills": {
"1": {
"created": 1488498832080,
"id": 1,
"lastModified": 1488498832080,
"localizedName": "Software Development Life Cycle (SDLC)",
"name": {
"localized": {
"en_US": "Software Development Life Cycle (SDLC)"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"skill": "urn:li:skill:2130"
},
"2": {
"created": 1488498832080,
"id": 2,
"lastModified": 1488498832080,
"localizedName": "Databases",
"name": {
"localized": {
"en_US": "Databases"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"skill": "urn:li:skill:523"
},
"3": {
"created": 1488498832080,
"id": 3,
"lastModified": 1488498832080,
"localizedName": "Representational State Transfer (REST)",
"name": {
"localized": {
"en_US": "Representational State Transfer (REST)"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"skill": "urn:li:skill:4536"
},
"4": {
"created": 1488498832080,
"id": 4,
"lastModified": 1488498832080,
"localizedName": "SQL",
"name": {
"localized": {
"en_US": "SQL"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"skill": "urn:li:skill:483"
},
"5": {
"created": 1445889972643,
"id": 5,
"lastModified": 1445889972643,
"localizedName": "DO-178B",
"name": {
"localized": {
"en_US": "DO-178B"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
}
}
},
"summary": {
"localized": {
"en_US": {
"rawText": "This is a test Summary on a LinkedIn profile."
}
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"vanityName": "LinkedIn Profile URL Vanity Name"
},
"resume": {
"filename": "Resume_test.pdf",
"media": "urn:li:media:AbcdefgBAXj3g8LOQSFsAAABW-5FC8AtSlXKDCVsWd98_JpsFrFoiHOI6fTO6EoWJ7s5724KJEJ17hkyz46i-zmcDKoQPlFToqSmeuTjTzpiXzwE0-fX373ZTnxRzk7RTcwJQcT7Glf4Z6R3naHf0xpzoMbPZiqJRWAwazaSuAXEnbRmXe0IfjuaQ1wBAAABW-5FC_W7wXVbhkyxHg7DuMAyXB9g-ef2-UQG9gi1NrpR-B0vD5gIzk-tep3idmr2UuZw8SYlbE_rQ8VR_hHCLeKePjOqAE5svW6g6ei7GMOqTL_gaHOW3CMPSOUkVvpyPlRizCOC1AnnM0CEUQa0Xuh9HDSaI09UAl1sKihf5pVQRG2l4rWIakXMs-sWVMEmsRlxE2hl-2_mB_uSTByWx5SHNg-vjIkgoLubwvOs_YJGMVqn2ciYNQaXmwJ0fepYUM49IstI6dL_ABpPBWKgD9p1YNuGEnxzudQivQUVOA5-bzMW8lThpXx-hxXwkT_a9BOkT8wdpMAz6K-XUB0mWGtlgbSW"
}
}
],
"paging": {
"count": 10,
"links": [],
"start": 0,
"total": 1
}
}
Retrieve Applicant Resume
The resume
field will be returned when the applicant uploaded a resume with their job application. Use the filename
sub-field to name the resume, and the media
sub-field as the media ID token to later download the resume.
Downloading protected media requires 3 pieces of information:
- The short-lived
media ID token
. This will be included in the parent resource containing the protected media. Please note that the media ID token has a lifetime of 24 hours. - An access token that you include in the header of your request. Authorization for protected media requires a token obtained via the OAuth 2 Client Credentials Flow . You must use a token obtained via the same OAuth 2 flow that was used to fetch the parent resource.
- The
media_type
, which will always beapplicant_resume
. Resumes submitted by job applicants on LinkedIn will be in the format .pdf or .doc only.
The media id, if the applicant attached a resume to their applicaiton, will be included in the response of the jobApplications call. Use the content-type
header in the response to indicate how the media data should be interpreted.
GET https://api.linkedin.com/media/upload?media_type=applicant_resume&id={media_ID_token}
Query parameters
Field | Description | Format | Required |
---|---|---|---|
media_type | Type of media | media_type=applicant_resume | Yes |
id | Media ID token | media URN in format id=urn:li:media:{id} | Yes |
Troubleshooting
In a browser, you can paste the below URL that contains both an active Media URN retrieved via the jobApplications call and an active Access Token to download the resume media:
https://api.linkedin.com/media/upload?id={media URN}&media_type=applicant_resume&oauth2_access_token={access token}