Facebook Ads Library Scraper avatar

Facebook Ads Library Scraper

Pricing

from $0.20 / 1,000 dataset items

Go to Apify Store
Facebook Ads Library Scraper

Facebook Ads Library Scraper

Extract ads from the Meta Ad Library by search URL or Facebook Page URL: creatives, copy, CTAs, platforms, run dates and optional EU transparency details. $0.20 per 1,000 ads, first 30 ads of every URL free.

Pricing

from $0.20 / 1,000 dataset items

Rating

0.0

(0)

Developer

API Dojo

API Dojo

Maintained by Apify Partner

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

11 hours ago

Last modified

Categories

Share

The Facebook Ads Library Scraper extracts ads from the Meta Ad Library by search URL or Facebook Page URL, with each ad's creative, copy, platforms and run dates. Ads cost $0.0002 each, or $0.20 per 1,000 ads, with the first 30 ads of every URL free.

The Facebook Ads Library Scraper accepts 2 source URL types, reads 12 Ad Library URL parameters, exposes 15 input fields, adds 9 derived fields to every ad, adds 7 more with ad details, and bills through 3 charge events. Every price below is a per-event charge on a paid Apify plan, with no subscription to this actor and no monthly minimum.

What Does the Facebook Ads Library Scraper Extract?

The Facebook Ads Library Scraper extracts every ad that an Ad Library search or a Facebook Page returns, in 2 layers: the ad as the Facebook Ad Library returns it, plus an optional ad details layer.

The table below lists the 4 data groups the Facebook Ads Library Scraper returns and where each group lives in the output.

Data groupOutput locationIncluded
Ad and advertiser identityad_archive_id, page_id, page_name, is_active, publisher_platform, start_date, end_dateEvery ad
Creative and copysnapshot.title, snapshot.body.text, snapshot.cta_text, snapshot.link_url, snapshot.display_format, snapshot.images, snapshot.videos, snapshot.cardsEvery ad
Derived fieldsurl, total, position, ads_count, start_date_formatted, end_date_formatted, ad_library_url, runTag, inputSourceEvery ad
Ad detailsadvertiser, aaa_info, violation_types, verified_voice_context, transparency_by_location, is_violating_eu_siep, is_siep_advertiser_eligible_for_ai_disclosureisDetailsPerAd set to true

The ad details layer carries EU and UK transparency data (reach by country, age and gender), advertiser page info, page spend and payer and beneficiary data for each ad that has details in the Facebook Ad Library.

Which URLs Does the Facebook Ads Library Scraper Accept?

The Facebook Ads Library Scraper accepts 2 URL types in startUrls: Ad Library search URLs and Facebook Page URLs. The 4 filter inputs, activeStatus, sorting, onlyAdsNewerThan and onlyAdsOlderThan, apply to both types, and a filter set in a search URL takes priority.

  • Ad Library search URLs, such as https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=US&q=nike&search_type=keyword_unordered&media_type=all, run the search exactly as the URL describes it. Each search URL needs a keyword (q) or an advertiser page (view_all_page_id).
  • Facebook Page URLs, in the 3 forms https://www.facebook.com/nike, https://www.facebook.com/profile.php?id=... and https://www.facebook.com/p/Name-123..., return the ads that Page has run. The Facebook Ads Library Scraper resolves the Page to its page ID, then searches that page's ads.

The Facebook Ads Library Scraper reads 12 parameters from an Ad Library search URL.

URL parameterWhat it filters
qSearch keyword
search_type=keyword_exact_phraseExact phrase search
view_all_page_idOne advertiser's ads
countryCountry, or all countries when the parameter is absent
ad_typeAd category
active_statusActive status
media_typeMedia type
publisher_platforms[n]Platforms
content_languages[n]Languages
sort_data[mode]Sorting: total_impressions or relevancy_monthly_grouped
start_date[min]Earliest start date
start_date[max]Latest start date

Who Uses the Facebook Ads Library Scraper?

