# Facebook Ads Advertiser Leads - Businesses Running Meta Ads (`hgservices/facebook-ads-advertiser-leads`) Actor

Find businesses that run Facebook and Instagram ads now. Search the Meta Ad Library by niche and get each advertiser's website, email, phone, WhatsApp, address, social profiles, website platform and ad activity. No login. Export JSON, CSV or Excel.

- **URL**: https://apify.com/hgservices/facebook-ads-advertiser-leads.md
- **Developed by:** [Harish Garg](https://apify.com/hgservices) (community)
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 saved leads

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

Find **businesses that run Facebook and Instagram ads right now**, and get their **website, email, phone, WhatsApp, address and social profiles**, plus how they advertise. Enter a niche such as `roofing`, `dentist` or `skincare`. The Actor searches the [Facebook Ad Library](https://www.facebook.com/ads/library), groups the ads by advertiser and visits each advertiser's website to find their public business contacts.

These are not cold leads from a directory. Every business in the list **pays for ads today**, so it has a marketing budget and wants new customers.

No Facebook account. No login. No coding needed. Run it in Apify Console, call it from the **API** or from **Claude and ChatGPT**, schedule it every week, and send the leads to your CRM with Apify integrations.

### What does Facebook Ads Advertiser Leads do?

- **Finds active advertisers** — searches the Meta Ad Library by keyword in any country and keeps one row per business.
- **Finds the website** — reads the landing pages of the ads, removes tracking links and skips marketplaces such as Amazon, directories such as Thumbtack, and link pages such as Linktree.
- **Finds the contacts** — visits the home page and the contact, about, imprint and location pages of the website, and reads the **email, phone, address, business name and social profiles** that the business publishes.
- **Shows the ad activity** — number of active ads, new ads in the last 30 days, how long the business has advertised, video ads, platforms and calls to action.
- **Shows how to reach them** — WhatsApp numbers and the contact channels the ads use: website, Messenger, WhatsApp, Instagram, phone call or lead form.
- **Shows the website platform** — Shopify, WordPress, WooCommerce, Wix, Squarespace, Webflow, GoHighLevel and more.
- **Skips big brands** — advertisers with more than 1,000,000 page likes are left out by default.

### Who uses Facebook ad leads?

- **Marketing agencies** — find local businesses that already spend on Facebook ads and offer them better ads, landing pages or management.
- **Ad creative and video producers** — find brands that run many ads and need new creatives every month.
- **Shopify app and e-commerce service sellers** — find Shopify stores that advertise in your niche.
- **SaaS sales teams** — find businesses that use lead forms, call buttons or Messenger ads, and sell them CRM, call tracking or chat tools.
- **Lead generation and appointment setting** — build a fresh list of active businesses in a city, state or country, on a schedule.
- **Market research** — see who advertises in a niche, how much and on which platforms.

### How to use Facebook Ads Advertiser Leads

You can run the Actor in five ways. All examples below use the same input: 10 roofing advertisers in the United States, kept only when they have an email or a phone.

#### In Apify Console (no code)

1. Open the [Actor page](https://apify.com/hgservices/facebook-ads-advertiser-leads) and click **Try for free**.
2. Enter one or more **Search keywords** for your niche, for example `roofing`, `med spa` or `solar panels`.
3. Select the **Country**.
4. Set **Maximum advertisers per search**, for example `10` for a first test.
5. Optional: set **Only leads with contact data** to **Only leads with an email or a phone**.
6. Click **Start**.
7. When the run finishes, open the **Output** tab, or download the leads as CSV, Excel, JSON or HTML.

To get new leads every week, open the Actor and click **Schedule**. Use **Exclude websites** to skip leads that you already have.

#### With the Apify API (HTTP)

Get your API token in Apify Console under [Settings > API & Integrations](https://console.apify.com/settings/integrations). This request starts a run, waits for it to finish and returns the leads as JSON:

```bash
curl -X POST "https://api.apify.com/v2/acts/hgservices~facebook-ads-advertiser-leads/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQueries": ["roofing"],
    "country": "US",
    "maxAdvertisersPerSearch": 10,
    "requireContact": "email_or_phone"
  }'
```

The synchronous endpoint waits up to 300 seconds. For large runs, start the run with the `/runs` endpoint and read the dataset when the run finishes. See the **API** tab for all endpoints.

#### With the JavaScript client

Install the client with `npm install apify-client`, then run:

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

// Start the Actor and wait for it to finish.
const run = await client.actor('hgservices/facebook-ads-advertiser-leads').call({
    searchQueries: ['roofing'],
    country: 'US',
    maxAdvertisersPerSearch: 10,
    requireContact: 'email_or_phone',
});

// Read the leads from the run's dataset.
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const lead of items) {
    console.log(lead.pageName, lead.websiteUrl, lead.primaryEmail, lead.primaryPhone);
}
```

#### With the Python client

Install the client with `pip install apify-client`, then run:

```python
import os

from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])

## Start the Actor and wait for it to finish.
run = client.actor('hgservices/facebook-ads-advertiser-leads').call(
    run_input={
        'searchQueries': ['roofing'],
        'country': 'US',
        'maxAdvertisersPerSearch': 10,
        'requireContact': 'email_or_phone',
    }
)

## Read the leads from the run's dataset.
for lead in client.dataset(run.default_dataset_id).iterate_items():
    print(lead['pageName'], lead['websiteUrl'], lead['primaryEmail'], lead['primaryPhone'])
```

This example is for `apify-client` version 2 or later. In version 1, `call()` returns a dictionary, so use `run['defaultDatasetId']`.

#### With Claude, ChatGPT and other AI assistants (MCP)

The [Apify MCP server](https://docs.apify.com/integrations/mcp) lets AI assistants find and run Apify Actors. Connect it once, then ask for leads in plain language. You sign in to Apify in your browser the first time. You do not need to copy an API token.

**Claude (claude.ai and Claude Desktop)**

1. Open **Settings > Connectors** and click **Add custom connector**.
2. Enter the URL `https://mcp.apify.com` and click **Add**.
3. Sign in to Apify and approve the access.

**Claude Code**

```bash
claude mcp add --transport http apify https://mcp.apify.com
```

Then run `/mcp` in Claude Code and sign in to Apify.

**ChatGPT**

1. Turn on **Developer mode** in ChatGPT settings.
2. Open **Settings > Apps & Connectors** and click **Create**.
3. Enter a name such as `Apify`, the MCP server URL `https://mcp.apify.com`, and select **OAuth** authentication.
4. Click **Create** and sign in to Apify.
5. In a new chat, click **+**, select **More**, and add the Apify connector.

**Cursor, VS Code and other MCP clients**

```json
{
    "mcpServers": {
        "apify": {
            "url": "https://mcp.apify.com"
        }
    }
}
```

**Example prompt**

> Use the Apify Actor hgservices/facebook-ads-advertiser-leads to find 10 roofing companies in the US that run Facebook ads and have an email or a phone. Show the company name, website, email and phone in a table.

The assistant runs the Actor and reads the leads from the dataset. To give the assistant only this Actor as a tool, use the server URL `https://mcp.apify.com?tools=hgservices/facebook-ads-advertiser-leads`.

### Input

| Field | Description | Default |
|-------|-------------|---------|
| `searchQueries` | Keywords that the ads contain. Each keyword is one search. | `roofing` |
| `adLibraryUrls` | Keyword search URLs from facebook.com/ads/library. | — |
| `exactPhrase` | Find only ads with the words in this order. | `false` |
| `country` | Two-letter country code, or `ALL`. | `US` |
| `languages` | Ad languages, for example `en`, `es`. Empty means all. | all |
| `platforms` | `facebook`, `instagram`, `messenger`, `audience_network`, `threads`, `whatsapp`. Empty means all. | all |
| `sortBy` | `impressions` (biggest spenders first) or `newest`. | `impressions` |
| `maxAdvertisersPerSearch` | Stop each search after this many new advertisers. | `50` |
| `maxAdsPerSearch` | Stop each search after this many ads. | `1000` |
| `maxPageLikes` | Skip advertisers with more page likes. `0` keeps all. | `1000000` |
| `minAdsFound` | Keep only advertisers with at least this many active ads in the results. | `1` |
| `requireWebsite` | Keep only advertisers with a website. | `false` |
| `requireContact` | `none`, `email`, `phone` or `email_or_phone`. | `none` |
| `excludeDomains` | Skip advertisers with these websites, for example your clients. | — |
| `crawlWebsites` | Visit the websites to find contacts. | `true` |
| `maxPagesPerWebsite` | Pages to read on each website. | `5` |
| `onlyRoleEmails` | Keep only company emails such as info@ and sales@. | `false` |

#### Input example

Dentists and med spas in the United States that advertise on Instagram, with an email or a phone:

```json
{
    "searchQueries": ["dentist", "med spa"],
    "country": "US",
    "platforms": ["instagram"],
    "maxAdvertisersPerSearch": 200,
    "requireContact": "email_or_phone"
}
```

### Output

Each lead is one advertiser. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The **Output** tab has three views: **Leads**, **Contacts** and **Ad activity**.

```json
{
    "pageName": "Gator Metal Roofing",
    "businessName": "Gator Metal Roofing",
    "websiteUrl": "https://gatormetalroofing.com/",
    "websiteDomain": "roofs.gatormetalroofing.com",
    "websiteStatus": "ok",
    "primaryEmail": "info@gatormetalroofing.com",
    "emails": ["info@gatormetalroofing.com", "infos@gatormetalroofing.com"],
    "roleEmails": ["info@gatormetalroofing.com"],
    "primaryPhone": "+18882022711",
    "phones": ["+18882022711"],
    "whatsappNumbers": [],
    "address": "140 Spaceway Ct. #125, Garner, NC 27529, US",
    "socials": {
        "facebook": "https://www.facebook.com/gatorhomeprofessionals",
        "instagram": "https://www.instagram.com/gatormetalroofing",
        "youtube": "https://www.youtube.com/channel/UCFtKivhs4-2or5YUgn2aYVQ"
    },
    "contactChannels": ["website"],
    "hasContactForm": false,
    "websitePlatform": "wordpress",
    "websiteTitle": "Roofing, Windows & Doors for The Carolinas | (888) 202-2711",
    "pageId": "111445424455372",
    "facebookUrl": "https://www.facebook.com/gatorhomeprofessionals/",
    "adLibraryUrl": "https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=US&media_type=all&search_type=page&view_all_page_id=111445424455372",
    "pageLikes": 1866,
    "pageCategories": ["business"],
    "adsFound": 1,
    "newAdsLast30Days": 0,
    "oldestAdStartDate": "2026-06-18T07:00:00.000Z",
    "newestAdStartDate": "2026-06-18T07:00:00.000Z",
    "longestRunningAdDays": 112,
    "videoAds": 0,
    "platforms": ["audience_network", "facebook", "instagram", "messenger", "threads"],
    "ctaTypes": ["LEARN_MORE"],
    "sampleAdText": "Think a metal roof is out of reach?\n\nIt may be more affordable than you think...",
    "sampleAdUrls": ["https://www.facebook.com/ads/library/?id=2229870087838367"],
    "landingUrls": ["https://roofs.gatormetalroofing.com/metalroofspringspecial"],
    "otherDomains": [],
    "profilePictureUrl": "https://api.apify.com/v2/key-value-stores/DNIsjP5JOE9dmgVKo/records/logo-111445424455372?signature=...",
    "pagesCrawled": 5,
    "searchTerms": ["roofing"],
    "searchCountry": "US",
    "scrapedAt": "2026-10-08T11:03:26.871Z"
}
```

#### Data fields

| Field | Description |
|-------|-------------|
| `pageName`, `businessName` | Facebook page name, and the business name from the website. |
| `websiteUrl`, `websiteDomain`, `websiteTitle` | The website most of the ads link to, and its page title. |
| `websiteStatus` | `ok`, `failed`, `no_website`, `not_crawled` or `blocked_by_robots`. |
| `primaryEmail`, `emails`, `roleEmails` | Public emails. Company emails on the website's own domain come first. |
| `primaryPhone`, `phones` | Public phone numbers in international format when the country is known. |
| `whatsappNumbers` | Numbers from WhatsApp links in the ads. |
| `address` | Address from the website's structured data. |
| `socials` | Instagram, Facebook, LinkedIn, TikTok, YouTube, X, Pinterest and Yelp profiles. |
| `contactChannels` | How the ads ask people to get in touch. |
| `hasContactForm` | The website has a contact form. |
| `websitePlatform` | Shopify, WordPress, WooCommerce, Wix, Squarespace and more. |
| `pageId`, `pageLikes`, `pageCategories` | The advertiser's Facebook page. |
| `profilePictureUrl` | The advertiser's logo. The Actor saves a copy in the run's key-value store, because Facebook's image links expire after a few days. |
| `facebookUrl`, `adLibraryUrl` | The Facebook page, and all its active ads in the Ad Library. |
| `adsFound` | Active ads of the advertiser in the search results. |
| `newAdsLast30Days` | Ads that started in the last 30 days. |
| `oldestAdStartDate`, `newestAdStartDate`, `longestRunningAdDays` | When the ads started, and days since the oldest active ad started. |
| `platforms`, `ctaTypes`, `videoAds` | Where the ads run, their buttons, and the number of video ads. |
| `sampleAdText`, `sampleAdUrls`, `landingUrls` | Examples of the ads and their landing pages. |
| `otherDomains` | Other websites that the ads link to. |
| `pagesCrawled` | Website pages that the Actor read. |
| `searchTerms`, `searchCountry`, `scrapedAt` | Which searches found the advertiser, and when. |

The **SUMMARY** record in the key-value store shows how many advertisers each search found, why advertisers were skipped, and how many websites loaded.

### How many leads have an email or a phone?

We tested the Actor on US advertisers in October 2026. The results depend on the niche:

- About **70%** of advertisers link their ads to their own website. The others use Messenger, WhatsApp, call buttons, lead forms or a marketplace.
- About **40%** of all leads have an email, and about **50%** have an email or a phone.
- Local services such as roofers and dentists often show a phone and a contact form, but no email.
- Online shops more often show an email such as support@ or hello@.

Use **Only leads with contact data** to keep only the leads you can contact.

### Tips

- **Use several keywords** for one niche, for example `roofing`, `roof replacement` and `roof repair`. Each advertiser appears only once.
- **Sort by newest** to find businesses that started advertising recently.
- **Set Minimum ads per advertiser** to 3 or more to find businesses that spend more on ads.
- **Lower Maximum page likes** to 50,000 to find small and local businesses.
- **Turn off Find contacts on websites** for a fast list of advertisers and their ad activity only.
- **Schedule the Actor** every week and use **Exclude websites** to skip leads you already have.

### FAQ

#### Is it legal to collect this data?

The Actor reads ads that Meta publishes in its public Ad Library, and contact data that businesses publish on their own websites. It does not log in and does not read private data. The Actor reads robots.txt and does not visit pages that robots.txt blocks.

Emails such as info@ or sales@ belong to companies. An email such as john@company.com can be **personal data** under the GDPR and similar laws. Turn on **Only company emails** to keep only company emails. You are responsible for how you use the data, including the rules for cold email and calls in your country. If you are not sure, ask a lawyer.

#### Why does a lead have no email?

Many small businesses show only a phone number and a contact form on their website. Some websites load their content with JavaScript or block automated visits. The `websiteStatus` field shows if the website loaded.

#### Why is `adsFound` lower than the number of ads in the Ad Library?

`adsFound` counts only the ads that matched your keywords. Open `adLibraryUrl` to see all active ads of the advertiser.

#### Can I get the ads themselves?

Yes. Use our [Facebook Ads Library Scraper](https://apify.com/hgservices/facebook-ads-library-scraper) to get every ad with its text, images, videos and landing page.

#### I need a feature or found a problem

Open an issue in the **Issues** tab. We also build custom solutions.

# Actor input Schema

## `searchQueries` (type: `array`):

Words that the ads contain, for example a niche ("roofing", "dentist", "med spa") or a product ("skincare", "solar panels"). Each keyword is one Ad Library search. The Actor finds the businesses that run these ads.

## `adLibraryUrls` (type: `array`):

Keyword search URLs copied from facebook.com/ads/library. Each URL is one search. Its country, language and platform filters are used. The Actor always searches active ads.

## `exactPhrase` (type: `boolean`):

Find only ads that contain the keyword words in this order, for example "metal roof replacement".

## `country` (type: `string`):

Country where the ads were shown. Select "All countries" to search everywhere.

## `languages` (type: `array`):

Find only ads in these languages. Leave empty for all languages.

## `platforms` (type: `array`):

Find only ads that ran on these platforms. Leave empty for all platforms.

## `sortBy` (type: `string`):

Order of the ads in the search. "Most impressions first" finds the advertisers that spend the most. "Newest first" finds advertisers that started new ads recently.

## `maxAdvertisersPerSearch` (type: `integer`):

The search stops when it finds this many new advertisers. Big brands (see "Maximum page likes") do not count. Each advertiser is one lead before the contact filters.

## `maxAdsPerSearch` (type: `integer`):

The search also stops after this many ads. Many advertisers run several ads, so you scan more ads than you find advertisers.

## `maxPageLikes` (type: `integer`):

Skip advertisers whose Facebook page has more likes than this, for example national brands. Set 0 to keep all advertisers.

## `minAdsFound` (type: `integer`):

Keep only advertisers with at least this many active ads in the search results. A higher number finds businesses that spend more on ads.

## `requireWebsite` (type: `boolean`):

Skip advertisers whose ads go only to Messenger, WhatsApp, a call button, a lead form or a marketplace.

## `requireContact` (type: `string`):

Save only leads with this contact data. You pay only for saved leads.

## `excludeDomains` (type: `array`):

Skip advertisers with these website domains, for example your current clients or competitors ("example.com").

## `crawlWebsites` (type: `boolean`):

Visit each advertiser's website to find the email, phone, address, social profiles and website platform. Turn off to get only the advertiser and ad data, which is faster.

## `maxPagesPerWebsite` (type: `integer`):

The home page plus contact, about, imprint, location, privacy and terms pages, in this order.

## `onlyRoleEmails` (type: `boolean`):

Keep only role emails such as info@, sales@ or support@, and drop emails that can belong to one person.

## Actor input object example

```json
{
  "searchQueries": [
    "roofing"
  ],
  "exactPhrase": false,
  "country": "US",
  "sortBy": "impressions",
  "maxAdvertisersPerSearch": 50,
  "maxAdsPerSearch": 1000,
  "maxPageLikes": 1000000,
  "minAdsFound": 1,
  "requireWebsite": false,
  "requireContact": "none",
  "crawlWebsites": true,
  "maxPagesPerWebsite": 5,
  "onlyRoleEmails": false
}
```

# Actor output Schema

## `leads` (type: `string`):

No description

## `contacts` (type: `string`):

No description

## `adActivity` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "roofing"
    ],
    "country": "US",
    "maxAdvertisersPerSearch": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/facebook-ads-advertiser-leads").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 = {
    "searchQueries": ["roofing"],
    "country": "US",
    "maxAdvertisersPerSearch": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("hgservices/facebook-ads-advertiser-leads").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 '{
  "searchQueries": [
    "roofing"
  ],
  "country": "US",
  "maxAdvertisersPerSearch": 50
}' |
apify call hgservices/facebook-ads-advertiser-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hgservices/facebook-ads-advertiser-leads"
        }
    }
}
```

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/lkPe7EJjND7VHczCq/builds/rrcozCiCbRiiVGPVJ/openapi.json
