Facebook Ads Library Scraper — Meta & Instagram Ads
Pricing
from $15.00 / 1,000 results
Facebook Ads Library Scraper — Meta & Instagram Ads
Extract ads from the Meta Ads Library (Facebook & Instagram). Get ad copy, running days, EU spend data, carousel cards, and landing page URLs. The only scraper that tracks how long each ad has been running — your key signal for finding competitor winning ads.
Pricing
from $15.00 / 1,000 results
Rating
0.0
(0)
Developer
Yuliia Kulakova
Actor stats
0
Bookmarked
4
Total users
3
Monthly active users
8 days ago
Last modified
Categories
Share
Collect · Analyze · Outperform
The most data-rich Facebook Ads Library scraper on Apify —
daysRunning, structured spend ranges, full carousel cards, video URLs, and landing pages.
Why this one? · Input · Output · Use cases · Pricing
Facebook Ads Library Scraper extracts ads from the Meta Ads Library — Meta's public database of every ad running on Facebook, Instagram, Messenger, Threads, and Audience Network.
Built for marketers, agencies, and researchers who need clean, structured data — not raw HTML or incomplete JSON. Every field is normalized, deduped, and ready to pipe into your analysis tool or CRM.
✨ What makes this different
| Feature | This actor | Most others |
|---|---|---|
daysRunning — how long the ad has been live | ✅ computed automatically | ❌ |
Spend as structured {min, max} — not a raw string | ✅ | ❌ |
| All carousel cards extracted as individual objects | ✅ | First card only |
| Video URLs (fbcdn.net CDN) | ✅ | ❌ |
| Image URLs for all image ads | ✅ | ❌ |
Landing page URL via resolveSnapshotUrls | ✅ opt-in | ❌ |
| Cross-search deduplication | ✅ | ❌ |
| Login wall detection with clear error message | ✅ | ❌ |
| Filters: status, ad category, date range, country | ✅ | Partial |
💡 Why daysRunning is the most valuable field
An ad running for 60+ days is profitable. The advertiser keeps paying because it converts.
daysRunning lets you instantly separate proven winners from tests without any manual calculation. Sort by it descending and you have a ranked list of your competitor's best-performing creatives — right now.
No other Facebook ads scraper on Apify computes this field automatically.
⚙️ Input
| Field | Type | Default | Description |
|---|---|---|---|
searchTerms | string[] | ["Nike"] | Brand names or keywords to search |
countries | string[] | ["US"] | ISO 2-letter country codes (e.g. "US", "GB", "DE") |
adType | string | "ALL" | ALL · POLITICAL_AND_ISSUE_ADS · HOUSING · EMPLOYMENT · FINANCIAL_PRODUCTS_AND_SERVICES |
adActiveStatus | string | "ACTIVE" | ALL · ACTIVE · INACTIVE |
maxAds | integer | 25 | Max ads per search term + country pair |
resolveSnapshotUrls | boolean | false | Visit each ad snapshot page to extract the real landing page URL and CDN media files |
startDate | string | — | Show ads that were active on/after this date (YYYY-MM-DD) |
endDate | string | — | Show ads that were active on/before this date (YYYY-MM-DD) |
Note on date filters: Meta shows ads that were running during the specified period, which may include ads that started before
startDateif they were still active within your range. This is Meta's behavior, not a scraper limitation.
Example inputs
Quick test — Nike US active ads
{"searchTerms": ["Nike"],"countries": ["US"],"adActiveStatus": "ACTIVE","maxAds": 25}
Agency competitor research — 3 brands × 3 countries
{"searchTerms": ["Adidas", "Nike", "Puma"],"countries": ["US", "GB", "DE"],"adActiveStatus": "ACTIVE","maxAds": 200}
Political ads with spend data (EU/DSA)
{"searchTerms": ["election"],"countries": ["DE"],"adType": "POLITICAL_AND_ISSUE_ADS","adActiveStatus": "ALL","maxAds": 100}
Date range — ads from a specific campaign window
{"searchTerms": ["Nike"],"countries": ["US"],"adActiveStatus": "ALL","maxAds": 50,"startDate": "2025-01-01","endDate": "2025-06-30"}
resolveSnapshotUrls — get real landing page URLs
{"searchTerms": ["Nike"],"countries": ["US"],"adActiveStatus": "ACTIVE","maxAds": 20,"resolveSnapshotUrls": true}
📦 Output schema
Each item in the dataset represents one ad. Carousel ads include all cards as separate objects inside creatives.
{"adArchiveId": "1234567890","pageId": "987654321","pageName": "Nike","adActiveStatus": "ACTIVE","adDeliveryStartTime": "2025-11-01T00:00:00.000Z","adDeliveryStopTime": null,"daysRunning": 154,"publisherPlatforms": ["facebook", "instagram"],"mediaType": "VIDEO","creativeVariantCount": 3,"creatives": [{"body": "Just Do It. Shop the new Air Max collection.","title": "Air Max 2026","caption": "nike.com","description": null,"ctaText": "Shop Now","ctaType": "SHOP_NOW","destinationUrl": "https://www.nike.com/air-max","imageUrls": [],"videoUrl": "https://video.ftbs6-2.fna.fbcdn.net/...","cardIndex": 0}],"spend": { "min": 1000, "max": 5000 },"impressions": { "min": 100000, "max": 500000 },"estimatedAudienceSize": { "min": 1000000, "max": 2000000 },"demographicDistribution": null,"euTotalReach": null,"targetAges": null,"targetGender": null,"targetLocations": null,"bylines": null,"fundingEntity": null,"snapshotUrl": "https://www.facebook.com/ads/library/?id=1234567890","scrapedAt": "2026-04-04T12:00:00.000Z"}
Field reference
| Field | Type | Notes |
|---|---|---|
adArchiveId | string | Unique Meta ad ID |
pageName | string | Advertiser page name |
adActiveStatus | string | ACTIVE or INACTIVE |
daysRunning | integer | Days since ad delivery start — key profitability signal |
publisherPlatforms | string[] | e.g. ["facebook", "instagram", "messenger", "threads"] |
mediaType | string | VIDEO, IMAGE, or NONE |
creatives | object[] | All creative variants; carousel = multiple objects |
creatives[].body | string | Ad copy text |
creatives[].videoUrl | string | Direct CDN video URL (fbcdn.net) |
creatives[].imageUrls | string[] | Direct CDN image URLs (fbcdn.net) |
creatives[].destinationUrl | string | Landing page URL — from GraphQL when available, or via resolveSnapshotUrls |
spend | object | {min, max} in USD — see availability note below |
impressions | object | {min, max} — see availability note below |
estimatedAudienceSize | object | {min, max} potential reach |
demographicDistribution | object | Age/gender breakdown (political ads only) |
fundingEntity | string | Who paid for the ad (political ads only) |
Spend & impressions availability
| Ad type | spend & impressions |
|---|---|
| US / global commercial ads (Nike, Adidas, etc.) | null — Meta policy, not a scraper bug |
| EU/UK commercial ads | Available for some ad categories under DSA |
| Political, issue, housing, employment, financial ads | ✅ Returned as {min, max} objects |
🎯 Use cases
Competitor ad intelligence Find which creatives your competitors have kept running for 60, 90, 120+ days. Long-running = profitable. Build a swipe file of proven winners, not guesses.
Agency client reporting Bulk-export all active ads for a brand across every country and platform. Export to CSV, Google Sheets, or push straight into your reporting dashboard via Apify API.
Creative benchmarking What CTAs dominate your category? Which formats (video vs. image vs. carousel) are brands investing in? What copy angles are getting budget behind them?
Political ad monitoring EU/UK DSA transparency data: spend ranges, estimated reach, demographic targeting, and funding entity — all structured and ready for analysis.
Market research & trend tracking Run the same search weekly to track how competitors shift their messaging, seasonal spend, and creative strategy over time.
💰 Pricing
From $15.00 / 1,000 ads — no monthly fees, pay only for what you scrape.
| Mode | What you get | ~Total cost per 1,000 ads |
|---|---|---|
| Standard | All fields — copy, video URLs, image URLs, spend, all carousel cards | ~$15 |
resolveSnapshotUrls: true | Everything above + confirmed landing page URL for each ad | ~$16–17 |
resolveSnapshotUrlsmode visits an extra page per ad (~5 sec each), which adds some Apify platform compute time on top of the base price. No monthly fees — pay only for what you scrape.
⚠️ Limitations
- Spend/impressions are
nullfor US commercial ads. This is Meta's transparency policy — data is only disclosed for political/issue/housing/employment/financial ads and some EU ads under DSA rules. - Meta does not expose exact spend — only ranges (e.g. $1,000–$5,000).
resolveSnapshotUrlsadds ~5 seconds per ad (one extra page load). For 1,000 ads, budget ~90 minutes of run time.- Date range filters rely on Meta's own filtering, which may include ads that started before your
startDateif they were still active during your range. - Meta periodically updates their internal page structure. If you notice empty results, open an issue and we'll push an update within 24–48 hours.

