LinkedIn Ads API: Access, Versions, and Reporting

By Mika ReyesPublished 7 min read

The short answer

The LinkedIn Ads API is the Advertising API in LinkedIn's Marketing API program. Create a developer app tied to a LinkedIn Page, request the Advertising API on the Products tab, and you start in the Development tier, which edits up to 5 ad accounts. Calls go to api.linkedin.com/rest with a LinkedIn-Version header (latest 202610) and need r_ads, rw_ads, or r_ads_reporting. Reporting runs through adAnalytics.

The LinkedIn Ads API is the Advertising API, one product in LinkedIn's Marketing API program. It manages ad accounts, campaign groups, campaigns, and creatives, and it reports on them through the adAnalytics endpoint. Every call goes to https://api.linkedin.com/rest/ with a monthly LinkedIn-Version header.

This guide is for developers at marketing platforms and SaaS products adding LinkedIn ads features for their customers. Everything below comes from LinkedIn's Marketing API docs on Microsoft Learn, version 202610.

What is the LinkedIn Ads API?

The LinkedIn Ads API is LinkedIn's Advertising API: the product that creates and manages Campaign Manager objects and reads their performance. It sits next to other Marketing API products, each with its own application.

LinkedIn Marketing API product What it's for Access
Advertising API Ad accounts, campaigns, creatives, reporting Open to approved developers
Community Management API Organic Page posts, comments, analytics Open to approved developers
Lead Sync API Lead gen form responses Open to approved developers
Conversions API Sending conversion events Open to approved developers
Matched Audiences API Uploading audience segments Requires Advertising API access first
Audience Insights, Media Planning Planning data Restricted, case by case

Source: LinkedIn's Increasing Access page.

How do I get LinkedIn Ads API access?

You get LinkedIn Ads API access by creating a developer app tied to a LinkedIn Page and requesting the Advertising API on the app's Products tab. The steps from LinkedIn's Marketing API quick start:

  1. Create a LinkedIn Page for your company if you don't have one.
  2. Create a developer app in the LinkedIn Developer Portal.
  3. Check the restricted use cases. LinkedIn rejects apps whose use case falls under its API and data restrictions, so read them before you apply.
  4. Apply for the Advertising API under the app's Products tab, and complete the access form.
  5. Map your ad accounts. In the Development tier, copy each nine-digit ad account ID from Campaign Manager, then add it under Products > View Ad Accounts.
  6. Generate a test token with the Developer Portal's token generator and start building.

What's the difference between Development and Standard tier?

The Development tier lets you read every ad account you administer but edit only 5; the Standard tier removes the edit cap. All apps start in Development, and you apply separately to upgrade.

Development tier Standard tier
Read No limit on ad accounts you administer No limit on ad accounts you administer
Create ad accounts 1 test ad account through the API Unlimited
Edit Up to 5 ad accounts Unlimited
How to get it Default after Advertising API approval Support ticket on the Developer Support Portal

Source: LinkedIn's access tier table.

The Standard upgrade needs a video. The quick start says to submit a tier upgrade request "with a video demonstrating how your platform creates, edits, or optimizes LinkedIn campaigns." LinkedIn also says it may decline an upgrade even when you meet the minimum requirements. For a product that serves many advertisers, plan for Standard from the start: 5 editable accounts covers your own testing, not your customers.

Which permissions does the LinkedIn Ads API need?

The LinkedIn Ads API uses three core member permissions: r_ads to read ad accounts, rw_ads to manage them, and r_ads_reporting to read reporting. All are 3-legged OAuth scopes, granted to your app once the Advertising API is approved.

Scope What it allows
r_ads Retrieve the member's advertising accounts
rw_ads Manage and read ad accounts where the member is ACCOUNT_BILLING_ADMIN, ACCOUNT_MANAGER, CAMPAIGN_MANAGER, or CREATIVE_MANAGER
r_ads_reporting Retrieve reporting for the member's ad accounts
r_organization_admin Retrieve the member's organization Pages and their reporting
w_organization_social Post, comment, and like on the organization's behalf

