LinkedIn Ads API: Access, Versions, and Reporting
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:
- Create a LinkedIn Page for your company if you don't have one.
- Create a developer app in the LinkedIn Developer Portal.
- Check the restricted use cases. LinkedIn rejects apps whose use case falls under its API and data restrictions, so read them before you apply.
- Apply for the Advertising API under the app's Products tab, and complete the access form.
- 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.
- 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 likeList(...)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
BUSINESSaccounts can be created through the API.ENTERPRISEaccounts are created by LinkedIn's internal ad operations. - Search is cursor-paginated with
pageSize(max 1,000) andpageToken, since version 202401. - Updates are partial. POST to the object with
X-RestLi-Method: PARTIAL_UPDATEand apatch.$setbody.
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.