Ad Library Scraper - Meta, Google, TikTok, LinkedIn, Snapchat avatar

Ad Library Scraper - Meta, Google, TikTok, LinkedIn, Snapchat

Pricing

from $8.00 / 1,000 ad returneds

Go to Apify Store
Ad Library Scraper - Meta, Google, TikTok, LinkedIn, Snapchat

Ad Library Scraper - Meta, Google, TikTok, LinkedIn, Snapchat

Search five public ad libraries in one run: Meta (Facebook), Google Ads Transparency, TikTok, LinkedIn and Snapchat. Get a competitor's ads with copy, CTA, landing URL, creative image, dates and how each ad was matched, plus a per-platform summary.

Pricing

from $8.00 / 1,000 ad returneds

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

4

Monthly active users

16 days ago

Last modified

Share

Ad Library Scraper: Meta, Google, TikTok, LinkedIn and Snapchat ads

This ad library scraper searches five public ad libraries in one run and returns a competitor's ads as clean JSON: the Meta (Facebook) Ad Library, Google Ads Transparency, TikTok, LinkedIn and Snapchat. Enter an advertiser name, optionally add its website, and get a summary row followed by one record per ad with copy, call to action, landing URL, creative image, dates and how each ad was matched.

Cross-Platform Ad Library collects advertiser ads from Meta, Google, TikTok, LinkedIn and Snapchat in one run. Search by advertiser name, add a domain for stronger matching, and receive a summary followed by individual ad records. Use the results to compare an advertiser's presence across public ad libraries, review creative copy, or monitor which platforms return matching ads.

Why use an ad library scraper for competitor ads

Every major ad platform publishes an ad library, but each one has its own site, its own search box and its own way of naming advertisers. Checking one competitor across five libraries by hand means five searches, five sets of screenshots and a spreadsheet to line them up. None of the libraries offers a combined export. This Actor runs the five searches for you, links each ad to the advertiser you asked for, and returns everything in one dataset that you can download as JSON, CSV, Excel or XML, or read from the Apify API.

How to scrape an ad library in three steps

  1. Enter the advertiser name in advertiser, for example Coolblue, and add the website in domain (coolblue.nl) when you know it.
  2. Pick a country and, if you want, a subset of platforms. Set max_ads_per_platform to control how many source records each library reads.
  3. Start the run and open the dataset. The first row summarises the search per platform; every following row is one ad.

Use cases

  • Competitor ad research. See which platforms a competitor advertises on, how many ads each library shows and which landing pages the ads point to.
  • Creative inspiration. Collect headlines, body copy, calls to action and creative images from a brand's live ads in one table.
  • Market and agency pitches. Show a prospect where its rivals advertise before a meeting, with real ad IDs and dates as evidence.
  • Ad monitoring. Run the same search on a schedule and compare ad IDs to spot new campaigns and ads that stopped running.
  • Landing page discovery. landing_domains_seen lists the domains the ads point to, which often reveals campaign microsites and careers sites.

Compared with other ways to see competitor ads

The free ad libraries of Meta, Google, TikTok, LinkedIn and Snapchat are the original sources, but each covers one platform and offers no export. Most ad library scrapers in the Apify Store handle a single library, so a cross-platform view means running and merging several Actors with different output formats. Commercial ad spy tools cover several networks, usually behind a monthly subscription. This Actor sits in between: one input, five libraries, one output format, matched to the advertiser, and you pay only for the ads you receive.

Input for the ad library scraper

The main input is advertiser, such as the HubSpot search shown in the example below. You can also provide domain. When a domain is available, an exact registrable-domain match is the strongest matching signal. Otherwise the Actor compares normalized advertiser names, removing common legal suffixes such as Inc., Ltd. and B.V. It does not treat a loose substring as a match.

country defaults to US. platforms selects any of meta, google, tiktok, linkedin and snapchat; an omitted or empty list checks all five. max_ads_per_platform defaults to 50 and supports up to 500. This limits the source records read from each platform, so strict matching can produce fewer final records. strict_match defaults to true. Set it to false to keep records that the source returned even when their advertiser identity cannot be confirmed. Those records have matched_by: unconfirmed and confidence: 0.4.

concurrency accepts one to five and defaults to four. It controls how many platform searches run at the same time. It does not change the output order: ads stay grouped in the order of the requested platform list. Legacy actor_ids overrides are accepted, but the default platform sources are used and the run records a warning.

