# LinkedIn Ads API: Access, Versions, and Reporting

How the LinkedIn Ads API works: applying for the Advertising API, Development vs. Standard tier, r_ads and rw_ads, LinkedIn-Version, and adAnalytics.

Canonical page: https://www.tryadeli.com/blog/linkedin-ads-api
Last updated: 2026-10-26

By Mika Reyes, Co-founder, Adeli. Published 2026-10-26.

## 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](https://learn.microsoft.com/en-us/linkedin/marketing/), 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](https://learn.microsoft.com/en-us/linkedin/marketing/increasing-access).

## 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](https://learn.microsoft.com/en-us/linkedin/marketing/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](https://www.linkedin.com/developers/apps/new).
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](https://learn.microsoft.com/en-us/linkedin/marketing/increasing-access#how-to-upgrade-your-access-tier).

**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](https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow) 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](https://learn.microsoft.com/en-us/linkedin/marketing/versioning).

```bash
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](https://www.linkedin.com/blog/engineering/marketing/under-the-hood-how-we-built-api-versioning-for-linkedin-market), 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](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads/account-structure/create-and-manage-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.

```bash
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](https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/ads-reporting):

- **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](https://learn.microsoft.com/en-us/linkedin/shared/api-guide/concepts/rate-limits).

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:

```python
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](https://github.com/linkedin-developers/linkedin-api-python-client) 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](https://www.tryadeli.com/docs/api/ads) 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](https://www.tryadeli.com/social-media-posting-api) publishes to Instagram, Facebook, TikTok, YouTube, X, and Bluesky from one endpoint.

If you're building an [AI marketing platform](https://www.tryadeli.com/use-cases/ai-marketing-platforms) 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](https://www.tryadeli.com/pricing).

## 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.

## Related Adeli pages

- [Social Media and Ads API for AI Marketing Platforms](https://www.tryadeli.com/use-cases/ai-marketing-platforms.md): Run posting, analytics, inbox, and Meta ads for your customers' accounts through one API, without months of platform reviews.
- [Social Media Posting & Scheduling API](https://www.tryadeli.com/social-media-posting-api.md): Adeli's social media posting and scheduling API publishes to Instagram, TikTok, YouTube, Facebook, X, and Bluesky in one request, now or at a set time. Free to start.
- [All posts on the Adeli blog](https://www.tryadeli.com/blog.md)

## About the author

Mika Reyes is the CEO behind Adeli and a tech and AI content creator. She was previously co-founder and CEO of Parallax, which was acquired by Phantom, and a product lead at LinkedIn. She is a Forbes 30 Under 30 honoree.
