Create and Manage Conversation Ads (Legacy)
Warning
Deprecation Notice
The Marketing Version 202310 (Marketing October 2023) and earlier versions (excluding 202306 and 202307) have been sunset. Additionally, the unversioned APIs will be sunset soon. We recommend that you migrate to the versioned APIs as well as migrate to the new Content and Community Management APIs to avoid disruptions. See the Migration page for more details.
If you haven’t yet migrated and have questions, submit a request on the LinkedIn Developer Support Portal.
Important
The Conversation Ads API replaces the sponsoredConversations API for creating Sponsored Conversation entities and Sponsored Message Content.
A Conversation Ad is a LinkedIn ad format that enables advertisers to deliver planned automated messages to a targeted LinkedIn member's inbox. It provides a chat-like experience between both the member and the advertiser.
Within the LinkedIn API, Conversation Ads are represented by the Sponsored Conversation entity. Sponsored Conversations are composed of Sponsored Message Content.
Refer to the Conversation Ads Use Case Guide for API workflows. You can also refer to Conversation Ads Overview for an ad format overview.
Permissions
Permission | Description |
---|---|
rw_ads |
Manage and read an authenticated member's ad accounts. Restricted to ad accounts in which the authenticated member has one of the following ad account roles. ACCOUNT_BILLING_ADMIN ACCOUNT_MANAGER CAMPAIGN_MANAGER CREATIVE_MANAGER |
r_ads |
Read an authenticated member's ad accounts. Restricted to ad accounts in which the authenticated member has one of the following ad account roles. ACCOUNT_BILLING_ADMIN ACCOUNT_MANAGER CAMPAIGN_MANAGER CREATIVE_MANAGER VIEWER |
See Account Access Controls for more information on ad account roles.
Sponsored Conversations and Sponsored Message Content
A sponsored conversation is represented by a graph that contains sponsored message content nodes which are triggered by user button clicks that are mapped to the nodes. When the user clicks a button, the button responds with content that resides in a specific location on the graph mapped to the button.
Conversation Ads require an advertiser to design the graph per their specification and objectives through mapping the buttons to the sponsored message content nodes on the graph.
The following sections provide information about how to design both the sponsored conversation and the sponsored message content.
Sponsored Conversations
This section explains how to manage sponsored ad conversations.
SponsoredConversation Schema
Field | Type | Description |
---|---|---|
id | long, read-only | ID key for the current conversation |
firstMessageContent | Sponsored Message Content URN | Root of the sponsored conversation graph. From this node, you can traverse all the messages in the conversation. Cannot be specified on creation. |
parentAccount | Sponsored Account URN, create-only | ID of the parent Sponsored Account that created the current conversation |
editable | boolean | Indicates whether the current sponsored conversation and child content can be edited. Starting July 2021 this field will be automatically set to false when the SponsoredConversation is set as the subContent of an AdInMailContent entity. |
Create a Conversation
A conversation stores the entry of a message tree. You can create a conversation by calling the sponsoredConversations
endpoint.
Sample Request
POST https://api.linkedin.com/v2/sponsoredConversations
{
"parentAccount": "urn:li:sponsoredAccount:123456"
}
Validations:
- The specified
parentAccount
must exist and be valid - The user must have the permission to manage the account
- You cannot set the
firstMessageContent
when initially creating asponsoredConversation
. It can only be set by a subsequent partial update call.
Successful response will have Status 201 Created
and the ID in the x-linkedin-id
response header.
Get a Conversation
A conversation stores a message tree entry. You can retrieve it by calling the sponsoredConversations
endpoint.
GET https://api.linkedin.com/v2/sponsoredConversations/{sponsoredConversationId}
Sample Request
Sample Response
{
"firstMessageContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,5678)",
"editable": true,
"id": 2620,
"parentAccount": "urn:li:sponsoredAccount:518374847",
"$URN": "urn:li:sponsoredConversation:2620"
}
Get a Conversation in Batch
You can retrieve multiple conversations at the same time retrieve it by calling the sponsoredConversations
endpoint.
GET https://api.linkedin.com/v2/sponsoredConversations?ids=List({sponsoredConversationId})
Sample Request
Sample Response
{
"statuses":{
"1234":200
},
"results":{
"1234":{
"id":1234,
"parentAccount":"urn:li:sponsoredAccount:12345",
"editable":true,
"firstMessageContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,5678)"
}
},
"errors":{}
}
Partially Updating a Conversation
After creating a conversation, you can also partially update it.
POST https://api.linkedin.com/v2/sponsoredConversations/{sponsoredConversationId}
Sample Request
POST https://api.linkedin.com/v2/sponsoredConversations/1234
{
"patch": {
"$set": {
"firstMessageContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,5678)"
}
}
}
Validations:
- The user must have the permission to manage the account
- The
sponsoredConversation
must be editable - The
firstMessageContent
must be valid and thissponsoredMessageContent
must created under the samesponsoredConversation
.
Sponsored Message Content
The content in this section explains how to manage sponsored message content.
SponsoredMessageContent Schema
Field | Type | Description |
---|---|---|
id | long, read-only | ID key for the current conversation content |
type | String, read-only | |
nextAction | SponsoredMessageContentUrn or SponsoredMessageOption[] | Indicates whether the succeeding action is an array of options or the direct next message in the thread. |
bodySource | String, AdFormUrn or SponsoredMessageAttachmentWithText | |
sponsoredConversation | SponsoredConversationUrn | Read-only URN of the parent sponsoredConversation for this SponsoredMessageContent. |
SponsoredMessageOption Schema
Field | Type | Description |
---|---|---|
type | SponsoredMessageReplyType | Type of the reply |
nextContext | com.linkedin.common.SponsoredMessageContentUrn | URN of the next message content to show. |
optionText | string | The text of the content shown on the button. |
actionTarget | AdFormUrn or URL | Specify AdFormUtn for LEAD_GENERATION or LEAD_GENERATION_THANK_YOU options. Or specify a landing page URL for the WEBSITE_VISIT option. |
Validations
The following invariants must hold when creating/updating/deleting SponsoredMessageContent
, otherwise it will throw validation errors (4xx error code).
All SponsoredMessageContents
within a conversation has the following tree level checks:
- The maximum number of
SponsoredMessageContents
within a conversation is 25 - All
SponsoredMessageContentUrn
references must exist - Cyclical references between the message nodes are not allowed
Individual SponsoredMessageContent
Checks:
- If the
bodySource
is aleadGenerationForm
:- The message type must be
OPTION_PROVIDING
- It must have at least one
LEAD_GENERATION_THANK_YOU
SponsoredMessageOption
- The
leadGenerationForm
account needs to match the ConversationparentAccount
- The message type must be
- If the
bodySource
is text:- The text length must be less than or equal to 500 characters
- If the
bodySource
isAttachmentAndText
:- The text length must be less than or equal to 500 characters
- The image must be an
digitalmediaAssetUrn
- A
SponsoredMessageContent
is defined to be an INFORMATION type if:- The
nextAction
must be null or be aSponsoredMessageContentUrn
- If the
nextAction
is aSponsoredMessageContentUrn
, thenextAction
must not point to aSponsoredMessageContent
with aleadGenerationForm
bodySource
- The
- A
SponsoredMessageContent
is defined to be anOPTION_PROVIDING
type if:- The
nextAction
must be an array - The array must have at least 1
SponsoredMessageOption
but no more than 5SponsoredMessageOptions
- The
SponsoredMessageOption
Validations:
optionText
must be between 1 and 35 characters- If the type of the option is
LEAD_GENERATION
:- The
actionTarget
must be aleadGenerationForm
- The
nextAction
field must not be null - The
nextAction
field is required to point to aSponsoredMessageContent
with a bodySource of type leadGenerationForm (to get thank you message from adForms endpoint and show on clients), this urn must be the same asAdFormUrn
in this option'sactionTarget
- The
SponsoredMessageContent
should beOPTION_PROVIDING
(i.e.:nextAction
must be an array and the array must have between 1 to 5SponsoredMessageOptions
).
- The
- If the type of the option is
LEAD_GENERATION_THANK_YOU
:- The
actionTarget
must be aleadGenerationForm
- The
bodySource
of thisSponsoredMessageContent
must beleadGenerationForm
and theAdFormUrn
must be the same as in this option'sactionTarget
- The
SponsoredMessageContent
should beOPTION_PROVIDING
(i.e.:nextAction
must be an array and the array must have between 1 to 5SponsoredMessageOptions
). - Note that the
optionText
will always be set to the thank you message from the ad form regardless of the input provided for theSponsoredMessageOption
optionText
.
- The
- If the type of the option is
EXTERNAL_WEBSITE
:- The
actionTarget
must be alandingPage
- The
nextAction
must not point to aSponsoredMessageContent
with abodySource
of typeleadGenerationForm
- The
- If the type of the option is
SIMPLE_REPLY
:- The
actionTarget
must be null - The
nextAction
must exist - The
nextAction
must not point to aSponsoredMessageContent
with abodySource
of typeleadGenerationForm
- The
- If the type of the option is
UNKNOWN
:- This is always invalid
Create Sponsored Message Content
Sponsored message content refers to conversation message nodes that can be sent to dedicated audiences that have established communications with your company. The nodes contain preset text responses that are triggered by user replies depending on the reply topic. You can create message nodes in your conversation by calling the sponsoredMessageContents
endpoint.
Depending on the content nodes in your conversation, the first content created through the API must be a content entity without a next action such as the final message in the conversation.
POST https://api.linkedin.com/v2/sponsoredConversations/{sponsoredConversationId}/sponsoredMessageContents
Sample Request (without next actions)
POST https://api.linkedin.com/v2/sponsoredConversations/1234/sponsoredMessageContents
{
"bodySource": {
"text": "Thank you for your time!"
}
}
Sample Request (with next actions)
POST https://api.linkedin.com/v2/sponsoredConversations/1234/sponsoredMessageContents
{
"bodySource": {
"text": "Hello!"
},
"nextAction": {
"array": [
{
"optionText": "No thanks",
"type": "SIMPLE_REPLY",
"nextContent" : "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,5678)"
},
{
"optionText": "Go to website",
"type": "EXTERNAL_WEBSITE",
"nextContent" : "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,5678)",
"actionTarget": { "landingPage": "https://www.example.com" }
}
]
}
}
Sample Request SponsoredMessageAttachmentWithText
The attachment asset is created using urn:li:digitalmediaRecipe:ads-image
. See note in Assets API for more info.
POST https://api.linkedin.com/v2/sponsoredConversations/1234/sponsoredMessageContents
{
"bodySource": {
"attachmentAndText": {
"attachment": {
"messageAttachment": {
"image": "urn:li:digitalmediaAsset:C5F0CAQGAq0elyqCQGQ"
}
},
"text": "Hello"
}
}
}
Create Sponsored Message Content in Batch
Sponsored message content refers to conversation message nodes that can be sent to dedicated audiences which have established communications with your company. The nodes contain preset text responses that are triggered by specific user replies depending on the reply topic. You can create message nodes in your conversation by calling the sponsoredMessageContents
endpoint.
Sample Request
POST https://api.linkedin.com/v2/sponsoredConversations/1234/sponsoredMessageContents
{
"elements": [
{
"bodySource": {"text": "Test message"},
"nextAction": {"string": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,5678)"}
},
{
"bodySource": {"text": "Another message"}
},
{
"bodySource": {"text": "Another message with simple reply"},
"nextAction": {"array": [{"optionText": "Simple Reply", "type": "SIMPLE_REPLY"}]}
}
]
}
Get All Sponsored Message Contents
You can retrieve message node contents in a created conversation by calling the sponsoredMessageContents
endpoint.
GET https://api.linkedin.com/v2/sponsoredConversations/{sponsoredConversationId}/sponsoredMessageContents
Sample Request
Sample Response
{
"elements":[
{
"sponsoredConversation":"urn:li:sponsoredConversation:1234",
"id":5678,
"bodySource":{
"text":"thank you!"
},
"body":"thank you!",
"type":"INFORMATION",
"$URN":"urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,5678)"
},
{
"sponsoredConversation":"urn:li:sponsoredConversation:1234",
"id":6789,
"bodySource":{
"text":"test intro"
},
"nextAction":{
"array":[
{
"landingPage":"http://linkedin.com",
"actionTarget":{
"landingPage":"http://linkedin.com"
},
"type":"EXTERNAL_WEBSITE",
"nextContent":"urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,6789)",
"optionText":"first button"
}
]
},
"body":"test intro",
"type":"OPTION_PROVIDING",
"$URN":"urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,7478)"
},
{
"sponsoredConversation":"urn:li:sponsoredConversation:1234",
"id":7486,
"bodySource":{
"text":"can you see the whole ads"
},
"nextAction":{
"array":[
{
"type":"SIMPLE_REPLY",
"nextContent":"urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,7494)",
"optionText":"yes"
}
]
},
"body":"can you see the whole ads",
"type":"OPTION_PROVIDING",
"$URN":"urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,7486)"
}
],
"paging":{
"count":10,
"start":0,
"links":[
]
}
}
Get Single Sponsored Message Contents
You can retrieve specific message node content in a created conversation by calling the sponsoredMessageContents
endpoint.
GET https://api.linkedin.com/v2/sponsoredConversations/{sponsoredConversationId}/sponsoredMessageContents/{sponsoredMessageContentId}
Sample Request
Sample Response
{
"sponsoredConversation":"urn:li:sponsoredConversation:1234",
"id":7478,
"bodySource":{
"text":"test intro"
},
"nextAction":{
"array":[
{
"landingPage":"http://example.com",
"actionTarget":{
"landingPage":"http://example.com"
},
"type":"EXTERNAL_WEBSITE",
"nextContent":"urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,7486)",
"optionText":"first button"
}
]
},
"body":"test intro",
"type":"OPTION_PROVIDING"
}
Partially Update Sponsored Message Content
You can partially update existing sponsored message content.
POST https://api.linkedin.com/v2/sponsoredConversations/{sponsoredConversationId}/sponsoredMessageContents/{sponsoredMessageContentId}
Sample Request
POST https://api.linkedin.com/v2/sponsoredConversations/1234/sponsoredMessageContents/5678
{
"patch": {
"$set": {
"bodySource":{
"leadGenerationForm":"urn:li:adForm:777890"
},
"nextAction":{
"array":[
{
"actionTarget": {
"landingPage": "https://abc.xyz/get/?mcv=123"
},
"type": "EXTERNAL_WEBSITE",
"nextContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1234,5678)",
"optionText": "Visit website"
}
]
}
}
}
}
A successful response returns a 204 No Content
HTTP status code and the ID in the x-linkedin-id
response header.
Partial Update of Sponsored Message Contents in Batch Mode
You can also partially update sponsored message contents in batch mode. You must update in batch mode when creating message contents containing the leadGenForm
.
POST https://api.linkedin.com/v2/sponsoredConversations/{sponsoredConversationId}/sponsoredMessageContents?ids=List({sponsoredMessageContentIds})
Sample Request
POST https://api.linkedin.com/v2/sponsoredConversations/987/sponsoredMessageContents?ids=List(123,345)
{
"entities":{
"3146":{
"patch":{
"$set":{
"nextAction":{
"array":[
{
"type": "SIMPLE_REPLY",
"nextContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1810,3122)",
"optionText": "View program details"
},
{
"type": "LEAD_GENERATION",
"actionTarget":{
"leadGenerationForm":"urn:li:adForm:778243"
},
"nextContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1810,3130)",
"optionText": "Speak with admissions"
},
{
"type": "SIMPLE_REPLY",
"nextContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1810,3138)",
"optionText": "No thanks"
}
]
}
}
}
},
"3122":{
"patch":{
"$set":{
"nextAction":{
"array":[
{
"actionTarget": {
"landingPage": "https://abc.com/get/?mcv=JDG550"
},
"type": "EXTERNAL_WEBSITE",
"nextContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1810,3106)",
"optionText": "Visit website"
},
{
"type": "LEAD_GENERATION",
"actionTarget":{
"leadGenerationForm":"urn:li:adForm:778243"
},
"nextContent": "urn:li:sponsoredMessageContent:(urn:li:sponsoredConversation:1810,3114)",
"optionText": "Speak with admissions"
}
]
}
}
}
},
"3114":{
"patch":{
"$set":{
"bodySource":{
"leadGenerationForm":"urn:li:adForm:778243"
},
"nextAction":{
"array":[
{
"type":"LEAD_GENERATION_THANK_YOU",
"actionTarget":{
"leadGenerationForm":"urn:li:adForm:778243"
},
"optionText":"Learn more"
}
]
}
}
}
},
"3130":{
"patch":{
"$set":{
"bodySource":{
"leadGenerationForm":"urn:li:adForm:778243"
},
"nextAction":{
"array":[
{
"type":"LEAD_GENERATION_THANK_YOU",
"actionTarget":{
"leadGenerationForm":"urn:li:adForm:778243"
},
"optionText":"Learn more"
}
]
}
}
}
}
}
}
Deleting Multiple Sponsored Message Content
You can delete multiple instances of Sponsored Message Content.
DELETE https://api.linkedin.com/v2/sponsoredConversations/{sponsoredConversationId}/sponsoredMessageContents?ids=List({sponsoredMessageContentIds})
Sample Request
DELETE https://api.linkedin.com/v2/sponsoredConversations/678/sponsoredMessageContents?ids=List(123,234)
Sample Response
{
"results":{
"7613":{
"status":204
},
"7605":{
"status":204
}
},
"errors":{
}
}
Create AdInMail Content for a Conversation Ad
InMail ads provide a way for marketers to increase their LinkedIn reach by sending personalized messages to their targeted audiences. AdInMail are tailored InMail messages that are delivered to a LinkedIn member's InMail inbox.
You can call the adInMailContentsV2
endpoint to create an AdInMailContents object to use in an ad creative. For Conversation Ads you need to provide a AdInMailGuidedRepliesSubContent as the subContent.
Sample Request
POST https://api.linkedin.com/v2/adInMailContentsV2
{
"account": "urn:li:sponsoredAccount:51234",
"name": "Employer Branding Journey",
"htmlBody": "<p>123<br><br>456</p>",
"subContent": {
"com.linkedin.ads.AdInMailGuidedRepliesSubContent": {
"sponsoredConversation": "urn:li:sponsoredConversation:508"
}
},
"legalText": {},
"subject": "Example Conversation Ad Content",
"sender": {
"displayName": "John Doe",
"displayPictureV2": "urn:li:digitalmediaAsset:C5ABC123",
"from": "urn:li:person:abc"
}
}