Response Decoration
Warning
Deprecation Notice
The use of Response Decoration is deprecated in some versions of LMS APIs. Please refer the Recent Changes page for information on the specific API versions that are affected by this deprecation. You can also refer to this video to understand how to handle the deprecation of API decoration.
When you call an API, the response may contain URNs referencing the different types of objects provided by LinkedIn's services. These URNs are valuable on their own; however, there may be instances when you want to expand a URN and access the values associated with the entity.
Decoration is a mechanism in LinkedIn's APIs to fetch data belonging to a URN object without having to make an extra call to that object's API. Decoration uses a syntax very similar to LinkedIn's Field Projections.
See the following example of a service that returns URN references to another type of entity:
Sample Request
GET https://api.linkedin.com/v2/{service}/1234
Sample Response
{
"id": 1234,
"relatedEntity": "urn:li:relatedEntity:6789"
}
Rather than taking the relatedEntity
URN value and making a second GET call to its parent service, you can use decoration to define how you'd like the relatedEntity
object to be expanded within the original API request. To do this, append the ~
character to the entity you wish to expand, and then provide the field projection in parentheses afterwards. For example:
Sample Request
GET https://api.linkedin.com/v2/{service}/1234&projection=(id,relatedEntity~($URN,foo,bar))
Sample Response
{
"id": 1234,
"relatedEntity": {
"$URN": "urn:li:relatedEntity:6789",
"bar": "bloop",
"foo": "bleep"
}
}
Decorating within Arrays/Lists
In some circumstances, a service might return a collection of URNs that are not all of the same type. In this case, provide multiple decoration instructions to tell the service how to deal with any potential URN type that is returned. See the following sample request and the list of different URN types that it returns within entities:
Sample Request
GET https://api.linkedin.com/v2/{service}/1234
Sample Data
{
"entities": [
"urn:li:foo:123",
"urn:li:bar:234",
"urn:li:baz:345"
],
"id": 1234
}
To decorate each of the foo
, bar
, and baz
URN types in this response, use the following projection syntax in your request:
Sample Request
GET https://api.linkedin.com/v2/{service}/1234?projection=entities*~foo(a,b)~bar(c,d)~baz(e,f))
Sample Response
{
"entities": [
{
"a": 1,
"b": 2
},
{
"c": 10,
"d": 20
},
{
"e": 100,
"f": 200
}
],
"id": 1234
}
Sample Projections
Consider the following data model of a sample resource and review the below samples showing how to access various parts of this data in order to decorate.
{
"person": {
"current_position": {
"company": "urn:li:company:1",
"from": "2009",
"job_title": "SWE"
},
"firstname": "First Name",
"following_companies": [
"urn:li:company:1",
"urn:li:company:2"
],
"lastname": "Last Name",
"messages": {
"urn:li:message:1": {
"bcc": [
"urn:li:person:1",
"urn:li:person:39"
],
"content": "xyz",
"from": "urn:li:person:99"
},
"urn:li:message:2": {
"bcc": [
"urn:li:person:1",
"urn:li:person:80"
],
"content": "abc",
"count": 1929
}
},
"phone": "200-100-200",
"position_history": [
{
"company": "urn:li:company:4888383",
"from": "2006",
"job_title": "SSE",
"to": "2009"
},
{
"company": "urn:li:company:39939",
"from": "1999",
"job_title": "SE",
"to": "2006"
}
]
}
}
Accessing URN within a child object
(person(current_position(company)))
{
"person": {
"current_position": {
"company": "urn:li:company:1"
}
}
}
Accessing URNs within an array of child objects
(person(position_history(*(company))))
{
"person": {
"position_history": [
{
"company": "urn:li:company:4888383"
},
{
"company": "urn:li:company:39939"
}
]
}
}
Accessing URNs within an array of URNs
(person(following_companies(*)))
{
"person": {
"following_companies": [
"urn:li:company:1",
"urn:li:company:2"
]
}
}
Selecting a single child field with a URN and expanding the URN
(person(current_position(company~)))
{
"person": {
"current_position": {
"company": "urn:li:company:1",
"company~": {
"active": true,
"administrators": [
"urn:li:person:6611647"
],
"allEmployeesAsAdmins": false,
"attributes": {
"disableThirdPartyNews": false,
"enableStatusUpdate": false,
"owns300x250RightAdSlot": false,
"paidCareers": false,
"paidGoldPlusCareers": false,
"paidPlatinumCareers": false,
"paidProducts": false,
"paidSilverCareers": false,
"paidSilverPlusCareers": false,
"showAnalytics": false,
"showBrandTree": false,
"showNews": true,
"showPastEmployees": false,
"silverProducts": false,
"useParentCareers": false
},
"companyId": 1,
"companyType": "PUBLIC_COMPANY",
"creationTime": 1375816467585,
"creator": "urn:li:person:6611647",
"dataVersion": 4,
"descriptions": [
{
"description": "test test test testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest test",
"locale": "en_US"
}
],
"employeeCountRange": "MYSELF_ONLY",
"heroImage": {
"cropHeight": 220,
"cropWidth": 646,
"cropXPosition": 0,
"cropYPosition": 0,
"croppedImage": "urn:li:media:/p/2/005/045/187/3d49ef0.png",
"height": 220,
"uncroppedImage": "urn:li:media:/p/2/005/045/187/3b333d8.png",
"width": 646
},
"images": [
{
"originalMedia": "urn:li:media:/p/2/005/045/188/1d5f329.png",
"type": "SQUARE_LOGO_LEGACY",
"urn": "urn:li:media:/p/2/005/045/188/1d5f329.png"
},
{
"originalMedia": "urn:li:media:/p/2/005/045/188/24809b3.png",
"type": "LOGO_LEGACY",
"urn": "urn:li:media:/p/2/005/045/188/24809b3.png"
}
],
"industries": [
"ACCOUNTING"
],
"lastEditor": "urn:li:person:6611647",
"lastModifiedTime": 1375816467585,
"logo": "urn:li:media:/p/2/005/045/188/24809b3.png",
"names": [
{
"active": true,
"locale": "en_US",
"name": "r-NQkR5TwJ",
"type": "CANONICAL"
}
],
"organizationalEntity": "urn:li:organization:1",
"squareLogo": "urn:li:media:/p/2/005/045/188/1d5f329.png",
"status": "OPERATING",
"stockSymbol": "",
"twitterId": "",
"universalName": "r-nqkr5twj",
"websiteUrl": "https://www.whatismyreferer.com/"
}
}
}
}
Selecting all child fields and fully expanding a child field containing a URN
(person(current_position(*,company~)))
{
"person": {
"current_position": {
"company": "urn:li:company:1",
"company~": {
"active": true,
"administrators": [
"urn:li:person:6611647"
],
"allEmployeesAsAdmins": false,
"attributes": {
"disableThirdPartyNews": false,
"enableStatusUpdate": false,
"owns300x250RightAdSlot": false,
"paidCareers": false,
"paidGoldPlusCareers": false,
"paidPlatinumCareers": false,
"paidProducts": false,
"paidSilverCareers": false,
"paidSilverPlusCareers": false,
"showAnalytics": false,
"showBrandTree": false,
"showNews": true,
"showPastEmployees": false,
"silverProducts": false,
"useParentCareers": false
},
"companyId": 1,
"companyType": "PUBLIC_COMPANY",
"creationTime": 1375816467585,
"creator": "urn:li:person:6611647",
"dataVersion": 4,
"descriptions": [
{
"description": "test test test testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest testtest test",
"locale": "en_US"
}
],
"employeeCountRange": "MYSELF_ONLY",
"heroImage": {
"cropHeight": 220,
"cropWidth": 646,
"cropXPosition": 0,
"cropYPosition": 0,
"croppedImage": "urn:li:media:/p/2/005/045/187/3d49ef0.png",
"height": 220,
"uncroppedImage": "urn:li:media:/p/2/005/045/187/3b333d8.png",
"width": 646
},
"images": [
{
"originalMedia": "urn:li:media:/p/2/005/045/188/1d5f329.png",
"type": "SQUARE_LOGO_LEGACY",
"urn": "urn:li:media:/p/2/005/045/188/1d5f329.png"
},
{
"originalMedia": "urn:li:media:/p/2/005/045/188/24809b3.png",
"type": "LOGO_LEGACY",
"urn": "urn:li:media:/p/2/005/045/188/24809b3.png"
}
],
"industries": [
"ACCOUNTING"
],
"lastEditor": "urn:li:person:6611647",
"lastModifiedTime": 1375816467585,
"logo": "urn:li:media:/p/2/005/045/188/24809b3.png",
"names": [
{
"active": true,
"locale": "en_US",
"name": "r-NQkR5TwJ",
"type": "CANONICAL"
}
],
"organizationalEntity": "urn:li:organization:1",
"squareLogo": "urn:li:media:/p/2/005/045/188/1d5f329.png",
"status": "OPERATING",
"stockSymbol": "",
"twitterId": "",
"universalName": "r-nqkr5twj",
"websiteUrl": "https://www.whatismyreferer.com/"
},
"from": "2009",
"job_title": "SWE"
}
}
}
Selecting all child fields and expanding child field with a URN for a single value
(person(current_position(*,company~(vanityName))))
{
"person": {
"current_position": {
"company": "urn:li:company:1",
"company~": {},
"from": "2009",
"job_title": "SWE"
}
}
}
Accessing complex type object
When a URN is a field’s key and the value is an object, it is called a complex type object. In the following example, the messages
field maps to an object with 2 fields that are MessageUrns
. These 2 MessageUrns
are keys that map to objects containing data such as bcc
,count
, and content
. To access the bcc
values for each MessageUrn
, use the decoration (person(messages()))(person(messages(*(from,bcc(*)))))
.
(person(messages()))
{
"person": {
"messages": {
"urn:li:message:1": {
"bcc": [
"urn:li:personr:1",
"urn:li:person:39"
],
"content": "xyz",
"from": "urn:li:person:99"
},
"urn:li:message:2": {
"bcc": [
"urn:li:person:1",
"urn:li:person:80"
],
"content": "abc",
"count": 1929
}
}
}
}
(person(messages(*(from,bcc(*)))))
{
"person": {
"messages": {
"urn:li:message:1": {
"bcc": [
"urn:li:person:1",
"urn:li:person:39"
],
"from": "urn:li:person:99"
},
"urn:li:message:2": {
"bcc": [
"urn:li:person:1",
"urn:li:person:80"
]
}
}
}
}
Accessing all URNs within any array from a BATCH_GET call
Note that a BATCH_GET call returns a results
field by default.
(results(*(person(following_companies(*)))))
Sample Data
{
"results": {
"123123": {
"person": {
"current_position": {
"company": "urn:li:company:1",
"from": "2009",
"job_title": "SWE"
},
"firstname": "First Name",
"following_companies": [
"urn:li:company:1",
"urn:li:company:2"
],
"lastname": "Last Name",
"messages": {
"urn:li:message:1": {
"bcc": [
"urn:li:person:1",
"urn:li:person:39"
],
"content": "xyz",
"from": "urn:li:person:99"
},
"urn:li:message:2": {
"bcc": [
"urn:li:person:1",
"urn:li:person:80"
],
"content": "abc",
"count": 1929
}
},
"phone": "200-100-200",
"position_history": [
{
"company": "urn:li:company:4888383",
"from": "2006",
"job_title": "SSE",
"to": "2009"
},
{
"company": "urn:li:company:39939",
"from": "1999",
"job_title": "SE",
"to": "2006"
}
]
}
}
}
}
(results(*(person(following_companies(*)))))
{
"results": {
"123123": {
"person": {
"following_companies": [
"urn:li:company:1",
"urn:li:company:2"
]
}
}
}
}
Note
Always use entity~
in the projection parameter to make the expansion request. If the entity
is expanded, the response returns entity~
. If for some reason the entity
cannot be expanded, the response returns entity!
.
Rate Limiting
Response decoration makes calls to other services in order to resolve the requested, decorated entity. These calls are subject to rate limiting. It is possible for calls to return a 200 while the decoration call is rate limited.
The following example makes a request to the /me
endpoint and uses response decoration to resolve the digitalMediaAsset
URN in the displayImage
field. The call to the /me
endpoint is successful, but the decoration call to resolve displayImage
is rate limited.
GET https://api.linkedin.com/v2/me?projection=(id,profilePicture(displayImage~(*)))
{
"profilePicture": {
"displayImage!": {
"serviceErrorCode": 101,
"message": "Resource level throttle limit for calls to this resource is reached.",
"status": 429
},
"displayImage": "urn:li:digitalmediaAsset:C4D03AQGFBHiaY1XXNA"
},
"id": "z6_nnTIGu-"
}