Listed below are the 5 roles that run the Facebook Ads Library Scraper against Meta Ad Library data.

  • Marketing agencies and media buyers track competitor creatives and landing pages through snapshot.title, snapshot.body.text, snapshot.cta_text and snapshot.link_url, and measure how long ads stay live from start_date_formatted and end_date_formatted.
  • Brands and e-commerce teams monitor competitor promotions per Facebook Page with onlyAdsNewerThan and activeStatus, and read publisher_platform to see which of FACEBOOK, INSTAGRAM, MESSENGER, THREADS and AUDIENCE_NETWORK carry each ad.
  • Market research firms analyze advertising by keyword, country, language and media type through search URL filters, and size each search with total.
  • Political and policy researchers study political and issue ads through spend, impressions_with_index, aaa_info.payer_beneficiary_data and advertiser.ad_library_page_info.page_spend.
  • Compliance and brand protection teams find ads that use a brand name through q, and review transparency_by_location.eu_transparency for reach by country, age and gender.

Each of these roles pays per ad saved, so run volume sets the bill.

What Does the Facebook Ads Library Scraper Cost?

The Facebook Ads Library Scraper charges 3 event types: $0.006 per input URL, $0.0002 per ad and $0.0004 per ad with details. The first page of every input URL, 30 ads, is free of dataset-item charges. This rate card applies to paid Apify plans. Free plan pricing differs and is listed on the Facebook Ads Library Scraper pricing tab.

EventPriceWhen it is charged
get-ad$0.006 per input URLOnce for every input URL when the run starts, whatever the number of ads. URLs rejected by the input rules below, before any request is sent, are not charged.
dataset-item$0.0002 per adOnce for every ad saved to the dataset. The first page of each URL, 30 ads, is free.
get-ad-detail$0.0004 per adOnly when isDetailsPerAd is true and Facebook returned details for that ad. Ads without details are not charged.

Free plan users run the Facebook Ads Library Scraper in Demo Mode, with each run capped at 10 items. Apify paid plans remove the Demo Mode cap.

Facebook Ads Library Scraper cost examples

The table below prices 5 scenarios against the rate card above. Each scenario deducts the 30 free ads of every input URL's first page from the dataset-item count.

ScenarioCharge eventsCalculationTotal cost
100 ads, 1 search URL1 get-ad, 70 dataset-item$0.006 + 70 × $0.0002$0.020
1,000 ads, 1 search URL1 get-ad, 970 dataset-item$0.006 + 970 × $0.0002$0.200
1,000 ads, 1 search URL, with details1 get-ad, 970 dataset-item, 1,000 get-ad-detail$0.006 + 970 × $0.0002 + 1,000 × $0.0004$0.600
2,000 ads, 10 Page URLs × 200 ads10 get-ad, 1,700 dataset-item10 × $0.006 + 1,700 × $0.0002$0.400
10,000 ads, 1 search URL1 get-ad, 9,970 dataset-item$0.006 + 9,970 × $0.0002$2.000

Facebook Ads Library Scraper unit economics

The 7 figures below are derived from the rate card above. Per-ad figures include the dataset-item charge and exclude the $0.006 charge per input URL and the 30 free ads per URL.

MetricValue
Free ads per input URL30
Cost per ad$0.0002
Cost per ad with details$0.0006
Cost per 1,000 ads$0.20
Cost per 1,000 ads with details$0.60
Ads per $15,000
Ads with details per $11,666

How Is the Facebook Ads Library Scraper Configured?

The Facebook Ads Library Scraper exposes 15 input fields covering sources, volume limits, ad details, filters, output shaping and delivery. startUrls is the only required field. Defaults are listed where the input schema sets one.