From version 202610, the Advertising API also includes r_member_boost, rw_member_boost, r_organization_boost, and rw_organization_boost for boosting posts.

Scopes aren't the whole check. The member also needs a role on the ad account. A VIEWER stays read-only even with rw_ads. Use /adAccountUsers to see which accounts a member can act on before you show them in your UI.

The OAuth flow is standard 3-legged. Send the member to https://www.linkedin.com/oauth/v2/authorization, then POST the code to https://www.linkedin.com/oauth/v2/accessToken within 30 minutes. LinkedIn's authorization code flow docs say access tokens last 60 days, and requesting a different scope set invalidates the member's earlier tokens.

How does LinkedIn Ads API versioning work?

LinkedIn ships a new Marketing API version every month and supports each one for at least a year. You pick one with a LinkedIn-Version: YYYYMM header on every call. The latest is 202610 (October 2026), per LinkedIn's versioning page.

curl "https://api.linkedin.com/rest/adAccounts?q=search&search=(status:(values:List(ACTIVE)))" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "LinkedIn-Version: 202610" \
  -H "X-Restli-Protocol-Version: 2.0.0"
  • No default version. A call without the header returns an error, and so does a sunset version.
  • Sunsets are dated. LinkedIn's docs carry a notice that version 202511 sunsets on November 16, 2026.
  • Migrating is a header change, though behavior and fields can differ between versions, so read the changelog for the endpoints you use.
  • Rest.li 2.0 syntax. Most calls need X-Restli-Protocol-Version: 2.0.0, which is why query parameters look like List(...) and (field:(values:...)).

Nihit Purwar, writing on LinkedIn's engineering blog in June 2022 about why the Marketing APIs moved to versions, described the problem it replaced:

"releasing breaking changes almost monthly with different sunset dates"

For you, versioning turns surprise breakage into a yearly chore. Put the version string in one config value, and put a reminder on the calendar before it sunsets.

How are LinkedIn ad accounts, campaign groups, campaigns, and creatives structured?

LinkedIn ads nest four levels deep: an ad account holds campaign groups, a campaign group holds campaigns, and a campaign holds creatives. Each level has its own endpoint under the ad account.

Level Endpoint URN format
Ad account /rest/adAccounts urn:li:sponsoredAccount:{id}
Campaign group /rest/adAccounts/{id}/adCampaignGroups urn:li:sponsoredCampaignGroup:{id}
Campaign /rest/adAccounts/{id}/adCampaigns urn:li:sponsoredCampaign:{id}
Creative /rest/adAccounts/{id}/adCreatives urn:li:sponsoredCreative:{id}

From LinkedIn's Create and Manage Ad Accounts page:

  • An ad account holds at most 5,000 campaigns and 15,000 creatives.
  • Only BUSINESS accounts can be created through the API. ENTERPRISE accounts are created by LinkedIn's internal ad operations.
  • Search is cursor-paginated with pageSize (max 1,000) and pageToken, since version 202401.
  • Updates are partial. POST to the object with X-RestLi-Method: PARTIAL_UPDATE and a patch.$set body.

How do I pull LinkedIn ad reporting with adAnalytics?

LinkedIn ad reporting comes from GET /rest/adAnalytics, using the analytics finder for one pivot or the statistics finder for up to three. It needs r_ads_reporting. Without a fields parameter you only get impressions and clicks, and you can request up to 20 metrics.

curl "https://api.linkedin.com/rest/adAnalytics?q=analytics&pivot=CAMPAIGN&timeGranularity=DAILY&dateRange=(start:(year:2026,month:9,day:1),end:(year:2026,month:9,day:30))&accounts=List(urn%3Ali%3AsponsoredAccount%3A123456)&fields=impressions,clicks,costInLocalCurrency,dateRange,pivotValues" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "LinkedIn-Version: 202610" \
  -H "X-Restli-Protocol-Version: 2.0.0"

