The official Facebook Ad Library API only returns political and social issue ads, strips out creative assets (images, videos, thumbnails), and gives you a paginated mess that times out on broad queries. The practical Facebook Ad Library API alternative is to scrape the public Ad Library web interface directly, which exposes every commercial ad, full creative URLs, landing page links, and advertiser metadata that the API hides.
Quick Answer
The best Facebook Ad Library API alternative is a headless scraper that pulls data from the public Ad Library web pages instead of Meta's restricted Graph API endpoint. The official API only covers political/issue ads in ~30 countries, omits image/video URLs, and caps results at 5,000 per query with frequent token expirations. A scraper-based approach returns commercial ads worldwide, full media assets, advertiser page details, ad copy, CTAs, and landing URLs. Tools like the Facebook Ad Library Scraper handle this on a pay-per-use basis without OAuth, app review, or rate-limit lottery.
What does the Facebook Ad Library API actually return?
Here's the honest scope of https://graph.facebook.com/v19.0/ads_archive:
| Data point | Official API | Public Ad Library page |
|---|---|---|
| Commercial ads (ecommerce, SaaS, DTC) | ❌ No | ✅ Yes |
| Political & issue ads | ✅ Yes | ✅ Yes |
| Ad creative image URL | ❌ No | ✅ Yes |
| Ad creative video URL | ❌ No | ✅ Yes |
| Landing page URL | ⚠️ Sometimes | ✅ Yes |
| Ad copy / body text | ✅ Yes | ✅ Yes |
| Advertiser page likes, category | ❌ No | ✅ Yes |
| CTA button text | ❌ No | ✅ Yes |
| Country targeting | ✅ Yes (~30 countries) | ✅ Yes (global) |
| Spend & impressions | ⚠️ Ranges only | ⚠️ Ranges only |
If you're running competitive intelligence for a DTC brand, the API is useless — your competitors don't run political ads. That's the structural gap.
Why is the Facebook Ad Library API so limited?
Meta built the Ad Library API for journalists and academics studying election interference after 2016, not for marketers. The endpoint is deliberately scoped to ad_type=POLITICAL_AND_ISSUE_ADS as the only meaningful filter. Even within that scope:
- Access tokens expire every 60 days unless you implement long-lived token refresh.
- App Review is mandatory for the
ads_readpermission. Approval can take 2–6 weeks and requires a business verification. - Rate limits sit around 200 calls per hour per user, dropping further if Meta flags your usage pattern.
- Pagination breaks silently past ~5,000 results — cursors stop returning data even when more exists.
- No webhook or change feed, so you must repoll to detect new ads.
The web Ad Library, by contrast, is public, requires no authentication, and renders every commercial ad with full media. That's why scraping it is the standard workaround.
How do I get Facebook ad creatives without the API?
You hit the public Ad Library URL pattern and parse the rendered results. The URL structure is:
https://www.facebook.com/ads/library/?active_status=all
&ad_type=all
&country=US
&q=YOUR_KEYWORD
&search_type=keyword_unordered
Or by page ID:
https://www.facebook.com/ads/library/?active_status=all
&ad_type=all
&view_all_page_id=PAGE_ID
The page is a React app with lazy-loaded results, so a simple curl won't work — you need a headless browser to render and scroll. The Facebook Ad Library Scraper handles this end-to-end: you pass a keyword or page URL, and it returns a JSON array with:
ad_archive_idpage_name,page_id,page_likesad_creative_bodies(all text variants)ad_creative_link_titles,ad_creative_link_descriptionsimages[]andvideos[]with direct CDN URLscta_textandcta_typelink_url(the landing page)start_date,is_active,publisher_platforms(Facebook, Instagram, Messenger, Audience Network)
Pricing is pay-per-use on Apify, typically a few dollars per thousand ads scraped — cheaper than the engineering time to build and maintain a Puppeteer cluster.
Can I scrape the Facebook Ad Library legally?
The Ad Library is a public page Meta publishes specifically for transparency. The 2022 hiQ Labs v. LinkedIn ruling and the 2024 Meta v. Bright Data decision both established that scraping public, non-logged-in pages doesn't violate the CFAA. That said:
- Don't log in and scrape — that brings ToS into play.
- Don't republish copyrighted creative assets without fair-use grounding.
- Respect reasonable rate limits to avoid burdening the service.
- If you're in the EU, document your GDPR lawful basis (legitimate interest for B2B competitive research usually holds).
Most production teams treat scraped Ad Library data as internal intelligence — feeding it into Looker dashboards, Slack alerts on competitor launches, or creative inspiration repos — which sits cleanly inside fair use.
What's a realistic workflow for competitor ad monitoring?
A typical setup for tracking 20–50 competitors:
- Daily scrape: Schedule the scraper to run once per day with a list of competitor page IDs as input.
- Diff against yesterday: Compare
ad_archive_idsets. New IDs = new ads launched. Missing IDs = ads paused. - Download creatives: Pull image/video URLs to S3 or R2 for permanent reference (Meta CDN URLs expire).
- Alert: Post new ads to a Slack channel with the creative, copy, and landing URL.
- Tag and analyze: Run ad copy through an LLM to classify offer type (discount, free trial, social proof, urgency).
At 50 pages × ~30 ads each × daily polling, you're looking at roughly 45,000 ad fetches per month. On pay-per-use pricing this lands around $20–40/month — versus the engineering cost of building OAuth flows for an API that wouldn't return the creatives anyway.
How does this compare to paid ad intelligence tools?
| Tool | Monthly cost | Creatives included | Custom queries | Raw data export |
|---|---|---|---|---|
| AdSpy | $149+ | ✅ | Limited | CSV only |
| BigSpy | $99+ | ✅ | Limited | CSV only |
| Foreplay | $99+ | ✅ | Curated only | ❌ |
| Official FB API | Free | ❌ | ✅ | JSON |
| Scraper actor | ~$20–40 | ✅ | ✅ Any keyword/page | JSON, full schema |
The paid tools wrap the same public data in a UI and charge for the dashboard. If you want the raw JSON to pipe into your own warehouse, BI tool, or AI workflow, the scraper route wins on cost and flexibility.
What about Instagram and Messenger ads?
The Ad Library is cross-platform — ads delivered through Instagram, Messenger, and Audience Network all surface in the same library. The publisher_platforms field tells you exactly where each ad runs:
{
"ad_archive_id": "1234567890",
"page_name": "ExampleBrand",
"publisher_platforms": ["facebook", "instagram"],
"ad_creative_bodies": ["Free shipping this weekend only..."],
"images": ["https://scontent.fbcdn.net/..."],
"cta_text": "Shop Now",
"link_url": "https://example.com/spring-sale"
}
So a single scraping job covers your full Meta competitive landscape — no separate Instagram Graph API workaround needed.
FAQ
Q: Does the official Facebook Ad Library API return ad images?
No. The Graph API ads_archive endpoint returns text fields, date ranges, and spend estimates only. Image and video URLs are not exposed through the API and must be obtained from the public Ad Library web interface.
Q: Do I need a Facebook developer account to scrape the Ad Library? No. The Ad Library web pages are publicly accessible without login. A scraper hits the same URL a browser would and parses the rendered output, so no app ID, access token, or app review is required.
Q: How fresh is the data compared to the official API? The Ad Library web pages update in near real-time — new ads typically appear within hours of launch. The official API has similar latency but adds 24–48 hours for some fields like spend ranges to populate. Scraping the web version gives you the earliest signal.
Q: Can I filter by spend or impressions? Both the API and the public Ad Library only show spend and impressions as ranges (e.g., $1K–$5K) for political ads, and not at all for commercial ads. No tool can give you exact figures because Meta doesn't publish them. You can sort and filter by date, country, platform, and keyword.
Q: How much does scraping cost compared to building it myself? The Facebook Ad Library Scraper runs roughly $0.50–$1.00 per 1,000 ads on pay-per-use pricing. Building and maintaining your own Puppeteer infrastructure with proxy rotation typically costs 20–40 engineering hours upfront plus ongoing maintenance whenever Meta updates the page structure — usually every 2–3 months.