LinkedIn Ad Library API — B2B Competitor Ads as JSON | FetchLayer
Unofficial Third-party API
7 endpoints live

Every B2B ad on LinkedIn.
Copy, creative, targeting.

B2B ad copy & creative Targeting disclosures Downloadable video & images AI-ready JSON

Search the public LinkedIn Ad Library by keyword or company and get the copy, the headline, the CTA, the format, the payer, and the actual video and image files as structured JSON — plus the impressions band and the job titles, company sizes and industries an advertiser targeted, wherever LinkedIn discloses them. No LinkedIn developer account, no OAuth, no partner application.

Free tier included No credit card No scraper maintenance

Trusted by developers shipping real products.

493,455 served today

POST /linkedin-ad-library/search-ads
200 OK

Request

$ curl -X POST \
  https://api.fetchlayer.dev/linkedin-ad-library/search-ads \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"revenue operations","country":"US"}'

Response

{
  "ads": [{
    "adId": "512345678",
    "advertiser": "Acme Software",
    "formatLabel": "Single Image Ad",
    "headline": "Close the quarter in two days",
    "payer": "Acme Software Inc.",
    "impressions": "10k-50k",
    "targeting": ["JOB", "COMPANY"]
  }],
  "nextCursor": "eyJwYWdlIjoy..."
}

Used by developers at

Individual developers or teams — not official partnerships

Built for feedback workflows

Fetch the public signal. Use it wherever your team works.

Keyword and company search

Search the Ad Library by keyword, or pull every ad one company has run — filtered by country, date range, payer, impressions band and targeting category. This is the one ad library aimed squarely at B2B buyers.

The targeting, not just the creative

For ads whose targeting includes the EU, LinkedIn discloses the categories the advertiser chose — job titles, company size, industry, education, interests, language and location — each marked as an inclusion or an exclusion. That is a competitor’s ICP, published.

The creative files, not screenshots

Get each video, image and thumbnail as a downloadable asset URL across the main creative and every attachment, then stream the bytes through GET /media with HTTP Range support. LinkedIn’s own URLs are signed and expire; these do not.

Every LinkedIn ad format

Single image, video, carousel, document, event, job posting, Spotlight, Follow Company and Message Ads all come back with their format code and LinkedIn’s own label, so you can see which surfaces a competitor is actually buying.

EU ad transparency

Impressions bands, impressions by country and the full targeting disclosure for ads served into the EU — the reporting LinkedIn publishes to meet its transparency obligations, returned as JSON instead of a page you have to read.

Brand name to advertiser

Resolve a brand into the advertiser name every lookup takes, with its LinkedIn page, profile type, tagline and a sample ad id. LinkedIn publishes no advertiser profile, so this plus advertiser-ads is the path — there is no profile endpoint and we do not pretend otherwise.

Ceilings you are told about

Every response carries a notes array reporting a walk cut short or an upstream limit hit, alongside hasNextPage, totalMatchCount and adsScanned. A plausible answer and a complete one are different things, and the API says which one you got.

AI-ready JSON

Pass ad copy, formats, payers, targeting and creative URLs to an LLM or an MCP agent to cluster offers, map an ICP and write the brief — no HTML parsing, no wrapper code.

FetchLayer Research Chat

Read a competitor’s demand-gen playbook—then export it to CSV.

Prefer not to write code? Give FetchLayer Research Chat a company, ask what it is running on LinkedIn, which formats it leans on and who it targeted, and turn the whole ad set into a structured file for your creative brief, ABM plan, or board deck.

  • Ask questions in plain English
  • Analyze themes, sentiment, and pain points
  • Download the structured results as CSV or JSON
Research B2B ads in Chat

No code or setup required · Uses your FetchLayer credits

LinkedIn Ad Library research

Pull every ad this company has run on LinkedIn this year. Group them by format and by the job titles they targeted, flag which offers repeat, then export it as CSV.

Y

I found their ads for the year, grouped them into four formats and six offers, and pulled the targeting disclosures on the EU-served ones — they lean on Message Ads aimed at RevOps and Finance titles at 200-1000 employee companies. The full ad-level breakdown is ready to download.