The limits that shape a reporting integration, from LinkedIn's reporting docs:

  • No pagination, and 15,000 elements max per response. Split large pulls by account, campaign, or date.
  • 45 million metric values per 5 minutes. Over that, you get 429 TOO_MANY_REQUESTS. Cost is metrics requested times rows returned, so ask only for the fields you show.
  • Retention. Performance data is kept 10 years, professional demographic data 2 years, and daily data 6 months.
  • Delays. Performance metrics are near real time. Demographic pivots lag 12 to 24 hours, and video watch time up to 48 hours.
  • Demographics are approximate. Values under 3 events are dropped, and only the top 100 values per creative per day come back.
  • Long URLs return 414. Use LinkedIn's query tunneling when your List(...) parameters get long.

What are the LinkedIn Ads API rate limits?

LinkedIn doesn't publish standard rate limits; each app's daily limits per endpoint show in the Developer Portal's Analytics tab. Limits are per application and per member, reset at midnight UTC, and a throttled call gets a 429, per LinkedIn's rate limiting page.

An endpoint appears in the Analytics tab only after your app has called it at least once that day (UTC). Developer admins get an email when the app passes 75% of an application-level quota, roughly 1 to 2 hours after it happens. adAnalytics adds its own data-volume throttle on top, described above.

How do I call the LinkedIn Ads API from Python?

LinkedIn's official Python client, linkedin-api-client, wraps Rest.li encoding and the version header for you. It's in beta. Install it with pip install linkedin-api-client, then call a finder:

from linkedin_api.clients.restli.client import RestliClient
 
client = RestliClient()
 
response = client.finder(
    resource_path="/adAccounts",
    finder_name="search",
    query_params={"search": {"status": {"values": ["ACTIVE"]}}},
    version_string="202610",
    access_token=ACCESS_TOKEN,
)
 
for account in response.elements:
    print(account["id"], account["name"])

The library's README shows the same pattern for /adAccounts. It handles query tunneling automatically, and its AuthClient builds the member auth URL and exchanges codes for tokens. If you'd rather use requests directly, send the three headers from the curl examples and URL-encode URNs inside List(...).

Where does Adeli fit?

Adeli runs LinkedIn ads for your customers without an Advertising API application of your own. Through Adeli's ads API you manage your customers' LinkedIn ad accounts and campaigns, track results, and pull leads, alongside Meta and TikTok ads. LinkedIn organic posting through Adeli is coming soon; today Adeli's posting API publishes to Instagram, Facebook, TikTok, YouTube, X, and Bluesky from one endpoint.

If you're building an AI marketing platform that runs LinkedIn ads, Adeli skips the Advertising API application, the access tiers, and the 60-day token refresh above, and covers organic posting on the other networks with the same key. Adeli is priced per profile (one of your customers) with every platform included. See pricing.

faq

Frequently asked questions

How long do LinkedIn Ads API access tokens last?

LinkedIn issues every member access token with a 60-day lifespan, and it doesn't hand out long-lived tokens. To refresh, you send the member through the authorization flow again, which skips the consent screen if they're still logged in and the token hasn't expired. Programmatic refresh tokens are only enabled for a limited set of partners.

What happens if I leave out the LinkedIn-Version header?

The request fails. LinkedIn's versioning docs say every versioned call must name a version, the latest version is not applied by default, and a missing or sunset version header returns an error response.

Is there an official LinkedIn Ads API Python library?

Yes, in beta. LinkedIn publishes linkedin-api-client on PyPI. Its RestliClient handles Rest.li 2.0 encoding, the version header, and query tunneling, and its AuthClient generates and refreshes tokens. LinkedIn warns it may change and to use caution in production.

Can I test the LinkedIn Ads API without spending money?

Yes. Create a test ad account through the adAccounts endpoint with the test flag set to true. Ads in it are never served or billed, and creatives are auto-rejected in review. Each developer app can have one test ad account, and adAnalytics returns no data for it.

Power your next project
with one ads & social media API

Give your users publishing, scheduling, and analytics through one integration your team can actually maintain.

Try with agents

Start with free credits. No credit card required.