Meta Ad Library Scraper
Pricing
from $2.64 / 1,000 ad scrapeds
Meta Ad Library Scraper
Search Meta's public Ad Library by brand/keyword or advertiser Page ID and export live ad creatives — CTA text, ad copy, images, platforms, active status. No Meta login, access token, or App Review required. A Meta/Facebook Ads Library API alternative and data exporter. Competitor ad research tool.
Pricing
from $2.64 / 1,000 ad scrapeds
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
a day ago
Last modified
Categories
Features
Share
Quick answer: The Meta Ad Library Scraper searches Meta's public Ad Library by keyword or advertiser Page ID and returns every matching ad as structured data — CTA button text and type, ad body copy, link description, creative image URLs, publisher platforms, and active/inactive status. No Meta developer account, access token, or App Review is required. Pricing is pay-per-result — $3.00 per 1 000 ads delivered, with no start fee and no subscription.
🎯 What this scrapes
The Meta Ad Library is Meta's public registry of every ad running across Facebook, Instagram, Messenger, and the Audience Network. This Actor searches it directly — by free-text query (brand or keyword) or by advertiser Page ID — and walks Meta's own pagination to pull every matching ad, not just the first page.
Per ad you get:
| Field | Type | Notes |
|---|---|---|
ad_archive_id | string | Meta's stable id for this ad |
page_id / page_name | string | The advertiser's Page |
is_active | boolean | Currently running or not |
collation_count / collation_id | int / string | Creative-variation grouping, if any |
publisher_platforms | array | FACEBOOK, INSTAGRAM, MESSENGER, ... |
link_url | string | Advertiser's landing page |
cta_text / cta_type | string | Button copy, e.g. "Shop now" / SHOP_NOW |
body_text | string | Primary ad copy |
link_description | string | Secondary link text |
image_urls | array | Creative image URLs |
display_format | string | IMAGE, VIDEO, CAROUSEL, ... |
start_date_unix / end_date_unix | int | Ad delivery window, unix seconds |
ad_library_url | string | Deep link back to the live Ad Library entry |
scraped_at | string | ISO-8601 UTC timestamp |
🔥 What we handle for you
- 🛡️ We handle Meta's verification step automatically — the public search page asks for a short verification before serving results; we deal with it on every run so you never see it.
- 🔁 We retry temporary failures with increasing delays and honor
Retry-After— up to 5 attempts per request. - 🌐 We route through Apify Proxy, pinned to your requested country, so results reflect the market you asked for.
- 🧱 We paginate for you. Most Ad Library scrapers stop at the first ~30 results; we keep walking Meta's own pagination until it runs out or you hit your cap.
- 🧊 Clean, typed dataset rows — validated fields, deduplicated across pages and targets.
- 💰 Pay-per-result pricing. There is no start fee; you are charged only for ads that land in your dataset. A run that finds nothing is not charged for results.
💡 Use cases
- Competitor ad monitoring — track what a competitor brand is running on Facebook/Instagram right now, and how their creative changes week to week.
- Ad copy research — pull hundreds of live CTA/body-copy combinations for a niche to inform your own creative testing.
- Brand protection — search your own brand or trademark to spot unauthorized advertisers riding your name.
- Market research — gauge how saturated a vertical is by counting active ads for a set of keywords.
- Agency reporting — screenshot-free proof of what's currently live for a client, exported straight to a spreadsheet.
- AI / RAG ingestion — feed ad copy and creative image URLs into a vector store for creative-trend analysis.
⚙️ How to use it
- Click "Try for free" at the top of the page.
- Enter one or more search queries (brand names or keywords) into the
Search queriesfield, e.g.nike,adidas. Each query is searched independently. - (Optional) Add advertiser Page IDs if you already know them, instead of or alongside queries.
- Set a country — required, and pinned to the proxy exit so results match the market you asked for.
- Run. Each ad is one row in the dataset; export to JSON, CSV, or Excel from the Storage tab.
📥 Input
The schema lives in .actor/input_schema.json. The fields:
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
queries | array of string | one of | ["nike", "adidas"] | Brand/keyword searches |
pageIds | array of string | one of | [] | Meta advertiser Page IDs |
country | string | yes | US | ISO-3166 alpha-2, pinned to the proxy exit |
activeStatus | enum | no | active | active / inactive / all |
adType | enum | no | all | all / political_and_issue_ads |
maxResults | integer | no | 300 | Total dataset items across all targets. 0 = unlimited |
maxPages | integer | no | 20 | Pagination ceiling per target (~8–10 ads/page) |
proxyConfiguration | proxy config | no | RESIDENTIAL enabled | See note below — needed for multi-page runs |
At least one of queries or pageIds must contain an entry.
Proxy defaults to RESIDENTIAL and it isn't a cosmetic choice. Meta's first page of results loads on a datacenter IP, but later pages are rate-limited far more strictly there. Choosing a datacenter proxy limits every run to roughly the first ~30 ads and the run fails with a clear error once maxPages asks for more than that (see Limitations).
Example input
{"queries": ["nike", "adidas"],"country": "US","activeStatus": "active","adType": "all","maxResults": 500,"maxPages": 20,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
📤 Output
Every row is one ad. Example:
{"ad_archive_id": "888379050198830","page_id": "521386541053415","page_name": "EV's clothing boxes","is_active": true,"collation_count": 1,"collation_id": "1269601201531459","publisher_platforms": ["FACEBOOK", "INSTAGRAM"],"link_url": "https://edjvntge.uk/collections/store","cta_text": "Shop now","cta_type": "SHOP_NOW","body_text": "SALE NOW! You had me at 9 vintage tees for £99","link_description": "Limited time only! Get 9 vintage tees for £99!","image_urls": ["https://scontent.fkun1-1.fna.fbcdn.net/..."],"display_format": "IMAGE","start_date_unix": 1785740400,"end_date_unix": null,"ad_library_url": "https://www.facebook.com/ads/library/?id=888379050198830","query": "nike","country": "US","scraped_at": "2026-09-12T18:00:00+00:00"}
Export options once the run finishes:
- JSON — full payload, ideal for AI/RAG pipelines
- CSV / Excel — for analyst spreadsheets
- JSONL — line-delimited, easy to stream into a warehouse
- API — fetch programmatically via
GET /v2/datasets/{id}/items; webhook onACTOR.RUN.SUCCEEDEDfor live pipelines
💰 Pricing
No Actor start fee. You pay for the output events below.
| Event | USD per event | Billing unit |
|---|---|---|
ad-result | $0.003 | Charged for each unique ad written to the dataset. |
1,000 output events cost $3.00 at the standard rate, with no start charge.
Existing subscriber discounts remain available in the Apify Pricing tab.
🚧 Limitations
- No
spend,impressions, orfunding_entityfields. Those figures are only ever disclosed via Meta's separate, credentialed Graph API for political/issue ads — the public search surface this Actor uses doesn't expose them for ordinary commercial ads, and we don't fabricate numbers Meta doesn't publish. - No direct video/image downloads.
image_urlslinks to Meta's own CDN; we don't mirror media files. - Multi-page runs need the RESIDENTIAL proxy tier — this is the default and we recommend keeping it. Meta rate-limits later result pages on datacenter IPs almost immediately, even though the first page loads fine. On the default
RESIDENTIALsetting our last cloud run walked page 1 → 3 and returned 49 unique ads across 23 advertisers with zero blocks, and a longer test walk reached 60 pages / 580+ unique ads on a single query;maxPagesdefaults conservatively to 20 so a typical run stays cheap. If you switch to a datacenter proxy to save cost, expect the run to cap at the first ~30 ads per target and fail with a clear error the momentmaxPagesasks for more than that — we'd rather fail visibly than quietly under-deliver. - If the proxy you requested cannot be set up, the run stops with an error rather than changing route.
- Meta can change its site without notice. If that happens, a run will fail with a clear status message rather than silently return nothing — and we ship a fix as soon as we can.
❓ FAQ
Is this legal?
Yes. The Meta Ad Library is a public registry Meta operates under EU DSA and US regulatory pressure. We search only what the public UI exposes, at a polite pace, and don't bypass any login wall or paywall.
Do I need a Meta developer account or access token?
No. Unlike Meta's official (and access-gated) Graph API, this Actor works entirely against the public Ad Library search surface — no app, no App Review, no ads_read permission.
Why is coverage sometimes less than the total Meta reports on the site?
Two reasons: your maxPages/maxResults caps, and identical creatives Meta groups into one "collation" — we return the group's representative ad rather than every duplicate variation.
Can I search political or issue ads specifically?
Yes — set adType to political_and_issue_ads. Meta discloses richer government-facing metadata for these via its own compliance tools; this Actor returns the same ad-copy fields as any other search.
How do I schedule this to run automatically?
Apify Console → Schedules → attach this Actor → set your cron. Daily or weekly is plenty; the Ad Library doesn't change fast enough to need more.
What integrations does this Actor support?
- Schedule — Apify Console → Schedules for recurring monitoring.
- Webhooks — register
ACTOR.RUN.SUCCEEDEDto fire a downstream pipeline. - API —
POST /v2/acts/DevilScrapes~meta-ad-library-scraper/run-sync-get-dataset-itemsfor a single synchronous pull. - Make / Zapier — every Apify Actor surfaces as a node out of the box.
💬 Your feedback
Spotted a bug, missing field, or want a new feature? Open an issue on the Apify Store listing — we read every one.
Built by Devil Scrapes — Apify Actors with attitude. PPE, transparent pricing, no junk fields.