Facebook Pages Scraper With Ad Library Activity avatar

Facebook Pages Scraper With Ad Library Activity

Pricing

from $2.99 / 1,000 results

Go to Apify Store
Facebook Pages Scraper With Ad Library Activity

Facebook Pages Scraper With Ad Library Activity

Facebook Pages Scraper with Ad Library Activity extracts page details, followers, posts, contact information, and Meta Ad Library activity. Analyze page performance, active ads, advertisers, creatives, and marketing strategies for competitor research and lead generation.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

44

Total users

0

Monthly active users

3 days ago

Last modified

Share

Facebook Pages Scraper — Profile, Contact and Ad Library Data

Facebook Pages Scraper With Ad Library Activity turns a list of Facebook Page URLs or usernames into structured JSON: page title, categories, likes, followers, contact details (email, phone, address, website), rating, and a live signal from the public Facebook Ad Library — whether the page is currently advertising, how many active ads it runs, and (on request) each individual ad creative. It is built for brand researchers, ad-intelligence teams, and lead-generation workflows that need a page's profile and its advertising footprint from a single run. No Facebook login is required, and results stream to the dataset as each page finishes.

🧭 What is Facebook Pages Scraper With Ad Library Activity?

It scrapes public Facebook Pages — the profile a business, brand, or public figure controls, not a personal profile — and returns each one as a typed JSON row. For every page it also checks the public Facebook Ad Library and attaches the page's advertising-activity signal; when Deep-fetch is turned on, it goes further and pulls the individual ad creatives running (or that ran) from that page. No Facebook account or login is required — every field returned is already visible to an anonymous visitor.

  • Pages are discovered by URL or bare username, one per line — no search or category browsing
  • Core identifying and contact fields: title, categories, email, phone, address, websites, pageId
  • Ad-activity signal on every page: isCurrentlyAdvertising, activeAdCount, adLibraryUrl
  • Optional ad-creative child rows: ad text, CTA, publisher platforms, start/end dates, active status, image and video URLs
  • Rating, follower/like counts, creation date, business hours, and Instagram cross-links when the page exposes them
  • Export as JSON, CSV, Excel, or XML from the Apify dataset, or read it through the Apify API

📇 What data can I extract with Facebook Pages Scraper With Ad Library Activity?

Every run returns two kinds of dataset row that share one dataset: a page row for each URL you supply, and — only when Deep-fetch is on — one ad row per ad creative found on that page's Ad Library listing.

Page row fields

This is the full set of keys the Actor writes for a successfully scraped page (source: build_output_for_url in src/main.py). A page that fails to load instead gets a 3-field error row: facebookUrl, error, success: false.

FieldExample ValueUse Case
facebookUrlhttps://www.facebook.com/nikeCanonical page URL, also the join key back to your input
pageUrlhttps://www.facebook.com/nikeDuplicate of facebookUrl, kept for backward compatibility
pageId100064860532502Numeric Facebook page ID
facebookId100064860532502Duplicate of pageId
pageNamenikeVanity URL slug
titleNikeDisplay name of the page
categories["Athletic & Sporting Goods Company"]Facebook's own category tags
categoryAthletic & Sporting Goods CompanyFirst entry of categories
likes35102847Total page likes
followers36500000Total page followers
followings12Number of accounts the page follows
info["Nike. 35,102,847 likes", "412,203 talking about this"]Raw meta-description lines the count fields are parsed from
introBringing inspiration and innovation to every athlete...Page bio/description
about_me{"text": "Bringing inspiration and innovation..."}Duplicate of intro, nested
addressOne Bowerman Drive, Beaverton, ORStreet address, if published
addressUrlhttps://www.bing.com/maps/default.aspx?...Map link built from address
phone+1 503-671-6453Public phone number, if published
emailpress@nike.comPublic contact email, if published
websitenike.comBare domain extracted from the page's website field
websites["https://www.nike.com"]All website/social URLs found, decoded and de-duplicated
alternativeSocialMediahttps://www.instagram.com/nikeSecondary social link (usually Instagram), if present
instagram[{"username": "nike", "url": "https://www.instagram.com/nike"}]Structured Instagram cross-link
rating94% recommend (202 Reviews)Raw recommendation-rating text
ratings94% recommend (202 Reviews)Duplicate of rating
ratingOverall94Recommendation percentage, parsed
ratingCount202Number of reviews behind the rating
priceRange$$Price-tier symbols, normalized to $
business_pricePrice Range · $$Formatted string built from priceRange
servicesIn-store shopping, Online orderingServices list text
business_servicesIn-store shopping, Online orderingDuplicate of services
business_hoursOpen nowBusiness-hours text, if published
creation_dateJanuary 22, 2010Page creation date
ad_statusThis Page is currently running ads.Facebook's own ad-status sentence, when detected
profilePictureUrlhttps://scontent.fna.fbcdn.net/...Profile photo image URL
coverPhotoUrlhttps://scontent.fna.fbcdn.net/...Cover photo image URL
profilePhotohttps://www.facebook.com/photo/?fbid=...Facebook photo-viewer link for the profile picture
isCurrentlyAdvertisingtrueWhether the Ad Library currently shows active ads for this page
activeAdCount12Number of currently active ads (from the Ad Library)
adLibraryUrlhttps://www.facebook.com/ads/library/?...&view_all_page_id=100064860532502Direct link to this page's public Ad Library listing
adCount20Number of ad child rows actually attached this run (present only when Deep-fetch is on)
pageAdLibrary{"is_business_page_active": true, "id": "...", "pageId": "...", "isCurrentlyAdvertising": true, "activeAdCount": 12, "adLibraryUrl": "...", "adCount": 20}Nested duplicate bundle of the Ad Library fields above, plus the internal business ID used to resolve the Ad Library connection
successtrueWhether this page was scraped successfully

