Meta Ads Library Scraper
Pricing
from $0.25 / 1,000 results
Meta Ads Library Scraper
Scrape Meta (Facebook/Instagram) Ad Library by keyword, advertiser, or Ad Library URL. Keyless GraphQL reverse-engineering — no Facebook login, no API key, no developer account.
Pricing
from $0.25 / 1,000 results
Rating
0.0
(0)
Developer
Aurenic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Scrape Meta (Facebook and Instagram) Ad Library by keyword, advertiser page ID, or full Ad Library URL — keyless, no Facebook login, no API key, no developer account.
What does Meta Ads Library Scraper do?
This actor reverse-engineers the internal GraphQL endpoint that powers Meta's public Ad Library web UI. It accepts keyword searches, numeric Facebook page IDs, or full Ad Library URLs, then paginates through results using Meta's own cursor-based GraphQL pagination. It returns structured ad records including ad copy, creative URLs, CTA text, landing pages, platform placement, active status, and — where Meta publishes it — spend and reach estimates for political/issue ads.
Output fields
Standard ad record
| Field | Type | Description |
|---|---|---|
| ad_archive_id | string | Meta's archived ad identifier |
| page_id | string | Numeric Facebook page ID |
| page_name | string | Advertiser page display name |
| is_active | boolean | Whether the ad is currently running |
| start_date_formatted | string | Ad start date (YYYY-MM-DD) |
| end_date_formatted | string | Ad end date, if stopped |
| publisher_platform | array | Platforms (facebook, instagram, audience_network, messenger) |
| ad_creative_body | string | Primary ad copy text |
| cta_text | string | Call-to-action button label |
| cta_type | string | CTA enum (SHOP_NOW, LEARN_MORE, …) |
| link_url | string | Landing page URL |
| caption | string | Displayed domain caption |
| image_urls | array | Creative image URLs |
| video_urls | array | Creative video URLs |
| spend | object | Spend range (political/issue ads only) |
| reach_estimate | object | Reach range (political/issue ads only) |
| impressions | object | Impression range (political/issue ads only) |
| advertiser | object | Advertiser transparency data |
| collation_count | integer | Number of creative variants in this collation |
| source_query | string | Which input source produced this row |
| scraped_at | string | ISO timestamp |
Who is it for?
- Performance marketers running competitive ad research and creative swipe-file workflows
- Media buyers monitoring competitor ad launches, rotation cadence, and landing page changes
- Brand strategists tracking share-of-voice and messaging shifts across Facebook and Instagram
- Compliance teams auditing political, housing, employment, and credit ad transparency data
- Data teams building ad intelligence pipelines and alerting on new creatives
- Agencies onboarding new clients by pulling their live and historical ad inventory
Pricing
Pay per result: $0.30 per 1,000 ads scraped.
You are charged only for ads actually written to the dataset. A blocked or rate-limited run that returns no ads is not billed.
How to use it
- Open the actor in Apify Console.
- Provide at least one input source: keyword queries, advertiser page IDs, or full Ad Library URLs.
- Set your country filter (or leave as
ALLfor worldwide). - Choose ad status (active, inactive, or both), ad category, and media type filters.
- Optionally set a max results per source cap to control cost.
- Leave the proxy setting at the default (Apify residential proxy).
- Click Start and export the dataset as JSON, CSV, or Excel.
Output example
{"ad_archive_id": "1599744897819025","page_id": "122105379866001758","page_name": "Cuidalia","is_active": true,"start_date_formatted": "2026-09-01","end_date_formatted": null,"publisher_platform": ["facebook", "instagram"],"ad_creative_body": "Tu descanso merece la mejor almohada...","cta_text": "Comprar","cta_type": "SHOP_NOW","link_url": "https://cuidalia.org","caption": "cuidalia.org","image_urls": ["https://scontent-mad1-1.xx.fbcdn.net/..."],"video_urls": [],"spend": null,"reach_estimate": null,"impressions": null,"advertiser": null,"collation_count": 3,"source_query": "cuidalia","scraped_at": "2026-09-28T12:00:00.000Z"}
Technical details
- Stack: Node.js 24,
apifySDK,impitHTTP client with Chrome TLS impersonation. - Anti-bot: The actor handles Meta's per-session
__rd_verifychallenge automatically (GET → 403 with 481-byte challenge body → POST verify path → re-GET → 200). Thedoc_idforAdLibrarySearchPaginationQueryis harvested from the live JS bundle on each run and falls back to a known-good value. - Proxy: Residential proxy is required. Meta's GraphQL pagination endpoint returns HTTP 200 carrying a GraphQL rate-limit error envelope to datacenter IPs. The default proxy configuration is Apify residential.
- Pagination: Cursor-based via
page_info.end_cursor, up to 60 pages per source. 1.2–3 second randomized delay between pages. - Extraction: Direct GraphQL response parsing — no HTML scraping of rendered results.
Known limits
- Commercial ad spend and reach are not available. Meta publishes spend, impressions, and audience demographics only for political/issue ads and EU DSA-covered ads. No scraper can retrieve these for standard commercial ads.
- Residential proxy bandwidth is billed separately by Apify at the platform's standard residential rate. This is in addition to the per-result actor price.
- The 60-page cap per source is imposed by this actor to bound run cost; Meta's own pagination may go deeper.
- Sorting by true ad launch time is not reliable. Meta's
start_datefield reflects impression delivery windows, not the actual date the ad first went live. The Ad Library API does not expose a sortable launch timestamp. - Meta rotates the GraphQL
doc_idperiodically. The actor harvests it live, but a rotation between harvest and pagination can force a fallback value that may be stale.
FAQ
Do I need a Facebook account or API key? No. The actor uses the same public GraphQL endpoint the Ad Library web UI calls. No login, no token, no developer account, no App Review.
Why is residential proxy required?
Meta's /api/graphql/ pagination endpoint applies a stricter per-IP rate limit than the public search page. A datacenter IP gets an HTTP 200 with a Rate limit exceeded GraphQL error envelope on the first pagination request. Residential exits clear this.
Can I get spend and impressions for commercial ads? No — and no other scraper can either. Meta publishes those fields only for political/issue ads and EU DSA ads. Any actor claiming otherwise for commercial ads is fabricating data.
How many ads can I get per run?
Up to 60 pages × 30 ads = 1,800 ads per source, capped by maxResultsPerSource if set. Multiple sources run sequentially.
Does it support Instagram ads?
Yes. Meta's Ad Library covers Facebook, Instagram, Audience Network, and Messenger. The publisher_platform field on each ad tells you where it ran.
What if the run returns zero ads?
Check that your proxy is residential. If you overrode the proxy field, ensure RESIDENTIAL is still in the groups. Datacenter proxies will silently produce empty runs.
Support
Open an issue on the Actor's page for bugs or feature requests.
Changelog
0.1 — 2026-09-28
- Initial build. Keyless GraphQL reverse-engineering of Meta Ad Library.
__rd_verifychallenge handling (GET → POST → re-GET).- Live
doc_idharvest with fallback. - Cursor-based pagination via
AdLibrarySearchPaginationQuery. - Residential proxy default.
- Input modes: keyword queries, advertiser page IDs, full Ad Library URLs.
- Filters: country, active status, ad category, media type, sort mode.
- Output schema with 22 fields including creative URLs, CTA, platform placement, and political-ad spend/reach.