Meta Ad Library Scraper avatar

Meta Ad Library Scraper

Pricing

from $5.00 / 1,000 ads

Go to Apify Store
Meta Ad Library Scraper

Meta Ad Library Scraper

Meta Ad Library Scraper returns every ad a brand runs on Facebook and Instagram: copy, picture or video, run dates and days running, and reach, targeting and payer for ads shown in the EU. No login. $5 per 1,000 ads. Monitor mode reports new, 30/60/90-day and stopped ads.

Pricing

from $5.00 / 1,000 ads

Rating

0.0

(0)

Developer

Agnes Maina

Agnes Maina

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Run on Apify

Meta Ad Library Scraper: every ad a brand runs on Facebook and Instagram, with days running

This Meta Ad Library scraper returns every ad a brand runs on Facebook and Instagram, with the copy, the picture or video, the start date, how many days the ad has been running, and for ads shown in the EU the reach by country, age and gender and who paid for it. Search by keyword or by advertiser page. No login, no cookies.

Type in Nike and you get Nike's active ads as rows you can filter, sort and export to JSON, CSV or Excel. It reads the same public library Meta also calls the Facebook Ads Library, so Instagram ads and Messenger ads come back alongside the Facebook ones. Sort by daysRunning to find the ads a brand has kept paying for. Run it once for research, or schedule monitor mode to get only the ads a competitor launched since last time, plus the ones that crossed 30, 60 or 90 days and the ones that stopped.

What you get

Each row is one ad from the Meta Ad Library.

FieldWhat it is
adId, libraryUrlThe ad's Library ID and its page in the Ad Library
advertiserName, advertiserId, advertiserUrlThe Facebook page that runs the ad
startDate, endDate, daysRunning, isActiveWhen the ad started, when it was last seen, how many days it has run, and whether it is still running
platformsfacebook, instagram, messenger or audience_network
displayFormatIMAGE, VIDEO, DCO (several versions tested at once) or DPA (catalog ad)
headline, body, linkDescription, ctaTextThe ad copy as text
landingUrl, landingDomainWhere the ad sends people
imageUrls, videoUrls, thumbnailUrlThe creative
collationCountHow many versions of this ad Meta groups together
euTotalReach, euReachByCountry, euReachByAgeGenderPeople reached in the EU, by country and by age and gender, where Meta publishes it
targetAges, targetGender, targetLocationsTargeting Meta publishes for EU ads
payerName, beneficiaryNameWho paid for the ad and who benefits, where Meta publishes it
searchTerm, searchAdvertiserThe search that found this ad
isNew, milestone, stoppedMonitor mode: new since your last run, crossed 30, 60 or 90 days running, or stopped since your last run
charged, reasonWhether the row was charged, and why
scrapedAtWhen the row was collected

Most Ad Library scrapers hand back the raw card. This one computes daysRunning for every ad, reads the EU reach breakdown that Meta only shows behind a second click, and in monitor mode tells you what changed since your last run.

What is not returned

  • Ad spend or budgets. Meta publishes spend only for political and social-issue ads, and this actor does not target those.
  • Impressions, clicks, conversions or bids.
  • Reach, targeting and payer for ads never shown in the EU. Meta publishes them only for EU ads. Those rows still have the ad itself.
  • Ads Meta has removed from the Ad Library.

Try it in 30 seconds

  1. Open the Store page and click Try for free.
  2. Enter a page name in Advertisers, for example Nike, or a keyword in Search terms, for example protein powder.
  3. Click Start. Open the Ads table when the run finishes, or download JSON, CSV or Excel.

Every Apify account gets $5 of free platform credit each month. At $0.005 per ad that covers about 1,000 ads.

The same run as input JSON:

{ "advertisers": ["Nike"], "country": "ALL", "activeStatus": "active", "maxAdsPerSearch": 50 }

Example output

One record from a real Nike run, collected on 2026-10-02. The CDN links are shortened and euReachByCountry is cut to 6 of its 33 countries here. The run was made before pricing was set, so charged, isNew and milestone are left out.

