# Meta Ads Prospect Finder: Advertisers With Leaky Sites (`fractionalhqforyou/advertisers-with-leaky-sites`) Actor

Pair active Meta ads with an HTTP homepage check for forms, booking links and visible tracking. Get prioritised agency prospects with evidence and review prompts. A screening score, not measured conversion loss.

- **URL**: https://apify.com/fractionalhqforyou/advertisers-with-leaky-sites.md
- **Developed by:** [Jessy Mariau](https://apify.com/fractionalhqforyou) (community)
- **Categories:** Lead generation, Automation, Social media
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 companies

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Meta Ads Prospect Finder: Advertisers With Leaky Sites

Start an agency prospect list with observable evidence: active Meta ads on one side, a homepage check on the other. Get a score and specific findings to review before offering a landing-page, tracking or website project.

The Actor checks homepage HTML. It does not measure ad spend, conversion rate or lost revenue, and it does not audit every ad landing page. Its value is a shorter research list with an explicit reason to investigate.

### See the result first

Leave company domains, Maps search and optional records empty, then run. The three fictional examples use the production scoring rubric without external requests or Actor event charges.

| Fictional company | Active ads | Score | Band |
| --- | --- | --- | --- |
| Demo Kitchens Ltd | 14 | 87 | HOT |
| Demo Dental Studio | 2 | 25 | COLD |
| Demo Plumbing | 0 | 35 | COLD |

These are actual outputs from the built-in fictional demo, not customer results. Open the dataset to inspect every reason, then export the rows as JSON, CSV or Excel.

### Cost of a real run

$0.03 per company checked, including unresolved companies and rows excluded by `minScore`. Checking 20 companies costs $0.60 in this Actor's events; the same list weekly for four weeks costs $2.40.

Meta Ad Library reads use `curious_coder/facebook-ads-library-scraper` and add its charges. An optional Maps search also runs `compass/crawler-google-places` with its contacts add-on. Both use your Apify account and require a compatible plan. `maxAdsPerCompany` caps the number of ads requested for each company. Check the Pricing tab and your Apify plan for current platform or standby usage costs.

### What I look at

Every company gets a score out of 100. Four things feed it, and they add up to exactly 100.

**Observed ad activity, worth 40.** SCALING is a rubric label for five or more active ads, or one ad that has been running 90 days or longer. TESTING is a rubric label for one to four active ads. DORMANT means the page had ads on the last run under the same watch key and has none now. NOT\_ADVERTISING scores nothing here and is always COLD, because the screening rubric prioritises active ads. UNRESOLVED means I could not find a Facebook page for the company at all, and it is also COLD.

**Capture elements not found in HTML, worth 25.** The homepage has no contact or lead form (15), or no booking link and no click-to-call phone number (10).

**Tracking not found in HTML, worth 20.** No Meta pixel (12), no Google tag (8). When a Google Tag Manager container is present and no pixel is visible I do not award the pixel points, because the pixel may be inside the container.

**Site basics, worth 15.** A dead site, a site that does not resolve, or a social profile where the website should be takes the full 15. A live site can lose points for plain http, no mobile viewport tag, a homepage that takes over three seconds or weighs over two megabytes, and a footer copyright three or more years behind.

HOT is 60 or more. WARM is 35 to 59. Everything else is COLD. Every row carries the rubric reasons with their numbers, and up to three pitch sentences written from that row alone, like this one:

> The Ad Library shows 14 active Meta ads. The homepage HTML checked shows no form, no booking link and no pixel; review the actual ad landing page and browser-rendered site before drawing conclusions.

### How a domain becomes an advertiser

The Ad Library is indexed by Facebook page, not by website. When you give me a domain I open the homepage and look for the Facebook page it links to, usually in the footer. When you give me a Maps search I ask the Google Maps scraper for the contacts add-on, which does the same job from its side. When you give me a Facebook page URL directly I skip that step. The row says which route found the page in `fb_page_source`, and when no route found one the row is UNRESOLVED rather than a quiet zero.

### How to run it

Put one domain or Facebook page per line in the first box. Or leave it empty and give me a Maps category and a town, plus how many results to take. Set the Ad Library country to where the ads are shown. Run it and sort the Overview table on the score column.

Run the same list under the same watch key each week and a company whose ads have stopped comes back as DORMANT.

Leave everything empty and you get three demo rows built by the same rubric: one HOT, one TESTING with a clean site, and one not advertising.

### Honest limits

- The stage labels describe observed ad volume and duration, not actual spend, profitability or campaign strategy.
- The website check is one plain request with no browser. A pixel or a tag injected by JavaScript after the page loads is invisible to me, which is why a Google Tag Manager container turns the pixel answer into "unknown" rather than "missing". Large brands with heavy front ends will look barer than they are.
- Some sites answer a plain request with a 403 from their bot wall. Those come back as unreachable, and the reason says HTTP 403, so you can tell a wall from a dead site.
- The Facebook page is found from the homepage footer. A company that links to its page only from a contact page, or not at all, comes back UNRESOLVED. In my own tests, five of six national brands resolved this way and three of ten Bolton dentists did. Local firms link to Facebook far less often than you would think, so expect most of a Maps run to be UNRESOLVED and read the resolved rows as the product.
- If the Ad Library scraper cannot read a page, the row is UNRESOLVED. Read `ads_error` for the reason.
- An online shop captures the click at its checkout, so when I see a cart or a shop platform on the homepage I give no capture points. The form and booking checks are for service businesses.
- Active ad counts are capped by the ads-per-company setting and by what the Ad Library shows for the chosen country. The count is a floor, not a census.
- None of this is a judgement about the business. It describes what the Ad Library and the homepage showed on the day I read them.

### Use it from an AI agent

Hand the search to an AI agent by adding this Actor as an MCP server. The endpoint is `https://fractionalhqforyou--advertisers-with-leaky-sites.apify.actor/mcp` and the single tool, `find_leaky_advertisers`, takes the same Ad Library query and returns the advertisers and their site findings. Agent runs are billed at the same per-event price. Where a raw endpoint is not supported, `apify/actors-mcp-server` with `fractionalhqforyou/advertisers-with-leaky-sites` in its Actor list gives the same tool.

### Help with your first run

Open an issue on this Actor with the run ID and the result you expected. Remove API keys and private records before sharing. Built by [Fractional HQ](https://fractionalhq.uk), independent design and automation.

# Actor input Schema

## `domains` (type: `string`):

One per line: a company domain (oddbox.co.uk) or a Facebook page URL (https://www.facebook.com/OddboxLDN). A domain is opened once to find the Facebook page in its footer. Leave everything empty for a demo dataset that charges nothing.

## `searchTerm` (type: `string`):

A category as you would type it into Google Maps: for example dentist or kitchen fitter. Used only when the domains box is empty. Runs the Google Maps scraper with its contacts add-on, billed to your own Apify account on top.

## `location` (type: `string`):

A town or city for the Maps search, such as Bolton in the UK.

## `maxPlaces` (type: `integer`):

Cap on businesses taken from the Maps search. Hard limit 500.

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

Two-letter ISO code for the Ad Library filter, or ALL. Only ads shown in this country count.

## `maxAdsPerCompany` (type: `integer`):

Cap on ads read from the Ad Library for each page, which bounds the wrapped run's cost. Five active ads already means SCALING, so 30 is plenty. Minimum 10, the wrapped Actor's floor.

## `minScore` (type: `integer`):

Filters the saved rows, not the work. 60 and above is HOT. Every company checked is charged for whether or not it clears this.

## `watchKey` (type: `string`):

Names the snapshot this run compares against. Run the same list under the same key each week and a company whose ads have stopped shows as DORMANT.

## `records` (type: `array`):

Objects with name, domain or website, fb\_page, and optionally ads (raw Ad Library items) and site (a previous website check). Anything supplied is not fetched again.

## Actor input object example

```json
{
  "maxPlaces": 20,
  "country": "GB",
  "maxAdsPerCompany": 30,
  "minScore": 0,
  "watchKey": "default"
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per company: the Facebook page and how it was found, active ad count, longest-running ad, ad stage, every website leak signal, the 0-100 leak score and band, the rubric reasons with their numbers, and up to three pitch sentences.

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

The OUTPUT record: companies checked, how many resolved to a Facebook page, band and stage counts, events charged, and the top 10 by score with their first pitch angle.

# 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 = {
    "domains": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("fractionalhqforyou/advertisers-with-leaky-sites").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 = { "domains": "" }

# Run the Actor and wait for it to finish
run = client.actor("fractionalhqforyou/advertisers-with-leaky-sites").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 '{
  "domains": ""
}' |
apify call fractionalhqforyou/advertisers-with-leaky-sites --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fractionalhqforyou/advertisers-with-leaky-sites"
        }
    }
}
```

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/HDzkW3s1kDi5TzNiT/builds/kWck6Z7hQ42RledUb/openapi.json
