Sync Candidate Notes

Candidate notes should be sent via the Middleware Platform whenever they are created or updated in your ATS. Use both your candidate identifier and note identifier when syncing candidate notes via API.

Note

The latest API version is 202603. Use this version in the LinkedIn-Version header for all API requests to access the most recent features and improvements.

Throttle Limits

Endpoint Requests Per Day (UTC) Records Per Minute
rest/candidateNote 1,000,000 N/A

Note

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

Create and Update Candidate Notes

Use the following endpoint to create and update candidate notes:

PUT https://api.linkedin.com/v2/atsCandidates/atsCandidateId={your candidate id}&dataProvider=ATS&integrationContext=urn:li:organization:2414183/notes?ids={note id 1}&ids={note id 2}

Request Body Fields

Field Description Format Required
atsCreatedAt The date when the note was created in your ATS. UTC Epoch Milliseconds No
author The first and last name of the person who wrote the note. Actor No
note A note about the candidate. string No

Actor Schema

Field Description Format Required
firstName The first name of the actor. String Required
lastName The last name of the actor. String Required

Sample Request

Headers:

Authorization: Bearer {token}
x-restli-method: batch_update

Request body:

{
  "entities": {
    "CAND_NOTE123": {
      "atsCreatedAt": 1484864187000,
      "note": "Lorem Ipsum.",
      "author": {
        "firstName": "Angela",
        "lastName": "Smith"
      }
    },
    "CAND_NOTE456": {
      "atsCreatedAt": 1484864187000,
      "note": "Lorem Ipsum moreum.",
      "author": {
        "firstName": "Bobby",
        "lastName": "Hill"
      }
    }
  }
}

Sample Response

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

Sample Response Body

{
    "errors": {},
    "results": {
        "CAND_NOTE123": {
            "status": 204
        },
        "CAND_NOTE456": {
            "status": 204
        }
    }
}

Note

  • Be sure to check the response for error statuses corresponding to individual entities you submit.

Delete Candidate Notes

API Details

Perform HTTP DELETE on /atsCandidates/{CandidateIdentifier}/notes endpoint to delete candidate notes. More information is available here.

Use the following endpoint to create and update candidate notes:

PUT https://api.linkedin.com/rest/candidateNotes

Include the LinkedIn-Version header when calling this endpoint.

API Request Parameter

Parameter Description Format Required
integrationContext The integration context specifies who owns the note and identifies the customer who owns the data. The value must be in the format urn:li:organization. String Yes
externalCandidateId The unique identifier of the candidate to which the note belongs within the partner system. String Yes
externalNoteId The unique identifier of the note within the partner system. String Yes

Request Body Fields

Field Description Format Required
author The person who wrote the note. Actor No
note A note about the application. String Yes
externalCreatedAt The time when the note was created in the partner system, represented as an epoch timestamp in milliseconds (UTC). The value must be positive and cannot be a future time. Epoch in Milliseconds (UTC) Yes
externalLastModifiedAt The time when the note was last modified in the partner system, represented as an epoch timestamp in milliseconds (UTC). The value must be positive and cannot be a future time. Epoch in Milliseconds (UTC) Yes

Actor Schema

Field Description Format Required
firstName The first name of the actor. String Required
lastName The last name of the actor. String Required

Sample Request (with query tunneling)

curl --location --request POST 'https://api.linkedin.com/rest/candidateNotes' \
--header 'Content-Type: multipart/mixed; boundary=xyz' \
--header 'x-restli-method: batch_update' \
--header 'LinkedIn-Version: 202512' \
--header 'X-HTTP-Method-Override: PUT' \
--header 'Authorization: Bearer {token}' \
--data '--xyz
Content-Type: application/x-www-form-urlencoded

ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn:li:organization:12345&ids[0].externalNoteId=note_20251219_0002
--xyz
Content-Type: application/json

{
  "entities": {
    "externalCandidateId=candidate_20251219_001&integrationContext=urn:li:organization:12345&externalNoteId=note_20251219_0002": 
    {
            "author": {
                "firstName": "Angela",
                "lastName": "Smith"
            },
            "note": "interview",           
            "externalLastModifiedAt": 1767735901000,
            "externalCreatedAt":1767735901000
    }
  }
}
--xyz--'

Sample Request (without query tunneling)

curl --location --globoff --request PUT 'https://api.linkedin.com/rest/candidateNotes?ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002' \
--header 'Content-Type: application/json' \
--header 'x-restli-method: batch_update' \
--header 'LinkedIn-Version: 202512' \
--header 'Authorization: Bearer {token}' \
--data '{
  "entities": {
    "externalCandidateId=candidate_20251219_001&integrationContext=urn:li:organization:12345&externalNoteId=note_20251219_0002": 
     {
            "author": {
                "firstName": "Angela",
                "lastName": "Smith"
            },
            "note": "interview",           
            "externalLastModifiedAt": 1767735718000,
            "externalCreatedAt":1767735718000

    }
  }
}'

Sample Request (with query tunneling)

curl --location --request POST 'https://api.linkedin.com/rest/candidateNotes' \
--header 'Content-Type: multipart/mixed; boundary=xyz' \
--header 'x-restli-method: batch_update' \
--header 'LinkedIn-Version: 202602' \
--header 'X-HTTP-Method-Override: PUT' \
--header 'Authorization: Bearer {token}' \
--data '--xyz
Content-Type: application/x-www-form-urlencoded

ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn:li:organization:12345&ids[0].externalNoteId=note_20251219_0002
--xyz
Content-Type: application/json

