Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Warning
Deprecation Notice: The Marketing Version 202510 (Marketing October 2025) will be sunset on October 15, 2026. We recommend that you migrate to the latest versioned APIs to avoid disruptions. For information on all the supported versions, refer to the migrations documentation. If you haven’t yet migrated and have questions, submit a request on the LinkedIn Developer Support Portal.
LinkedIn Event Ads are a type of Sponsored Content that allows advertisers to promote events directly in the LinkedIn feed. This ad type enables advertisers to seamlessly promote a LinkedIn event to a defined audience before, during, and after the event. By using Event Ads, advertisers can increase event visibility, drive registrations, and engage with attendees throughout the event lifecycle.
For Live Events, this format provides an immersive ad experience for event attendees and registrants. Before the event, members can seamlessly register and view event details. During the event, members can watch the live stream directly in their feed. After the event, members can watch a replay of the event.
Supported event types for Event Ads
Event Ads can promote events created with the Events Management API. Supported event types include:
| Event type | Description |
|---|---|
| LinkedIn Live (on-platform) | Live video events streamed on LinkedIn. Use type.online.format.liveVideo when creating the event. |
| External online (on-platform) | Virtual events hosted on an external website with a LinkedIn Events Detail Page. Create the event with type.online.format.external; members register on LinkedIn and attend via your URL. |
| In-person (on-platform) | Events at a physical location with a LinkedIn Events Detail Page. Use type.inPerson when creating the event. |
| Off-platform event ad (no EDP) | An event created solely to back a sponsored ad campaign, without a LinkedIn Events Detail Page. Supported for external online (type.online.format.external) and in-person (type.inPerson) events that include an external URL. Create the event with hasDarkUgc: true. The event is not visible on organic surfaces and the ad always redirects to the external URL. See Create an Off-Platform Event Ad without a LinkedIn Events Detail Page. |
For a general external event creation example, refer to the External event example in the Events Management API documentation. For off-platform Event Ads (no EDP), additionally set hasDarkUgc: true as described in the table above and detailed in Create an Off-Platform Event Ad without a LinkedIn Events Detail Page.
Authentication
This API follows our standard OAuth Authorization Code flow.
The user authenticates with LinkedIn (see OAuth guidance in the Appendix for introducing a new permission into your OAuth flow scopes). Ensure all the necessary scopes (permissions) are requested:
rw_ads(for campaign and ad/creative management)w_organization_social,r_organization_social(to manage company page posts)r_events(get events).
This API follows our standard OAuth Authorization Code flow.
The user authenticates with LinkedIn (see OAuth guidance in the Appendix for introducing a new permission into your OAuth flow scopes). Ensure all the necessary scopes (permissions) are requested:
rw_ads(for campaign and ad/creative management)w_organization_social,r_organization_social(to manage company page posts)r_events(get events).rw_events(create and manage events, required for off-platform events withhasDarkUgc: true).
Permissions
| Permission | Description | Product |
|---|---|---|
w_organization_social |
Post, comment, and like posts on behalf of an organization. Restricted to the company admin, DSC poster, or content admin. | Advertising API |
r_organization_social |
Retrieve Posts on the company page. | Advertising API |
rw_ads |
Create ads and creatives for a sponsored account. | Advertising API |
r_ads |
Read an authenticated member's Ad Account. 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 |
Advertising API |
r_events |
Retrieve organization’s events. Restricted to organizations in which the authenticated member has one of the following company page roles: ADMINISTRATOR, CONTENT_ADMINISTRATOR |
Event Management API |
| Permission | Description | Product |
|---|---|---|
w_organization_social |
Post, comment, and like posts on behalf of an organization. Restricted to the company admin, DSC poster, or content admin. | Advertising API |
r_organization_social |
Retrieve Posts on the company page. | Advertising API |
rw_ads |
Create ads and creatives for a sponsored account. | Advertising API |
r_ads |
Read an authenticated member's Ad Account. 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 |
Advertising API |
r_events |
Retrieve organization’s events. Restricted to organizations in which the authenticated member has one of the following company page roles: ADMINISTRATOR, CONTENT_ADMINISTRATOR |
Event Management API |
rw_events |
Create and manage organization’s events. Required for creating off-platform events with hasDarkUgc: true. Restricted to organizations in which the authenticated member has one of the following company page roles: ADMINISTRATOR, CONTENT_ADMINISTRATOR |
Event Management API |
Schema
Note
Starting 202410, the name field is introduced in Creative schema. Going forward, this name field is the preferred approach to set and get the creative's name, consistently across all ad formats.
Familiarize yourself with the following APIs required to create an Event Ad:
- Campaigns - create campaigns.
- Campaign Groups - create campaign groups.
- Posts- create posts (User Generated Content) on behalf of an organization.
- Creatives - design creative content for an Ad Campaign.
- Events- retrieve Events
Schema for entire creative is similar to Creatives, only the content field now supports an Event Ad content for the creation and management of Event Ads.
Schema for Event Ad Content is as follows:
| Field | Type | Details | Required |
|---|---|---|---|
| post | UserGeneratedContentPostUrn | URN identifying the sponsored user generated content post. This field is read only. | Yes |
| directSponsoredContent | boolean | Indicates whether the creative is direct sponsored content or not. This field is read only. | No |
| event | EventUrn | The LinkedIn event URN associated with this creative. This field is derived from the UGC post URN and is read only. | Yes |
| preEventRegistrationImage | DigitalmediaAssetUrn | Image shown to users who haven't registered for the event yet. | No |
| hidePreviewVideo | boolean | This flag indicates whether the preview should be hidden or not. | No |
| contentAuthor | URN | Author of the content. Optional for backwards compatibility reasons. | No |
Restrictions
The following campaign objective types are supported for the Event Ads ad format:
- Brand awareness (
BRAND_AWARENESS) - Website visits (
WEBSITE_VISITS) - Engagement (
ENGAGEMENT) - Lead generation (
LEAD_GENERATION)
Note
Event Ads have the following restrictions:
- Event Ads are currently not available for delivery on the LinkedIn Audience Network.
- Audio events are not supported for Event Ads.
Create an Event Ad with a New Post
The event you promote can be any on-platform event with a LinkedIn Events Detail Page (LinkedIn Live video, external online, or in-person), or an off-platform event created with hasDarkUgc: true (external online or in-person with an external URL). In all cases, you create a dark post that references the event, then create an Event Ad creative that ties the campaign to that post.
To create an event creative, the following steps must be followed:
- Create a Campaign for Event Ad.
- Create the Post for the Event (This should be a dark post).
- Create an Event Creative with the Event dark post.
Create a Campaign for the Event Ad
POST https://api.linkedin.com/rest/adAccounts/{adAccountId}/adCampaigns
{
"account": "urn:li:sponsoredAccount:{adAccountId}",
"campaignGroup": "urn:li:sponsoredCampaignGroup:{campaignGroupId}",
"audienceExpansionEnabled": false,
"costType": "CPV",
"connectedTelevisionOnly": false,
"objectiveType": "ENGAGEMENT",
"creativeSelection": "OPTIMIZED",
"locale": {"language": "en", "country": "US"},
"name": "Testing Live Event Ads",
"format": "SPONSORED_UPDATE_EVENT",
"offsiteDeliveryEnabled": false,
"runSchedule": {
"start": 1520890990333,
"end": 1521754990333
},
"targetingCriteria": {
"include": {
"and": [
{
"or": {
"urn:li:adTargetingFacet:interfaceLocales": [
"urn:li:locale:en_US"
]
}
},
{
"or": {
"urn:li:adTargetingFacet:locations": [
"urn:li:geo:103644278"
]
}
}
]
}
},
"type": "SPONSORED_UPDATES",
"dailyBudget": {
"currencyCode": "USD",
"amount": "18"
},
"unitCost": {
"amount": "15",
"currencyCode": "USD"
},
"status": "ACTIVE"
}
A successful response returns a 201 Created HTTP status code and the campaign ID in the x-restli-id response header. For example, urn:li:sponsoredCampaign:164380864.
Note
To use lifetime or accelerated pacing (pacingStrategy: LIFETIME or ACCELERATED), see Accelerated Delivery.
Get an Event by ID
Note
Replace the eventId parameter with the specific Event ID, which will look like 7189069406168117248.
Note
The organizer returned in the response must match the organization tied to the ad account used in the Event Ad campaign.
Sample Response
{
"vanityName": "testlive7189069406168117248",
"settings": {
"entryCriteria": "PUBLIC",
"attendanceMode": "VIRTUAL",
"discoveryMode": "LISTED",
"invitationSettings": {
"invitationPrivilegePolicies": [
{
"com.linkedin.adsexternalapi.events.v1.SimpleEventInvitationPrivilegePolicyV1": "ALL_ATTENDEES"
}
]
},
"mapsToSingleUgcPost": true
},
"timeRangeV2": {
"startsAt": 1735704000000
},
"localizedName": "Test Live",
"created": {
"actor": "urn:li:person:kb6e46S_kG",
"time": 1714007712961
},
"organizer": "urn:li:organization:1234657",
"name": {
"localized": {
"en_US": "Test Live"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"id": 7189069406168117248,
"lastModified": {
"actor": "urn:li:person:kb6e46S_kG",
"time": 1714007712961
},
"localizedDescription": {
"rawText": ""
},
"ugcPost": "urn:li:ugcPost:7246667386014023680"
}
A successful response returns a 200 OK HTTP status code.
Note
Using the URN from the ugcPost field, get the post by calling the GET Posts endpoint to get either the liveVideo URN (for a Live event) or an event URN (for a non-Live event). The ugcPost URN or the event URN is used in the next step to create a dark events ads post.
Get a Post by URN
Replace the encodedUgcPostUrn parameter with the specific URL-encoded URN, which will look like urn%3Ali%3AugcPost%3A7246667386014023680.
Sample Response
{
"isReshareDisabledByAuthor": false,
"createdAt": 1727740141581,
"lifecycleState": "PUBLISHED",
"lastModifiedAt": 1727740156240,
"visibility": "PUBLIC",
"publishedAt": 1727740141581,
"author": "urn:li:organization:1234657",
"id": "urn:li:ugcPost:7246667386014023680",
"distribution": {
"feedDistribution": "MAIN_FEED",
"thirdPartyDistributionChannels": []
},
"content": {
"reference": {
"id": "urn:li:liveVideo:{liveVideoId}"
}
},
"commentary": "Testing live event, September 2024 POST",
"lifecycleStateInfo": {
"isEditedByAuthor": false
}
}
A successful response returns a 200 OK HTTP status code. Using the live video URN from the response in this step, create the dark post in this step.
Create a Dark Post for a Live Event
Use the live video URN from the previous step as the content reference. For non-live event types (external online or in-person), use urn:li:event:{eventId} instead.
POST https://api.linkedin.com/rest/posts
{
"adContext": {
"dscAdAccount": "urn:li:sponsoredAccount:{adAccountId}",
"dscStatus": "ACTIVE"
},
"author": "urn:li:organization:{organizationId}",
"commentary": "Sample Live Event Post",
"visibility": "PUBLIC",
"distribution": {
"feedDistribution": "NONE",
"targetEntities": [],
"thirdPartyDistributionChannels": []
},
"content":{
"reference":{
"id": "urn:li:liveVideo:{liveVideoId}"
}
},
"lifecycleState": "PUBLISHED",
"isReshareDisabledByAuthor": true
}
A successful response returns a 201 Created HTTP status code and the ID in the x-restli-id response header.
Create an Event Ad Creative
This creative ties the campaign and the dark post together.
POST https://api.linkedin.com/rest/adAccounts/{adAccountId}/creatives
{
"content": {
"reference": "urn:li:ugcPost:{ugcPostId}"
},
"campaign": "urn:li:sponsoredCampaign:{campaignId}",
"intendedStatus": "ACTIVE"
}
A successful response returns a 201 Created HTTP status code and the ID in the x-restli-id response header. For example, urn:li:sponsoredCreative:120491345.
Accelerated Delivery
Event Ads support two non-default pacing strategies via the pacingStrategy field. By default (no pacingStrategy set), budget is distributed evenly each day using dailyBudget.
| Setting | Lifetime pacing | Accelerated pacing |
|---|---|---|
pacingStrategy value |
LIFETIME |
ACCELERATED |
| Budget type | totalBudget (required) |
totalBudget (required) |
runSchedule.end |
Required | Required |
| Spend rate | Evenly over campaign duration | As fast as possible |
| Max campaign duration | No limit | 24 hours |
| Supported event types | All | All |
Note
Both LIFETIME and ACCELERATED require totalBudget (not dailyBudget) and a runSchedule.end date. Campaigns with pacingStrategy: ACCELERATED must be no longer than 24 hours in duration.
The following example shows a campaign with accelerated delivery. To use lifetime pacing instead, replace "pacingStrategy": "ACCELERATED" with "pacingStrategy": "LIFETIME" — the rest of the request is identical.
Sample Request
POST https://api.linkedin.com/rest/adAccounts/{adAccountId}/adCampaigns
{
"account": "urn:li:sponsoredAccount:{adAccountId}",
"campaignGroup": "urn:li:sponsoredCampaignGroup:{campaignGroupId}",
"audienceExpansionEnabled": false,
"costType": "CPC",
"connectedTelevisionOnly": false,
"objectiveType": "ENGAGEMENT",
"creativeSelection": "OPTIMIZED",
"locale": {"language": "en", "country": "US"},
"name": "Event Ad — Accelerated Delivery",
"format": "SPONSORED_UPDATE_EVENT",
"pacingStrategy": "ACCELERATED",
"offsiteDeliveryEnabled": false,
"runSchedule": {
"start": 1735704000000,
"end": 1735790400000
},
"targetingCriteria": {
"include": {
"and": [
{
"or": {
"urn:li:adTargetingFacet:locations": [
"urn:li:geo:103644278"
]
}
}
]
}
},
"type": "SPONSORED_UPDATES",
"totalBudget": {
"currencyCode": "USD",
"amount": "100"
},
"unitCost": {
"amount": "15",
"currencyCode": "USD"
},
"status": "ACTIVE"
}
A successful response returns a 201 Created HTTP status code and the campaign ID in the x-restli-id response header. After creating the campaign, proceed with the standard Create a Dark Post and Create an Event Ad Creative steps.
Create an Off-Platform Event Ad without a LinkedIn Events Detail Page
Use this flow to create an Event Ad for an off-platform event that has no LinkedIn Events Detail Page (EDP). The event is created solely to back a sponsored ad campaign and does not appear on organic surfaces. The ad always redirects to the external URL regardless of the event lifecycle stage (pre-event, during, post-event).
Compared to the standard Event Ads flow, the key difference is in Step 1: you create a new event with hasDarkUgc: true rather than referencing a pre-existing LinkedIn event. All subsequent steps (campaign, dark post, creative) follow the same pattern.
hasDarkUgc |
LinkedIn Events Detail Page | Visible on organic surfaces | Ad URL routing |
|---|---|---|---|
false (default) |
Yes | Yes | EDP pre/post-event; external URL during event |
true |
No | No | Always external URL |
Note
hasDarkUgc and discoveryMode are independent fields. hasDarkUgc: true suppresses the event from all organic event surfaces (events home, feed, search, and recommendations) at the platform level, regardless of discoveryMode. The discoveryMode field remains LISTED by default in the API response but has no practical effect on organic visibility for hasDarkUgc: true events.
Step 1: Create the Event
Create an off-platform event with hasDarkUgc: true. Note the id in the response — you will use that value as {eventId} to construct the event URN (urn:li:event:{eventId}) in the next step.
This requires the rw_events permission. The organizer must be the same organization tied to the ad account used in the campaign.
POST https://api.linkedin.com/rest/events
{
"name": {
"localized": {
"en_US": "My Off-Platform Event Ad"
}
},
"type": {
"online": {
"format": {
"external": {
"endsAt": 1777839939000,
"url": "https://example.com/my-event"
}
}
}
},
"organizer": "urn:li:organization:{organizationId}",
"startsAt": 1777829139000,
"hasDarkUgc": true
}
Sample Response
HTTP/1.1 201 Created
{
"hasDarkUgc": true,
"vanityName": "myoffplatformeventad7424900030345404416",
"discoveryMode": "LISTED",
"created": {
"actor": "urn:li:person:vU6QAVEtcr",
"time": 1770234115561
},
"organizer": "urn:li:organization:7185861",
"name": {
"localized": {
"en_US": "My Off-Platform Event Ad"
}
},
"startsAt": 1777829139000,
"id": 7424900030345404416,
"lastModified": {
"actor": "urn:li:person:vU6QAVEtcr",
"time": 1770234115561
},
"type": {
"online": {
"format": {
"external": {
"endsAt": 1777839939000,
"url": "https://example.com/my-event"
}
}
}
}
}
Step 2: Create a Campaign
Create a campaign with format: SPONSORED_UPDATE_EVENT. See Create a Campaign for the Event Ad for a full example — the campaign creation request is the same as for standard Event Ads.
Step 3: Create a Dark Post
Create a dark post referencing the event URN (urn:li:event:{eventId}) from the Step 1 response. Unlike Live Event Ads (which reference a liveVideo URN), off-platform event ads reference the event URN directly.
POST https://api.linkedin.com/rest/posts
{
"adContext": {
"dscAdAccount": "urn:li:sponsoredAccount:{adAccountId}",
"dscStatus": "ACTIVE"
},
"author": "urn:li:organization:{organizationId}",
"commentary": "Join us for our upcoming event!",
"visibility": "PUBLIC",
"distribution": {
"feedDistribution": "NONE",
"targetEntities": [],
"thirdPartyDistributionChannels": []
},
"content": {
"reference": {
"id": "urn:li:event:{eventId}"
}
},
"lifecycleState": "PUBLISHED",
"isReshareDisabledByAuthor": true
}
A successful response returns a 201 Created HTTP status code and the dark post URN in the x-restli-id response header.
Step 4: Create an Event Ad Creative
Tie the campaign and the dark post together. This step is identical to the standard Event Ads creative creation.
POST https://api.linkedin.com/rest/adAccounts/{adAccountId}/creatives
{
"content": {
"reference": "urn:li:ugcPost:{ugcPostId}"
},
"campaign": "urn:li:sponsoredCampaign:{campaignId}",
"intendedStatus": "ACTIVE"
}
A successful response returns a 201 Created HTTP status code and the ID in the x-restli-id response header.
Lead Generation with Event Ads
This section describes the workflow for creating Event Ads with the LEAD_GENERATION objective.
Create a Lead Gen Event Ad with a New Post
Before starting, ensure the target event has already been created via the Events Management API. Lead gen registration forms used by the ad's CTA are associated with the ad creative (see leadgenCallToAction.destination), separate from any organic registration form attached to the event itself.
Follow the steps to create a Lead Gen event creative:
- Create a Campaign for Event Ad.
- Validate Event Eligibility and verify lead gen requirements.
- Get a Post by URN and verify it references the Event.
- Create a Dark Post for the Event.
- Create an Event Ad Creative with Lead Gen CTA.
- Optionally Verify Created Creative and Verify Campaign Objective.
Create a Campaign for Event Ad with LEAD_GENERATION
Sample Request
POST https://api.linkedin.com/rest/adAccounts/{adAccountId}/adCampaigns
{
"account": "urn:li:sponsoredAccount:{adAccountId}",
"campaignGroup": "urn:li:sponsoredCampaignGroup:{campaignGroupId}",
"objectiveType": "LEAD_GENERATION",
"format": "SPONSORED_UPDATE_EVENT",
"costType": "CPC",
"name": "Event Lead Gen Campaign",
"type": "SPONSORED_UPDATES",
"status": "DRAFT",
"dailyBudget": {
"currencyCode": "USD",
"amount": "50"
},
"unitCost": {
"currencyCode": "USD",
"amount": "5.00"
},
"targetingCriteria": {
"include": {
"and": [
{
"or": {
"urn:li:adTargetingFacet:locations": [
"urn:li:geo:103644278"
]
}
},
{
"or": {
"urn:li:adTargetingFacet:interfaceLocales": [
"urn:li:locale:en_US"
]
}
}
]
}
},
"locale": {
"country": "US",
"language": "en"
},
"offsiteDeliveryEnabled": false,
"politicalIntent": "NOT_POLITICAL",
"runSchedule": {
"start": 1738800000000
}
}
Note
Ensure objectiveType is LEAD_GENERATION and format is SPONSORED_UPDATE_EVENT for a valid Lead Gen Event campaign.
A successful response returns a 201 Created HTTP status code and the ID in the x-restli-id response header.
Validate Event Eligibility
Sample Request
Sample Response
{
"vanityName": "testeventleadgen7424807067934375937",
"discoveryMode": "LISTED",
"ugcPost": "urn:li:ugcPost:7424807071402991617",
"leadGenForm": "urn:li:versionedLeadGenForm:(urn:li:leadGenForm:7424807067728912384,1)",
"organizer": "urn:li:organization:103056081",
"created": {
"actor": "urn:li:person:XQcAjrNBrF",
"time": 1770211951302
},
"name": {
"localized": {
"en_US": "Test event LeadGen"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"startsAt": 1801755000000,
"id": 7424807067934375937,
"lastModified": {
"actor": "urn:li:person:XQcAjrNBrF",
"time": 1770211952201
},
"type": {
"inPerson": {
"endsAt": 1801758600000,
"address": {
"geographicArea": "Maharashtra",
"country": "IN",
"city": "Pune"
}
}
}
}
Note
Using the ugcPost URN from the Event response, call GET Posts and verify the post references the same Event.
Ensure the organizer matches the organization tied to the ad account/campaign before proceeding. The event's organic leadGenForm field (if present) is independent of the form used by the Event Ad's CTA. The ad's form is attached to the creative via leadgenCallToAction.destination.
Get a Post by URN for LEAD_GENERATION
Sample Request
Sample Response
{
"isReshareDisabledByAuthor": false,
"createdAt": 1770211952157,
"lifecycleState": "PUBLISHED",
"lastModifiedAt": 1770211976810,
"visibility": "PUBLIC",
"publishedAt": 1770211952157,
"author": "urn:li:organization:103056081",
"id": "urn:li:ugcPost:7424807071402991617",
"distribution": {
"feedDistribution": "MAIN_FEED",
"thirdPartyDistributionChannels": []
},
"content": {
"reference": {
"id": "urn:li:event:7424807067934375937"
}
},
"commentary": "",
"lifecycleStateInfo": {
"isEditedByAuthor": false
}
}
Note
Verify that content.reference.id is the expected Event URN before creating the dark post.
Create a Dark Post for the Event
Sample Request
POST https://api.linkedin.com/rest/posts
{
"author": "urn:li:organization:{organizationId}",
"lifecycleState": "PUBLISHED",
"commentary": "Test post",
"visibility": "PUBLIC",
"distribution": {
"feedDistribution": "NONE"
},
"content": {
"reference": {
"id": "urn:li:event:{eventId}"
}
},
"adContext": {
"dscAdAccount": "urn:li:sponsoredAccount:{adAccountId}",
"dscStatus": "ACTIVE"
}
}
Note
Ensure author matches the campaign associated entity and adContext.dscAdAccount matches the campaign account to avoid creative validation errors.
A successful response returns a 201 Created HTTP status code and the ID in the x-restli-id response header.
Create Event Ad Creative with Lead Gen CTA
Sample Request
POST https://api.linkedin.com/rest/adAccounts/{adAccountId}/creatives
{
"content": {
"reference": "urn:li:ugcPost:{ugcPostId}"
},
"campaign": "urn:li:sponsoredCampaign:{campaignId}",
"leadgenCallToAction": {
"destination": "urn:li:adForm:{adFormId}",
"label": "REGISTER"
},
"intendedStatus": "ACTIVE"
}
Note
Use the dark post URN for the same Event in content.reference.
Ensure campaign belongs to the same ad account and leadgenCallToAction.destination account matches the campaign account to avoid MISMATCH_FIELDS errors.
A successful response returns a 201 Created HTTP status code and the ID in the x-restli-id response header. For example, urn:li:sponsoredCreative:1172099093.
Verify Created Creative (Optional)
Sample Request
Sample Response
{
"servingHoldReasons": [
"FORM_HOLD",
"UNDER_REVIEW",
"CAMPAIGN_STOPPED",
"ACCOUNT_SERVING_HOLD",
"CAMPAIGN_GROUP_STATUS_HOLD",
"CAMPAIGN_GROUP_END_DATE_HOLD"
],
"lastModifiedAt": 1770368999914,
"leadgenCallToAction": {
"destination": "urn:li:adForm:8246744",
"label": "REGISTER"
},
"lastModifiedBy": "urn:li:person:SxmZ_oygU7",
"content": {
"eventAd": {
"post": "urn:li:ugcPost:7425461981719060480",
"event": "urn:li:event:7425124626453778432",
"hidePreviewVideo": false,
"directSponsoredContent": true
}
},
"createdAt": 1770368635830,
"createdBy": "urn:li:person:B1U4S2MZ-C",
"isTest": false,
"review": {
"status": "PENDING"
},
"isServing": false,
"campaign": "urn:li:sponsoredCampaign:479393263",
"id": "urn:li:sponsoredCreative:1172099093",
"intendedStatus": "ACTIVE",
"account": "urn:li:sponsoredAccount:508915158"
}
Note
Confirm the response includes leadgenCallToAction and that content.eventAd.event matches the intended Event URN.
Verify Campaign Objective (Optional)
Sample Request
Sample Response
{
"storyDeliveryEnabled": false,
"targetingCriteria": {
"include": {
"and": [
{
"or": {
"urn:li:adTargetingFacet:locations": [
"urn:li:geo:103644278"
]
}
},
{
"or": {
"urn:li:adTargetingFacet:interfaceLocales": [
"urn:li:locale:en_US"
]
}
}
]
}
},
"connectedTelevisionOnly": false,
"locale": {
"country": "US",
"language": "en"
},
"type": "SPONSORED_UPDATES",
"optimizationTargetType": "NONE",
"runSchedule": {
"start": 1738800000000
},
"changeAuditStamps": {
"created": {
"actor": "urn:li:unknown:0",
"time": 1770367562770
},
"lastModified": {
"actor": "urn:li:unknown:0",
"time": 1770367562770
}
},
"costType": "CPC",
"creativeSelection": "OPTIMIZED",
"offsiteDeliveryEnabled": false,
"id": 479393263,
"audienceExpansionEnabled": false,
"test": false,
"format": "SPONSORED_UPDATE_EVENT",
"servingStatuses": [
"STOPPED",
"ACCOUNT_SERVING_HOLD",
"CAMPAIGN_GROUP_STATUS_HOLD",
"CAMPAIGN_GROUP_END_DATE_HOLD"
],
"version": {
"versionTag": "1"
},
"objectiveType": "LEAD_GENERATION",
"associatedEntity": "urn:li:organization:2414183",
"campaignGroup": "urn:li:sponsoredCampaignGroup:619393574",
"dailyBudget": {
"currencyCode": "USD",
"amount": "50"
},
"politicalIntent": "NOT_POLITICAL",
"unitCost": {
"currencyCode": "USD",
"amount": "5"
},
"name": "Event Lead Gen Campaign",
"account": "urn:li:sponsoredAccount:508915158",
"status": "DRAFT"
}
Note
Ensure that objectiveType is set to LEAD_GENERATION and format is set to SPONSORED_UPDATE_EVENT to confirm campaign compatibility for Lead Gen Event Ads.
Appendix
OAuth Guidance
Since you'll be adding new permissions to the OAuth scopes, your customers will need to reauthenticate to allow you to make API calls to the new endpoints on their behalf. To do this seamlessly and with minimal disruption to your customers, we recommend the following: (Please note that the guidance below assumes you're using the same Client ID and Secret.)
Update your OAuth flow scope with the new permissions required to access the APIs for the new feature. New customers (have never been a customer on your platform before) will by default trigger the updated OAuth flow (thus moving forward they'll be able to access the new features from an access token perspective once you’ve ungated the feature in the UI for them). Existing customers who are not ramped to this new feature in your UI and thus not using the new permissions will continue as is, for now. When you exchange their refresh token for a new access token every 60 days, the access token returned will only have the scopes initially granted for the initial refresh token (this won't reflect the updated OAuth scope). If an existing user’s access tokens become invalidated/revoked or the refresh token expires, you'll force them to reauthenticate and go through the updated OAuth flow with the new scope and permissions (thus moving forward they'll be able to access the new features from an access token perspective once you’ve ungated the feature in the UI for them). Existing customers who are ramped to use the new feature in your UI and the new permissions When they signal they want to use the new feature you'll force them to reauthenticate and go through the updated OAuth flow with the updated scope and permissions
Note: Once users reauthenticate, all tokens previously generated for each user by your client ID and secret will be invalidated so only the newly generated access and refresh token should be stored and used moving forward. A user can have multiple active/valid tokens generated by your client id and client secret so long as they were all granted with the same scopes.
Frequently Asked Questions
Q1: What if I want to use the same client ID and secret but want separate OAuth flows for each feature (matched audiences, Lead Syncing, conversions, etc)? In other words, the user authenticates for each feature with a unique set of scopes
Answer: This is not recommended because a user may use multiple features within your platform which would lead to token conflicts and the user inadvertently invalidating their tokens. If you want to achieve separate OAuth flows with unique scopes for each feature then you'll need a LinkedIn Developer App for each feature and use the unique Client ID and Secret for each OAuth flow.
API Error Details
General creative errors are included here - Creatives error.