Preserved as found in the source: the output mixes camelCase (facebookUrl, priceRange, pageId) with snake_case keys (business_hours, business_price, creation_date, ad_status, about_me) — this is not normalized. Several fields are also plain duplicates of another field on the same row (pageUrl/facebookUrl, facebookId/pageId, ratings/rating, business_services/services, about_me.text/intro) — kept so field names some downstream tools expect are still present, rather than dropped.

Page rows carry no type or isChild key at all. Only ad child rows set type: "ad" and isChild: true. To tell a page row from an ad row programmatically, check for the presence of isChild — its absence means the row is a page.

🧾 Ad Library child-row fields (includeAdLibrary: true)

When Deep-fetch is on, each ad found for a page is pushed as its own dataset row immediately after that page's row (source: _ad_row in src/ad_library.py):

FieldExample ValueUse Case
typeadMarks this row as an ad child row
isChildtrueAlways true on ad rows
parentPageId100064860532502Numeric ID of the page this ad belongs to
parentPageUrlhttps://www.facebook.com/nikeThe parent page's URL — the join key back to the page row
adArchiveId1234567890123456Facebook's Ad Library archive ID for this creative
adLibraryUrlhttps://www.facebook.com/ads/library/?id=1234567890123456Direct link to this ad's Ad Library entry
isActivetrueWhether this specific ad is currently running
adTextJust Do It. New season, new gear.Primary ad copy
titleNike Air MaxAd headline/title
captionnike.comCaption line shown under the creative
linkDescriptionShop the new collectionSecondary link description text
ctaTextShop NowCall-to-action button text
ctaTypeSHOP_NOWCall-to-action type code
linkUrlhttps://www.nike.com/shopDestination URL
displayFormatVIDEOVIDEO, IMAGE, TEXT, or UNKNOWN
publisherPlatforms["FACEBOOK", "INSTAGRAM"]Meta platforms the ad runs on
startDate2026-06-01T00:00:00.000ZAd start date, ISO
endDate2026-07-20T00:00:00.000ZAd end date, ISO (null while still running)
startDateTimestamp1780358400Raw Unix timestamp behind startDate
endDateTimestamp1784592000Raw Unix timestamp behind endDate
imageUrls["https://scontent.fna.fbcdn.net/..."]Creative image URLs
videoUrls["https://video.fna.fbcdn.net/..."]Creative video URLs (HD/SD)
pageNameNikePage name as shown on the ad
pageProfilePictureUrlhttps://scontent.fna.fbcdn.net/...Page profile photo shown on the ad
scrapedAt2026-07-26T14:02:11.000ZUTC timestamp this ad row was captured
successtrueAlways true on ad rows that were successfully parsed

🎯 Distinguishing and joining rows