{
  "entities": {
    "externalCandidateId=candidate_20251219_001&integrationContext=urn:li:organization:12345&externalNoteId=note_20251219_0002": 
    {
            "author": {
                "firstName": "Angela",
                "lastName": "Smith"
            },
            "note": "interview",           
            "externalLastModifiedAt": 1767735901000,
            "externalCreatedAt":1767735901000
    }
  }
}
--xyz--'

Sample Request (without query tunneling)

curl --location --globoff --request PUT 'https://api.linkedin.com/rest/candidateNotes?ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002' \
--header 'Content-Type: application/json' \
--header 'x-restli-method: batch_update' \
--header 'LinkedIn-Version: 202602' \
--header 'Authorization: Bearer {token}' \
--data '{
  "entities": {
    "externalCandidateId=candidate_20251219_001&integrationContext=urn:li:organization:12345&externalNoteId=note_20251219_0002": 
     {
            "author": {
                "firstName": "Angela",
                "lastName": "Smith"
            },
            "note": "interview",           
            "externalLastModifiedAt": 1767735718000,
            "externalCreatedAt":1767735718000

    }
  }
}'

Sample Request (with query tunneling)

curl --location --request POST 'https://api.linkedin.com/rest/candidateNotes' \
--header 'Content-Type: multipart/mixed; boundary=xyz' \
--header 'x-restli-method: batch_update' \
--header 'LinkedIn-Version: 202603' \
--header 'X-HTTP-Method-Override: PUT' \
--header 'Authorization: Bearer {token}' \
--data '--xyz
Content-Type: application/x-www-form-urlencoded

ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn:li:organization:12345&ids[0].externalNoteId=note_20251219_0002
--xyz
Content-Type: application/json

{
  "entities": {
    "externalCandidateId=candidate_20251219_001&integrationContext=urn:li:organization:12345&externalNoteId=note_20251219_0002": 
    {
            "author": {
                "firstName": "Angela",
                "lastName": "Smith"
            },
            "note": "interview",           
            "externalLastModifiedAt": 1767735901000,
            "externalCreatedAt":1767735901000
    }
  }
}
--xyz--'

Sample Request (without query tunneling)

curl --location --globoff --request PUT 'https://api.linkedin.com/rest/candidateNotes?ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002' \
--header 'Content-Type: application/json' \
--header 'x-restli-method: batch_update' \
--header 'LinkedIn-Version: 202603' \
--header 'Authorization: Bearer {token}' \
--data '{
  "entities": {
    "externalCandidateId=candidate_20251219_001&integrationContext=urn:li:organization:12345&externalNoteId=note_20251219_0002": 
     {
            "author": {
                "firstName": "Angela",
                "lastName": "Smith"
            },
            "note": "interview",           
            "externalLastModifiedAt": 1767735718000,
            "externalCreatedAt":1767735718000

    }
  }
}'

Sample Response

{
    "results": {
        "externalCandidateId=candidate_20251219_001&externalNoteId=note_20251219_0002&integrationContext=urn%3Ali%3Aorganization%3A12345": {
            "status": 204
        }
    },
    "errors": {}
}

Delete Candidate Notes

Sample Request (with query tunneling)

curl --location --request POST 'https://api.linkedin.com/rest/candidateNotes' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'LinkedIn-Version: 202512' \
--header 'X-HTTP-Method-Override: DELETE' \
--header 'Authorization: Bearer {token}' \
--data 'ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002'

Sample Request (without query tunneling)

curl --location --globoff --request DELETE 'https://api.linkedin.com/rest/candidateNotes?ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002' \
--header 'LinkedIn-Version: 202512' \
--header 'Authorization: Bearer {token}' 

Sample Request (with query tunneling)

curl --location --request POST 'https://api.linkedin.com/rest/candidateNotes' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'LinkedIn-Version: 202602' \
--header 'X-HTTP-Method-Override: DELETE' \
--header 'Authorization: Bearer {token}' \
--data 'ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002'

Sample Request (without query tunneling)

curl --location --globoff --request DELETE 'https://api.linkedin.com/rest/candidateNotes?ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002' \
--header 'LinkedIn-Version: 202602' \
--header 'Authorization: Bearer {token}' 

Sample Request (with query tunneling)

curl --location --request POST 'https://api.linkedin.com/rest/candidateNotes' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'LinkedIn-Version: 202603' \
--header 'X-HTTP-Method-Override: DELETE' \
--header 'Authorization: Bearer {token}' \
--data 'ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002'

Sample Request (without query tunneling)

curl --location --globoff --request DELETE 'https://api.linkedin.com/rest/candidateNotes?ids[0].externalCandidateId=candidate_20251219_001&ids[0].integrationContext=urn%3Ali%3Aorganization%3A12345&ids[0].externalNoteId=note_20251219_0002' \
--header 'LinkedIn-Version: 202603' \
--header 'Authorization: Bearer {token}' 

Sample Response

{
    "results": {
        "externalCandidateId=candidate_20251219_001&externalNoteId=note_20251219_0002&integrationContext=urn%3Ali%3Aorganization%3A12345": {
            "status": 204
        }
    },
    "errors": {}
}