Another input that was used in a real run:

{
"advertiser": "HubSpot",
"country": "US",
"platforms": ["meta", "google", "linkedin"],
"max_ads_per_platform": 5,
"strict_match": false,
"concurrency": 1
}

That run returned five Meta ads, five Google ads and five LinkedIn ads: fifteen advertisements and one summary row. Counts depend on the current source data; a later search can return a different selection.

Real example: Coolblue across five ad libraries

This input was run on 3 October 2026:

{
"advertiser": "Coolblue",
"domain": "coolblue.nl",
"country": "NL",
"platforms": [
"meta",
"google",
"tiktok",
"linkedin",
"snapchat"
],
"max_ads_per_platform": 10,
"strict_match": true,
"concurrency": 4
}

It returned 36 ads: ten from Meta, ten from Google, ten from TikTok, six from LinkedIn and none from Snapchat. The summary row:

{
"_type": "advertiser_summary",
"advertiser": "Coolblue",
"domain": "coolblue.nl",
"platforms_found": [
"meta",
"google",
"tiktok",
"linkedin"
],
"ads_per_platform": {
"meta": 10,
"google": 10,
"tiktok": 10,
"linkedin": 6,
"snapchat": 0
},
"total_ads": 36,
"landing_domains_seen": [
"coolblue.nl",
"tiktok.com",
"linkedin.com",
"fb.com",
"careersatcoolblue.com"
],
"errors": []
}

A Google ad from the same run, matched on the advertiser's domain:

{
"advertiser_name": "Coolblue B.V.",
"advertiser_id": "AR16794634669365657601",
"ad_id": "CR11238090626463432705",
"headline": null,
"body_text": null,
"format": "image",
"landing_url": "https://adstransparency.google.com/advertiser/AR16794634669365657601/creative/CR11238090626463432705?region=NL",
"landing_domain": "coolblue.nl",
"creative_url": "https://encrypted-tbn1.gstatic.com/shopping?q=tbn:ANd9GcT9POITZB3bQjwEwSJwNrVDVpsuh04iUUXA2hV3zpC9tAZdvWQ",
"first_shown": "2026-05-04",
"last_shown": "2026-10-03",
"platform": "google",
"source": "cross-platform-ad-library",
"creative_id": "CR11238090626463432705",
"fetched_at": "2026-10-03T13:53:36.482Z",
"region": "NL",
"first_seen": "2026-05-04",
"last_seen": "2026-10-03",
"text": null,
"matched_by": "domain",
"confidence": 1
}

A Meta ad from the same run:

{
"advertiser_name": "Coolblue",
"ad_id": "2472373056568246",
"headline": "{{product.name}}",
"body_text": "{{product.custom_label_2}}",
"cta": "Apply now",
"landing_url": "https://www.careersatcoolblue.com/",
"landing_domain": "careersatcoolblue.com",
"creative_url": "https://scontent-ams2-1.xx.fbcdn.net/v/t39.35426-6/731834882_963104756723892_862714434917884101_n.jpg?stp=dst-jpg_s60x60_tt6&_nc_cat=106&ccb=1-7&_nc_sid=c53f8f&_nc_ohc=H2RkVsNIRY8Q7kNvwHfJVEC&_nc_oc=AdrIaoMmG0h8FRnBhLBNmXz0SRa_FPyKaO-jBiR9xgmWzWVuEMp4b1xVQfhlRreyxBU&_nc_zt=14&_nc_ht=scontent-ams2-1.xx&_nc_gid=gyTFw-CiLtlfW3QWTBwEmg&_nc_ss=72180&oh=00_AQO59TskT0thFS-LWQ2oUJ_6qAmuGsJnfHndZSuAjZv3Yg&oe=6AC6E585",
"is_active": true,
"platform": "meta",
"source": "cross-platform-ad-library",
"creative_id": "2472373056568246",
"fetched_at": "2026-10-03T13:53:21.207Z",
"region": "NL",
"text": "{{product.custom_label_2}}",
"matched_by": "name",
"confidence": 0.8
}

Output: competitor ads from every ad library

The first dataset row has _type: advertiser_summary. It includes advertiser, domain, platforms_found, ads_per_platform, total_ads, landing_domains_seen and errors. A platform that returns no ads still appears in ads_per_platform with a zero. The summary does not have a platform field.

