# Businesses Running Ads - Meta, TikTok & Google Pixel Check (`that_red_bird/ad-pixel-leads`) Actor

Check any list of websites (or a Google Maps dataset) for Meta, TikTok, Google Ads, Pinterest and Snap pixels, including ones loaded through Google Tag Manager. Leads for ad agencies.

- **URL**: https://apify.com/that_red_bird/ad-pixel-leads.md
- **Developed by:** [mohamed alaya](https://apify.com/that_red_bird) (community)
- **Categories:** Lead generation, Marketing, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 site checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Businesses Running Ads - Meta, TikTok & Google Pixel Check

Give it a list of websites, or the website column of a Google Maps scraper dataset, and it tells you which sites have Meta, TikTok, Google Ads, LinkedIn, Pinterest, Snap, Reddit, Microsoft or X ad pixels installed, including pixels hidden inside Google Tag Manager.
Made for ad agencies and freelancers who want a list of businesses that already spend money on advertising.

It does not scrape Google Maps or any social network. It only reads the public homepage of each website you give it (plus the public Google Tag Manager script when the page loads one).

### What a pixel does and does not prove

A Meta, TikTok or Google Ads pixel proves that tracking code for that ad platform is installed on the site. Businesses install it to measure ads and to retarget visitors, so it is a strong hint that they advertise or did. It does **not** prove that ads are running today or how much is spent. The output flag is called `adsLikelyRunning` for that reason: it is true when at least one ad-platform pixel was found with confidence 70 or more. Check the Meta Ad Library or the Google Ads Transparency Center before you pitch.

### Quick start (3 copy-paste examples)

**1. See it work (empty input):** run with `{}`. You get three labelled synthetic demo pages checked offline (free).

**2. A list of websites:**

```json
{ "urls": ["https://www.allbirds.com", "https://example-dentist.com"], "readTagManager": true }
```

**3. A Google Maps dataset** (pick the dataset in the "Lead dataset" field, or give its id):

```json
{ "datasetId": "YOUR_DATASET_ID", "onlyAdSites": true, "maxSites": 500 }
```

### Use it with (pipelines)

- `compass/crawler-google-places` (Google Maps scraper) -> this Actor. It reads each row's `website` (and `title`, `placeId` for the label). Result: every local business in the area that has ad pixels, ready for outreach.
- Any lead list or CSV with a column named `website`, `websiteUrl`, `companyWebsite`, `domain` or `site`. Use "Website column name" for other names.

Field names: `website`, `title` and `placeId` are taken from the Google Maps scraper's documented output (from documentation, not checked against a fresh export). The Tag Manager reading was checked against a real public container on 2026-10-10 (see limits).

### Input guide

| Field | What it does |
|---|---|
| Websites | One address per line. |
| Lead dataset | Dataset picker (read-only access). Each website is checked once. |
| Or paste rows | JSON, JSON lines or CSV with a website column. |
| Website column name | Only if your column is not one of the usual names. |
| Read Google Tag Manager containers | Reads the public `gtm.js` container of up to 3 GTM ids per page. On by default. |
| Only output sites with an ad pixel | Hide sites without ad pixels. |
| Maximum sites / Parallel requests | Safety cap (default 100) and politeness (default 5). |

### Output

One row per website (`type: "site"`), errors as `type: "error"` rows.

| Field | Meaning |
|---|---|
| `site`, `business`, `title` | The address, the business name from your data (or the page title). |
| `adsLikelyRunning` | True when an ad-platform pixel was found with confidence 70+. Tracking installed, not proof of spend. |
| `adStack` | One lead-ready line, e.g. `Ads: Meta Pixel 123456789012345, TikTok Pixel (via GTM) \| Analytics: Google Analytics 4`. |
| `platforms` | Names of the ad platforms found. |
| `pixels` | Per tag: `platform`, `kind` (ads / analytics / heatmap), `ids` (pixel or measurement ids found), `confidence` 0-99, `confidenceLabel`, `foundIn` (homepage or gtm:GTM-XXXX). |
| `gtmContainers` | Google Tag Manager ids on the page. |
| `note` | The plain statement above. |

Sample row:

```json
{ "type": "site", "site": "https://demo-shop.example", "business": "Demo Online Shop (synthetic)", "adsLikelyRunning": true,
  "adStack": "Ads: Meta Pixel 1234567890123456 (via GTM), TikTok Pixel CABCDEFGHIJ1234567 (via GTM), Google Ads AW-987654321 (via GTM)",
  "platforms": ["Meta Pixel (Facebook / Instagram ads)", "TikTok Pixel", "Google Ads (conversion / remarketing)"],
  "gtmContainers": ["GTM-DEMO123"] }
```

Detected: Meta, TikTok, Google Ads (AW- ids and conversion scripts), LinkedIn Insight, Pinterest, Snap, Reddit, Microsoft/Bing UET, X (Twitter), Criteo; analytics Google Analytics 4, Universal Analytics; Hotjar and Microsoft Clarity. Confidence combines independent hits (a script URL plus an init call with an id is stronger than a bare function name).

### Price

Pay per event: **$0.002 per website checked** and **$0.003 more for each site where an ad pixel was found**. Unreachable sites and the free demo are never charged.
Example: 500 websites, 180 with ad pixels = 500 x $0.002 + 180 x $0.003 = **$1.54**.

### FAQ

**Does it tell me who is paying for ads right now?** No. It shows which ad platforms a site is wired up for. Use it to build a shortlist, then confirm in the platforms' public ad libraries.

**Why did a known advertiser show nothing?** Pixels can be loaded only after a cookie banner is accepted, from a server-side container, or on pages other than the homepage. This Actor reads the homepage HTML and the public GTM script only.

**Does it use a browser?** No, plain HTTP requests, with an automatic retry through Apify proxy when a site blocks the first attempt.

### Honest limits

- No JavaScript is executed. Tags injected after consent, by server-side tagging, or only on inner pages are missed.
- A found pixel is not proof of active spend. A missing pixel is not proof of no advertising.
- Pixel ids are what the page or container text contains; a container can hold ids for several brands.
- Weak signals (a bare `fbq(` call) get low confidence and do not set `adsLikelyRunning` alone.
- Tested here on synthetic pages and one live public Tag Manager container (Allbirds), not on a large real lead list.

# Actor input Schema

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

Website addresses to check, one per line, for example https://example.com. Leave empty to use a dataset below, or to see the built-in demo.

## `datasetId` (type: `string`):

Pick the dataset of a Google Maps scraper (for example compass/crawler-google-places) or any lead list that has a website column. Each business website is checked once. Added to the Websites above.

## `rows` (type: `string`):

Paste a JSON array, JSON lines or CSV that has a website column (and optionally a business name column called title or name). Ignored when a dataset is picked above.

## `websiteField` (type: `string`):

Name of the column that holds the website address. Leave empty to try the usual names (website, websiteUrl, companyWebsite, domain, site).

## `readTagManager` (type: `boolean`):

When the page loads a Google Tag Manager container (GTM-XXXX), also read that public container script to find pixels that are loaded through it. Recommended: many Meta and TikTok pixels are hidden there.

## `onlyAdSites` (type: `boolean`):

Drop sites without any ad-platform pixel from the dataset. All reachable sites are still checked and charged as site checks.

## `maxSites` (type: `integer`):

Safety cap on how many websites are checked in one run.

## `concurrency` (type: `integer`):

How many websites are fetched at the same time. Keep it low to be polite to the sites.

## Actor input object example

```json
{
  "urls": [],
  "rows": "",
  "websiteField": "",
  "readTagManager": true,
  "onlyAdSites": false,
  "maxSites": 100,
  "concurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `downloadCsv` (type: `string`):

No description

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

No description

## `count` (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 = {
    "urls": [],
    "rows": "",
    "websiteField": "",
    "readTagManager": true,
    "onlyAdSites": false,
    "maxSites": 100,
    "concurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/ad-pixel-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 = {
    "urls": [],
    "rows": "",
    "websiteField": "",
    "readTagManager": True,
    "onlyAdSites": False,
    "maxSites": 100,
    "concurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("that_red_bird/ad-pixel-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 '{
  "urls": [],
  "rows": "",
  "websiteField": "",
  "readTagManager": true,
  "onlyAdSites": false,
  "maxSites": 100,
  "concurrency": 5
}' |
apify call that_red_bird/ad-pixel-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,that_red_bird/ad-pixel-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/uSAqcYO617S7xDb9o/builds/Yav1GVS26DxuRzwNC/openapi.json
