Ad Library Scraper — Google, Meta & LinkedIn
Pricing
from $12.00 / 1,000 results
Ad Library Scraper — Google, Meta & LinkedIn
Scrape ads from the Google Ads Transparency Center, Meta Ad Library (Facebook and Instagram) and LinkedIn Ad Library in one run. Find competitor ads by keyword, brand or domain and get ad copy, creatives, images, video URLs, impressions and run dates. Export to JSON, CSV or Excel.
Pricing
from $12.00 / 1,000 results
Rating
0.0
(0)
Developer
Mediocre_Interest
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
3
Monthly active users
16 days ago
Last modified
Categories
Share
Scrape ads from the Google Ads Transparency Center, the Meta Ad Library (Facebook and Instagram) and the LinkedIn Ad Library in one run, and get them back in a single consistent row shape. Search competitor ads by keyword, brand name or domain, or paste ad library URLs directly, then export to JSON, CSV or Excel.
Nothing to set up: the input arrives prefilled with a sample search, so pressing Start returns real ads straight away. No login, no API keys and no ad account — every ad in these three libraries is published by the platforms themselves for transparency, and this Actor just makes all of it queryable in one place.
What does the Ad Library Scraper do?
Most ad scrapers cover one platform. This one covers three, and normalizes them into a single row shape so you can compare a brand's Facebook creative against its Google search ads and its LinkedIn campaigns without writing any glue code.
Each ad library is queried through the same endpoints its own web app uses, so results match what you would see browsing the library by hand. The Actor resolves your query to the right advertiser on each platform, pages through the results, drops ads whose text does not genuinely match your search terms, and de-duplicates across overlapping queries so every ad appears once per run.
- 🔍 Competitor ad research — see exactly what a brand is running today and how long each ad has been live
- 🖼️ Ad creative extraction — ad copy, headlines, images, video URLs and destination links
- 📊 Category monitoring — search one keyword across three ad libraries in one run
- 🌍 Country comparison — filter by market and see where a campaign is actually delivering
- 💡 Swipe files — export creative and copy for inspiration or analysis
- 📈 Dashboards and alerts — schedule runs and push results into your own tooling
What ad data can you extract from each ad library?
| Google Ads Transparency Center | Meta Ad Library | LinkedIn Ad Library | |
|---|---|---|---|
| Search by keyword | matches advertisers/domains | ✅ searches ad copy | ✅ searches ad copy |
| Search by advertiser | ✅ | ✅ | ✅ |
| Search by domain | ✅ native filter | keyword match | keyword match |
| Ad copy & headline | — | ✅ | ✅ |
| Images | ✅ most ads | ✅ | ✅ |
| Video URLs | browser preview link | ✅ direct URLs | — |
| Destination URL | — | ✅ | ✅ most ads |
| First / last shown dates | ✅ | ✅ | some ads |
| Impressions | — | political ads only | some ads (as a range) |
| Country delivery split | — | — | some ads |
The table above is what these platforms actually publish, not what we wish they published. Google's Transparency Center is metadata-first: you get the advertiser, the dates, the archived creative image and a link to the ad, but Google does not publish ad text over the wire. Meta is the richest source for ad copy and media. LinkedIn is the only one of the three that publishes a per-country delivery split alongside an impressions range for ordinary commercial ads rather than just political ones — though only for a subset of them.
Why use this Actor to scrape ads?
- Three ad libraries, one row shape. A Google creative, a Facebook ad and a LinkedIn campaign come back with the same fields, so a comparison is a filter rather than a data-cleaning project.
- Nothing to install and no credentials. All three libraries are public. There is no login step, no cookie to harvest and no ad account to connect.
- You pay per ad, not per run. Pricing is pay per event, charged on the ads that actually land in your dataset — see the cost section below.
- Noise is filtered before you are charged. Ad library keyword search is loose by nature.
filterIrrelevantchecks each ad's own text and drops the ones that do not genuinely match, and dropped ads never reach the dataset. - Built for repeat monitoring. Schedule a daily run from the Schedules tab and push new ads into Google Sheets, Slack, Zapier, Make or a webhook through Apify integrations.
- Made for marketers and developers alike. Performance marketers running competitor teardowns, agencies sourcing real creative for pitch decks, growth and SEO teams tracking a rival's messaging, researchers sizing a category — and developers who want ad library data behind a plain HTTP API instead of three separate scraping projects.
How to scrape ads from Google, Meta and LinkedIn
- Click Try for free to open the Actor.
- Choose your platforms — Google, Meta, LinkedIn, or all three.
- Add what you want to search: search terms, advertisers, domains, or paste direct URLs from any of the three ad libraries.
- Set max ads per query to control the size of the run.
- Pick your countries (defaults to
US). - Click Start and watch results appear in the dataset tab.
- Export as JSON, CSV, Excel, or pull them through the Apify API.
To run it on a schedule, open the Schedules tab and pick a cadence — daily competitor monitoring is the most common setup.
How to scrape Google ads from the Ads Transparency Center
Google's Ads Transparency Center indexes ads by advertiser, not by ad text, so the way you ask matters more here than on the other two platforms.
The most reliable route is a domain. Put nike.com in domains and the Actor queries Google's native domain filter and goes straight to the verified advertiser. Searching the brand name instead goes through Google's suggestion endpoint, which ranks by spelling similarity — a search for Nike can surface nikey and Nikesh above Nike, Inc. The Actor re-ranks whole-word matches to the top to compensate, but a domain is still the sharper tool.
You can also paste a Transparency Center advertiser URL (https://adstransparency.google.com/advertiser/AR…) into startUrls, or pass the bare AR… advertiser ID in advertisers for an exact match.
Each Google row carries the advertiser, first and last shown dates, the archived creative image and a direct link to view the ad. Google's own region filter applies, so an advertiser with no ads in your selected countries returns nothing even if it advertises heavily elsewhere — the run log tells you when that happens.
How to scrape Facebook and Instagram ads from the Meta Ad Library
Meta is the richest of the three for creative work. Its Ad Library searches actual ad copy, so keyword searches behave the way you would expect, and each row comes back with the headline, body copy, call-to-action text, the destination URL, image URLs and direct video URLs — plus which surfaces the ad ran on (FACEBOOK, INSTAGRAM, AUDIENCE_NETWORK, MESSENGER).
Search a brand with advertisers, a topic with searchTerms, or a numeric Facebook page ID for an exact page match. Meta has no domain filter, so a domain is searched as a keyword there.
Meta runs need residential proxies — see the tips below. Meta blocks datacenter IP ranges outright.
How to scrape LinkedIn ads from the LinkedIn Ad Library
LinkedIn is the best source for B2B ad research, and the only platform here that publishes a per-country delivery breakdown for ordinary commercial ads.
The Actor searches by keyword, by LinkedIn company ID, or by account owner name, then opens each ad's detail page to collect the full untruncated ad copy, the creative images, the destination URL, the run dates, an impressions range like 1k-5k and the country percentage split. That detail pass is what makes LinkedIn rows rich, and it costs roughly one request per ad — set linkedinFetchDetails to false for a faster, cheaper, shallower pass that reads the search cards only.
LinkedIn matches multi-word phrases loosely, so single specific keywords work far better here: cybersecurity returns much sharper results than enterprise cybersecurity software.
Input
Search one brand across all three ad libraries:
{"platforms": ["google", "meta", "linkedin"],"domains": ["nike.com"],"searchTerms": ["running shoes"],"countries": ["US"],"maxAdsPerQuery": 100,"matchMode": "phrase","filterIrrelevant": true}
Monitor one competitor's live campaigns on Meta only:
{"platforms": ["meta"],"advertisers": ["Nike"],"metaActiveStatus": "active","countries": ["US", "GB"],"maxAdsPerQuery": 50}
What to scrape
| Field | Description |
|---|---|
platforms | Which ad libraries to search: google, meta, linkedin |
searchTerms | Keywords to search for |
advertisers | Brand names, Google advertiser IDs, Meta page IDs or LinkedIn company IDs |
domains | Advertiser websites, e.g. nike.com — the most reliable way to find a specific brand |
startUrls | Paste ad library URLs to scrape directly |
Relevance and filters
| Field | Description |
|---|---|
matchMode | phrase (default, precise) or broad (more results, noisier) |
filterIrrelevant | Drop ads that don't actually mention your search terms. On by default |
countries | ISO-2 country codes, e.g. ["US", "GB"] |
dateFrom / dateTo | Limit to ads delivered in a date range |
Per-platform settings
| Field | Description |
|---|---|
googleMaxAdvertisersPerTerm | How many matching advertisers a Google keyword fans out to |
metaActiveStatus | all, active or inactive |
metaMediaType | all, image, video or meme |
metaAdType | Restrict to a category such as political_and_issue_ads |
linkedinFetchDetails | Full detail per ad (default), or a faster, lighter pass |
Limits and output
| Field | Description |
|---|---|
maxAdsPerQuery | Cap per search term, advertiser or domain |
maxRequestsPerCrawl | Overall safety limit |
includeRaw | Keep each platform's original payload alongside the clean fields |
proxyConfiguration | Proxy settings — residential recommended |
Two things to keep an eye on:
maxAdsPerQueryis per query, so three search terms and two domains at 100 each is up to 500 ads, not 100. AndmaxRequestsPerCrawl(default 1000) is the overall brake — multi-platform LinkedIn runs reach it faster than you would expect.
Output
Every ad lands as one row in the run's default dataset, in the same shape whichever ad library it came from, and downloads as JSON, JSONL, CSV, Excel, XML or HTML. The Overview view shows the advertiser, format, dates and a link to the ad; the Creatives view shows the copy, call to action and media URLs.
Here is a real Meta result from the first input example above:
{"platform": "meta","adId": "1520310666349109","adUrl": "https://www.facebook.com/ads/library/?id=1520310666349109","advertiser": {"id": "15087023444","name": "Nike","url": "https://www.facebook.com/nike/","domain": "nike.com"},"creative": {"title": "Find Nike Near You","body": "Add a retro touch to any fit.","caption": "nike.com","ctaText": "Shop now","linkUrl": "https://www.nike.com/w/womens-summer-essentials-lifestyle...","format": "image","imageUrls": ["https://scontent.fbom12-2.fna.fbcdn.net/v/t39.35426-6/680632406_..."],"videoUrls": []},"publisherPlatforms": ["FACEBOOK", "INSTAGRAM"],"firstShown": "2026-04-29T07:00:00.000Z","lastShown": "2026-05-25T07:00:00.000Z","isActive": false,"regions": [],"metrics": null,"query": { "type": "domain", "value": "nike.com" },"scrapedAt": "2026-08-26T06:08:29.194Z"}
A Google result from the same run carries the advertiser, both dates, the archived creative image and a link to the ad in the Transparency Center:
{"platform": "google","adId": "CR09978845720385421313","adUrl": "https://adstransparency.google.com/advertiser/AR16735076323512287233/creative/CR09978845720385421313","advertiser": { "name": "Nike, Inc.", "domain": "nike.com" },"creative": {"format": "text","imageUrls": ["https://tpc.googlesyndication.com/archive/simgad/430467805130317951"]},"firstShown": "2022-11-30T14:49:50.000Z","lastShown": "2026-08-26T05:37:14.000Z"}
And where LinkedIn publishes delivery data, you get an impressions range plus the country split:
{"platform": "linkedin","advertiser": { "name": "Profound", "url": "https://www.linkedin.com/company/104065246" },"firstShown": "2026-08-21T00:00:00.000Z","lastShown": "2026-08-26T00:00:00.000Z","metrics": { "impressions": "1k-5k" },"regionBreakdown": [{ "region": "United Kingdom", "sharePct": 27 },{ "region": "Germany", "sharePct": 14 },{ "region": "France", "sharePct": 12 },{ "region": "Netherlands", "sharePct": 7 },{ "region": "Spain", "sharePct": 6 }]}
What does each ad row contain?
| Column(s) | Meaning |
|---|---|
platform, adId, adUrl | Which library the ad came from, its id there, and a link to view it |
advertiser.name, .id, .url, .domain, .country | Who ran the ad, as the platform identifies them |
creative.title, .body, .caption, .ctaText | The ad copy. Empty on Google, which does not publish ad text |
creative.linkUrl, .format, .imageUrls, .videoUrls | Destination link, text/image/video, and the media the platform exposes |
publisherPlatforms | Surfaces the ad ran on, e.g. FACEBOOK, INSTAGRAM |
firstShown, lastShown, isActive | Delivery window, and whether it is still running |
metrics.impressions, regionBreakdown | Impressions range and per-country split, where the platform discloses them |
regions, query, scrapedAt | Countries returned, the query that found the ad, and when it was collected |
raw | The platform's original payload, when includeRaw is on |
How much does it cost to scrape ads?
The Actor is pay per event, at the prices shown on this page. You are charged for the ads you receive, not for how long a run takes.
| Event | Charged | When |
|---|---|---|
| Results | Per ad in the dataset | Each unique ad written to the run's default dataset |
| Actor Start | Once per GB of memory, at start | When a run begins, minimum one event |
A run that returns 1,000 ads costs $15 on the Free plan and $12 on Gold and above, plus a fraction of a cent for the start event. Smaller runs scale down exactly — 50 ads is 50 result events.
Two things you are never charged for:
- Ads the relevance filter drops. They are discarded before they reach the dataset, so a broad keyword that returns mostly noise costs you only the ads you keep.
- A platform that returns nothing. No rows means no result events, whether a brand has no ads in your chosen countries or a library was unreachable.
How to run the ad library scraper from the API
Start a run and get the ads back in a single call with run-sync-get-dataset-items:
curl -X POST "https://api.apify.com/v2/acts/mediocre_interest~ads-library-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H 'Content-Type: application/json' \-d '{"platforms": ["google", "meta", "linkedin"],"domains": ["nike.com"],"countries": ["US"],"maxAdsPerQuery": 50}'
The response is the dataset itself — a JSON array of ad rows in the shape shown above. Add &format=csv for a spreadsheet, or &fields=platform,advertiser.name,creative.body,adUrl to return just the columns you need.
Results can also be piped anywhere Apify integrates: Google Sheets, Slack, Zapier, Make, GitHub, Google Drive, AWS S3, or any webhook. Official API clients exist for Python and JavaScript, and the API tab on this page has copy-paste snippets with your token already filled in.
Tips for better results
Search a brand by domain, not by name. Google ranks its advertiser suggestions by spelling similarity, so nike.com in domains beats Nike in advertisers every time. This is the single biggest quality win in the Actor.
Use Apify Proxy with the RESIDENTIAL group. Meta blocks datacenter and platform IP ranges outright, so residential proxies are required for Meta runs. The Actor keeps one sticky IP per Meta session, because Meta ties its anti-bot cookie to the IP, and rotates automatically when an exit gets blocked. Google and LinkedIn are more forgiving but benefit from the same setting.
Use single, specific keywords on LinkedIn. Multi-word phrases match loosely there and most results get filtered out.
Leave filterIrrelevant on. Ad library keyword search is broad by nature and will happily return a long advertorial that happens to contain your words in unrelated sentences. The filter checks each ad's own text, drops the ones that don't genuinely match, and reports how many it removed.
Start small. Run with maxAdsPerQuery: 20 to confirm you're getting the right advertiser before spending a full run.
FAQ
Is it legal to scrape ad libraries?
The Google Ads Transparency Center, the Meta Ad Library and the LinkedIn Ad Library are public transparency tools that the platforms publish deliberately, in large part to satisfy regulations like the EU Digital Services Act. The Actor collects only what those pages show to any visitor, with no login and no personal data behind an account wall. As with any scraping, you are responsible for how you use the data and for your own compliance obligations.
Do I need a Facebook, Google or LinkedIn account?
No. All three ad libraries are public. The Actor needs no login, no cookies and no API keys.
Can I get ad text from Google?
Google's Ads Transparency Center does not publish ad copy or destination URLs. You do get the advertiser, first and last shown dates, the archived creative image for most ads, and a direct link to view the ad. For full ad copy, use Meta or LinkedIn.
Why did a Google search return no results?
Two common reasons. Google's domain filter is exact, so the Actor normalizes what you enter (Nike.com becomes nike.com). And the region filter is applied by Google itself — an advertiser with no ads in your selected countries returns nothing even though it advertises elsewhere. The run log tells you which happened; clearing countries searches every region.
Why did my whole run come back empty?
The run log names the outcome for each platform in turn — a keyword that matched no advertiser on Google, a library that refused the exit IP, or an advertiser with no live ads in your chosen countries. The two fixes that resolve most empty runs are searching by domain rather than brand name, and setting proxyConfiguration to the RESIDENTIAL group so Meta and LinkedIn answer at all.
Why do some LinkedIn ads have impressions and others don't?
LinkedIn only publishes delivery data for a subset of ads. Where it does, you get an impressions range like 1k-5k and a per-country percentage split. Where it doesn't, the page itself has no such section — the ad still returns with its creative and copy.
How do I monitor a competitor's ads automatically?
Put the competitor's domain in domains, select all three platforms, then open the Schedules tab and set a daily run. Connect the output to Google Sheets, Slack or a webhook through Apify integrations and you get a running log of every new ad they launch.
Can I scrape ads from one specific advertiser?
Yes. Put the brand in advertisers, or use its exact identifier — a Google advertiser ID (AR…), a Meta page ID, or a LinkedIn company ID — for an exact match. You can also paste an ad library URL into startUrls.
Can I scrape ads from a specific country?
Yes. Set countries to ISO-2 codes such as ["US", "GB"]. Google and Meta apply the filter server-side. LinkedIn has no country filter on search, but where it discloses delivery data you get a per-country percentage split in regionBreakdown.
Are results deduplicated?
Yes. Overlapping searches never produce repeat rows; every ad appears once per run.
Can I export to CSV or Excel?
Yes. Results can be downloaded as JSON, JSONL, CSV, Excel, XML or HTML from the dataset tab, or fetched through the Apify API.
What other Actors work with this one?
- Multi-Platform Job Scraper — the same one-run, one-row-shape approach applied to job boards. Pair it with this Actor to see who a competitor is hiring alongside what they are advertising.
- n8n Node Catalog & Community Package Scraper — catalogues n8n's node ecosystem and its community packages.
- n8n Workflow Generator — turns a prompt into importable n8n workflow JSON.
- n8n Workflow Auditor — lints n8n workflows for security and reliability problems.
- n8n Workflow Backup & GitOps — version-controlled backups of an n8n instance.
- Make.com Scenario Auditor — lints Make.com scenarios and reviews their operation cost.
- Make.com Operations Usage & Cost Analyzer — breaks down where a Make.com account's operations go.
- Make.com App & Module Catalog — catalogues Make.com apps with their triggers and actions.
Support
Found a bug or need a field the Actor doesn't return yet? Open an issue on the Actor's Issues tab with your input configuration and the run ID.
Ad libraries change their layouts from time to time. If results suddenly look wrong, please report it — that's the fastest way to get it fixed for everyone.