Talent Hub Integrations Onboarding

Note

The use of this API is restricted to those developers approved by LinkedIn and subject to applicable data restrictions in their agreements.

This integration requires a partnership; 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 to use this integration.

If you are not yet a LinkedIn Talent Solutions Partner, please complete the LinkedIn Talent Solutions Partner Request Form.

Obtain a LinkedIn Developer Account

Before beginning development you will need to be provisioned access. You can request access by completing the following steps:

  • Create an API application for your integration. This will be your developer application. You can choose to create two separate applications i.e. one for your test/stage environment and one for your production environment.

Note

TalentHub product assignment is not supported in LinkedIn's developer platform. Sharing the developer application ID with your Business Development point of contact is sufficient for provisioning.

Once your app is configured and provisioned, you may begin making API requests and testing the integration. All API requests require OAuth 2.0 Client Credentials Flow (2-Legged) Authorization. Also, API requests return paged results; details on paging through results can be found here.

Register Your Talent Hub Integration

You need to finish configuring your integration before it can be added to LinkedIn Talent Solutions Third Party Integration Registry. Use your application credentials to call the following API:

POST https://api.linkedin.com/v2/hireThirdPartyExtensionProviders/extensionType={extensionType}&extensionProvider=THIRD_PARTY

Talent hub Integration service is uniquely identified by a combination of the fields below:

Field Name Description Type
extensionType Indicates the type of the extension. Types include INTERVIEW, BACKGROUND_CHECK, HRIS, JOB_DISTRIBUTION, DOCUMENT_SIGNATURE, THIRD_PARTY_ASSESSMENT Enum
extensionProvider You should always supply THIRD_PARTY for this field. String

Request Body Schema

Field Name Description Type Required
displayName Multi locale string of the display name of your integration. String Yes
description Multi locale string of the description of your integration. Maximum character limit 70. String Yes
onboardingUrl A URL where you will receive the customer's LinkedIn Information via a GET request. As a response you will display a login screen where users will sign in to your system. This will complete the association of accounts and the onboarding process for the integration. This needs to be an HTTPS endpoint. String Yes
callbackUrl A URL for LinkedIn to send push notifications to your system regarding the integration. Different extension types might have different kinds of push notifications that you’re required to subscribe to and respond. This needs to be an HTTPS endpoint. Please do not use any query parameters. String Yes

Sample Request Headers

Authorization: Bearer {access_token}
x-restli-method: partial_update

Sample Request Body

{
  "patch": {
    "$set": {
      "displayName": {
        "localized": {
          "en_US": "Lorem Ipsum 1"
        }
      },
      "description": {
        "localized": {
          "en_US": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
        }
      },
      "onboardingUrl": "https://www.provider-url.com/liOnboarding",
      "callbackUrl": "https://www.provider-url.com/liCallback"
    }
  }
}

A successful request will return a 204 response code.

After your integration is certified by LinkedIn, it will appear in our integration registry under the associated category for customers to select and onboard.

Enable a Customer

This section assumes that the customer has an account with both LinkedIn and your system and hence they’re our mutual customers.

Receive Customer Onboarding Request

When a customer starts to enable an integration in LinkedIn, they will be directed to your onboardingUrl. You will receive a GET request from LinkedIn on the onboardingUrl you provided. The GET request contains the customer’s LinkedIn information (hiring context) necessary for the integration and a signature for you to verify the request comes from LinkedIn in the query parameters.

As a response to this GET request you will display a login screen for your system. You will need to pass through the hiring context to any other flows that can originate here such as “user sign up”, “forgot password”, etc. Once your user logs in, you will use the information (hiring context) from the GET request to associate the LinkedIn user to your user's account. Any future request sent to you by LinkedIn will include the user information (hiring context) so you can correspond each request to the user’s account in your system. After onboarding process is done, you should redirect the customer back to LinkedIn to the redirectUrl provided in the GET request.

