# TikTok & Kwai Ads Checker — Detect Advertisers by Domain (`memo23/tiktok-kwai-ads-checker`) Actor

Turn a company list into an advertiser list. Detects TikTok, Kwai, Meta and Google ad pixels on each company's website (including GTM-injected tags), returns yes / no-signal / unknown verdicts with pixel IDs. Works where ad libraries don't exist: Brazil, US, LATAM and beyond.

- **URL**: https://apify.com/memo23/tiktok-kwai-ads-checker.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 company 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/platform/actors/running/actors-in-store#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

## TikTok & Kwai Ads Checker — Detect Advertisers by Domain 🎯

Feed it your company list — get back, for every company, whether they run **TikTok ads**, **Kwai ads**, **Meta ads** or **Google Ads**, with the actual **pixel IDs as evidence**. Works for companies in **any country** (Brazil, US, LATAM, Europe, APAC…), because it doesn't search TikTok's ad archive — it detects the ad pixels installed on each company's own website, including the ones hidden inside Google Tag Manager containers.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-ads-checker.png)

### Why use this checker

- **It answers the question ad libraries can't.** TikTok only publishes an ad library for the EU/EEA + UK + Turkey. Ads delivered in Brazil, the US, or anywhere else are not publicly searchable — with any tool. Kwai has no public ad archive at all. The pixel on the advertiser's own site is the reliable, region-independent signal.
- **No more name matching.** Ad-library search actors try to match your company names against registered legal entities ("S.F. TRADING S.R.L.") and fail. This checker joins on the one identifier you already have: the domain.
- **GTM-aware detection.** On corporate sites, most ad pixels are injected at runtime by Google Tag Manager and never appear in the raw HTML. The checker downloads and scans each site's GTM containers — in real-world testing, ~85% of confirmed TikTok advertisers were only detectable this way.
- **Bot-walls handled for you.** Three independent HTTP stacks with real-browser TLS fingerprints, escalating through built-in residential proxies at no extra cost and zero configuration.
- **Kwai included.** The only Store actor that detects Kwai for Business pixels — essential for Brazil and LATAM prospecting.

### What it does

1. You paste a list of company websites — bare domains, hosts or full URLs, straight from a CRM/CSV export.
2. Each site is fetched with an escalating chain: direct → residential proxy → alternate HTTP stack.
3. The HTML plus up to 3 linked Google Tag Manager containers are scanned for ad-network signatures.
4. You get one row per company: verdict per network (`yes` / `no_signal` / `unknown`), pixel IDs, detection path, and fetch diagnostics.

### Use cases

- **Agency prospecting** — qualify leads by whether they already buy short-video ads (they have budget) or don't yet (they need you).
- **CRM enrichment** — fill an "Ad Networks Used" column across your whole database.
- **Competitor & market monitoring** — track which players in a vertical are on TikTok/Kwai and when new pixels appear.
- **Market sizing** — measure TikTok-ads adoption across an industry list.
- **Sales triggers** — a freshly installed pixel is a buying signal for creative, UGC and performance services.

### Input configuration

```json
{
    "companies": ["kabum.com.br", "https://www.alura.com.br", "acme.com"],
    "detectTikTok": true,
    "detectKwai": true,
    "detectMeta": true,
    "detectGoogleAds": true,
    "scanGtmContainers": true,
    "maxConcurrency": 10
}
```

- **companies** — one entry per company; messy exports are fine (mixed domains/URLs, duplicates are deduped by host).
- **detect\*** — switch individual networks off if you only pay attention to some.
- **scanGtmContainers** — leave on; it's where most detections come from.

### Output sample

```json
{
    "company": "salonline.com.br",
    "domain": "salonline.com.br",
    "finalUrl": "https://www.salonline.com.br/",
    "fetchStatus": "ok",
    "fetchedVia": "direct",
    "runsTikTokAds": "yes",
    "tiktokPixelIds": ["CHHRDL3C77U2URIDD54G"],
    "tiktokDetectedVia": "page",
    "runsKwaiAds": "yes",
    "kwaiPixelIds": [],
    "kwaiDetectedVia": "page",
    "metaPixel": true,
    "metaPixelIds": ["1745357812345678"],
    "googleAdsDetected": true,
    "googleAdsTags": ["AW-123456789"],
    "gtmContainers": ["GTM-N4GVFBQT"],
    "gtmContainersScanned": ["GTM-N4GVFBQT"],
    "checkedAt": "2026-07-28T13:45:00.000Z"
}
```

### Key output fields

| Field | Meaning |
|---|---|
| `runsTikTokAds` / `runsKwaiAds` | `yes` = pixel found (IDs in `…PixelIds`); `no_signal` = site reachable, no pixel; `unknown` = site couldn't be fetched |
| `…DetectedVia` | `page` = pixel inline in the HTML, `gtm` = found inside a Google Tag Manager container |
| `metaPixel`, `googleAdsDetected` | Boolean bonus detections for Meta and Google Ads |
| `fetchStatus` | `ok`, `blocked` (bot-wall on every rung), `unreachable` (DNS/network), `invalid_input` |
| `fetchedVia` | Which rung succeeded: `direct`, `residential-proxy`, `residential-proxy-got` |

### FAQ

**Is a pixel proof that they're running ads right now?**
It's strong evidence of an active or recent ad program: pixels are installed to track paid campaigns, and pixel IDs come from live ad accounts. It can't distinguish "campaign live this minute" from "campaign paused last month" — treat `yes` as "this company buys (or very recently bought) ads on this network."