The remaining rows omit _type and have platform, advertiser_name, ad_id, matched_by and confidence. Depending on the platform they also include headline, body_text, cta, format, landing_url, landing_domain, creative_url, first_shown, last_shown, impressions, spend, advertiser_id, person_name or is_active. Original field names remain available. Additional common fields include source, creative_id, fetched_at, ad_landing_url, region, text, first_seen and last_seen where the source provides them.

Some fields are null when the platform does not publish that information. Impressions and spend remain strings; they should not be interpreted as verified numeric totals across different platforms. Some libraries publish ad-detail links rather than the actual click destination, and the legacy landing_url field can contain such a library link. Likewise, the Meta creative_url field can contain the advertiser's profile image rather than the ad creative. ad_landing_url contains the actual destination from Meta's link_url; it is null for the other platforms when no actual destination is provided.

matched_by: domain has confidence 1.0; a normalized name match has confidence 0.8. These values describe how the row was linked to your search, not a statistical estimate of attribution. Records are kept in source order. Source duplicates are retained, so consumers that need unique creatives should use platform plus ad ID.

The key-value store record errors contains per-platform failures. Each entry has platform, actor and error. A failure on one platform does not prevent successful results from the others. An entirely empty search still returns a summary with total_ads: 0.

Pricing of the ad library scraper

The pricing model remains $0.02 per run start and $0.008 per delivered advertisement. The summary row is not an advertisement and is not included in the per-ad event. A search with no matching advertisements has no per-ad charge; the run-start event still applies. Existing event names remain run_start and ad. Advertisements are charged after they are delivered to the dataset.

An empty or whitespace-only advertiser without a usable domain completes successfully with an input error and no dataset rows. It incurs the $0.02 run-start event and no per-ad events. The previous version failed that input before charging anything ($0).

Users without a paid Apify plan receive at most ten dataset rows in a run: the summary first and up to nine advertisements. The per-platform source limit is also capped at ten before searching. Only delivered advertisements are charged. The summary can describe more matching ads than the free run delivers, because it describes the search result before the final delivery cap.

Large requests continue automatically. Intermediate collection pages are not advertisements and are not charged as delivered ads. The final dataset contains one summary followed by the collected advertisements.

If collection is interrupted before the final results are ready, after three failed attempts to continue or when the run's time limit stops collection, the run succeeds with an empty dataset, including no summary row. Previously, the Actor still returned a summary with platform errors and any ads already collected. The $0.02 run start fee remains charged; no ad events are charged. Check the errors record for a request timeout, or OUTPUT for a partial flag and time limit warning. A completed search with no ads still returns its summary row.

FAQ about the ad library scraper

Why are there no Snapchat ads for this brand?

Snapchat's public library mainly covers political advertising. A commercial advertiser can therefore return zero Snapchat records without an error. A zero count means the queried library returned nothing for that input; it does not prove the advertiser never runs ads elsewhere.

Why does TikTok report an error for US?

TikTok's library does not support the US region filter used by the legacy cross-platform search. That per-platform error is retained. Other selected platforms can still return records. Choose a supported country when that fits your research scope.

Can I search with a domain alone?

The underlying search can derive a name from a domain. The existing Apify input form still requires advertiser, so provide the advertiser field as well when using that form. A name and domain together generally provide the clearest identity check.

Does an empty result stop the run?

No. Source misses produce a completed run with a summary and zero advertisement records. Source errors are listed individually, and other platform results stay available. An invalid input produces a completed empty run with an input error.

Which ad libraries does this ad library scraper cover?

Five: the Meta Ad Library (Facebook and Instagram ads), the Google Ads Transparency Center, the TikTok ad library, the LinkedIn Ad Library and the Snapchat ads gallery. Choose a subset with platforms; leave it empty to search all five.

How do I make sure the ads really belong to my competitor?

Add the advertiser's website in domain. Ads whose landing page is on that registrable domain get matched_by: domain and confidence 1.0. Keep strict_match on to drop records whose advertiser cannot be confirmed.

Can I run it on a schedule to track competitor ads?

Yes. Create an Apify schedule or call the Actor through the API with the same input every day or week, then compare ad_id values per platform between runs to see which ads are new and which stopped running.