Facebook Pages Scraper With Ad Library Activity
Pricing
from $2.99 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
44
Total users
0
Monthly active users
3 days ago
Last modified
Categories
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.
| Field | Example Value | Use Case |
|---|---|---|
facebookUrl | https://www.facebook.com/nike | Canonical page URL, also the join key back to your input |
pageUrl | https://www.facebook.com/nike | Duplicate of facebookUrl, kept for backward compatibility |
pageId | 100064860532502 | Numeric Facebook page ID |
facebookId | 100064860532502 | Duplicate of pageId |
pageName | nike | Vanity URL slug |
title | Nike | Display name of the page |
categories | ["Athletic & Sporting Goods Company"] | Facebook's own category tags |
category | Athletic & Sporting Goods Company | First entry of categories |
likes | 35102847 | Total page likes |
followers | 36500000 | Total page followers |
followings | 12 | Number 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 |
intro | Bringing inspiration and innovation to every athlete... | Page bio/description |
about_me | {"text": "Bringing inspiration and innovation..."} | Duplicate of intro, nested |
address | One Bowerman Drive, Beaverton, OR | Street address, if published |
addressUrl | https://www.bing.com/maps/default.aspx?... | Map link built from address |
phone | +1 503-671-6453 | Public phone number, if published |
email | press@nike.com | Public contact email, if published |
website | nike.com | Bare domain extracted from the page's website field |
websites | ["https://www.nike.com"] | All website/social URLs found, decoded and de-duplicated |
alternativeSocialMedia | https://www.instagram.com/nike | Secondary social link (usually Instagram), if present |
instagram | [{"username": "nike", "url": "https://www.instagram.com/nike"}] | Structured Instagram cross-link |
rating | 94% recommend (202 Reviews) | Raw recommendation-rating text |
ratings | 94% recommend (202 Reviews) | Duplicate of rating |
ratingOverall | 94 | Recommendation percentage, parsed |
ratingCount | 202 | Number of reviews behind the rating |
priceRange | $$ | Price-tier symbols, normalized to $ |
business_price | Price Range · $$ | Formatted string built from priceRange |
services | In-store shopping, Online ordering | Services list text |
business_services | In-store shopping, Online ordering | Duplicate of services |
business_hours | Open now | Business-hours text, if published |
creation_date | January 22, 2010 | Page creation date |
ad_status | This Page is currently running ads. | Facebook's own ad-status sentence, when detected |
profilePictureUrl | https://scontent.fna.fbcdn.net/... | Profile photo image URL |
coverPhotoUrl | https://scontent.fna.fbcdn.net/... | Cover photo image URL |
profilePhoto | https://www.facebook.com/photo/?fbid=... | Facebook photo-viewer link for the profile picture |
isCurrentlyAdvertising | true | Whether the Ad Library currently shows active ads for this page |
activeAdCount | 12 | Number of currently active ads (from the Ad Library) |
adLibraryUrl | https://www.facebook.com/ads/library/?...&view_all_page_id=100064860532502 | Direct link to this page's public Ad Library listing |
adCount | 20 | Number 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 |
success | true | Whether 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
typeorisChildkey at all. Only ad child rows settype: "ad"andisChild: true. To tell a page row from an ad row programmatically, check for the presence ofisChild— 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):
| Field | Example Value | Use Case |
|---|---|---|
type | ad | Marks this row as an ad child row |
isChild | true | Always true on ad rows |
parentPageId | 100064860532502 | Numeric ID of the page this ad belongs to |
parentPageUrl | https://www.facebook.com/nike | The parent page's URL — the join key back to the page row |
adArchiveId | 1234567890123456 | Facebook's Ad Library archive ID for this creative |
adLibraryUrl | https://www.facebook.com/ads/library/?id=1234567890123456 | Direct link to this ad's Ad Library entry |
isActive | true | Whether this specific ad is currently running |
adText | Just Do It. New season, new gear. | Primary ad copy |
title | Nike Air Max | Ad headline/title |
caption | nike.com | Caption line shown under the creative |
linkDescription | Shop the new collection | Secondary link description text |
ctaText | Shop Now | Call-to-action button text |
ctaType | SHOP_NOW | Call-to-action type code |
linkUrl | https://www.nike.com/shop | Destination URL |
displayFormat | VIDEO | VIDEO, IMAGE, TEXT, or UNKNOWN |
publisherPlatforms | ["FACEBOOK", "INSTAGRAM"] | Meta platforms the ad runs on |
startDate | 2026-06-01T00:00:00.000Z | Ad start date, ISO |
endDate | 2026-07-20T00:00:00.000Z | Ad end date, ISO (null while still running) |
startDateTimestamp | 1780358400 | Raw Unix timestamp behind startDate |
endDateTimestamp | 1784592000 | Raw Unix timestamp behind endDate |
imageUrls | ["https://scontent.fna.fbcdn.net/..."] | Creative image URLs |
videoUrls | ["https://video.fna.fbcdn.net/..."] | Creative video URLs (HD/SD) |
pageName | Nike | Page name as shown on the ad |
pageProfilePictureUrl | https://scontent.fna.fbcdn.net/... | Page profile photo shown on the ad |
scrapedAt | 2026-07-26T14:02:11.000Z | UTC timestamp this ad row was captured |
success | true | Always 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.
| Feature | Official Ad Library API | This Actor |
|---|---|---|
| Setup | Meta developer account + access token | Apify account only |
| Ad categories covered | Mainly political/issue ads | All ad categories the public Ad Library shows |
| Page profile data (likes, contact, categories) | Not provided | Included on the same row |
| Ad Library activity + creatives in one call | No — separate systems | Yes — one run |
| Output shape | Meta's own API schema | One 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.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | One 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"] |
maxPages | No | integer | Caps 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 |
includeAdLibrary | No | boolean | Fetch 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 |
activeAdsOnly | No | boolean | When 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 |
maxAdsPerPage | No | integer | Upper 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 |
proxyConfiguration | No | object | This 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.
Is it legal to scrape Facebook Pages and the Ad Library?
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.
🔗 Related scrapers
| Scraper Name | What it extracts |
|---|---|
| Facebook Group Profile Scraper | Facebook Group profile and metadata by URL, username, or ID |
| Facebook Groups Search Scraper — Member Size & Activity Metrics | Group member counts and activity signals from search |
| Facebook Group Engagement Analyzer | Engagement metrics for a given Facebook Group |
| Facebook Search Scraper By Hashtag | Facebook posts and results matching a hashtag search |
| Facebook Videos Scraper By Creator Profile | Video listings scraped from a creator's Facebook page |
| Instagram Profile Engagement Estimator | Instagram 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.