
Instagram Reel Scraper
scrape.ly/store/echofield/instagram-reel-scraperSocial mediaVideos
1 monthly user

Scrape public ads from Facebook Ad Library search results and Facebook pages, including creative, dates, platforms, and archive ids. No login.
Collect public ads from the Meta Ad Library in minutes. Paste an Ad Library search link, a Facebook page URL, or just a page name, and get one clean row per ad: creative, copy, call to action, landing page, dates, platforms, and the Ad Library link. No Facebook login, and ads cost a fraction of a cent each.
https://www.facebook.com/nike), or a bare page slug such as nike.error and errorCode, and error rows are not charged.| Field | Type | What it does |
|---|---|---|
urls | array | Ad Library search URLs, Facebook page URLs, or page slugs. Required. |
count | integer | Total ads to save across all URLs. Default 10. |
limitPerSource | integer | Maximum ads from each URL. Leave empty to use only count. |
scrapePageAds.period | select | Page URLs only: keep ads that started in the last 24 hours, 7, 14, or 30 days. |
scrapePageAds.activeStatus | select | Page URLs only: all, active, or inactive. |
scrapePageAds.sortBy | select | Page URLs only: impressions_desc or most_recent. |
scrapePageAds.countryCode | string | Page URLs only: two-letter country code such as US, or ALL. |
scrapeAdDetails | boolean | Add EU reach, payer, and advertiser fields. Slower, one extra request per ad. |
runTag | string | Copied onto each saved row as runTag. |
proxy | object | Datacenter proxy is used by default. |
An Ad Library search link keeps the country, keyword, status, and media type already in the link.
{
"urls": [
{
"url": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=US&q=coffee&search_type=keyword_unordered&media_type=all"
}
],
"count": 10
}
Each ad is one dataset row. The default table shows the page, title, ad text, active flag, platforms, dates, landing page, and Ad Library link.
| Field | Description |
|---|---|
ad_archive_id | Ad Library archive id. |
page_name, page_id | The page that ran the ad. |
is_active | Whether the ad is still running. |
start_date_formatted, end_date_formatted | Start and end time in UTC. |
total_active_time | Active time in seconds as Facebook reports it. Facebook only fills it for very recent ads (roughly the first day after the start date) and leaves it empty for older ones; the actor passes it through and never computes it from the dates. |
publisher_platform | Platforms where the ad ran (Facebook, Instagram, and others). |
snapshot | Creative: title, body text, call to action, cards, images, videos, link URL. |
ad_library_url | Public Ad Library page for the ad. |
url, total | The input URL and the count the library reports for a keyword search. |
pageInfo | Page transparency summary, for page URLs. |
aaa_info | Payer and EU reach details when ad details are on. |
error, errorCode | Only on rows for URLs that could not be scraped. |
{
"ad_archive_id": "2619351891814847",
"page_name": "American Health Support Community",
"page_id": "966175593248497",
"is_active": true,
"start_date_formatted": "2026-07-18 07:00:00",
"end_date_formatted": "2026-10-13 07:00:00",
"publisher_platform": ["FACEBOOK", "INSTAGRAM", "AUDIENCE_NETWORK", "WHATSAPP", "THREADS"],
"ad_library_url": "https://www.facebook.com/ads/library/?id=2619351891814847",
"snapshot": {
"title": "Natural Relief in Weeks",
"body": { "text": "My aunt called me a creep for putting a camera in Nana's living room." },
"cta_text": "Learn more",
"link_url": "https://shop.pipitea.com/hbt/kd/sp-nm",
"display_format": "IMAGE"
},
"total": 50001,
"url": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=US&q=coffee&search_type=keyword_unordered&media_type=all"
}
The example is trimmed; real rows also include card, image, and video URLs inside snapshot.
You pay $0.00005 per ad saved, which is $0.05 per 1,000 ads, plus platform usage for compute and proxy traffic. Rows that only report an error are not charged.
Worked example: saving 1,000 ads costs $0.05 in result fees, plus the platform usage of the run.
Is it legal to scrape the Ad Library? The Ad Library is public by design. This actor only reads public pages without logging in. You are responsible for how you use the data and for following local law and platform terms.
Do I need a Facebook login or my own proxy? No login. A datacenter proxy is included by default.
How many ads can I get?
As many as you set in count, but Facebook shows logged-out visitors only the first page of about 30 ads per search or page. To collect more, add several narrower URLs (one per country, media type, or date range) in the same run.
Why are spend and reach_estimate empty?
Meta publishes those figures for some political and social-issue ads. Ordinary commercial ads usually leave them empty.
Can I schedule it or call it from code? Yes. Use schedules in the console, or start runs and read datasets through the API.
Moving from another Ad Library actor? The URL list, count, page filters, and ad-details switch use the same input names as the curious_coder actor.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
urlsarrayRequiredURLs
Facebook Ad Library search URLs, or Facebook page URLs such as https://www.facebook.com/nike. A page slug such as nike also works.
countintegerOptionaldefault 10Maximum ads
Total ads to save across all URLs. Facebook shows logged-out visitors about 30 ads per search or page, so add more URLs to get more ads.
limitPerSourceintegerOptionalLimit per URL
Maximum ads to save from each URL. Leave empty to use only Maximum ads. Facebook shows logged-out visitors about 30 ads per URL.
Applied when the URL is a Facebook page. Ad Library search URLs keep the filters already in the link.
scrapePageAds.periodenumOptionaldefault ""Date range
Keep ads whose start date falls in this range.
scrapePageAds.activeStatusenumOptionaldefault "all"Active status
Which ads to keep for a page URL.
scrapePageAds.sortByenumOptionaldefault "impressions_desc"Sort
How to order ads for a page URL.
scrapePageAds.countryCodestringOptionaldefault "ALL"Country
Two-letter country code, such as US or DE. Use ALL for every country.
Extra fields. Leave these off unless you need them.
scrapeAdDetailsbooleanOptionaldefault falseScrape ad details
Add EU reach, payer, and advertiser fields for each ad.
runTagstringOptionalRun tag
Copied onto each saved row as runTag.
proxyobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter exits are used by default.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| page_name | string | null | Name of the page that ran the ad. |
| ad_archive_id | string | null | Ad Library archive id. |
| page_id | string | null | Facebook page id. |
| is_active | boolean | null | Whether the ad is still running. |
| start_date_formatted | string | null | Ad start time in UTC. |
| end_date_formatted | string | null | Ad end time in UTC. |
| total_active_time | integer | null | Active time in seconds as reported by Facebook. Only present for very recent ads (roughly the first day after start); null for older ads. Never derived from the dates. |
| publisher_platform | array | null | Platforms where the ad ran. |
| snapshot | object | null | Creative snapshot: copy, call to action, cards, images, and videos. |
| ad_library_url | string | null | Public Ad Library page for this ad. |
| url | string | null | Input URL this row came from. |
| total | number | null | Total ads the library reported for a keyword search. |
| pageInfo | object | null | Page transparency summary for a Facebook page URL. |
| aaa_info | object | null | Payer and EU reach details when ad details are enabled. |
| runTag | string | null | Tag copied from the input, when one was set. |
| error | string | null | What went wrong for this URL. |
| errorCode | string | null | Error code when this URL could not be scraped. |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Ad | $0.00005 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/facebook-ads-library-scraper').call({
"urls": [
{
"url": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=US&q=coffee&search_type=keyword_unordered&media_type=all"
}
],
"count": 10,
"scrapePageAds.period": "",
"scrapePageAds.activeStatus": "all",
"scrapePageAds.sortBy": "impressions_desc",
"scrapePageAds.countryCode": "ALL",
"proxy": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/facebook-ads-library-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/facebook-ads-library-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Active ads from one page, most impressions first.
Keyword search with EU reach and payer details.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.