**Can a company run TikTok ads without a detectable pixel?**
Yes, two gaps: server-side-only tracking (Events API without the JS pixel) and pure branding campaigns with no conversion tracking. Both are rare among SMB/e-commerce/performance advertisers. `no_signal` means "no evidence," not "provably zero ads."

**What about `unknown` / `blocked` rows?**
Some corporate sites sit behind aggressive WAFs that block all plain HTTP clients. The checker escalates through three stacks and residential proxies, and retries blocked sites up to two extra times on fresh proxy exit IPs; the few walls that survive all of that are honestly reported as `unknown` instead of guessed.

**Does it work for US / Brazil / LATAM companies?**
Yes — that's the point. It reads each company's own website, so it works identically for every country, unlike TikTok's ad library (EU/UK/TR only).

**Do you support other tag managers (Tealium, Segment)?**
GTM is scanned today and covers the overwhelming majority of sites. Other tag managers are on the roadmap — open an issue if you need one.

**How fresh are the results?**
Every run fetches the sites live at run time.

### Support

Found a bug or missing a feature? Open an issue from the actor's **Issues** tab in the Apify Console — issues are answered within a day.

### Additional services

Need this wired into a bigger pipeline (ad-creative evidence from the TikTok Creative Center / EU Ad Library, TikTok profile discovery, lead scoring, delivery to your CRM)? Reach out through the actor's issues tab.

### Explore more scrapers

More actors by the same developer are on the [memo23 profile page](https://apify.com/memo23) — including the [TikTok Ads & Trends Scraper](https://apify.com/memo23/tiktok-ads-scraper-cheerio) that pulls actual ad creatives from the TikTok Ad Library (EU/UK/TR) and Creative Center Top Ads.

### 🤖 For AI Agents & LLM Apps

This actor is MCP-ready: call it from AI agents via the Apify MCP server with the input schema above. Typical agent flow: take a company list from the conversation → run the checker → reason over `runsTikTokAds`/`runsKwaiAds` verdicts and pixel IDs → draft outreach or scoring. Output is flat JSON, one row per company, safe to feed directly into an LLM context window.

### ⚠️ Disclaimer

This actor only fetches publicly accessible pages of the websites you provide and publicly served Google Tag Manager container files. It performs no login, no bypassing of paywalls or CAPTCHAs, and collects no personal data. TikTok, Kwai, Meta, Google and all related marks belong to their respective owners; this actor is not affiliated with or endorsed by any of them. You are responsible for using the results in compliance with the laws and terms applicable to you.

### SEO Keywords

check if company runs TikTok ads, TikTok pixel detector, TikTok ads checker by domain, Kwai pixel detector, Kwai ads checker, detect ad pixels on website, Meta pixel checker bulk, Google Ads tag detector, ad network detection by URL, TikTok advertisers list Brazil, find TikTok advertisers US, GTM container scanner, company list ad intelligence, adtech lead generation, short-video ads prospecting

# Actor input Schema

## `companies` (type: `array`):

One entry per company — bare domain (<code>acme.com.br</code>), host (<code>www.acme.com</code>) or full URL (<code>https://acme.com/page</code>). CRM/CSV exports paste straight in. The checker visits each site, scans the HTML and every linked Google Tag Manager container for ad pixels, and returns one verdict row per company.

## `detectTikTok` (type: `boolean`):

Detect the TikTok Ads pixel (ttq / analytics.tiktok.com) and extract pixel IDs.

## `detectKwai` (type: `boolean`):

Detect the Kwai for Business pixel (kwaiq / kwai.net / AdsNebula) and extract pixel IDs.

## `detectMeta` (type: `boolean`):

Detect the Meta (Facebook/Instagram) pixel and extract pixel IDs.

## `detectGoogleAds` (type: `boolean`):

Detect Google Ads conversion tags (AW-XXXXXXX).

## `scanGtmContainers` (type: `boolean`):

Also download and scan each site's GTM container JS. Strongly recommended: on corporate sites most ad pixels are injected via GTM and invisible in the raw HTML — in testing ~85% of TikTok pixel hits were only findable this way.

## `maxConcurrency` (type: `integer`):

How many companies are checked in parallel.

## `proxy` (type: `object`):

Leave empty — paying users automatically route through the actor's built-in residential proxy at no extra cost. Free-tier runs use the default Apify proxy unless you configure your own here.

## Actor input object example

```json
{
  "companies": [
    "acme.com",
    "https://www.example.com.br"
  ],
  "detectTikTok": true,
  "detectKwai": true,
  "detectMeta": true,
  "detectGoogleAds": true,
  "scanGtmContainers": true,
  "maxConcurrency": 10
}
```

# 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 = {
    "companies": [
        "kabum.com.br",
        "salonline.com.br",
        "https://www.alura.com.br"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/tiktok-kwai-ads-checker").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 = { "companies": [
        "kabum.com.br",
        "salonline.com.br",
        "https://www.alura.com.br",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/tiktok-kwai-ads-checker").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "companies": [
    "kabum.com.br",
    "salonline.com.br",
    "https://www.alura.com.br"
  ]
}' |
apify call memo23/tiktok-kwai-ads-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/tiktok-kwai-ads-checker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/77bq0xy5eYP07oMyi/builds/Ed36ywph2oBJFSvgR/openapi.json