FieldTypeDescriptionDefault
startUrlsarrayFacebook Ad Library search URLs or Facebook Page URLs to scrape ads from. Required.not set
resultsLimitintegerMaximum number of ads per input URL. Empty scrapes all available ads.not set
maxItemsintegerMaximum number of items in the output across all input URLs. The run finishes once it is reached.not set
onlyTotalbooleanSaves 1 item per input URL with Facebook's total ad count, instead of the ads. Each item is charged as 1 dataset-item.false
isDetailsPerAdbooleanAdds each ad's details, such as EU reach and advertiser info. Charged as get-ad-detail for every ad that has details.false
customMapFunctionstringJavaScript function that reshapes every item before it is saved.not set
runTagstringValue added to the runTag field of every item.not set
activeStatusstring"" (active and inactive), active or inactive.""
sortingstring"" (default order), total_impressions or relevancy_monthly_grouped (most recent).""
onlyAdsNewerThanstringAds that ran on or after this date, as YYYY-MM-DD or a relative value such as 3 months.not set
onlyAdsOlderThanstringAds that ran on or before this date, as YYYY-MM-DD or a relative value such as 1 week.not set
outputConnectorstringMCP connector that receives the results.not set
deliverTargetstringURL or ID the connector writes to.not set
deliverModestringperPost (one record per item) or summary (one roll-up per run).perPost
deliverMaxItemsintegerCap on records perPost delivers. Ignored in summary.not set

The onlyAdsNewerThan and onlyAdsOlderThan range returns the ads that ran during the range, including ads that started before it.

Facebook Ads Library Scraper custom map function

The Facebook Ads Library Scraper runs customMapFunction once per item, and its return value replaces that item in the output.

(object) => { return { ...object } }

The Facebook Ads Library Scraper applies 5 rules to customMapFunction.

  • One synchronous function. async functions, generator functions and functions returning a Promise are rejected.
  • Object return value. A return of null, a string or a number is rejected.
  • No filtering. Items returned as null, {} or undefined are saved as { noResults: true }, and filtering through this function is treated as abuse of pay-per-result pricing, which results in a ban. Search URL filters and the filter inputs limit results instead.
  • No date logic. Source code containing new Date, 1970 or Date.now is blocked. The search URL date range, onlyAdsNewerThan and onlyAdsOlderThan handle date filtering.
  • Safe fallback. A function that fails to parse, throws or returns an invalid value is rejected for the rest of the run, a warning is logged, and the original items are saved. The run continues.

Not every item has every field, so optional chaining such as object.snapshot?.title keeps the function from throwing.

Which Input Rules Does the Facebook Ads Library Scraper Enforce?

The Facebook Ads Library Scraper enforces 12 input rules covering required fields, URL validation, filters, limits and legacy fields.

RuleBehavior
startUrls contains at least 1 URLThe run fails when startUrls is empty.
startUrls entries are { "url": "..." } objects or plain stringsBoth forms are accepted.
The URL hostname contains facebookOther hosts are logged as Invalid URL and skipped.
A search URL contains q or view_all_page_idOther Ad Library URLs, such as single-ad ?id= links, are logged and skipped.
A Page URL matches one of the 3 Page URL formsOther URLs are logged as Unsupported URL and skipped.
onlyAdsNewerThan and onlyAdsOlderThan are YYYY-MM-DD or a number of days, weeks, months or yearsRelative values count back from today in UTC. Any other value, or a start date later than the end date, fails the run.
A search URL's own filters take priorityactiveStatus, sorting and the date range apply only where the search URL does not set them.
resultsLimit, maxItems and deliverMaxItems are integers of 1 or moreEmpty fields apply no limit.
resultsLimit caps each URL, maxItems caps the runThe Facebook Ads Library Scraper stops paging a URL at its limit and stops the run at the run limit.
onlyTotal and isDetailsPerAd both setonlyTotal wins and a warning is logged.
The legacy fields urls, limitPerSource, scrapeAdDetails, count and scrapePageAds.* are set over the APIThey keep their previous behavior. When a run also sets the field that replaces one, the replacement wins, and urls is merged with startUrls.
includeAboutPage or enrichWithEcommerceData is setNot supported. A warning is logged and the run continues.

The Facebook Ad Library counts at most 50,001 results for a search, so total never exceeds 50001.

How Do You Search the Ad Library with the Facebook Ads Library Scraper?

The Facebook Ads Library Scraper runs a search URL copied from the Ad Library website with every filter in it. The example below returns up to 100 Nike ads in the US.

{
"startUrls": [
{ "url": "https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=US&q=nike&search_type=keyword_unordered&media_type=all" }
],
"maxItems": 100
}

