Share via


Sync Pipelines

Pipelines (or the equivalent in your system) should be synced to the Middleware Platform whenever they are created or updated in your CRM. We define a pipeline as any feature that is used for nurturing and sourcing candidates. Other terms for pipeline include talent pool and folder. When a customer activates CRM Connect for the first time, you must sync all of their historical data to LinkedIn to power the integration.

Prerequisites and Requirements

Throttle Limits

Throttle Limits Requests Per Day (UTC) Records Per Minute
Pipelines maximum 100,000 10,000

Note

Please submit batch calls grouped with no more than 100 records in sequential order.

Sync Pipelines API Endpoint

https://api.linkedin.com/rest/tcrmPipelines

Sync Pipelines API Query String Parameters

Parameter Description Type Required
tcrmPipelineId Pipeline identifier within external Talent CRM String Required
integrationContext LinkedIn company URN provided during customer onboarding, e.g. urn:li:organization:1 String Required
dataProvider Hardcoded, this value is always PARTNER String Required

Sync Pipelines via Batch Update

Perform HTTP PUT on the /tcrmPipelines endpoint to send talent CRM pipelines to LinkedIn. Batch requests require the x-restli-method: batch_update header. Multiple records can be sent in a single API request as indicated in the example below.

Sync Pipelines Request Body Fields

Field Description Format Required
accessRestricted Flag indicating whether the pipeline is restricted by ACL. If true, the pipeline is only accessible to a set of Recruiter users specified via ACLs. If false, the pipeline is accessible to all Recruiter users. (Default value: false) boolean Optional
description Description of the pipeline. String Optional
externalJobPostingIds List of unique external job IDs for the jobs that are in the pipeline. String[] Optional
locations Locations for this pipeline. String[] Optional
ownerEmailAddress Email address of the owner of this pipeline. String Optional
ownerFirstName First name of the owner of this pipeline. String Optional
ownerLastName Last name of the owner of this pipeline. String Optional
pipelineState The state for this pipeline (i.e. whether this pipeline is open or closed). Possible values:
  • OPEN
  • CLOSED
Enum Required
skills Skills required for candidates in this pipeline. String[] Optional
title Title of the pipeline. String Required
tcrmCreatedAt Time when this pipeline was created within external CRM. Long Required
tcrmLastModifiedAt The timestamp when the content was last modified within external CRM, in milliseconds since Unix Epoch. Long Required

Sample Sync Pipelines API Request

curl -i -X PUT 'https://api.linkedin.com/rest/tcrmPipelines?ids%5B0%5D.tcrmPipelineId=tcrmPipelineid300&ids%5B0%5D.integrationContext=urn:li:organization:1234567890&ids%5B0%5D.dataProvider=ATS&ids%5B1%5D.tcrmPipelineId=tcrmPipelineid400&ids%5B1%5D.integrationContext=urn:li:organization:1234567890&ids%5B1%5D.dataProvider=ATS' \
--header 'x-restli-method: batch_update' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {access_token}' \
--header 'LinkedIn-Version: 202406' \
--data-raw '{
  "entities": {
    "tcrmPipelineId=tcrmPipelineid300&dataProvider=PARTNER&integrationContext=urn:li:organization:1234567890": {
      "accessRestricted": true,
      "description": "Java/C++ engineers pipeline",
      "externalJobPostingIds": ["extJobPostingId01","extJobPostingId02"],
      "locations": ["NYC","San Francisco"],     
      "ownerEmailAddress": "ethan@example.com",
      "ownerFirstName": "Ethan",
      "ownerLastName": "Allen",
      "pipelineState": "OPEN",
      "skills": ["c++","java"],
      "title": "Java/C++ Engineers",
      "tcrmCreatedAt": 1670935153,
      "tcrmLastModifiedAt": 1670935160
     },
      "tcrmPipelineId=tcrmPipelineid400&dataProvider=PARTNER&integrationContext=urn:li:organization:1234567890": {
      "description": "Testing for pipeline 400.. Only for testing purposes",
      "externalJobPostingIds": ["extJobPostingId03","extJobPostingId04"],
      "locations": ["NJ","CA"],     
      "ownerEmailAddress": "andy@example.com",
      "ownerFirstName": "Andy",
      "ownerLastName": "Smith",
      "pipelineState": "OPEN",
      "private": true,
      "skills": ["c","python"],
      "title": "Python and C Engineers",
      "tcrmCreatedAt": 1670935153,
      "tcrmLastModifiedAt": 1670935160
     }
    }
}' 

Sample Sync PipelinesAPI Response

{
    "results": {
        "dataProvider=PARTNER&integrationContext=urn%3Ali%3Aorganization%3A1000&tcrmPipelineId=tcrmPipelineid300": {
            "status": 204
        },
        "dataProvider=PARTNER&integrationContext=urn%3Ali%3Aorganization%3A1000&tcrmPipelineId=tcrmPipelineid400": {
            "status": 204
        }
    },
    "errors": {}
}

Delete Pipelines

Perform HTTP DELETE on the /tcrmPipelines endpoint when a customer deletes candidate pipeline records.

Sample Delete Pipelines Request

curl -i -X DELETE "https://api.linkedin.com/rest/tcrmPipelines?ids%5B0%5D.tcrmPipelineId=tcrmPipelineId300&ids%5B0%5D.integrationContext=urn:li:organization:1234567890&ids%5B0%5D.dataProvider=PARTNER&ids%5B1%5D.tcrmPipelineId=tcrmPipelineId400&ids%5B1%5D.integrationContext=urn:li:organization:1234567890&ids%5B1%5D.dataProvider=PARTNER" \
--header 'Authorization: Bearer {access_token}' \
-H 'X-RestLi-Protocol-Version:1.0.0' \
-H 'Accept:application/json' \
-H 'LinkedIn-Version: 202406'

Sample Delete Pipeline Response Body

A successful request will return a 200 OK response code, and you will find the status of each entity in the response body.

   {
    "results": {
        "dataProvider=PARTNER&integrationContext=urn%3Ali%3Aorganization%3A1000&tcrmPipelineId=tcrmPipelineId400": {
            "status": 204
        },
        "dataProvider=PARTNER&integrationContext=urn%3Ali%3Aorganization%3A1000&tcrmPipelineId=tcrmPipelineId300": {
            "status": 204
        }
    },
    "errors": {}
}