openapi: 3.1.0 info: title: LinkedIn Marketing API description: | REST API for managing LinkedIn advertising - ad accounts, ad account users, ad campaign groups, ad campaigns, and ad creatives. The versioned API requires the Linkedin-Version header (YYYYMM format) and the X-Restli-Protocol-Version: 2.0.0 header for most endpoints. Authentication uses an OAuth 2.0 bearer token with scopes such as rw_ads (read/write) or r_ads (read-only). version: "202605" contact: name: Kin Lane email: kin@apievangelist.com license: name: LinkedIn API Terms of Use url: https://www.linkedin.com/legal/l/api-terms-of-use servers: - url: https://api.linkedin.com description: LinkedIn API production security: - oauth2: [rw_ads] tags: - name: AdAccounts description: Manage ad accounts - name: AdCampaignGroups description: Manage campaign groups - name: AdCampaigns description: Manage campaigns - name: AdCreatives description: Manage creatives - name: AdAccountUsers description: Manage ad account user permissions paths: /rest/adAccounts: get: tags: [AdAccounts] summary: Search ad accounts operationId: adAccounts_search parameters: - name: q in: query required: true schema: type: string enum: [search] - name: search in: query schema: type: string description: 'Search criteria, e.g. (type:(values:List(BUSINESS)),status:(values:List(ACTIVE)))' - name: pageSize in: query schema: type: integer maximum: 1000 - name: pageToken in: query schema: type: string - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AdAccountSearchResponse' post: tags: [AdAccounts] summary: Create an ad account (or batch create with X-RestLi-Method header) operationId: adAccounts_create parameters: - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' - name: X-RestLi-Method in: header schema: type: string enum: [BATCH_CREATE] requestBody: required: true content: application/json: schema: oneOf: - $ref: '#/components/schemas/AdAccount' - type: object properties: elements: type: array items: $ref: '#/components/schemas/AdAccount' responses: '201': description: Created (account ID returned in x-restli-id header) /rest/adAccounts/{adAccountID}: get: tags: [AdAccounts] summary: Fetch an ad account operationId: adAccounts_get parameters: - $ref: '#/components/parameters/adAccountID' - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AdAccount' post: tags: [AdAccounts] summary: Update an ad account (partial update via patch payload) operationId: adAccounts_update parameters: - $ref: '#/components/parameters/adAccountID' - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' - name: X-RestLi-Method in: header schema: type: string enum: [PARTIAL_UPDATE] requestBody: required: true content: application/json: schema: type: object properties: patch: type: object properties: $set: type: object additionalProperties: true responses: '204': description: No Content delete: tags: [AdAccounts] summary: Delete a DRAFT ad account operationId: adAccounts_delete parameters: - $ref: '#/components/parameters/adAccountID' - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '204': description: No Content /rest/adAccounts/{adAccountID}/adCampaignGroups: get: tags: [AdCampaignGroups] summary: Search campaign groups for an ad account operationId: adCampaignGroups_search parameters: - $ref: '#/components/parameters/adAccountID' - name: q in: query schema: type: string enum: [search] - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK post: tags: [AdCampaignGroups] summary: Create a campaign group operationId: adCampaignGroups_create parameters: - $ref: '#/components/parameters/adAccountID' - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' requestBody: required: true content: application/json: schema: type: object responses: '201': description: Created /rest/adAccounts/{adAccountID}/adCampaignGroups/{campaignGroupID}: get: tags: [AdCampaignGroups] summary: Get a campaign group operationId: adCampaignGroups_get parameters: - $ref: '#/components/parameters/adAccountID' - name: campaignGroupID in: path required: true schema: type: string - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK post: tags: [AdCampaignGroups] summary: Update a campaign group (partial update) operationId: adCampaignGroups_update parameters: - $ref: '#/components/parameters/adAccountID' - name: campaignGroupID in: path required: true schema: type: string - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' - name: X-RestLi-Method in: header schema: type: string enum: [PARTIAL_UPDATE] requestBody: required: true content: application/json: schema: type: object responses: '204': description: No Content /rest/adAccounts/{adAccountID}/adCampaigns: get: tags: [AdCampaigns] summary: Search campaigns under an ad account operationId: adCampaigns_search parameters: - $ref: '#/components/parameters/adAccountID' - name: q in: query schema: type: string enum: [search] - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK post: tags: [AdCampaigns] summary: Create a campaign operationId: adCampaigns_create parameters: - $ref: '#/components/parameters/adAccountID' - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AdCampaign' responses: '201': description: Created /rest/adAccounts/{adAccountID}/adCampaigns/{adCampaignID}: get: tags: [AdCampaigns] summary: Get a campaign operationId: adCampaigns_get parameters: - $ref: '#/components/parameters/adAccountID' - name: adCampaignID in: path required: true schema: type: string - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AdCampaign' post: tags: [AdCampaigns] summary: Update a campaign (partial update) operationId: adCampaigns_update parameters: - $ref: '#/components/parameters/adAccountID' - name: adCampaignID in: path required: true schema: type: string - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' - name: X-RestLi-Method in: header schema: type: string enum: [PARTIAL_UPDATE] requestBody: required: true content: application/json: schema: type: object responses: '204': description: No Content /rest/adAccounts/{adAccountID}/adCreatives: get: tags: [AdCreatives] summary: Search creatives under an ad account operationId: adCreatives_search parameters: - $ref: '#/components/parameters/adAccountID' - name: q in: query schema: type: string enum: [search] - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK post: tags: [AdCreatives] summary: Create a creative operationId: adCreatives_create parameters: - $ref: '#/components/parameters/adAccountID' - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' requestBody: required: true content: application/json: schema: type: object responses: '201': description: Created /rest/adAccounts/{adAccountID}/adCreatives/{adCreativeID}: get: tags: [AdCreatives] summary: Get a creative operationId: adCreatives_get parameters: - $ref: '#/components/parameters/adAccountID' - name: adCreativeID in: path required: true schema: type: string - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK /rest/adAccountUsers: get: tags: [AdAccountUsers] summary: Find ad account users operationId: adAccountUsers_find parameters: - name: q in: query required: true schema: type: string enum: [accounts] - name: accounts in: query schema: type: string description: 'Sponsored account URN, e.g. urn:li:sponsoredAccount:{id}' - $ref: '#/components/parameters/linkedinVersion' - $ref: '#/components/parameters/restliProtocol' responses: '200': description: OK components: securitySchemes: oauth2: type: oauth2 description: LinkedIn OAuth 2.0 (3-legged or 2-legged) flows: authorizationCode: authorizationUrl: https://www.linkedin.com/oauth/v2/authorization tokenUrl: https://www.linkedin.com/oauth/v2/accessToken scopes: rw_ads: Read and write LinkedIn ads data r_ads: Read LinkedIn ads data r_ads_reporting: Read LinkedIn ads reporting r_organization_social: Read organization social actions w_organization_social: Write organization social actions parameters: adAccountID: name: adAccountID in: path required: true schema: type: string linkedinVersion: name: Linkedin-Version in: header required: true description: LinkedIn API version in YYYYMM format schema: type: string example: "202605" restliProtocol: name: X-Restli-Protocol-Version in: header required: true schema: type: string enum: ["2.0.0"] schemas: AdAccount: type: object required: [name, type] properties: id: type: integer format: int64 name: type: string type: type: string enum: [BUSINESS, ENTERPRISE] currency: type: string default: USD reference: type: string description: 'URN such as urn:li:organization:{id} or urn:li:person:{id}' status: type: string enum: [ACTIVE, DRAFT, CANCELED, PENDING_DELETION, REMOVED] default: ACTIVE notifiedOnCampaignOptimization: type: boolean notifiedOnCreativeApproval: type: boolean notifiedOnCreativeRejection: type: boolean notifiedOnEndOfCampaign: type: boolean notifiedOnNewFeaturesEnabled: type: boolean servingStatuses: type: array items: type: string enum: [RUNNABLE, STOPPED, BILLING_HOLD, ACCOUNT_TOTAL_BUDGET_HOLD, ACCOUNT_END_DATE_HOLD, RESTRICTED_HOLD, INTERNAL_HOLD] test: type: boolean default: false AdAccountSearchResponse: type: object properties: elements: type: array items: $ref: '#/components/schemas/AdAccount' metadata: type: object properties: nextPageToken: type: string AdCampaign: type: object properties: id: type: integer format: int64 name: type: string account: type: string description: 'urn:li:sponsoredAccount:{id}' status: type: string enum: [ACTIVE, PAUSED, ARCHIVED, COMPLETED, CANCELED, DRAFT, PENDING_DELETION, REMOVED] type: type: string enum: [TEXT_AD, SPONSORED_UPDATES, SPONSORED_INMAILS, DYNAMIC] costType: type: string enum: [CPC, CPM, CPV] dailyBudget: type: object properties: amount: type: string currencyCode: type: string associatedEntity: type: string description: 'urn:li:organization:{id}' audienceExpansionEnabled: type: boolean locale: type: object targetingCriteria: type: object test: type: boolean