{
"adId": "1382287983621487",
"advertiserId": "15087023444",
"advertiserName": "Nike",
"advertiserUrl": "https://www.facebook.com/nike/",
"collationCount": 1,
"startDate": "2026-09-30",
"endDate": "2026-10-02",
"isActive": true,
"daysRunning": 2,
"platforms": ["facebook", "instagram"],
"displayFormat": "DCO",
"headline": "Festive Sale",
"body": "Up to 40% off* is here. Get an extra 15% off from now till 5 October. Use code GEARUP",
"linkDescription": "Nike - Official Online Store for Athletic Shoes, Clothing & Sports Gear. Shop the latest Nike products and enjoy free shipping.",
"ctaText": "Shop now",
"landingUrl": "https://www.nike.in/lp/eoss-mweb",
"landingDomain": "nike.in",
"imageUrls": [],
"videoUrls": ["https://video-hou1-1.xx.fbcdn.net/o1/v/t2/f2/m366/AQO96AbQbm...", "https://video-hou1-1.xx.fbcdn.net/o1/v/t2/f2/m366/AQNptjGKuE..."],
"thumbnailUrl": "https://scontent-hou1-1.xx.fbcdn.net/v/t39.35426-6/832745501...",
"libraryUrl": "https://www.facebook.com/ads/library/?id=1382287983621487",
"euTotalReach": 22032,
"euReachByCountry": { "PT": 3701, "IT": 2842, "ES": 2821, "GR": 1465, "RO": 1315, "FR": 1030 },
"euReachByAgeGender": {
"18-24": { "male": 709, "female": 290, "unknown": 247 },
"25-34": { "male": 2725, "female": 1160, "unknown": 412 },
"35-44": { "male": 3163, "female": 1707, "unknown": 368 },
"45-54": { "male": 2551, "female": 1741, "unknown": 301 },
"55-64": { "male": 1653, "female": 1650, "unknown": 238 },
"65+": { "male": 1281, "female": 1749, "unknown": 162 }
},
"targetAges": null,
"targetGender": "All",
"targetLocations": null,
"payerName": null,
"beneficiaryName": null,
"searchTerm": null,
"searchAdvertiser": "Nike",
"stopped": false,
"reason": "ad with advertiser, start date and content",
"scrapedAt": "2026-10-02T09:56:34.247Z"
}

Pricing

Pay per event. No monthly fee.

EventPriceWhen you pay
Actor start$0.00005Once per run
Ad$0.005An ad is delivered with its advertiser, its start date and its creative (copy, picture or video)

Worked example: 1,000 ads cost 1,000 x $0.005 = $5, plus $0.00005 for the run start.

Rows without a start date or a creative are still delivered, with charged: false, and cost $0. EU reach, targeting and payer are included in the ad price. In monitor mode you pay only for ads that are new since your last run; milestone and stopped rows are free.

How this compares

Live Apify Store data from 2026-10-02 for "facebook ad library" and "meta ad library". Prices are the published per-ad price on the free plan. "—" means the listing does not say.

ActorPrice per adDays runningEU reach by country, age and genderMonitor modeLogin needed
This actor$0.005, all detail includedYesYesYes, new, 30/60/90-day and stopped adsNo
apify/facebook-ads-scraper$0.0058———No
curious_coder/facebook-ads-library-scraper$0.00075————
constructive_calm/facebook-ad-library-pro$0.00049, plus $0.00025 for details————
whoareyouanas/meta-ad-scraper$0.01————

If you only need raw cards in bulk, curious_coder is cheaper. If you need to know how long each ad has run and who it reached, compare against the per-ad plus detail prices.

Input

FieldTypeDefaultDescription
searchTermsarrayKeywords, for example protein powder. Add at least one search term or advertiser
advertisersarrayFacebook page names, page IDs or page URLs, for example Nike. Add at least one search term or advertiser
countrystringALLTwo-letter country code such as US, GB or DE. Only ads shown in that country are delivered
activeStatusstringactiveactive, inactive or all
mediaTypestringallall, image, video, meme or none
minDaysRunninginteger0Deliver only ads running for at least this many days. 0 turns the filter off
maxAdsPerSearchinteger100Stop after this many ads per search term or advertiser
fetchEuDetailsbooleantrueRead reach, targeting and payer for EU-eligible ads
onlyNewSinceLastRunbooleanfalseMonitor mode. Later runs of the same search deliver only new, milestone and stopped ads
proxyConfigurationobjectApify residentialThe Ad Library blocks datacenter addresses, so residential proxy is the default