linkedin-ad-library-competitor-ads.csv

96 ads · 13 columns · ready to download

CSV

From raw feedback to action

One request is the start of the workflow.

Store the structured response, run it on a schedule, pass it to an LLM, or feed it into the system your team already uses. FetchLayer handles retrieval so you can focus on the outcome.

  1. 01

    Resolve the company

    Search a brand name to get the advertiser name and LinkedIn page, or pass a linkedin.com/company URL you already have. Raise pages to reach smaller advertisers.

  2. 02

    Pull the ads, the copy and the targeting

    Widen dateRange past the 30-day default, filter by country, payer, impressions band or targeting category, then call ad-detail for full copy and ad-media for the files.

  3. 03

    Turn ads into demand-gen intelligence

    Build a B2B swipe file, map a competitor’s ICP from their targeting disclosures, diff the rotation week over week, or hand the JSON to an agent to write the creative brief.

MCP & agents

Live

Your AI already knows how to use this.

Use the LinkedIn Ad Library endpoint directly from your MCP-compatible agent. Ask it to retrieve public feedback, identify patterns, and turn the result into a useful brief without writing integration glue.

1
Pick your editor
2
Agent discovers 7+ tools
3
Query any platform instantly
connect your agent ~30s

Pick your editor and we hand you the config with your key already in it — no JSON to hand-edit, no wrapper code.

Get your free API key

Free tier · no credit card · any MCP host

New chat fetchlayer connected

Find every ad this company has run on LinkedIn this year, tell me which job titles and company sizes they targeted, and get me the video files.

Used fetchlayer.linkedin_ad_library_advertiser_ads

Pulled 96 ads across six formats. Message Ads carry the highest-impressions band, the EU-served ads disclose targeting on JOB and COMPANY facets — RevOps and Finance titles at 200-1000 employee firms — and the HD video assets are ready to download.

Ask a follow-up…

Works with every MCP-compatible tool

Cursor
Claude
VS Code
Windsurf
Cline
Hermes
OpenClaw
Kiro
No wrapper code
All 7 endpoints exposed as tools
Official & maintained
Free to install

Use cases

What B2B teams build with LinkedIn ad data.

Same API, endless applications. Here is what teams ship with public LinkedIn ad data.

01

B2B competitor tracking

Search by keyword or company to see every LinkedIn ad a competitor runs — copy, headline, CTA and format.

competitorsadsb2b
02

AI agent context

Give Claude, Codex, or your MCP agent structured ad copy, formats and targeting instead of a folder of screenshots.

llmagentsmcp
03

Ad fatigue & rotation

Poll a company on a schedule to see which ads get pulled, which keep spending, and what replaces them.

alertsmonitoringcron
04

Offer & messaging research

Cluster the offers, headlines and CTAs a whole category runs to see which promise the market is buying.

messagingoffersresearch
05

Creative swipe files

Download the real video, image and document creative across a competitor’s ads and keep a searchable library.

creativeassetsswipe
06

ICP mapping

Read the job titles, company sizes and industries an advertiser targeted, wherever the EU disclosure publishes them.

targetingicpeu

Compare approaches

Spend time on the insight, not the collection layer.

What you needFetchLayerOfficial APIBuild it yourself
Search public B2B ads without a LinkedIn appNo public APIYou build it
Advertiser targeting disclosures as JSONPage you readYou parse it
Downloadable video & image assetsSigned, expiring URLsYou extract them
Bearer auth from one accountPartner approvalYou manage it
Ready for AI and MCP workflowsYour integrationYour integration

FetchLayer provides access to publicly available data. It is not affiliated with, endorsed by, or sponsored by the platform.

Pricing

Start free. Scale when ready.

Pay per request with no commitment, or lock in a flat monthly rate with built-in savings.

Free plan — 30 requests

Verify responses, inspect the API, no credit card required.

Try free

Pay as you go

$1.99

per 1,000 requests

$0.00199 per request · credits never expire

How credits work — no multipliers

One credit = one API call, on every endpoint and platform. No matter how many results come back, you pay for the call, not the output size. Most scraping APIs charge multipliers of 5x, 25x, even 75x per call depending on the target — here it's always 1.

  • No multipliers — 1 request = 1 credit
  • No monthly commitment
  • Credits never expire
  • Same API & MCP access as subscribers
  • ∞ req/min, ∞ API keys
