Meta Ad Library Scraper — Ad Search & Export
Pricing
Pay per event
Meta Ad Library Scraper — Ad Search & Export
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.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
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.20 per 1 000 ads landed, no subscription, no card required to try it.
🎯 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 solve Meta's session challenge automatically — the public search page replies with a short verification step before serving results; we handle it on every run so you never see it.
- 🔁 We retry with exponential backoff on rate limits and server errors, honoring
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 — Pydantic-validated, deduplicated across pages and targets.
- 💰 Pay-per-result pricing. A small per-run fee, then you're charged only for ads that actually land. No data, no charge.
💡 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.
The first run on a new account uses $5 of free Apify credit — that's roughly 1 500 ads at our pricing.
📥 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 — required for pagination |
At least one of queries or pageIds must contain an entry.
Proxy defaults to RESIDENTIAL and it isn't a cosmetic choice. We confirmed live that Meta's ad-search results (page 1) work fine on a datacenter IP, but its pagination endpoint applies a much stricter rate limit to datacenter traffic — page 2+ gets rejected almost immediately. Switching this input to a datacenter proxy will cap every run at the first ~30 ads and fail loud (see Limitations) once maxPages asks for more than that.
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
Pay-per-event. You pay for what you get, nothing for what you ask for:
| Event | Price | When charged |
|---|---|---|
actor-start | $0.20 | Base fee, once per run (warm-up, challenge-solve, proxy resolution) |
ad-result | $0.003 | Per unique ad written to the dataset |
Examples:
| Pull | Cost |
|---|---|
| 100 ads | $0.50 |
| 1 000 ads | $3.20 |
| 10 000 ads | $30.20 |
🚧 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. - Pagination needs the RESIDENTIAL proxy tier — this is the default and we recommend keeping it. We confirmed live that Meta's pagination endpoint rate-limits datacenter IPs almost immediately, even though the first page of results loads fine on one. 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 walk from a workstation 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 loud with a clear error the momentmaxPagesasks for more than that — we'd rather fail visibly than quietly under-deliver. - Meta can change its session-verification step or internal query IDs without notice. If that happens, a run will fail loud with a clear status message rather than silently return nothing — and we ship a fix the same way we found the original path.
❓ 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.