Monitor mode

Set onlyNewSinceLastRun to true and schedule the run daily or weekly. The first run delivers current ads up to your limit and remembers every ad it saw. Each later run delivers ads that appeared since, marked isNew and charged, plus free rows for ads that crossed 30, 60 or 90 days running (milestone) and ads that disappeared from the Library (stopped).

Use cases

  • Competitor ad monitoring. Schedule monitor mode weekly on ten competitors and get only the new ads, the ones that have proven themselves by running 90 days, and the ones that got cut.
  • Winning-ad research. Set minDaysRunning to 30 and search a category. Ads a brand keeps paying for are the ads that work.
  • Agency pitches. Pull a prospect's rivals' active ads and open the pitch with their copy and creative.
  • EU market research. Sort by euTotalReach and read euReachByCountry to see where a brand is actually spending in Europe.
  • Creative swipe file. Export image and video links with headline and body for a whole category.

Integrations

Run it and get the dataset in one request:

curl -X POST "https://api.apify.com/v2/acts/agnes.developer.queen~meta-ad-library-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"advertisers": ["Nike"], "maxAdsPerSearch": 50}'

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("agnes.developer.queen/meta-ad-library-scraper").call(
run_input={"advertisers": ["Nike"], "maxAdsPerSearch": 50}
)
for ad in client.dataset(run["defaultDatasetId"]).iterate_items():
print(ad["daysRunning"], ad["headline"], ad["libraryUrl"])

Node.js:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('agnes.developer.queen/meta-ad-library-scraper').call({
advertisers: ['Nike'],
maxAdsPerSearch: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'ads');

Make, n8n and Zapier: use the Apify app or node, pick "Run Actor", choose agnes.developer.queen/meta-ad-library-scraper and paste the input JSON. Send the dataset on to Google Sheets, Slack or your CRM. Schedules and webhooks work as with any Apify actor.

MCP server, for any MCP client:

https://mcp.apify.com/?tools=agnes.developer.queen/meta-ad-library-scraper

Ask the agent which of a competitor's ads have run longest this quarter. It should read daysRunning, headline, body, euTotalReach and libraryUrl.

FAQ

Is the Meta Ad Library free?

Yes. Meta runs it as a free public website at facebook.com/ads/library. It has no export and its official API covers only political and social-issue ads. This actor turns the same public data into rows you can export, for $5 per 1,000 ads.

Can I see how much a competitor spends on Facebook ads?

No. Meta publishes spend only for political and social-issue ads. For everyone else you get the ads, their start dates, how long they have run, and for EU ads the number of people reached. An ad that has run 90 days and reached 20,000 people in the EU is a strong signal of where the budget goes.

What does days running mean?

The number of days between the ad's start date in the Library and the day the row was collected, or the ad's end date if it stopped. Brands keep paying for ads that work, so long-running ads are usually the winners.

Why do some rows have no EU reach?

Meta publishes reach, targeting and payer only for ads shown in the EU. Ads that never ran there have no such data to read, and euTotalReach is null. You still get the ad, its dates and its creative.

Does it get video ads?

Yes. Video ads return the video file links in videoUrls and a still in thumbnailUrl. Set mediaType to video to get only those.

Why was an ad not charged?

The Library gave no start date or no creative for it, usually a card still loading or an ad Meta has partially removed. The row is still delivered with charged: false, the reason field says why, and libraryUrl still opens it. You pay $0 for it.

Can I monitor a brand weekly?

Yes. Turn on onlyNewSinceLastRun and add a weekly schedule in Apify. The first run sets the baseline, and each later run delivers and charges only for new ads, with free rows for milestones and stopped ads.

Why did an advertiser name return nothing?

The name must match a Facebook page. The actor searches the name and takes the page whose name matches exactly, so use the name as it appears on the page, or paste the page URL or page ID instead.

Do I need a Facebook account or cookies?

No. The actor reads the public Ad Library without logging in.

The actor reads only public pages that Meta publishes for anyone to see, and it collects no personal data. You are responsible for how you use the data and for following the laws and terms that apply to you. Ask a lawyer if you are unsure about your use case.

Support

Open an issue in the Issues tab on the Store page. Bug reports with a run ID get fixed fastest.