Get API key

Expiry

Credits stay until you use them. No monthly reset, no pressure to hit a quota.

0

Commitments

No subscription, no contract, no minimums. Start, pause, or scale whenever.

100%

Access

Every endpoint and MCP included. Not a limited tier — same data as any subscriber.

API reference

Every parameter, documented.

All requests are POST with a JSON body and Bearer auth header.

POST /linkedin-ad-library/search-ads

Search the public Ad Library by keyword. Returns LinkedIn ads with their copy, format, advertiser, payer and creative — and, for EU-targeted ads, run dates, impressions band and targeting.

query* string Keyword or phrase to search the Ad Library for
advertiser string Also restrict the search to advertisers whose name contains this
country string Two-letter country code, or ALL. Defaults to ALL.
countries string[] Several countries at once (max 20); overrides country.
payer string Name on the ad’s "paid for by" line.
dateRange string 'last-30-days' | 'current-month' | 'current-year' | 'last-year' | 'custom-date-range'. Defaults to last-30-days.
startDate string Only ads running on or after this YYYY-MM-DD date.
endDate string Only ads running on or before this YYYY-MM-DD date.
impressionsMin number Only ads with at least this many impressions. EU-targeted ads only.
impressionsMax number Only ads with at most this many impressions. EU-targeted ads only.
includedTargeting string[] LANGUAGE, LOCATION, AUDIENCE, DEMOGRAPHIC, COMPANY, EDUCATION, JOB, INTERESTS_AND_TRAITS. EU-targeted ads only.
excludedTargeting string[] Only ads that excluded these targeting categories. EU-targeted ads only.
sortOrder string 'newest' | 'oldest'. Orders the whole result set by date.
limit number Maximum ads returned (max 2000), or -1 for everything available. Defaults to 30.
pages number Pages of results to collect in one request (max 100).
cursor string Resume from a previous response's nextCursor.
POST /linkedin-ad-library/advertiser-ads

Every ad one company has run, from a company name or a linkedin.com/company URL. Names match by substring, so the response’s matchedAdvertisers array names the advertisers the results actually cover.

advertiser* string Advertiser or company name, or a linkedin.com/company/<name> URL
query string Optional keyword to filter within the advertiser's ads
dateRange string Defaults to last-30-days — widen it for a historical view.
includedTargeting string[] Filter to ads that targeted these categories. EU-targeted ads only.
limit number Maximum ads returned, or -1 for everything available.
pages number Pages of results to collect in one request (max 100).
POST /linkedin-ad-library/search-advertisers

Find the companies and people running LinkedIn ads whose name matches a brand. Returns the advertiser name, LinkedIn page, profile type, tagline, ad count and a sample ad id — this is how you resolve a brand into the name every other route takes.

query* string Advertiser or company name to look up
country string Two-letter country code, or ALL. Defaults to ALL.
countries string[] Several countries at once (max 20).
limit number Maximum advertisers returned (max 500), or -1 for everything available.
pages number Pages of ads to scan for advertisers (max 20). More pages find advertisers running fewer ads.
resolveProfiles boolean Also look up each advertiser's LinkedIn page. Defaults to true.
POST /linkedin-ad-library/ad-detail

One ad in full: the complete copy (search results carry a shortened body, this does not), headline, CTA labels, destination link, format, advertiser, payer, and — for EU-targeted ads — run dates, impressions band, impressions by country and the targeting the advertiser chose.

ad* string Ad id, or an Ad Library URL containing one
POST /linkedin-ad-library/ad-media

An ad’s videos, images and thumbnails as downloadable asset URLs, across the main creative and each attachment. Pair it with GET /linkedin-ad-library/media, which streams the bytes themselves with HTTP Range support so video seeking works.

ad* string Ad id, or an Ad Library URL containing one
kinds string[] 'video' | 'image' | 'thumbnail'. Defaults to all three.
preferHighQuality boolean Pick the largest video rendition. Defaults to true.
probe boolean Confirm each asset is still downloadable and report its size and content type.
inline boolean Return the bytes base64-encoded. Refused for assets over the inline size limit.
POST /linkedin-ad-library/resolve-url

