# Meta Ad Library Scraper: Cheap Facebook Ads (`tidyharvest/meta-ad-library-scraper`) Actor

Facebook & Instagram ads from the Meta Ad Library by page, keyword or ad link, for $0.10 per 1,000 all-in. Built to undercut Meta (Facebook & Instagram) Ads Library Scraper: its $0.15/1k plus platform usage came to $0.17-0.24/1k in our Oct 2026 tests.

- **URL**: https://apify.com/tidyharvest/meta-ad-library-scraper.md
- **Developed by:** [TidyHarvest](https://apify.com/tidyharvest) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.08 / 1,000 ad scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Meta Ad Library Scraper: Cheap Facebook Ads

Get **Facebook and Instagram ads** out of the **Meta Ad Library**: ad text, headline, landing page,
call to action, **image and video URLs**, carousel cards, start and end dates and platforms, for any brand's page, any
keyword, or a single ad link, for about **half what the most popular budget scraper costs** in our tests. **$0.10 per 1,000 ads, and that's the whole bill**: no start fee, no platform usage on top.

Paste a Facebook page (`facebook.com/nike`), a brand name, an Ad Library URL from your browser, or type a keyword. No
login, no cookies, no Facebook account.

### Compared with Meta (Facebook & Instagram) Ads Library Scraper

Built to undercut [Meta (Facebook & Instagram) Ads Library Scraper](https://apify.com/jmlp/meta-ad-library-scraper)
(`jmlp/meta-ad-library-scraper`), the cheapest popular Ad Library actor. Its card says $0.15 per 1,000 ads, but your
Apify platform usage (its runs default to 4 GB of memory, plus residential proxy traffic) comes on top. In October 2026
we ran both on the same inputs at the same time, in two rounds, and measured what each run actually cost:

| | This actor | Meta (Facebook & Instagram) Ads Library Scraper |
|---|---|---|
| A brand page, 300 ads: what you pay | **$0.03** | $0.06-0.07 |
| A keyword search, 1,000 ads: what you pay | **$0.10** | $0.20-0.22 |
| 10 small advertisers, 2,800 ads | **$0.28** | $0.49-0.50 |
| 40 mixed pages, searches and ad links (up to 100 ads each) | **$0.26** (2,552 ads) | $0.58 (3,141 ads) |
| All-in price per 1,000 ads (7 runs) | **$0.10** | $0.17-0.24 |
| Time for the 40 mixed sources (two runs each) | **164-168 s** | 213-221 s |
| Rows whose text is a template placeholder (`{{product.brand}}`) | **0%** | 13% (1,429 of 11,345) |
| Output | flat columns, ISO dates | Facebook's raw nested fields |

**Where it does more or does better:** it is faster on one big search (1,000 keyword ads in 81-122 s vs 238-241 s here;
10 advertisers in 146 s vs 192 s; a brand page of 300 ads took about the same, 66-144 s vs 69-75 s), and it can split a
page's full history into date ranges to scrape it in parallel.

### How to use it

1. Paste one or more **Facebook pages, page names, Ad Library URLs or ad links** (one per line), or type **search terms**.
2. Optional: pick **countries** and whether you want **active**, inactive or all ads.
3. Set **Max ads** (100 for a first look; 0 for every ad) and click Start. Results stream into the dataset as they come.

```json
{ "urls": ["https://www.facebook.com/nike", "gymshark"], "maxItems": 500 }
```

```json
{ "searchTerms": ["protein powder"], "countries": ["US"], "activeStatus": "active", "maxItems": 1000 }
```

### What you get

One row per ad, with the same columns every time: `adArchiveId`, `adLibraryUrl`, `pageId`, `pageName`, `pageUrl`,
`pageLikeCount`, `isActive`, `startDate`, `endDate`, `activeDays`, `platforms`, `displayFormat`, `body`, `title`,
`linkUrl`, `linkDomain`, `ctaText`, `imageUrls`, `videos` (HD/SD URLs + preview), `cards` (carousel and dynamic-ad
variations), `collationCount`, `spend`/`impressions` (political ads), `position` and `source`. ISO dates throughout.
Dynamic and catalog ads come back with the text the site shows, never a `{{product.name}}` placeholder.

### Pricing

- **$0.10 per 1,000 ads** on the Free and Bronze plans, $0.09 on Silver, $0.08 on Gold and above.
- Nothing else: no start fee, and Apify platform usage (compute, proxies) is included, not passed on to you.
- Empty searches and bad inputs cost nothing; they get a free status row.

### Need more?

This is the lean edition. [Facebook Ads Library Scraper](https://apify.com/tidyharvest/facebook-ads-library-scraper)
(same team, same engine) adds **EU/UK reach and audience data** per ad, a **count-only** mode for lead lists, an
**only-new-ads** mode for scheduled monitoring, one-ad-per-advertiser lead lists, and every Ad Library filter as a form field.

### Limits and notes

- Meta's "~N results" is an estimate; you get every ad the Ad Library actually shows a logged-out visitor.
- Ads Meta shows only to logged-in users can't be returned; ads whose media is hidden are flagged `mediaRequiresLogin`.
- Media URLs are Facebook CDN links that expire after a while: download what you need to keep.
- A run moved by Apify to another server continues where it stopped, without duplicates.

### Is it legal?

The Meta Ad Library is a public transparency database. This actor reads it as a logged-out visitor would: no login, no
account. Ads are businesses' public advertising; if you store names of individuals (pages run by people, political
disclaimers), data-protection law applies to you. Ad creatives belong to their advertisers: analysis is generally fine,
republishing is not.

# Actor input Schema

## `urls` (type: `array`):

One per line: a brand's Facebook page (facebook.com/nike), its name or page id, an Ad Library URL copied from your browser, or one ad's link (?id=...).

## `searchTerms` (type: `array`):

Keywords to search ad text for, one per line (e.g. running shoes). Each term is searched in every country below. No need to build a URL.

## `countries` (type: `array`):

Two-letter country codes where the ads ran (US, GB, DE...). Empty = all countries, or the country in your URL. Several codes = one search per country.

## `activeStatus` (type: `string`):

Applies to every source, including pasted URLs.

## `maxItems` (type: `integer`):

Stop after this many ads in total (also caps your cost). 0 = every ad.

## `maxAdsPerSource` (type: `integer`):

Per-source cap (0 = none). Advanced.

## Actor input object example

```json
{
  "urls": [
    "https://www.facebook.com/nike"
  ],
  "countries": [],
  "activeStatus": "default",
  "maxItems": 100,
  "maxAdsPerSource": 0
}
```

# Actor output Schema

## `ads` (type: `string`):

One row per ad.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.facebook.com/nike"
    ],
    "countries": [],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyharvest/meta-ad-library-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://www.facebook.com/nike"],
    "countries": [],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("tidyharvest/meta-ad-library-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.facebook.com/nike"
  ],
  "countries": [],
  "maxItems": 100
}' |
apify call tidyharvest/meta-ad-library-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidyharvest/meta-ad-library-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/iTP0Ne6aklmg33HXr/builds/HCudSz7r0aaTyrHoM/openapi.json