GET https://{your application’s registered onboarding URL}?hiringContext={hiringContext}&extensionType={extensionType}&redirectUrl={redirectUrl}&signature={signature}
Field Name Description Type
hiringContext Hiring context of the customer requesting the integration in the format of “urn:li:contract:123” URN
extensionType Integration type the customer requested. String
redirectUrl A URL where you should redirect customers back to LinkedIn when they have finished the extension onboarding process in your system String
signature This will be "HMACSHA256" signature. LinkedIn uses your developer application's secret as the encryption key. For encryption payload, LinkedIn prefixes "hmacsha256=" to the request payload. UTF-8 encoding is used here. For example, encryption payload for this use case is: hmacsha256={"hiringContext":"urn:li:contract:12345678","extensionType":"THIRD_PARTY_ASSESSMENT","redirectUrl":"https://www.linkedin.com/talent/account/v2/integrations"} String

Note

In order to authenticate the incoming request, the same HMAC signature can be computed by the partner and matched with the value present in the signature field present in the incoming request.

Sample Request

GET https://www.provider-url.com/liOnboarding?hiringContext=urn%3Ali%3Acontract%3A123&extensionType=BACKGROUND_CHECK&redirectUrl=https%3A%2F%2Fwww%2Elinkedin%2Ecom%2Ftalent%2Faccount%2Fv2%2Fintegrations&signature=aea468cc5941e8a7d50cb16aec9ee39b7ab4ce692a3cfb1d303737d663fe5100

Customers must log in to your system to authenticate their identity (unless they are already logged in).

Update Customer Integrations

To let LinkedIn know your system is ready for customer to consume the integration, use your application credentials to call the following API:

POST https://api.linkedin.com/v2/hireThirdPartyExtensions/hiringContext={hiringContext}&extensionType={extensionType}&extensionProvider=THIRD_PARTY

Talent hub customer Integration is uniquely identified by a combination of the fields below:

Field Name Description Type
hiringContext Hiring context of the customer in LinkedIn obtained in the format of urn:li:contract:123 URN
extensionType Integration type the customer requested. String
extensionProvider You should always supply THIRD_PARTY for this field. String

Request Body Fields

Field Name Description Type Required
status Status of the extension. Statuses include ENABLED or PROVIDER_EXCEPTION. Enum Yes
providerExceptionType Represents the type of exception which happened on provider side if the provider marks the status as PROVIDER_EXCEPTION. Statuses include ACCOUNT_NOT_ELIGIBLE, AUTHENTICATION_FAILURE, TEMPORARILY_UNAVAILABLE, and SERVER_ERROR Enum No

Note

You may expire the extension if not used over a period of time. In this case ensure that you update the providerExceptionType to AUTHENTICATION_FAILURE

Sample Request Headers

Authorization: Bearer {access_token}
x-restli-method: partial_update

Sample Request Body

{
 "patch": {
  "$set": {
   "providerConfiguration": {
    //Provide below field only if your integration is for Background Check
    "backgroundCheckConfiguration": {},
    //Provide below field only if your integration is for Assessment
    "assessmentConfiguration": {}
   },
    //Provide below field only if your integration is of type Interview
   "configuration": {
       "interviewConfiguration": {}
   },
   //Provide below field for All integration types
   "status": "ENABLED"
  }
 }
}

A successful request will return a 204 response code. The customer’s extension will be in ENABLED status after this step.

Redirect the customer back to the redirectUrl when everything is done. Customers will see latest status in the integration registry page.

Note

Refer to Background Check, Assessments and Interviews for integration specific configurations

Disable Customer Integration

In the event a customer should disable an integration, a push event will be sent to your application's callbackUrl notifying you of this change. If you should receive this type of push event, please update your customer mapping that the integration has been disabled and to no longer make requests for this integration.

Request Body Fields

Field Description Format Required
type Type of notification String Yes
hiringContext Hiring context of the customer in the format of urn:li:contract:123. URN Yes

Sample Request

"Content-Type":"application/json",
"X-LI-Signature":"d3756e445a8065c0f38c2182c502f8229800eb2c6a9f3b4a1fdf152af867e6fc",
"Content-Length":"107",
"Connection":"Keep-Alive",
"Accept-Encoding":"gzip,deflate"

{
   "type":"DELETE_THIRD_PARTY_EXTENSION",
   "hiringContext": "urn:li:contract:123"
}

Rate Limits and Throttling

All of LinkedIn’s API are subject to rate limiting and throttling based on the number of requests made per unit time. The below limits apply to all API endpoints listed in this doc.

Throttle Limits Request Per Day (UTC) Action
Application Maximum (max requests per app) 5000 Calls will be rejected with a status code of 429