Parse any Ad Library URL into the structured filters it encodes — whether it points at one ad or a search, plus the keyword, advertiser, payer, countries, dates, impressions range and targeting filters. Free: it never consumes a credit.

url* string Any Ad Library URL, to be parsed into structured filters

Fields marked * are required. Full API reference →

FAQ

Common questions.

Is the LinkedIn Ad Library public data?

Yes. LinkedIn publishes the Ad Library so anyone can see the ads running across the platform. FetchLayer retrieves those publicly available records and returns them as structured JSON. FetchLayer is not affiliated with, endorsed by, or sponsored by LinkedIn or Microsoft.

Why is there no advertiser profile endpoint?

Because LinkedIn does not publish one. The Facebook Ad Library has an advertiser profile page — category, verification, followers, spend by disclaimer — and the LinkedIn Ad Library has no equivalent, so there is nothing to build the endpoint from. We would rather leave it out than ship a route that always fails. Use /search-advertisers instead: it returns the advertiser name, LinkedIn page URL, profile type (company, member, school, or showcase), tagline, logo, ad count and a sample ad id. Then pass that name to /advertiser-ads for everything they are running.

Do I need a LinkedIn developer account or OAuth token?

No. You authenticate with your FetchLayer API key — the same Bearer token you use for every other platform. There is no LinkedIn app to register, no partner programme to apply to, no Marketing Developer Platform approval, and no token to refresh.

What identifiers can I pass in?

For an advertiser: a company or advertiser name, or a linkedin.com/company URL. For a single ad: an ad id, or any Ad Library URL containing one. If you only have a brand name, /search-advertisers turns it into the advertiser name the other routes take, and /resolve-url parses any Ad Library URL into the structured filters it encodes.

What does LinkedIn publish about reach and targeting?

For ads whose targeting includes the EU: the run dates, an impressions band (always a band — "1k-5k", never an exact figure), impressions broken down by country, and the targeting the advertiser chose across eight categories — language, location, audience, demographic, company, education, job and interests and traits, each marked as an inclusion or an exclusion. For every other ad those four fields are null. LinkedIn publishes no ad spend for any ad, EU or not.

How far back does the archive go?

Coverage is ads that ran after 1 June 2023, kept for one year after their last impression. A new ad appears within 24 to 48 hours of its first impression, and its country-level impressions breakdown lands a little later. One thing to watch: dateRange defaults to the last 30 days, so widen it to current-year, last-year, or a custom range before concluding an advertiser has gone quiet.

How do I know a result set is complete?

Read the notes array. Every response carries one — a list of caveat strings reporting a paging walk that was cut short or an upstream limit that was hit. Pair it with hasNextPage, totalMatchCount and, on /search-advertisers, adsScanned, which is what that list’s completeness actually depends on. A well-formed response is not the same as a complete one.

Can I download the actual video and image files?

Yes. /ad-media returns every video, image and thumbnail on an ad — across the main creative and each attachment — as a downloadable asset URL, optionally probed to confirm it is still live and report its size and content type. LinkedIn’s own CDN URLs are signed and expire, so each asset also carries a stable FetchLayer download URL; GET /linkedin-ad-library/media then streams the bytes with HTTP Range support, so video seeking works in a player.

Can I use this with an AI model or MCP agent?

Yes. Every response is structured JSON you can store, embed, or hand to an LLM, and the six research routes are exposed as MCP tools on FetchLayer’s MCP server — so an agent can pull a competitor’s live B2B ads, read the copy, see who they targeted, and fetch the creative without any wrapper code.

How does billing work?

One API request equals one credit, the same as every other FetchLayer platform — no multipliers. Each page walked counts as one request, so pages: 10 bills as ten. Parsing an Ad Library URL with /resolve-url is free and consumes nothing; streaming media bytes bills as a normal request. LinkedIn Ad Library is in Beta while coverage expands, at standard pricing.

Start pulling LinkedIn Ad Library data today.

Get a free API key, make your first request, and put public feedback to work in your own product or research workflow.