Filter and join page rows and ad rows using: isChild (present and true only on ad rows), parentPageUrl / parentPageId (present only on ad rows, and equal to the parent page's facebookUrl / pageId), and adArchiveId (unique per ad, absent on page rows). activeAdCount and isCurrentlyAdvertising on the page row are your quick advertising-activity signal without needing to join to any ad rows at all.

📣 How does this differ from the official Facebook Ad Library API?

Meta operates its own official Ad Library API for ad transparency, and if political/issue-ad research is your use case and you're comfortable setting up developer access, that is the supported route. But it requires its own separate access-token setup through a Meta developer account, and it is scoped mainly to political and social-issue ads — it does not hand back a page's profile fields and its full advertising activity (including ordinary commercial ads) in one combined response the way this Actor does.

FeatureOfficial Ad Library APIThis Actor
SetupMeta developer account + access tokenApify account only
Ad categories coveredMainly political/issue adsAll ad categories the public Ad Library shows
Page profile data (likes, contact, categories)Not providedIncluded on the same row
Ad Library activity + creatives in one callNo — separate systemsYes — one run
Output shapeMeta's own API schemaOne normalized JSON row per page or ad

Why not just use the official API for everything?

Setting it up means registering as a Meta developer, requesting the right access level, and working within its scope — and even then it is built around political and issue-ad transparency reporting, not a general "give me this brand's page profile plus every ad it's running" query. This Actor covers that gap: point it at a page URL and it returns the profile and the Ad Library signal together, without a separate developer application.

Use the official API when your requirement is specifically political/issue-ad compliance reporting under Meta's own terms. Use this Actor when you want a page's profile and its advertising activity — of any ad category — in a single structured run.

🎯 How to use data from Facebook Pages Scraper With Ad Library Activity

Ad-intelligence and competitive research teams

Feed a list of competitor or category pages into startUrls with includeAdLibrary on, then sort the resulting ad rows by startDate to see which creatives a brand is currently pushing, which ctaType it favors, and which publisherPlatforms it runs on. Pair that with activeAdCount on the page row to rank which competitors are advertising most aggressively this week.

Agencies auditing client or prospect pages

Run a client or prospect list on a recurring schedule with activeAdsOnly on, and diff activeAdCount and isCurrentlyAdvertising run over run to flag when a prospect starts or stops running ads — a natural outreach trigger for a paid-media pitch.

Market research and brand-activity mapping

Scrape every page in a category (e.g. a list of apparel or SaaS brand pages) and cross-tabulate categories, ratingOverall, followers, and isCurrentlyAdvertising to map which segments of a market are actively spending on ads versus relying on organic reach.

🤖 AI agents and automated pipelines

Because every row is typed JSON with a stable schema, agent frameworks can pull adText, ctaText, and publisherPlatforms straight into a RAG index or a competitor-monitoring tool without any HTML parsing step.

⬇️ Input

Required: startUrls.

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayOne page per line — a full link (https://www.facebook.com/nike) or a bare username (nike). Each page is scraped for its profile data, then checked against the Facebook Ad Library.["https://www.facebook.com/nike", "https://www.facebook.com/Shopify"]
maxPagesNointegerCaps how many of the start URLs above are scraped this run (top-level pages only — attached ads do not count against it). Range 1–10,000. Default 10.25
includeAdLibraryNobooleanFetch each page's individual ads from the Facebook Ad Library and add them as child rows (type: "ad", isChild: true): ad text, call-to-action, publisher platforms, start/end dates, active status and media URLs. Default false.true
activeAdsOnlyNobooleanWhen Deep-fetch is on, keep only ads that are currently ACTIVE (running now) and drop inactive/expired ones. The page-level activeAdCount and isCurrentlyAdvertising signals are computed either way. Default false.true
maxAdsPerPageNointegerUpper limit on ad child rows fetched per page (only applies when Deep-fetch is on). Use 0 for unlimited. Range 0–1,000. Default 20.20
proxyConfigurationNoobjectThis actor always runs through Apify RESIDENTIAL proxy — datacenter or custom groups here are ignored. It auto-rotates up to 3 fresh residential sessions on blocked pages. Keep this on so proxy billing stays clear on your account.{"useApifyProxy": true}

Example input

{
"startUrls": ["https://www.facebook.com/nike", "Shopify"],
"maxPages": 25,
"includeAdLibrary": true,
"activeAdsOnly": false,
"maxAdsPerPage": 20,
"proxyConfiguration": { "useApifyProxy": true }
}

Common pitfall: maxPages only limits how many of your startUrls are opened — it does not cap ad rows. If you set includeAdLibrary on for a page running hundreds of ads, use maxAdsPerPage to bound that specific page's ad rows; the two limits are independent. Also note that activeAdsOnly does nothing on its own unless includeAdLibrary is also on — no ad creative rows are ever fetched without Deep-fetch enabled, so the active-only filter has nothing to filter.

⬆️ Output

Typed JSON, one row per page plus (optionally) one row per ad creative, streamed to the dataset live as each page finishes. Export as JSON, CSV, Excel, or XML, or read it through the Apify API. When includeAdLibrary is on, ad rows are also mirrored to a separate per-run dataset named <runId>-ads.

Page row sample

{
"facebookUrl": "https://www.facebook.com/nike",
"categories": ["Athletic & Sporting Goods Company"],
"info": ["Nike. 35,102,847 likes", "412,203 talking about this"],
"likes": 35102847,
"priceRange": null,
"title": "Nike",
"address": null,
"pageId": "100064860532502",
"pageName": "nike",
"pageUrl": "https://www.facebook.com/nike",
"intro": "Bringing inspiration and innovation to every athlete in the world.",
"websites": ["https://www.nike.com"],
"phone": null,
"email": null,
"alternativeSocialMedia": "https://www.instagram.com/nike",
"website": "nike.com",
"services": null,
"rating": null,
"followers": 36500000,
"followings": 12,
"profilePictureUrl": "https://scontent.fna.fbcdn.net/v/nike_profile.jpg",
"coverPhotoUrl": "https://scontent.fna.fbcdn.net/v/nike_cover.jpg",
"profilePhoto": "https://www.facebook.com/photo/?fbid=609196481681551",
"ratingOverall": null,
"ratingCount": null,
"category": "Athletic & Sporting Goods Company",
"addressUrl": null,
"instagram": [{"username": "nike", "url": "https://www.instagram.com/nike"}],
"ratings": null,
"business_hours": null,
"business_price": null,
"business_services": null,
"creation_date": "January 22, 2010",
"ad_status": "This Page is currently running ads.",
"about_me": {"text": "Bringing inspiration and innovation to every athlete in the world."},
"facebookId": "100064860532502",
"isCurrentlyAdvertising": true,
"activeAdCount": 12,
"adLibraryUrl": "https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=ALL&is_targeted_country=false&media_type=all&search_type=page&view_all_page_id=100064860532502",
"adCount": 20,
"pageAdLibrary": {
"is_business_page_active": true,
"id": "57242657138",
"pageId": "100064860532502",
"isCurrentlyAdvertising": true,
"activeAdCount": 12,
"adLibraryUrl": "https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=ALL&is_targeted_country=false&media_type=all&search_type=page&view_all_page_id=100064860532502",
"adCount": 20
},
"success": true
}

Ad child-row sample (includeAdLibrary: true)

{
"type": "ad",
"isChild": true,
"parentPageId": "100064860532502",
"parentPageUrl": "https://www.facebook.com/nike",
"adArchiveId": "1234567890123456",
"adLibraryUrl": "https://www.facebook.com/ads/library/?id=1234567890123456",
"isActive": true,
"adText": "Just Do It. New season, new gear.",
"title": "Nike Air Max",
"caption": "nike.com",
"linkDescription": "Shop the new collection",
"ctaText": "Shop Now",
"ctaType": "SHOP_NOW",
"linkUrl": "https://www.nike.com/shop",
"displayFormat": "VIDEO",
"publisherPlatforms": ["FACEBOOK", "INSTAGRAM"],
"startDate": "2026-06-01T00:00:00.000Z",
"endDate": null,
"startDateTimestamp": 1780358400,
"endDateTimestamp": null,
"imageUrls": [],
"videoUrls": ["https://video.fna.fbcdn.net/nike_ad.mp4"],
"pageName": "Nike",
"pageProfilePictureUrl": "https://scontent.fna.fbcdn.net/v/nike_profile.jpg",
"scrapedAt": "2026-07-26T14:02:11.000Z",
"success": true
}

📊 Billing, failed pages and uncharged rows

This Actor charges on the row_result event, once per row it pushes. There is no separate free "accounting" row: a page that fails to scrape is still pushed as a 3-field row (facebookUrl, error, success: false) through the same charged row_result event, so failed pages are billed the same as successful ones. Filter success === true (or false) downstream to separate real data from failed-page placeholders before you rely on row counts.

❓ Frequently asked questions

What if a page has zero ads in the Ad Library?

The page row is still returned in full. activeAdCount will be 0 and isCurrentlyAdvertising will be false once the Ad Library connection is confirmed for that page; with includeAdLibrary on, adCount will be 0 and no ad child rows are pushed for that page. This is different from the Ad Library being unreachable for a page, in which case those activity fields stay null instead of 0/false.

Can I get the individual ad creatives along with the page profile?

Yes — turn on includeAdLibrary. Each ad becomes its own child row (type: "ad", isChild: true) pushed right after its parent page's row, with ad text, CTA, publisher platforms, start/end dates, active status, and image/video URLs. maxAdsPerPage bounds how many are fetched per page (0 = unlimited), and this only applies while Deep-fetch is on.

How accurate is the contact and rating data?

The Actor returns exactly what is publicly visible on the page at request time — email, phone, address, rating, and ad status all come straight from Facebook's own rendered page data. Accuracy depends on whether the page owner keeps that information current; re-run periodically if you need fresh contact or rating data for outreach.

How many pages can I get per run?

maxPages accepts 1 to 10,000 (default 10) and caps how many of your startUrls are opened — top-level pages only. Ad child rows attached under includeAdLibrary do not count against this cap; maxAdsPerPage governs those separately, per page.

Does activeAdsOnly filter the page-level ad-activity numbers too?

No. activeAdsOnly only filters which individual ad child rows are kept when Deep-fetch is on. The page-level activeAdCount and isCurrentlyAdvertising fields are computed from a separate active-ads check that runs whenever either includeAdLibrary or activeAdsOnly is turned on — turning on activeAdsOnly alone (with Deep-fetch off) still populates those two page fields, it just won't fetch any ad rows.

Do I need to configure a proxy myself?

No. This Actor always runs through Apify's residential proxy — any datacenter group or custom setting you pick in proxyConfiguration is ignored — and it auto-rotates up to 3 fresh residential sessions per page if a fetch gets blocked. Leave the default proxy input as-is; it exists so Apify's proxy usage stays attributed to your account correctly, not to select a different tier.

Does this Actor work with Claude, ChatGPT, and other AI agent frameworks?

Yes. It is callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make a request — LangChain, CrewAI, n8n, or a hand-written tool definition — can invoke it and receive typed JSON directly.

How does this compare to other Facebook Pages and Ad Library scrapers?

Checked on the Apify Store as observed on 2026-07-26: apify/facebook-pages-scraper documents page profile fields (contact details, likes, followers, ratings, ad status) but not individual ad creatives or an activeAdCount/isCurrentlyAdvertising signal. curious_coder/facebook-ads-library-scraper documents ad-level fields (ad ID, spend, impressions, publisher platform) scraped from Ad Library search URLs or page lists, but not page profile fields like contact info or ratings. apify/facebook-ads-scraper documents the widest ad-side field set (page & advertiser transparency data plus ad creatives, with an optional e-commerce enrichment add-on) but is built around Ad Library URLs and page/advertiser transparency data rather than the page's own profile fields (email, address, rating, business hours) this Actor returns. This Actor's difference is returning both — page profile and Ad Library activity, on the same row — from a page URL or username alone.

Can I use this without a Facebook or Meta developer account?

Yes. No Facebook login, account, or Meta developer access token is required. The only credential you need is your Apify account to run the Actor.

Yes, when limited to what is publicly visible. Facebook Pages exist to be discovered — they are business and brand profiles, not personal accounts — and Meta's own Ad Library is explicitly built and published as a public ad-transparency tool, intended for exactly this kind of research and analysis. This Actor extracts only what an anonymous visitor already sees on a page and its public Ad Library listing.

Page profile data (categories, likes, ratings) and ad-creative data are business and product records, not personal data, so the obligations that apply are contractual and database-related — Facebook's terms of service, and database or unfair-competition rules covering systematic reuse of a compiled dataset — rather than GDPR-style personal-data regimes. Some pages may expose a business contact email or phone number; treat that the same way you would any published business contact detail.

Consult legal counsel for commercial applications involving bulk storage of this data.

Scraper NameWhat it extracts
Facebook Group Profile ScraperFacebook Group profile and metadata by URL, username, or ID
Facebook Groups Search Scraper — Member Size & Activity MetricsGroup member counts and activity signals from search
Facebook Group Engagement AnalyzerEngagement metrics for a given Facebook Group
Facebook Search Scraper By HashtagFacebook posts and results matching a hashtag search
Facebook Videos Scraper By Creator ProfileVideo listings scraped from a creator's Facebook page
Instagram Profile Engagement EstimatorInstagram profile engagement estimates by username

💬 Your feedback

Found a bug, or need a field that's visible on the page but missing from the output? Open an issue on the Actor's Issues tab with the page URL and the field you expected — that's the fastest way to get it looked at.