How Do You Scrape a Facebook Page's Ads with the Facebook Ads Library Scraper?

The Facebook Ads Library Scraper filters Page URL ads with the 4 filter inputs. The example below returns up to 200 active ads that the Nike Page ran in the last 30 days, newest first.

{
"startUrls": [
{ "url": "https://www.facebook.com/nike" }
],
"activeStatus": "active",
"sorting": "relevancy_monthly_grouped",
"onlyAdsNewerThan": "30 days",
"resultsLimit": 200
}

How Do You Count an Advertiser's Ads with the Facebook Ads Library Scraper?

The Facebook Ads Library Scraper saves only Facebook's ad count when onlyTotal is true, with 1 item per input URL and no ads. The example below counts the ads of the Nike Page.

{
"startUrls": [
{ "url": "https://www.facebook.com/nike" }
],
"onlyTotal": true
}

The run saves the item below. page_id is null for keyword searches, and total is null when Facebook returns no count.

{
"url": "https://www.facebook.com/nike",
"page_id": "15087023444",
"total": 14443,
"inputSource": "https://www.facebook.com/nike"
}

How Do You Get EU Reach with the Facebook Ads Library Scraper?

The Facebook Ads Library Scraper adds EU reach and advertiser details when isDetailsPerAd is true. The example below returns 50 active French video ads with details and tags every item france-video-ads.

