Facebook Ad Library Scraper
Pricing
from $0.80 / 1,000 ad scrapeds
Facebook Ad Library Scraper
Search Meta's public Ad Library without login or API key. Get ad text, creatives, spend range, impressions, platforms and funding entity, by keyword or for a specific Facebook Page. $0.0008 per ad plus $0.005 per run start.
Pricing
from $0.80 / 1,000 ad scrapeds
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Scrape any ad from Meta's public Ad Library: Facebook, Instagram, WhatsApp, Threads, Messenger, Audience Network. No login, no API key, no access token.
Why this scraper
- Paste any Ad Library URL: the filters in the URL (country, ad type, active status, media type, publisher platforms, content languages, page IDs, date range, sort) are parsed automatically. Apply filters in your browser, copy the URL, paste it here.
- Full creative data: ad text, headline, link, call to action, every image, every video (HD, SD, preview), every carousel card with its own link and CTA. Meta's raw creative object is passed through in
snapshot, so new fields are never lost. - Page info: page name, ID, profile picture, page likes, categories.
- Political and issue ads: spend range, reach range and impressions as Meta publishes them.
- EU ad transparency details (reach, targeting, payer): switch on
includeAdDetailsto get total EU reach, reach by country, age and gender, targeting and the declared payer and beneficiary for each ad. - Fast and light: about 1,000 ads in roughly 3 minutes.
- Pay-per-result: you pay for the ads you receive.
Input sources (mix and match)
| Field | Example | Use when |
|---|---|---|
searchUrls | https://www.facebook.com/ads/library/?active_status=all&country=DE&q=nike&search_type=keyword_exact_phrase&publisher_platforms[0]=instagram&start_date[min]=2025-06-01 | You've already built a filtered view in the browser |
searchQueries | ["Tesla Model 3", "electric vehicles"] | Quick keyword searches across all of Meta's network |
pageIds | ["15087023444"] | You know the advertiser's numeric Page ID and want all their ads |
advertiserNames | ["Baulig Consulting"] | You know the brand name (searched as exact phrase) |
Filters (apply to keyword / page / advertiser searches)
Note: when you paste a
searchUrl, filters from that URL take precedence. The fields below apply tosearchQueries,pageIds, andadvertiserNames.
| Filter | Values | Default |
|---|---|---|
country | ISO code (US, GB, DE, ...) or ALL | ALL |
adType | ALL, POLITICAL_AND_ISSUE_ADS, HOUSING_ADS, EMPLOYMENT_ADS, CREDIT_ADS | ALL |
activeStatus | ALL, ACTIVE, INACTIVE | ALL |
mediaType | ALL, IMAGE, VIDEO, MEME, NONE | ALL |
publisherPlatforms | array of facebook, instagram, messenger, audience_network, whatsapp, threads, oculus | all |
contentLanguages | ISO 639-1 codes (en, de, ...) | all |
searchType | keyword_unordered (broad) or keyword_exact_phrase (strict) | keyword_unordered |
maxAdsPerInput / maxResults | ads per source / total ads (0 = no total limit) | 20 / 0 |
sortBy | total_impressions_DESC, total_impressions_ASC, time_active_DESC, time_active_ASC (Meta has no newest-first sort) | relevancy |
startDateMin / startDateMax | YYYY-MM-DD | none |
includeAdDetails | true adds EU ad transparency details (reach, targeting, payer) to every ad. Runs take longer because each ad needs one extra lookup | false |
What you get
One row per ad. Spend and reach are published by Meta only for political and issue ads, so they are empty for other ads. Meta may add fields over time; they are passed through in snapshot.
| Field | Type | Description |
|---|---|---|
ad_archive_id | string | Unique Ad Library archive ID |
ad_id | string | Internal ad ID (rare) |
collation_id | string | Meta's grouping ID for ad variants (group by it to see distinct creatives) |
collation_count | integer | Number of ad variants in this group |
page_id | string | Facebook Page ID of the advertiser |
page_name | string | Display name of the advertiser's Page |
page_is_deleted | boolean | Whether the advertiser Page has been deleted |
page_like_count | integer | Likes on the advertiser's Page |
page_profile_picture_url | string | Direct URL to the Page's profile picture |
page_profile_uri | string | Public URL of the Page |
is_active | boolean | Whether the ad is currently running |
start_date | integer | Unix timestamp when the ad started running |
end_date | integer | Unix timestamp when the ad stopped running (empty if still active) |
start_date_formatted | string | Start date as YYYY-MM-DD |
end_date_formatted | string | End date as YYYY-MM-DD |
total_active_time | integer | Total seconds the ad has been active |
publisher_platform | array | Platforms where the ad runs (FACEBOOK, INSTAGRAM, MESSENGER, AUDIENCE_NETWORK, WHATSAPP, THREADS) |
targeted_or_reached_countries | array | Countries the ad targets or reaches |
categories | array | Meta's ad categories |
display_format | string | Creative format (IMAGE, VIDEO, CAROUSEL, DCO, ...) |
cta_type | string | Call-to-action button type (LEARN_MORE, SHOP_NOW, ...) |
cta_text | string | Display text of the call-to-action button |
link_url | string | Destination URL the ad links to |
link_description | string | Description text below the link title |
title | string | Ad headline |
body_text | string | Main body text of the ad |
ad_caption | string | Caption on the link card (usually the domain) |
snapshot | object | Meta's full creative object: body, images[], videos[], cards[] for carousels, page categories, byline, disclaimer label and more |
currency | string | Currency code for spend figures |
spend | string | Spend range as text, for example >$1M (political and issue ads only) |
reach_estimate | string | Reach range as text, for example >1M (political and issue ads only) |
impressions_with_index | object | Impression range with text representation |
has_user_reported | boolean | Whether users have reported the ad |
report_count | integer | Number of user reports |
is_aaa_eligible | boolean | Whether the ad is eligible for ad authorization (political and issue ads) |
gated_type | string | Ad gating status (ELIGIBLE, GATED, ...) |
hide_data_status | string | Whether transparency data is hidden (NONE, HIDDEN, ...) |
contains_digital_created_media | boolean | Whether the ad contains AI-generated or digitally altered media |
contains_sensitive_content | boolean | Whether Meta flagged sensitive content |
is_violating_eu_siep | boolean | Whether the ad violates the EU policy on sensitive issues, elections or politics |
violation_types | array | Policy violations associated with the ad |
verified_voice_context | object | Verified-voice transparency information |
state_media_run_label | object | State-controlled media label |
menu_items | array | Interactive menu items in the ad |
fev_info | object | External review information |
regional_regulation_data | object | Regional regulatory data |
aaa_info | object | Ad authorization data, included when Meta returns it |
transparency_by_location | object | Per-jurisdiction transparency data, included when Meta returns it |
advertiser | object | Advertiser metadata, included when Meta returns it |
total_advertiser_spend_lower | integer | Lifetime Page spend, lower bound (only when Meta returns it) |
total_advertiser_spend_upper | integer | Lifetime Page spend, upper bound (only when Meta returns it) |
total_advertiser_spend_currency | string | Currency of the lifetime Page spend |
eu_total_reach | integer | Total EU reach of the ad (with includeAdDetails; empty when the ad was not delivered in the EU) |
targets_eu | boolean | Whether the ad targets the EU (with includeAdDetails) |
beneficiary | string | Beneficiary declared by the advertiser (with includeAdDetails) |
payer | string | Payer declared by the advertiser (with includeAdDetails) |
target_ages | string | Targeted age range, for example 18-65+ (with includeAdDetails) |
target_gender | string | Targeted gender, for example All (with includeAdDetails) |
target_locations | array | Targeted locations, an empty list when unknown (with includeAdDetails) |
reach_breakdown | array | EU reach per country and age range: country, age_range, male, female, unknown (with includeAdDetails) |
ad_details_status | string | ok, not_eu (ad not delivered in the EU) or failed (details could not be fetched) (with includeAdDetails) |
ad_library_url | string | Direct link to the ad in the Ad Library |
advertiser_url | string | Link to all ads of the Page |
country | string | Country filter applied to the request |
search_input | string | Which input produced the ad: query:X, page_id:X, advertiser:X or url:X |
source_url | string | The Ad Library URL used to fetch the ad |
scraped_at | string | ISO 8601 UTC timestamp when the record was extracted |
Pricing
Pay-per-result. An ad is charged only after it has been saved to the dataset, and each ad is charged once. A run with no results costs nothing.
| Event | When | Price |
|---|---|---|
actor-start | Once per run, right before the first ads are saved | $0.005 |
facebook-ad-result | Per ad saved to the dataset | $0.0008 |
Example: 1,000 ads cost one start event plus 1,000 ad events (about $0.81).
Usage examples
Paste any Ad Library URL
{"searchUrls": ["https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=DE&q=baulig&search_type=keyword_exact_phrase&publisher_platforms[0]=facebook&publisher_platforms[1]=instagram&start_date[min]=2025-06-06"],"maxResults": 200,"maxAdsPerInput": 200}
Search by keyword in a specific country
{"searchQueries": ["Tesla Model 3", "electric vehicles"],"country": "US","activeStatus": "ACTIVE","mediaType": "VIDEO","maxAdsPerInput": 100}
Get all ads for a specific advertiser Page
{"pageIds": ["15087023444"],"maxAdsPerInput": 500}
Research political advertisers in the EU
{"searchQueries": ["vote 2026", "election"],"adType": "POLITICAL_AND_ISSUE_ADS","country": "DE","contentLanguages": ["de"],"maxAdsPerInput": 200}
Compare a brand across platforms
{"advertiserNames": ["Nike"],"country": "ALL","publisherPlatforms": ["facebook", "instagram"],"maxAdsPerInput": 500}
EU ad transparency details (reach, targeting, payer)
{"searchQueries": ["nike"],"country": "DE","maxAdsPerInput": 20,"includeAdDetails": true}
Example of the added fields for one ad:
{"eu_total_reach": 140850,"targets_eu": true,"payer": "Example Media Ltd.","beneficiary": "Example Media Ltd.","target_ages": "21-65+","target_gender": "All","target_locations": ["Germany"],"reach_breakdown": [{ "country": "DE", "age_range": "25-34", "male": 1200, "female": 800, "unknown": 12 }],"ad_details_status": "ok"}
Use with AI agents (MCP)
Connect this actor to any MCP-compatible AI client, including Claude Desktop, Claude.ai, Cursor, VS Code, LangChain and LlamaIndex.
{"mcpServers": {"apify": {"command": "npx","args": ["-y","mcp-remote","https://mcp.apify.com?tools=santamaria-automations/facebook-ad-library-scraper","--header","Authorization: Bearer <APIFY_TOKEN>"]}}}
Example prompt: "Use facebook-ad-library-scraper to find 30 active Nike video ads in Germany, including page like count and call to action."
Use cases
- Competitive intelligence: see what ads your competitors are running, with copy, creative and call to action
- Creative research: analyse ad hooks, CTAs and carousel structures at scale
- Political ad transparency: spend and reach ranges for political and issue ads
- Market sizing: measure category-level ad activity across countries and platforms
- Lead generation: find companies that advertise on Meta in your vertical
- Compliance auditing: surface AI-generated, sensitive or flagged ads
Notes
- Meta's Ad Library is publicly accessible without login under their ad transparency policy
- Spend and reach ranges are Meta's own and only published for political and issue ads
collation_idgroups ad variants of one creative: group by it to see distinct creatives- Meta serves 10 ads per page. The scraper waits about 1.5 seconds between requests, so 1,000 ads take roughly 3 minutes
pageIdsmust be numeric Page IDs. To search by brand name useadvertiserNames- Meta limits how fast the Ad Library can be read. Blocked or rate-limited requests are retried automatically (
maxIPRotations, default 5 retries). Large runs may need a higher value. - Changes on Meta's side are handled automatically, so runs keep working without any action from you
Data protection
This actor returns only data that is publicly visible on the source pages. Results can include personal data, such as names, phone numbers, email addresses and addresses of private persons, sole traders or contact persons. Where the source labels an entry type, it is included so you can filter the results yourself.
You are responsible for using the data lawfully, including the GDPR/DSGVO, national data-protection laws and unfair-competition rules (e.g. UWG) for marketing and outreach.
Related actors
- Instagram Scraper - profiles and posts of the brands you find in the Ad Library.
- TikTok Search Scraper - see the same brands' organic TikTok content.
- Google Ads Transparency Scraper - the Google side of a competitor's advertising.
- Website Contact Extractor - contact details from the advertisers' websites in
link_url.
Issues and feedback
- Issues tab for bug reports and feature requests
- More actors by santamaria-automations