Event Ads API

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 with hasDarkUgc: 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:

  1. Create a Campaign for Event Ad.
  2. Create the Post for the Event (This should be a dark post).
  3. 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

GET https://api.linkedin.com/rest/events/{eventId}

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

GET https://api.linkedin.com/rest/posts/{encodedUgcPostUrn}

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:

  1. Create a Campaign for Event Ad.
  2. Validate Event Eligibility and verify lead gen requirements.
  3. Get a Post by URN and verify it references the Event.
  4. Create a Dark Post for the Event.
  5. Create an Event Ad Creative with Lead Gen CTA.
  6. 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

GET https://api.linkedin.com/rest/events/{eventId}

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

GET https://api.linkedin.com/rest/posts/{encodedUgcPostUrn}

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

GET https://api.linkedin.com/rest/adAccounts/{adAccountId}/creatives/{encodedCreativeUrn}

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

GET https://api.linkedin.com/rest/adAccounts/{adAccountId}/adCampaigns/{campaignId}

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.