{
"startUrls": [
{ "url": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=FR&q=nike&search_type=keyword_unordered&media_type=video" }
],
"isDetailsPerAd": true,
"maxItems": 50,
"runTag": "france-video-ads"
}

How Do You Send Facebook Ads Library Scraper Results to Notion?

The Facebook Ads Library Scraper delivers results through Apify MCP Connectors to Notion, Todoist or any service whose MCP server offers non-destructive write tools. The 4 steps below set up delivery.

  1. Authorize a connector once in Console, Settings, API & Integrations, MCP connectors.
  2. Select the connector in outputConnector.
  3. Paste the destination URL or ID in deliverTarget, such as https://www.notion.so/My-Posts-24f8a1b2c3d44e5f8a9b0c1d2e3f4a5b, after sharing the Notion page with the connector through the Notion Connections menu.
  4. Set deliverMode to perPost or summary, and set deliverMaxItems to cap perPost records.

A Notion page target produces a database with one typed column per field (URL, number, date, text). An existing database fills the columns it already has, matched by name, and an empty database receives only the title, with the rest of each record in the row body. Nested fields are flattened into columns, so snapshot becomes snapshot.title and snapshot.link_url, and publisher_platform becomes a comma-joined column. The full record is kept in each row's page body.

The Facebook Ads Library Scraper writes through the connector the user authorized and uses only non-destructive write tools, so it cannot delete or overwrite existing data. Delivery runs after scraping. A failed delivery is logged as C201 and the run finishes with all results in the dataset. Delivery stops early when the run timeout is near, and the log reports how many records were delivered.

Which Fields Does the Facebook Ads Library Scraper Output?

The Facebook Ads Library Scraper outputs each ad as the Facebook Ad Library returns it, adds 9 derived fields, and adds 7 ad details fields when isDetailsPerAd is true.

The table below lists the 9 derived fields.

FieldDescription
urlThe input URL the ad was found with.
totalFacebook's result count for the input URL, capped by Facebook at 50,001.
positionThe ad's position in the input URL's results, starting from 1.
ads_countNumber of ads that use this ad's creative.
start_date_formattedstart_date in UTC, as YYYY-MM-DD HH:mm:ss.
end_date_formattedend_date in UTC, as YYYY-MM-DD HH:mm:ss.
ad_library_urlLink to the ad in the Facebook Ad Library.
runTagThe runTag input, present when it is set.
inputSourceThe input URL the ad came from.

The table below lists the 7 ad details fields.

FieldContents
advertiserAdvertiser page info and ad_library_page_info, including page_spend and page_info with Instagram followers, likes and verification.
aaa_infopayer_beneficiary_data, targets_eu and takedown status.
violation_typesViolation types listed for the ad.
verified_voice_contextVerified voice context, or null.
transparency_by_locationeu_transparency, uk_transparency and br_transparency, with location, age and gender audience and eu_total_reach.
is_violating_eu_siepBoolean EU SIEP violation flag.
is_siep_advertiser_eligible_for_ai_disclosureBoolean AI disclosure eligibility flag.

Facebook Ads Library Scraper output example

The example below is 1 French video ad scraped with isDetailsPerAd set to true, shortened in the media URLs.

{
"ad_archive_id": "1936432480352751",
"ad_id": null,
"collation_count": null,
"collation_id": null,
"is_active": true,
"page_id": "739783715881879",
"page_is_deleted": false,
"page_name": "BagIt",
"has_user_reported": false,
"report_count": null,
"menu_items": [],
"state_media_run_label": null,
"impressions_with_index": {
"impressions_text": null,
"impressions_index": -1
},
"gated_type": "ELIGIBLE",
"categories": [
"UNKNOWN"
],
"is_aaa_eligible": true,
"contains_digital_created_media": false,
"contains_sensitive_content": false,
"reach_estimate": null,
"currency": "",
"spend": null,
"start_date": 1783580400,
"end_date": 1791961200,
"publisher_platform": [
"FACEBOOK",
"INSTAGRAM",
"AUDIENCE_NETWORK",
"MESSENGER",
"THREADS"
],
"total_active_time": null,
"regional_regulation_data": {
"finserv": {
"is_deemed_finserv": false,
"is_limited_delivery": false
},
"tw_anti_scam": {
"is_limited_delivery": false
}
},
"hide_data_status": "NONE",
"fev_info": null,
"targeted_or_reached_countries": [],
"snapshot": {
"page_id": "739783715881879",
"page_is_deleted": false,
"page_name": "BagIt",
"page_profile_uri": "https://www.facebook.com/61578816363458/",
"page_profile_picture_url": "https://scontent-lga3-2.xx.fbcdn.net/.../742831932_1550070166817658_6198977506474300428_n.jpg",
"page_like_count": 778,
"page_categories": [
"Home care"
],
"byline": null,
"title": "Des baskets propres. Sans effort.",
"body": {
"text": "Pourquoi tes baskets blanches ne sont jamais vraiment propres ?\n\nVoici ce que personne ne te dit :\n\n❌ Le frottage manuel crée des micro-déchirures.\n❌ Les sprays décolorent le tissu.\n❌ La machine sans protection déforme tes chaussures.\n\nBagIt résout tout ça :\n\n✅ Protège le revêtement blanc\n✅ Nettoie en profondeur (herbe, boue, graisse)\n✅ Marche sur On Cloud, Veja, Nike, Converse...\n✅ 187,000+ Français l'utilisent\n✅ Ta machine est aussi protégée\n\n30 minutes dans la machine. Blanches comme neuves. Même après 50 lavages.\n\n✔️ Essaye-le sans risque → garantie 60 jours satisfait ou remboursé."
},
"caption": "shopbagit.com",
"cta_text": "Shop now",
"cta_type": "SHOP_NOW",
"link_url": "https://www.shopbagit.com/products/sac-de-lavage-bagit",
"link_description": "Promotion -60% • Garantie 60 jours",
"display_format": "VIDEO",
"images": [],
"videos": [
{
"video_hd_url": "https://video-lga3-3.xx.fbcdn.net/.../AQMXemPAFj5mTFSwCL7XjtULBeegjap0JbQUa0eRMqYxPuCUeK7VQjDPr8Z2wGfymae6UYctmfGDaLOuhewe64F9Y5YuY6adS0gw0N2TKifuQA.mp4",
"video_preview_image_url": "https://scontent-lga3-2.xx.fbcdn.net/.../742437254_942574228862741_94592501591813558_n.jpg",
"video_sd_url": "https://video-lga3-3.xx.fbcdn.net/.../AQPi0uubmDXa9rzNNBvYgjWSCy9OE0eE3TTYB1uEIbCRQeGDZeRvosxqJKsWJHpLxoaLi1RMx8vE5helJg1RTokkcC9q30j5xslGmiUuWg.mp4",
"watermarked_video_hd_url": null,
"watermarked_video_sd_url": null
}
],
"cards": [],
"branded_content": null,
"root_reshared_post": null,
"disclaimer_label": null,
"event": null,
"is_reshared": false,
"extra_links": [],
"extra_texts": [],
"extra_images": [],
"extra_videos": [],
"country_iso_code": null,
"brazil_tax_id": null,
"additional_info": null,
"ec_certificates": []
},
"url": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=FR&q=nike&search_type=keyword_unordered&media_type=video",
"total": 875,
"position": 2,
"ads_count": 1,
"start_date_formatted": "2026-07-09 07:00:00",
"end_date_formatted": "2026-10-14 07:00:00",
"ad_library_url": "https://www.facebook.com/ads/library/?id=1936432480352751",
"advertiser": {
"page": {
"about": {
"text": ""
},
"is_delegate_page_with_linked_primary_profile": false,
"id": "739783715881879"
},
"ad_library_page_info": {
"page_spend": {
"current_week": null,
"lifetime_by_disclaimer": [],
"weekly_by_disclaimer": [],
"is_political_page": false
},
"page_info": {
"entity_type": "PERSON_PROFILE",
"ig_followers": 2252,
"ig_username": "sacbagit",
"ig_verification": false,
"likes": 778,
"page_alias": "",
"page_category": "Cleaning Service",
"page_cover_photo": "https://scontent-lga3-2.xx.fbcdn.net/.../611010143_122143091456960545_6902738384277385121_n.png",
"page_id": "739783715881879",
"page_is_deleted": false,
"page_is_restricted": false,
"page_name": "BagIt",
"page_profile_uri": "https://facebook.com/61578816363458",
"page_verification": "NOT_VERIFIED",
"profile_photo": "https://scontent-lga3-2.xx.fbcdn.net/.../581460377_122133267434960545_679457567548373465_n.jpg",
"is_profile_page": false
}
}
},
"aaa_info": {
"payer_beneficiary_data": [
{
"payer": "BagIt",
"beneficiary": "BagIt"
}
],
"targets_eu": true,
"has_violating_payer_beneficiary": false,
"is_ad_taken_down": false
},
"violation_types": [],
"verified_voice_context": null,
"transparency_by_location": {
"br_transparency": null,
"eu_transparency": {
"targets_eu": true,
"location_audience": [
{
"name": "Belgium",
"num_obfuscated": 0,
"type": "countries",
"excluded": false
},
{
"name": "Luxembourg",
"num_obfuscated": 0,
"type": "countries",
"excluded": false
},
{
"name": "France",
"num_obfuscated": 0,
"type": "countries",
"excluded": false
}
],
"gender_audience": "All",
"age_audience": {
"min": 18,
"max": 65
},
"eu_total_reach": 1487024,
"age_country_gender_reach_breakdown": [
{
"country": "BE",
"age_gender_breakdowns": [
{
"age_range": "18-24",
"male": 1749,
"female": 850,
"unknown": 35
},
{
"age_range": "55-64",
"male": 16776,
"female": 24428,
"unknown": 1028
}
]
}
]
},
"uk_transparency": null
},
"is_siep_advertiser_eligible_for_ai_disclosure": true,
"is_violating_eu_siep": false,
"inputSource": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=FR&q=nike&search_type=keyword_unordered&media_type=video"
}

Which Errors Does the Facebook Ads Library Scraper Report?

The Facebook Ads Library Scraper reports 9 error codes. 6 of the 9 codes are non-terminal, and the run continues with the other URLs. 3 codes terminate the run: C098, C099 and C100.

The 6 non-terminal codes split into 3 recovery behaviors:

  • 4 codes (C001, C002, C003, C004) stop one URL and leave the other URLs running.
  • 1 code (C019) saves an error item, waits 1 second and retries the request.
  • 1 code (C201) skips the MCP connector delivery and keeps every result in the dataset.
CodeCauseBehavior
C001A search or Page lookup request failed.Stops that URL.
C002A search returned an unexpected response.Stops that URL at that page.
C003A Page lookup returned an unexpected response.Skips that Page URL.
C004No Facebook Page exists for the URL.Skips that Page URL.
C019Rate limit exceeded for the account.Saves an item with noResults, error, code and message, then retries after 1 second.
C201MCP connector delivery failed.Logs a warning. The run finishes with all results.
C098Unhandled rejection.Ends the run.
C099Uncaught exception.Ends the run.
C100Run initialization failed.Ends the run.

The 3 terminal codes ask for the run ID to be sent to apidojo support.

Which Facebook Ads Library Scraper Questions Come Up Most Often?

Does the Facebook Ads Library Scraper need a Facebook account?

No. The Facebook Ads Library Scraper input has no login, cookie or proxy field, and takes only the URLs and options listed above.

Does the Facebook Ads Library Scraper scrape Instagram ads?

Yes. The Facebook Ads Library Scraper returns every platform an ad ran on in publisher_platform, including INSTAGRAM, and a search URL with publisher_platforms[n] limits the search to chosen platforms.

Can the Facebook Ads Library Scraper scrape all ads from one advertiser?

Yes. The Facebook Ads Library Scraper returns one advertiser's ads from a Facebook Page URL or from a search URL with view_all_page_id.

The Facebook Ads Library Scraper pages through each URL until the results end or resultsLimit or maxItems is reached. Facebook counts at most 50,001 results per search in total.

How does the Facebook Ads Library Scraper filter ads by date?

The Facebook Ads Library Scraper filters ads by onlyAdsNewerThan and onlyAdsOlderThan, and a search URL's start_date[min] and start_date[max] take priority over them. Date logic inside customMapFunction is blocked.

Does the Facebook Ads Library Scraper return EU reach data?

Yes. The Facebook Ads Library Scraper returns transparency_by_location.eu_transparency, with eu_total_reach and an age, gender and country breakdown, when isDetailsPerAd is true.

Are the first 30 ads free in the Facebook Ads Library Scraper?

Yes. The Facebook Ads Library Scraper does not charge dataset-item for the first page of every input URL, which is 30 ads, so 10 URLs return 300 ads for the 10 × $0.006 URL charges alone, $0.06 on a paid plan. get-ad-detail still applies to those ads when isDetailsPerAd is true.

Does the Facebook Ads Library Scraper charge for ads without details?

No. The Facebook Ads Library Scraper charges get-ad-detail only for ads that came back with details. Ads without details are saved without them and charged as dataset-item only.

Does the Facebook Ads Library Scraper return ad videos and images?

Yes. The Facebook Ads Library Scraper returns snapshot.videos with video_hd_url, video_sd_url and video_preview_image_url, plus snapshot.images and snapshot.cards.

What does the Facebook Ads Library Scraper do with an invalid URL?

The Facebook Ads Library Scraper logs the invalid URL and skips it, and the other URLs keep running. A Page that does not exist is reported as C004.

Which countries does the Facebook Ads Library Scraper support?

The Facebook Ads Library Scraper uses the country parameter of a search URL, or all countries when the URL has none. Page URLs search all countries, unless an API input sets a 2-letter code in scrapePageAds.countryCode.

Why does the Facebook Ads Library Scraper return fewer ads than expected?

The Facebook Ads Library Scraper stops at maxItems, resultsLimit or the run's maximum charge. Empty limit fields return every ad the URL has, and the Ad Library website shows whether the URL has ads at all.

Does the Facebook Ads Library Scraper work on the Apify free plan?

Yes. The Facebook Ads Library Scraper runs in Demo Mode on the free plan, with each run capped at 10 items.

Can the Facebook Ads Library Scraper send ads to Notion?

Yes. The Facebook Ads Library Scraper writes results to Notion, Todoist and other MCP connectors through outputConnector, deliverTarget and deliverMode.

Where Do You Get Facebook Ads Library Scraper Support?

The Facebook Ads Library Scraper is published by apidojo, with support at apidojo10@gmail.com. The run log names each skipped URL and the reason.

apidojo also publishes these 7 actors: