Meta's Ad Library is the single best window into what your competitors are actually running — every active ad, every creative, on Facebook and Instagram, free to browse. But it is also widely misunderstood, because the data it exposes is not uniform. The fields you get for a Shopify store's product ad are nothing like the fields you get for a political campaign's ad, and most people who ask "how much did they spend?" don't realize that number simply does not exist for commercial advertisers.
The split that defines everything: commercial vs. political/issue ads
Meta classifies ads into two buckets, and each bucket is governed by a different transparency regime. This single distinction determines which fields are available, so it is worth understanding before you write any query.
| Field | Commercial ads | Political / issue ads |
|---|---|---|
| Ad creative (image/video) | Yes | Yes |
| Ad copy / body text | Yes | Yes |
| Page name & link | Yes | Yes |
| Platforms it ran on (FB/IG/Messenger) | Yes | Yes |
| Active / inactive status & start date | Yes | Yes |
| Spend range | No | Yes (banded) |
| Impression range | No | Yes (banded) |
| Audience demographics (age/gender/region) | No | Yes |
| Funding entity / "paid for by" | No | Yes |
The takeaway: for commercial competitive research your value is in the creative and copy and how long an ad has been running, not in spend. A long-running ad is itself the signal — advertisers kill losers fast, so an ad that has been live for months is almost certainly a winner. For political/issue research you additionally get banded spend, impressions and who paid, because that data is mandated for transparency.
Reading "ad lifespan" as a performance proxy
Since commercial spend is hidden, the most useful derived metric is duration. Each ad row carries a start date and an active flag. Compute days_active = today - start_date for currently-running ads, and you can rank a competitor's library by longevity. The handful of ads that have survived 60, 90, 120 days are their proven creative — the angles, hooks and offers worth studying. Pair that with the count of near-duplicate variations of one creative (Meta lets advertisers run many copies of an ad), and high variation count plus long lifespan is the strongest "this is working" signal the library can give you.
The filters that scope your pull
The Ad Library is country-partitioned and faceted. The inputs that matter:
- Country — a single country code per query (the library is not global in one call). To cover multiple markets, fan out one run per country.
- Search mode — by page (everything a specific advertiser runs) or by keyword (every advertiser using a phrase in their copy). Page mode for competitor teardown; keyword mode for category-wide creative mining.
- Ad status —
active(running now),inactive(stopped), or all. Active-only is what you want for "what is live today." - Media type — image, video, or all. Useful when you only care about, say, video hooks.
- Ad category — "all ads" vs. the political/issue subset, which is what unlocks the spend and impression bands.
Why most people don't use the official API for this
Meta does publish an official Ad Library API — but it is restricted to political and issue ads only, requires identity verification, and needs an access token tied to a confirmed account. For ordinary commercial competitor research it is the wrong door entirely: it simply won't return product ads. That is why practitioners scrape the public Ad Library web interface, which has no token requirement and covers every ad category. A maintained scraper wraps that interface, handles paging through a competitor's full library, and returns the creatives and metadata as structured rows.
Worked example: teardown of a competitor's live video ads in the US
Say you want every currently-running video ad for the page "acmeskincare" in the United States, so you can study their best-performing hooks. Search by page, filter to active video ads, scoped to US:
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchMode": "page",
"pageId": "acmeskincare",
"country": "US",
"activeStatus": "active",
"mediaType": "video",
"maxItems": 200
}'
Each row comes back with the adCreativeBody (the copy), media URLs for the video, the linked pageName, the publisherPlatforms array, an adDeliveryStartTime and the active flag. Sort by start time to surface their longest-running creatives, group near-identical bodies to see which angle they are scaling, and pull the media URLs to actually watch the hooks. That is a competitor creative teardown that would take a day by hand, done in one run.
Pull any advertiser's full library as JSON
Our maintained Facebook Ad Library Actor pages through a competitor's entire library and returns creatives, copy, platforms, status and start dates as structured data — country and status filters built in, callable as an API, free to start with monthly Apify credits.
Get the Ad Library Scraper → Or get done-for-you leadsTroubleshooting common surprises
- "I see the ads in my browser but the scraper returns nothing."
- You almost certainly omitted the country, or set a country where that page runs no ads. The library returns an empty set per-country, not a global one. Confirm the page is active in that specific market.
- "Where is the spend figure?"
- It does not exist for commercial ads — only political/issue ads carry banded spend and impressions. If you need it, you must be querying ads in the political/issue category, which also requires the official restricted API for full fidelity.
- "The same ad appears many times."
- That is expected. Advertisers run multiple near-identical copies of a creative across audiences and placements. Dedupe on the creative body plus media hash if you want unique creatives, but remember the copy count is itself a signal of how hard they are pushing it.
- "Page-name search misses ads I know exist."
- Page search matches the advertiser's page, while keyword search matches ad copy text. An ad whose copy contains your phrase but is run by a differently-named page only shows under keyword mode. Run both modes for full coverage.
Disclosure: the links to Apify on this page are affiliate links. If you create a paid account through them we may earn a commission, at no extra cost to you. We recommend Apify because we build and ship Actors on it ourselves.